1 |
C $Header: /u/gcmpack/MITgcm/pkg/gmredi/submeso_calc_psi.F,v 1.1 2011/07/13 22:59:53 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "GMREDI_OPTIONS.h" |
5 |
|
6 |
CBOP |
7 |
C !ROUTINE: SUBMESO_CALC_PSI |
8 |
C !INTERFACE: |
9 |
SUBROUTINE SUBMESO_CALC_PSI( |
10 |
I bi, bj, iMin, iMax, jMin, jMax, |
11 |
I sigmaX, sigmaY, sigmaR, |
12 |
I locMixLayer, |
13 |
I myIter, myThid ) |
14 |
|
15 |
C !DESCRIPTION: \bv |
16 |
C *==========================================================* |
17 |
C | SUBROUTINE SUBMESO_CALC_PSI |
18 |
C | o Calculate stream-functions for Sub-Meso bolus velocity |
19 |
C *==========================================================* |
20 |
C | Ref: B. Fox-Kemper etal, Oce.Model., 39:61-78, 2011 |
21 |
C | B. Fox-Kemper etal, JPO, 38(6):1145-1165, 2008 |
22 |
C *==========================================================* |
23 |
C \ev |
24 |
|
25 |
C !USES: |
26 |
IMPLICIT NONE |
27 |
|
28 |
C == Global variables == |
29 |
#include "SIZE.h" |
30 |
#include "GRID.h" |
31 |
#include "EEPARAMS.h" |
32 |
#include "PARAMS.h" |
33 |
#include "GMREDI.h" |
34 |
|
35 |
C !INPUT/OUTPUT PARAMETERS: |
36 |
C == Routine arguments == |
37 |
_RL sigmaX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
38 |
_RL sigmaY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
39 |
_RL sigmaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
40 |
_RL locMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
41 |
INTEGER bi,bj,iMin,iMax,jMin,jMax |
42 |
INTEGER myIter |
43 |
INTEGER myThid |
44 |
CEOP |
45 |
|
46 |
#ifndef GM_EXCLUDE_SUBMESO |
47 |
|
48 |
C !LOCAL VARIABLES: |
49 |
C == Local variables == |
50 |
INTEGER i,j,k |
51 |
_RL mixLayerU (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
52 |
_RL mixLayerV (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
53 |
_RL dBuoyX_Hu (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
54 |
_RL dBuoyY_Hv (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
55 |
_RL NHmixLay (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
56 |
_RL MsquareH (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
57 |
_RL lengthScaleF(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
58 |
_RL fcorLoc (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
59 |
_RL PsiLoc (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
60 |
_RL dzLoc |
61 |
#ifdef GM_BOLUS_ADVEC |
62 |
_RL z2H, mu_z |
63 |
#endif |
64 |
_RL five_ov21 |
65 |
PARAMETER( five_ov21 = 5. _d 0 / 21. _d 0 ) |
66 |
|
67 |
C-- parameter to move to GMREDI.h |
68 |
c _RL subMeso_invTau, subMeso_LfMin, subMeso_Ceff |
69 |
c _RS subMeso_Lmax |
70 |
|
71 |
c subMeso_invTau = 1.6 _d -6 ! ~ 1/(7.2 days) |
72 |
c subMeso_LfMin = 1000. _d 0 |
73 |
c subMeso_Ceff = 0.07 _d 0 |
74 |
c subMeso_Lmax = 111. _d 3 |
75 |
|
76 |
C- Initialization : <= done in S/R gmredi_init |
77 |
|
78 |
c IF ( GM_useSubMeso ) THEN |
79 |
DO j=1-OLy,sNy+OLy |
80 |
DO i=1-OLx+1,sNx+OLx |
81 |
mixLayerU(i,j) = op5*( locMixLayer(i-1,j)+locMixLayer(i,j) ) |
82 |
mixLayerU(i,j) = MIN( mixLayerU(i,j), -rLowW(i,j,bi,bj) ) |
83 |
ENDDO |
84 |
ENDDO |
85 |
DO j=1-OLy+1,sNy+OLy |
86 |
DO i=1-OLx,sNx+OLx |
87 |
mixLayerV(i,j)=op5*( locMixLayer(i,j-1)+locMixLayer(i,j) ) |
88 |
mixLayerV(i,j) = MIN( mixLayerV(i,j), -rLowS(i,j,bi,bj) ) |
89 |
ENDDO |
90 |
ENDDO |
91 |
|
92 |
C-- Integrate buoyancy gradient over the Mixed-Layer |
93 |
DO j=1-OLy,sNy+OLy |
94 |
DO i=1-OLx,sNx+OLx |
95 |
dBuoyX_Hu(i,j)= 0. |
96 |
dBuoyY_Hv(i,j)= 0. |
97 |
NHmixLay(i,j) = 0. |
98 |
fcorLoc(i,j) = SQRT( fCori(i,j,bi,bj)*fCori(i,j,bi,bj) |
99 |
& + subMeso_invTau*subMeso_invTau ) |
100 |
ENDDO |
101 |
ENDDO |
102 |
DO k=1,Nr |
103 |
DO j=1-OLy,sNy+OLy |
104 |
DO i=1-OLx+1,sNx+OLx |
105 |
dzLoc = MAX( 0. _d 0, MIN( drF(k), mixLayerU(i,j)+rF(k) ) ) |
106 |
dBuoyX_Hu(i,j) = dBuoyX_Hu(i,j) + sigmaX(i,j,k)*dzLoc |
107 |
ENDDO |
108 |
ENDDO |
109 |
DO j=1-OLy+1,sNy+OLy |
110 |
DO i=1-OLx,sNx+OLx |
111 |
dzLoc = MAX( 0. _d 0, MIN( drF(k), mixLayerV(i,j)+rF(k) ) ) |
112 |
dBuoyY_Hv(i,j) = dBuoyY_Hv(i,j) + sigmaY(i,j,k)*dzLoc |
113 |
ENDDO |
114 |
ENDDO |
115 |
ENDDO |
116 |
DO k=2,Nr |
117 |
DO j=1-OLy,sNy+OLy |
118 |
DO i=1-OLx,sNx+OLx |
119 |
dzLoc = 0. |
120 |
IF ( locMixLayer(i,j)+rC(k-1).GE.0. ) dzLoc = drC(k) |
121 |
NHmixLay(i,j) = NHmixLay(i,j) |
122 |
& + dzLoc*MAX( -sigmaR(i,j,k), 0. _d 0 ) |
123 |
ENDDO |
124 |
ENDDO |
125 |
ENDDO |
126 |
DO j=1-OLy,sNy+OLy |
127 |
DO i=1-OLx,sNx+OLx |
128 |
dBuoyX_Hu(i,j)= -dBuoyX_Hu(i,j)*gravity*recip_rhoConst |
129 |
dBuoyY_Hv(i,j)= -dBuoyY_Hv(i,j)*gravity*recip_rhoConst |
130 |
NHmixLay(i,j) = SQRT( NHmixLay(i,j)*gravity*recip_rhoConst |
131 |
& *locMixLayer(i,j) ) |
132 |
ENDDO |
133 |
ENDDO |
134 |
DO j=2-OLy,sNy+OLy-1 |
135 |
DO i=2-OLx,sNx+OLx-1 |
136 |
MsquareH(i,j)= SQRT( op25*( |
137 |
& (dBuoyX_Hu(i,j) + dBuoyX_Hu(i+1,j))**2 |
138 |
& + (dBuoyY_Hv(i,j) + dBuoyY_Hv(i,j+1))**2 |
139 |
& ) ) |
140 |
ENDDO |
141 |
ENDDO |
142 |
C- Compute Lf at grid-cell center |
143 |
DO j=2-OLy,sNy+OLy-1 |
144 |
DO i=2-OLx,sNx+OLx-1 |
145 |
lengthScaleF(i,j)= MAX( |
146 |
& MsquareH(i,j)/(fcorLoc(i,j)*fcorLoc(i,j)) , |
147 |
& NHmixLay(i,j)/fcorLoc(i,j) , |
148 |
& subMeso_LfMin ) |
149 |
ENDDO |
150 |
ENDDO |
151 |
|
152 |
C Mix-Layer Eddies contribution to Bolus Transport in X dir. |
153 |
DO j=2-OLy,sNy+OLy-1 |
154 |
DO i=3-OLx,sNx+OLx-1 |
155 |
PsiLoc(i,j) = -subMeso_Ceff*dBuoyX_Hu(i,j) |
156 |
& *mixLayerU(i,j) |
157 |
& *MIN( dxC(i,j,bi,bj), subMeso_Lmax ) |
158 |
& *2. _d 0/(lengthScaleF(i-1,j)+lengthScaleF(i,j)) |
159 |
& *2. _d 0/(fcorLoc(i-1,j)+fcorLoc(i,j)) |
160 |
ENDDO |
161 |
ENDDO |
162 |
#ifdef GM_BOLUS_ADVEC |
163 |
DO k=2,Nr |
164 |
DO j=2-OLy,sNy+OLy-1 |
165 |
DO i=3-OLx,sNx+OLx-1 |
166 |
IF ( mixLayerU(i,j).GT.0. _d 0 ) THEN |
167 |
z2H = 2. _d 0*rF(k)/mixLayerU(i,j) |
168 |
ELSE |
169 |
z2H = 0. _d 0 |
170 |
ENDIF |
171 |
mu_z = ( z2H + 1. _d 0 )*( z2H + 1. _d 0 ) |
172 |
mu_z = ( 1. _d 0 - mu_z )*(1. _d 0 + mu_z*five_ov21 ) |
173 |
mu_z = MAX( 0. _d 0, mu_z ) |
174 |
GM_PsiX(i,j,k,bi,bj) = GM_PsiX(i,j,k,bi,bj) |
175 |
& + mu_z*PsiLoc(i,j) |
176 |
ENDDO |
177 |
ENDDO |
178 |
ENDDO |
179 |
#endif /* GM_BOLUS_ADVEC */ |
180 |
#ifdef ALLOW_DIAGNOSTICS |
181 |
IF ( useDiagnostics ) THEN |
182 |
CALL DIAGNOSTICS_FILL( lengthScaleF, 'SubMesLf', |
183 |
& 0, 1, 2, bi, bj, myThid ) |
184 |
CALL DIAGNOSTICS_FILL( PsiLoc, 'SubMpsiX', |
185 |
& 0, 1, 2, bi, bj, myThid ) |
186 |
ENDIF |
187 |
#endif |
188 |
IF ( debugLevel.GE.debLevD ) THEN |
189 |
CALL WRITE_LOCAL_RL( 'subMeso_Lf','I10',1,lengthScaleF, |
190 |
& bi,bj,1,myIter,myThid ) |
191 |
CALL WRITE_LOCAL_RL( 'subMeso_psiX','I10',1,PsiLoc, |
192 |
& bi,bj,1,myIter,myThid ) |
193 |
ENDIF |
194 |
|
195 |
C Mix-Layer Eddies contribution to Bolus Transport in Y dir. |
196 |
DO j=3-OLy,sNy+OLy-1 |
197 |
DO i=2-OLx,sNx+OLx-1 |
198 |
PsiLoc(i,j) = -subMeso_Ceff*dBuoyY_Hv(i,j) |
199 |
& *mixLayerV(i,j) |
200 |
& *MIN( dyC(i,j,bi,bj), subMeso_Lmax ) |
201 |
& *2. _d 0/(lengthScaleF(i,j-1)+lengthScaleF(i,j)) |
202 |
& *2. _d 0/(fcorLoc(i,j-1)+fcorLoc(i,j)) |
203 |
ENDDO |
204 |
ENDDO |
205 |
#ifdef GM_BOLUS_ADVEC |
206 |
DO k=2,Nr |
207 |
DO j=3-OLy,sNy+OLy-1 |
208 |
DO i=2-OLx,sNx+OLx-1 |
209 |
IF ( mixLayerV(i,j).GT.0. _d 0 ) THEN |
210 |
z2H = 2. _d 0*rF(k)/mixLayerV(i,j) |
211 |
ELSE |
212 |
z2H = 0. _d 0 |
213 |
ENDIF |
214 |
mu_z = ( z2H + 1. _d 0 )*( z2H + 1. _d 0 ) |
215 |
mu_z = ( 1. _d 0 - mu_z )*(1. _d 0 + mu_z*five_ov21 ) |
216 |
mu_z = MAX( 0. _d 0, mu_z ) |
217 |
GM_PsiY(i,j,k,bi,bj) = GM_PsiY(i,j,k,bi,bj) |
218 |
& + mu_z*PsiLoc(i,j) |
219 |
ENDDO |
220 |
ENDDO |
221 |
ENDDO |
222 |
#endif /* GM_BOLUS_ADVEC */ |
223 |
#ifdef ALLOW_DIAGNOSTICS |
224 |
IF ( useDiagnostics ) THEN |
225 |
CALL DIAGNOSTICS_FILL( PsiLoc, 'SubMpsiY', |
226 |
& 0, 1, 2, bi, bj, myThid ) |
227 |
ENDIF |
228 |
#endif |
229 |
IF ( debugLevel.GE.debLevD ) THEN |
230 |
CALL WRITE_LOCAL_RL( 'subMeso_psiY','I10',1,PsiLoc, |
231 |
& bi,bj,1,myIter,myThid ) |
232 |
ENDIF |
233 |
|
234 |
c ENDIF |
235 |
#endif /* ndef GM_EXCLUDE_SUBMESO */ |
236 |
|
237 |
RETURN |
238 |
END |