/[MITgcm]/MITgcm/pkg/gmredi/gmredi_calc_tensor.F
ViewVC logotype

Contents of /MITgcm/pkg/gmredi/gmredi_calc_tensor.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.33 - (show annotations) (download)
Tue Oct 21 22:10:55 2008 UTC (15 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61e
Changes since 1.32: +26 -22 lines
- fix the "OLD_VISBECK_CALC" option + move the #undef to GMREDI_OPTIONS.h
- change computation of Visbeck-K where Slope > Smax :
  now: N*min(Slope,Smax) (similar to OLD_VISBECK_CALC with gkw91 taperFct)
  previously was: M*sqrt(min(Slope,Smax))

1 C $Header: /u/gcmpack/MITgcm/pkg/gmredi/gmredi_calc_tensor.F,v 1.32 2008/03/28 18:48:05 heimbach Exp $
2 C $Name: $
3
4 #include "GMREDI_OPTIONS.h"
5 #ifdef ALLOW_KPP
6 # include "KPP_OPTIONS.h"
7 #endif
8
9 CBOP
10 C !ROUTINE: GMREDI_CALC_TENSOR
11 C !INTERFACE:
12 SUBROUTINE GMREDI_CALC_TENSOR(
13 I iMin, iMax, jMin, jMax,
14 I sigmaX, sigmaY, sigmaR,
15 I bi, bj, myTime, myIter, myThid )
16
17 C !DESCRIPTION: \bv
18 C *==========================================================*
19 C | SUBROUTINE GMREDI_CALC_TENSOR
20 C | o Calculate tensor elements for GM/Redi tensor.
21 C *==========================================================*
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 "DYNVARS.h"
32 #include "EEPARAMS.h"
33 #include "PARAMS.h"
34 #include "GMREDI.h"
35 #include "GMREDI_TAVE.h"
36 #ifdef ALLOW_KPP
37 # include "KPP.h"
38 #endif
39
40 #ifdef ALLOW_AUTODIFF_TAMC
41 #include "tamc.h"
42 #include "tamc_keys.h"
43 #endif /* ALLOW_AUTODIFF_TAMC */
44
45 C !INPUT/OUTPUT PARAMETERS:
46 C == Routine arguments ==
47 C bi, bj :: tile indices
48 C myTime :: Current time in simulation
49 C myIter :: Current iteration number in simulation
50 C myThid :: My Thread Id. number
51 C
52 INTEGER iMin,iMax,jMin,jMax
53 _RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
54 _RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
55 _RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
56 INTEGER bi, bj
57 _RL myTime
58 INTEGER myIter
59 INTEGER myThid
60 CEOP
61
62 #ifdef ALLOW_GMREDI
63
64 C !LOCAL VARIABLES:
65 C == Local variables ==
66 INTEGER i,j,k,kp1
67 _RL SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
68 _RL SlopeY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
69 _RL dSigmaDx(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
70 _RL dSigmaDy(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
71 _RL dSigmaDr(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
72 _RL SlopeSqr(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
73 _RL taperFct(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
74 _RL maskp1, Kgm_tmp
75 _RL ldd97_LrhoC(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
76 _RL ldd97_LrhoW(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
77 _RL ldd97_LrhoS(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
78 _RL Cspd, LrhoInf, LrhoSup, fCoriLoc
79
80 INTEGER kLow_W (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
81 INTEGER kLow_S (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
82 _RL locMixLayer(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
83 _RL baseSlope (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
84 _RL hTransLay (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
85 _RL recipLambda(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
86
87 #ifdef GM_VISBECK_VARIABLE_K
88 #ifdef OLD_VISBECK_CALC
89 _RL Ssq(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
90 #else
91 _RL dSigmaH
92 _RL Sloc, M2loc
93 #endif
94 _RL deltaH, integrDepth
95 _RL N2loc, SNloc
96 #endif
97
98 #ifdef ALLOW_DIAGNOSTICS
99 LOGICAL doDiagRediFlx
100 LOGICAL DIAGNOSTICS_IS_ON
101 EXTERNAL DIAGNOSTICS_IS_ON
102 INTEGER km1
103 _RL dTdz
104 _RL tmp1k(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
105 #endif
106
107 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
108
109 #ifdef ALLOW_AUTODIFF_TAMC
110 act1 = bi - myBxLo(myThid)
111 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
112 act2 = bj - myByLo(myThid)
113 max2 = myByHi(myThid) - myByLo(myThid) + 1
114 act3 = myThid - 1
115 max3 = nTx*nTy
116 act4 = ikey_dynamics - 1
117 igmkey = (act1 + 1) + act2*max1
118 & + act3*max1*max2
119 & + act4*max1*max2*max3
120 #endif /* ALLOW_AUTODIFF_TAMC */
121
122 #ifdef ALLOW_DIAGNOSTICS
123 doDiagRediFlx = .FALSE.
124 IF ( useDiagnostics ) THEN
125 doDiagRediFlx = DIAGNOSTICS_IS_ON('GM_KuzTz', myThid )
126 doDiagRediFlx = doDiagRediFlx .OR.
127 & DIAGNOSTICS_IS_ON('GM_KvzTz', myThid )
128 ENDIF
129 #endif
130
131 #ifdef GM_VISBECK_VARIABLE_K
132 DO j=1-Oly,sNy+Oly
133 DO i=1-Olx,sNx+Olx
134 VisbeckK(i,j,bi,bj) = 0. _d 0
135 ENDDO
136 ENDDO
137 #endif
138
139 C-- set ldd97_Lrho (for tapering scheme ldd97):
140 IF ( GM_taper_scheme.EQ.'ldd97' .OR.
141 & GM_taper_scheme.EQ.'fm07' ) THEN
142 Cspd = 2. _d 0
143 LrhoInf = 15. _d 3
144 LrhoSup = 100. _d 3
145 C- Tracer point location (center):
146 DO j=1-Oly,sNy+Oly
147 DO i=1-Olx,sNx+Olx
148 IF (fCori(i,j,bi,bj).NE.0.) THEN
149 ldd97_LrhoC(i,j) = Cspd/ABS(fCori(i,j,bi,bj))
150 ELSE
151 ldd97_LrhoC(i,j) = LrhoSup
152 ENDIF
153 ldd97_LrhoC(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoC(i,j),LrhoSup))
154 ENDDO
155 ENDDO
156 C- U point location (West):
157 DO j=1-Oly,sNy+Oly
158 kLow_W(1-Olx,j) = 0
159 ldd97_LrhoW(1-Olx,j) = LrhoSup
160 DO i=1-Olx+1,sNx+Olx
161 kLow_W(i,j) = MIN(kLowC(i-1,j,bi,bj),kLowC(i,j,bi,bj))
162 fCoriLoc = op5*(fCori(i-1,j,bi,bj)+fCori(i,j,bi,bj))
163 IF (fCoriLoc.NE.0.) THEN
164 ldd97_LrhoW(i,j) = Cspd/ABS(fCoriLoc)
165 ELSE
166 ldd97_LrhoW(i,j) = LrhoSup
167 ENDIF
168 ldd97_LrhoW(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoW(i,j),LrhoSup))
169 ENDDO
170 ENDDO
171 C- V point location (South):
172 DO i=1-Olx+1,sNx+Olx
173 kLow_S(i,1-Oly) = 0
174 ldd97_LrhoS(i,1-Oly) = LrhoSup
175 ENDDO
176 DO j=1-Oly+1,sNy+Oly
177 DO i=1-Olx,sNx+Olx
178 kLow_S(i,j) = MIN(kLowC(i,j-1,bi,bj),kLowC(i,j,bi,bj))
179 fCoriLoc = op5*(fCori(i,j-1,bi,bj)+fCori(i,j,bi,bj))
180 IF (fCoriLoc.NE.0.) THEN
181 ldd97_LrhoS(i,j) = Cspd/ABS(fCoriLoc)
182 ELSE
183 ldd97_LrhoS(i,j) = LrhoSup
184 ENDIF
185 ldd97_LrhoS(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoS(i,j),LrhoSup))
186 ENDDO
187 ENDDO
188 ELSE
189 C- Just initialize to zero (not use anyway)
190 DO j=1-Oly,sNy+Oly
191 DO i=1-Olx,sNx+Olx
192 ldd97_LrhoC(i,j) = 0. _d 0
193 ldd97_LrhoW(i,j) = 0. _d 0
194 ldd97_LrhoS(i,j) = 0. _d 0
195 ENDDO
196 ENDDO
197 ENDIF
198
199 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
200 C-- 1rst loop on k : compute Tensor Coeff. at W points.
201
202 DO j=1-Oly,sNy+Oly
203 DO i=1-Olx,sNx+Olx
204 hTransLay(i,j) = R_low(i,j,bi,bj)
205 baseSlope(i,j) = 0. _d 0
206 recipLambda(i,j) = 0. _d 0
207 locMixLayer(i,j) = 0. _d 0
208 ENDDO
209 ENDDO
210 #ifdef ALLOW_KPP
211 IF ( useKPP ) THEN
212 DO j=1-Oly,sNy+Oly
213 DO i=1-Olx,sNx+Olx
214 locMixLayer(i,j) = KPPhbl(i,j,bi,bj)
215 ENDDO
216 ENDDO
217 ELSE
218 #else
219 IF ( .TRUE. ) THEN
220 #endif
221 DO j=1-Oly,sNy+Oly
222 DO i=1-Olx,sNx+Olx
223 locMixLayer(i,j) = hMixLayer(i,j,bi,bj)
224 ENDDO
225 ENDDO
226 ENDIF
227
228 DO k=Nr,2,-1
229
230 #ifdef ALLOW_AUTODIFF_TAMC
231 kkey = (igmkey-1)*Nr + k
232 DO j=1-Oly,sNy+Oly
233 DO i=1-Olx,sNx+Olx
234 SlopeX(i,j) = 0. _d 0
235 SlopeY(i,j) = 0. _d 0
236 dSigmaDx(i,j) = 0. _d 0
237 dSigmaDy(i,j) = 0. _d 0
238 dSigmaDr(i,j) = 0. _d 0
239 SlopeSqr(i,j) = 0. _d 0
240 taperFct(i,j) = 0. _d 0
241 Kwx(i,j,k,bi,bj) = 0. _d 0
242 Kwy(i,j,k,bi,bj) = 0. _d 0
243 Kwz(i,j,k,bi,bj) = 0. _d 0
244 # ifdef GM_NON_UNITY_DIAGONAL
245 Kux(i,j,k,bi,bj) = 0. _d 0
246 Kvy(i,j,k,bi,bj) = 0. _d 0
247 # endif
248 # ifdef GM_EXTRA_DIAGONAL
249 Kuz(i,j,k,bi,bj) = 0. _d 0
250 Kvz(i,j,k,bi,bj) = 0. _d 0
251 # endif
252 # ifdef GM_BOLUS_ADVEC
253 GM_PsiX(i,j,k,bi,bj) = 0. _d 0
254 GM_PsiY(i,j,k,bi,bj) = 0. _d 0
255 # endif
256 ENDDO
257 ENDDO
258 #endif
259
260 DO j=1-Oly+1,sNy+Oly-1
261 DO i=1-Olx+1,sNx+Olx-1
262 C Gradient of Sigma at rVel points
263 dSigmaDx(i,j)=op25*( sigmaX(i+1,j,k-1)+sigmaX(i,j,k-1)
264 & +sigmaX(i+1,j, k )+sigmaX(i,j, k )
265 & )*maskC(i,j,k,bi,bj)
266 dSigmaDy(i,j)=op25*( sigmaY(i,j+1,k-1)+sigmaY(i,j,k-1)
267 & +sigmaY(i,j+1, k )+sigmaY(i,j, k )
268 & )*maskC(i,j,k,bi,bj)
269 dSigmaDr(i,j)=sigmaR(i,j,k)
270 ENDDO
271 ENDDO
272
273 #ifdef ALLOW_AUTODIFF_TAMC
274 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
275 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
276 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
277 CADJ STORE baseSlope(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
278 CADJ STORE hTransLay(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
279 CADJ STORE recipLambda(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
280 #endif /* ALLOW_AUTODIFF_TAMC */
281
282 #ifdef GM_VISBECK_VARIABLE_K
283 #ifndef OLD_VISBECK_CALC
284 IF ( GM_Visbeck_alpha.GT.0. .AND.
285 & -rC(k-1).LT.GM_Visbeck_depth ) THEN
286
287 C-- Depth average of f/sqrt(Ri) = M^2/N^2 * N
288 C M^2 and N^2 are horizontal & vertical gradient of buoyancy.
289
290 C Calculate terms for mean Richardson number which is used
291 C in the "variable K" parameterisaton:
292 C compute depth average from surface down to the bottom or
293 C GM_Visbeck_depth, whatever is the shallower.
294
295 DO j=1-Oly+1,sNy+Oly-1
296 DO i=1-Olx+1,sNx+Olx-1
297 IF ( maskC(i,j,k,bi,bj).NE.0. ) THEN
298 integrDepth = -rC( kLowC(i,j,bi,bj) )
299 C- in 2 steps to avoid mix of RS & RL type in min fct. arguments
300 integrDepth = MIN( integrDepth, GM_Visbeck_depth )
301 C Distance between level center above and the integration depth
302 deltaH = integrDepth + rC(k-1)
303 C If negative then we are below the integration level
304 C (cannot be the case with 2 conditions on maskC & -rC(k-1))
305 C If positive we limit this to the distance from center above
306 deltaH = MIN( deltaH, drC(k) )
307 C Now we convert deltaH to a non-dimensional fraction
308 deltaH = deltaH/( integrDepth+rC(1) )
309
310 C-- compute: ( M^2 * S )^1/2 (= S*N since S=M^2/N^2 )
311 dSigmaH = dSigmaDx(i,j)*dSigmaDx(i,j)
312 & + dSigmaDy(i,j)*dSigmaDy(i,j)
313 IF ( dSigmaH .GT. 0. _d 0 ) THEN
314 dSigmaH = SQRT( dSigmaH )
315 C- compute slope, limited by GM_maxSlope:
316 IF ( -dSigmaDr(i,j).GT.dSigmaH*GM_rMaxSlope ) THEN
317 Sloc = dSigmaH / ( -dSigmaDr(i,j) )
318 ELSE
319 Sloc = GM_maxSlope
320 ENDIF
321 M2loc = gravity*recip_rhoConst*dSigmaH
322 c SNloc = SQRT( Sloc*M2loc )
323 N2loc = -gravity*recip_rhoConst*dSigmaDr(i,j)
324 IF ( N2loc.GT.0. _d 0 ) THEN
325 SNloc = Sloc*SQRT(N2loc)
326 ELSE
327 SNloc = 0. _d 0
328 ENDIF
329 ELSE
330 SNloc = 0. _d 0
331 ENDIF
332 VisbeckK(i,j,bi,bj) = VisbeckK(i,j,bi,bj)
333 & +deltaH*GM_Visbeck_alpha
334 & *GM_Visbeck_length*GM_Visbeck_length*SNloc
335 ENDIF
336 ENDDO
337 ENDDO
338 ENDIF
339 #endif /* ndef OLD_VISBECK_CALC */
340 #endif /* GM_VISBECK_VARIABLE_K */
341
342 C Calculate slopes for use in tensor, taper and/or clip
343 CALL GMREDI_SLOPE_LIMIT(
344 O SlopeX, SlopeY,
345 O SlopeSqr, taperFct,
346 U hTransLay, baseSlope, recipLambda,
347 U dSigmaDr,
348 I dSigmaDx, dSigmaDy,
349 I ldd97_LrhoC, locMixLayer, rF,
350 I kLowC(1-Olx,1-Oly,bi,bj),
351 I k, bi, bj, myTime, myIter, myThid )
352
353 DO j=1-Oly+1,sNy+Oly-1
354 DO i=1-Olx+1,sNx+Olx-1
355 C Mask Iso-neutral slopes
356 SlopeX(i,j)=SlopeX(i,j)*maskC(i,j,k,bi,bj)
357 SlopeY(i,j)=SlopeY(i,j)*maskC(i,j,k,bi,bj)
358 SlopeSqr(i,j)=SlopeSqr(i,j)*maskC(i,j,k,bi,bj)
359 ENDDO
360 ENDDO
361
362 #ifdef ALLOW_AUTODIFF_TAMC
363 CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
364 CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
365 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
366 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
367 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
368 #endif /* ALLOW_AUTODIFF_TAMC */
369
370 C Components of Redi/GM tensor
371 DO j=1-Oly+1,sNy+Oly-1
372 DO i=1-Olx+1,sNx+Olx-1
373 Kwx(i,j,k,bi,bj)= SlopeX(i,j)*taperFct(i,j)
374 Kwy(i,j,k,bi,bj)= SlopeY(i,j)*taperFct(i,j)
375 Kwz(i,j,k,bi,bj)= SlopeSqr(i,j)*taperFct(i,j)
376 ENDDO
377 ENDDO
378
379 #ifdef GM_VISBECK_VARIABLE_K
380 #ifdef OLD_VISBECK_CALC
381 DO j=1-Oly+1,sNy+Oly-1
382 DO i=1-Olx+1,sNx+Olx-1
383
384 C- note (jmc) : moved here since only used in VISBECK_VARIABLE_K
385 C but do not know if *taperFct (or **2 ?) is necessary
386 Ssq(i,j)=SlopeSqr(i,j)*taperFct(i,j)
387
388 C-- Depth average of M^2/N^2 * N
389
390 C Calculate terms for mean Richardson number
391 C which is used in the "variable K" parameterisaton.
392 C Distance between interface above layer and the integration depth
393 deltaH=abs(GM_Visbeck_depth)-abs(rF(k))
394 C If positive we limit this to the layer thickness
395 integrDepth = drF(k)
396 deltaH=min(deltaH,integrDepth)
397 C If negative then we are below the integration level
398 deltaH=max(deltaH, 0. _d 0)
399 C Now we convert deltaH to a non-dimensional fraction
400 deltaH=deltaH/GM_Visbeck_depth
401
402 IF ( Ssq(i,j).NE.0. .AND. dSigmaDr(i,j).NE.0. ) THEN
403 N2loc = -gravity*recip_rhoConst*dSigmaDr(i,j)
404 SNloc = SQRT(Ssq(i,j)*N2loc )
405 VisbeckK(i,j,bi,bj) = VisbeckK(i,j,bi,bj)
406 & +deltaH*GM_Visbeck_alpha
407 & *GM_Visbeck_length*GM_Visbeck_length*SNloc
408 ENDIF
409
410 ENDDO
411 ENDDO
412 #endif /* OLD_VISBECK_CALC */
413 #endif /* GM_VISBECK_VARIABLE_K */
414
415 C-- end 1rst loop on vertical level index k
416 ENDDO
417
418
419 #ifdef GM_VISBECK_VARIABLE_K
420 #ifdef ALLOW_AUTODIFF_TAMC
421 CADJ STORE VisbeckK(:,:,bi,bj) = comlev1_bibj, key=igmkey, byte=isbyte
422 #endif
423 IF ( GM_Visbeck_alpha.GT.0. ) THEN
424 C- Limit range that KapGM can take
425 DO j=1-Oly+1,sNy+Oly-1
426 DO i=1-Olx+1,sNx+Olx-1
427 VisbeckK(i,j,bi,bj)=
428 & MIN(VisbeckK(i,j,bi,bj),GM_Visbeck_maxval_K)
429 ENDDO
430 ENDDO
431 ENDIF
432 cph( NEW
433 #ifdef ALLOW_AUTODIFF_TAMC
434 CADJ STORE VisbeckK(:,:,bi,bj) = comlev1_bibj, key=igmkey, byte=isbyte
435 #endif
436 cph)
437 #endif /* GM_VISBECK_VARIABLE_K */
438
439 C- express the Tensor in term of Diffusivity (= m**2 / s )
440 DO k=1,Nr
441 #ifdef ALLOW_AUTODIFF_TAMC
442 kkey = (igmkey-1)*Nr + k
443 # if (defined (GM_NON_UNITY_DIAGONAL) || \
444 defined (GM_VISBECK_VARIABLE_K))
445 CADJ STORE Kwx(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
446 CADJ STORE Kwy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
447 CADJ STORE Kwz(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
448 # endif
449 #endif
450 DO j=1-Oly+1,sNy+Oly-1
451 DO i=1-Olx+1,sNx+Olx-1
452 #ifdef ALLOW_KAPREDI_CONTROL
453 Kgm_tmp = kapredi(i,j,k,bi,bj)
454 #else
455 Kgm_tmp = GM_isopycK
456 #endif
457 #ifdef ALLOW_KAPGM_CONTROL
458 & + GM_skewflx*kapgm(i,j,k,bi,bj)
459 #else
460 & + GM_skewflx*GM_background_K
461 #endif
462 #ifdef GM_VISBECK_VARIABLE_K
463 & + VisbeckK(i,j,bi,bj)*(1. _d 0 + GM_skewflx)
464 #endif
465 Kwx(i,j,k,bi,bj)= Kgm_tmp*Kwx(i,j,k,bi,bj)
466 Kwy(i,j,k,bi,bj)= Kgm_tmp*Kwy(i,j,k,bi,bj)
467 #ifdef ALLOW_KAPREDI_CONTROL
468 Kwz(i,j,k,bi,bj)= ( kapredi(i,j,k,bi,bj)
469 #else
470 Kwz(i,j,k,bi,bj)= ( GM_isopycK
471 #endif
472 #ifdef GM_VISBECK_VARIABLE_K
473 & + VisbeckK(i,j,bi,bj)
474 #endif
475 & )*Kwz(i,j,k,bi,bj)
476 ENDDO
477 ENDDO
478 ENDDO
479
480 #ifdef ALLOW_DIAGNOSTICS
481 IF ( useDiagnostics .AND. GM_taper_scheme.EQ.'fm07' ) THEN
482 CALL DIAGNOSTICS_FILL( hTransLay, 'GM_hTrsL', 0,1,2,bi,bj,myThid)
483 CALL DIAGNOSTICS_FILL( baseSlope, 'GM_baseS', 0,1,2,bi,bj,myThid)
484 CALL DIAGNOSTICS_FILL(recipLambda,'GM_rLamb', 0,1,2,bi,bj,myThid)
485 ENDIF
486 #endif /* ALLOW_DIAGNOSTICS */
487
488
489 #if ( defined (GM_NON_UNITY_DIAGONAL) || defined (GM_EXTRA_DIAGONAL) )
490 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
491 C-- 2nd k loop : compute Tensor Coeff. at U point
492
493 #ifdef ALLOW_KPP
494 IF ( useKPP ) THEN
495 DO j=1-Oly,sNy+Oly
496 DO i=2-Olx,sNx+Olx
497 locMixLayer(i,j) = ( KPPhbl(i-1,j,bi,bj)
498 & + KPPhbl( i ,j,bi,bj) )*op5
499 ENDDO
500 ENDDO
501 ELSE
502 #else
503 IF ( .TRUE. ) THEN
504 #endif
505 DO j=1-Oly,sNy+Oly
506 DO i=2-Olx,sNx+Olx
507 locMixLayer(i,j) = ( hMixLayer(i-1,j,bi,bj)
508 & + hMixLayer( i ,j,bi,bj) )*op5
509 ENDDO
510 ENDDO
511 ENDIF
512 DO j=1-Oly,sNy+Oly
513 DO i=1-Olx,sNx+Olx
514 hTransLay(i,j) = 0.
515 baseSlope(i,j) = 0.
516 recipLambda(i,j)= 0.
517 ENDDO
518 DO i=2-Olx,sNx+Olx
519 hTransLay(i,j) = MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) )
520 ENDDO
521 ENDDO
522
523 DO k=Nr,1,-1
524 kp1 = MIN(Nr,k+1)
525 maskp1 = 1. _d 0
526 IF (k.GE.Nr) maskp1 = 0. _d 0
527 #ifdef ALLOW_AUTODIFF_TAMC
528 kkey = (igmkey-1)*Nr + k
529 #endif
530
531 C Gradient of Sigma at U points
532 DO j=1-Oly+1,sNy+Oly-1
533 DO i=1-Olx+1,sNx+Olx-1
534 dSigmaDx(i,j)=sigmaX(i,j,k)
535 & *_maskW(i,j,k,bi,bj)
536 dSigmaDy(i,j)=op25*( sigmaY(i-1,j+1,k)+sigmaY(i,j+1,k)
537 & +sigmaY(i-1, j ,k)+sigmaY(i, j ,k)
538 & )*_maskW(i,j,k,bi,bj)
539 dSigmaDr(i,j)=op25*( sigmaR(i-1,j, k )+sigmaR(i,j, k )
540 & +(sigmaR(i-1,j,kp1)+sigmaR(i,j,kp1))*maskp1
541 & )*_maskW(i,j,k,bi,bj)
542 ENDDO
543 ENDDO
544
545 #ifdef ALLOW_AUTODIFF_TAMC
546 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
547 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
548 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
549 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
550 CADJ STORE locMixLayer(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
551 CADJ STORE baseSlope(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
552 CADJ STORE hTransLay(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
553 CADJ STORE recipLambda(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
554 #endif /* ALLOW_AUTODIFF_TAMC */
555
556 C Calculate slopes for use in tensor, taper and/or clip
557 CALL GMREDI_SLOPE_LIMIT(
558 O SlopeX, SlopeY,
559 O SlopeSqr, taperFct,
560 U hTransLay, baseSlope, recipLambda,
561 U dSigmaDr,
562 I dSigmaDx, dSigmaDy,
563 I ldd97_LrhoW, locMixLayer, rC,
564 I kLow_W,
565 I k, bi, bj, myTime, myIter, myThid )
566
567 #ifdef ALLOW_AUTODIFF_TAMC
568 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
569 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
570 #endif /* ALLOW_AUTODIFF_TAMC */
571
572 #ifdef GM_NON_UNITY_DIAGONAL
573 c IF ( GM_nonUnitDiag ) THEN
574 DO j=1-Oly+1,sNy+Oly-1
575 DO i=1-Olx+1,sNx+Olx-1
576 Kux(i,j,k,bi,bj) =
577 #ifdef ALLOW_KAPREDI_CONTROL
578 & ( kapredi(i,j,k,bi,bj)
579 #else
580 & ( GM_isopycK
581 #endif
582 #ifdef GM_VISBECK_VARIABLE_K
583 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))
584 #endif
585 & )*taperFct(i,j)
586 ENDDO
587 ENDDO
588 #ifdef ALLOW_AUTODIFF_TAMC
589 # ifdef GM_EXCLUDE_CLIPPING
590 CADJ STORE Kux(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
591 # endif
592 #endif
593 DO j=1-Oly+1,sNy+Oly-1
594 DO i=1-Olx+1,sNx+Olx-1
595 Kux(i,j,k,bi,bj) = MAX( Kux(i,j,k,bi,bj), GM_Kmin_horiz )
596 ENDDO
597 ENDDO
598 c ENDIF
599 #endif /* GM_NON_UNITY_DIAGONAL */
600
601 #ifdef GM_EXTRA_DIAGONAL
602
603 #ifdef ALLOW_AUTODIFF_TAMC
604 CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
605 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
606 #endif /* ALLOW_AUTODIFF_TAMC */
607 IF ( GM_ExtraDiag ) THEN
608 DO j=1-Oly+1,sNy+Oly-1
609 DO i=1-Olx+1,sNx+Olx-1
610 Kuz(i,j,k,bi,bj) =
611 #ifdef ALLOW_KAPREDI_CONTROL
612 & ( kapredi(i,j,k,bi,bj)
613 #else
614 & ( GM_isopycK
615 #endif
616 #ifdef ALLOW_KAPGM_CONTROL
617 & - GM_skewflx*kapgm(i,j,k,bi,bj)
618 #else
619 & - GM_skewflx*GM_background_K
620 #endif
621 #ifdef GM_VISBECK_VARIABLE_K
622 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*GM_advect
623 #endif
624 & )*SlopeX(i,j)*taperFct(i,j)
625 ENDDO
626 ENDDO
627 ENDIF
628 #endif /* GM_EXTRA_DIAGONAL */
629
630 #ifdef ALLOW_DIAGNOSTICS
631 IF (doDiagRediFlx) THEN
632 km1 = MAX(k-1,1)
633 DO j=1,sNy
634 DO i=1,sNx+1
635 C store in tmp1k Kuz_Redi
636 #ifdef ALLOW_KAPREDI_CONTROL
637 tmp1k(i,j) = ( kapredi(i,j,k,bi,bj)
638 #else
639 tmp1k(i,j) = ( GM_isopycK
640 #endif
641 #ifdef GM_VISBECK_VARIABLE_K
642 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*0.5 _d 0
643 #endif
644 & )*SlopeX(i,j)*taperFct(i,j)
645 ENDDO
646 ENDDO
647 DO j=1,sNy
648 DO i=1,sNx+1
649 C- Vertical gradients interpolated to U points
650 dTdz = (
651 & +recip_drC(k)*
652 & ( maskC(i-1,j,k,bi,bj)*
653 & (theta(i-1,j,km1,bi,bj)-theta(i-1,j,k,bi,bj))
654 & +maskC( i ,j,k,bi,bj)*
655 & (theta( i ,j,km1,bi,bj)-theta( i ,j,k,bi,bj))
656 & )
657 & +recip_drC(kp1)*
658 & ( maskC(i-1,j,kp1,bi,bj)*
659 & (theta(i-1,j,k,bi,bj)-theta(i-1,j,kp1,bi,bj))
660 & +maskC( i ,j,kp1,bi,bj)*
661 & (theta( i ,j,k,bi,bj)-theta( i ,j,kp1,bi,bj))
662 & ) ) * 0.25 _d 0
663 tmp1k(i,j) = dyG(i,j,bi,bj)*drF(k)
664 & * _hFacW(i,j,k,bi,bj)
665 & * tmp1k(i,j) * dTdz
666 ENDDO
667 ENDDO
668 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KuzTz', k,1,2,bi,bj,myThid)
669 ENDIF
670 #endif /* ALLOW_DIAGNOSTICS */
671
672 C-- end 2nd loop on vertical level index k
673 ENDDO
674
675 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
676 C-- 3rd k loop : compute Tensor Coeff. at V point
677
678 #ifdef ALLOW_KPP
679 IF ( useKPP ) THEN
680 DO j=2-Oly,sNy+Oly
681 DO i=1-Olx,sNx+Olx
682 locMixLayer(i,j) = ( KPPhbl(i,j-1,bi,bj)
683 & + KPPhbl(i, j ,bi,bj) )*op5
684 ENDDO
685 ENDDO
686 ELSE
687 #else
688 IF ( .TRUE. ) THEN
689 #endif
690 DO j=2-Oly,sNy+Oly
691 DO i=1-Olx,sNx+Olx
692 locMixLayer(i,j) = ( hMixLayer(i,j-1,bi,bj)
693 & + hMixLayer(i, j ,bi,bj) )*op5
694 ENDDO
695 ENDDO
696 ENDIF
697 DO j=1-Oly,sNy+Oly
698 DO i=1-Olx,sNx+Olx
699 hTransLay(i,j) = 0.
700 baseSlope(i,j) = 0.
701 recipLambda(i,j)= 0.
702 ENDDO
703 ENDDO
704 DO j=2-Oly,sNy+Oly
705 DO i=1-Olx,sNx+Olx
706 hTransLay(i,j) = MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) )
707 ENDDO
708 ENDDO
709
710 C Gradient of Sigma at V points
711 DO k=Nr,1,-1
712 kp1 = MIN(Nr,k+1)
713 maskp1 = 1. _d 0
714 IF (k.GE.Nr) maskp1 = 0. _d 0
715 #ifdef ALLOW_AUTODIFF_TAMC
716 kkey = (igmkey-1)*Nr + k
717 #endif
718
719 DO j=1-Oly+1,sNy+Oly-1
720 DO i=1-Olx+1,sNx+Olx-1
721 dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k)
722 & +sigmaX(i,j-1,k) +sigmaX(i+1,j-1,k)
723 & )*_maskS(i,j,k,bi,bj)
724 dSigmaDy(i,j)=sigmaY(i,j,k)
725 & *_maskS(i,j,k,bi,bj)
726 dSigmaDr(i,j)=op25*( sigmaR(i,j-1, k )+sigmaR(i,j, k )
727 & +(sigmaR(i,j-1,kp1)+sigmaR(i,j,kp1))*maskp1
728 & )*_maskS(i,j,k,bi,bj)
729 ENDDO
730 ENDDO
731
732 #ifdef ALLOW_AUTODIFF_TAMC
733 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
734 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
735 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
736 CADJ STORE baseSlope(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
737 CADJ STORE hTransLay(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
738 CADJ STORE recipLambda(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
739 #endif /* ALLOW_AUTODIFF_TAMC */
740
741 C Calculate slopes for use in tensor, taper and/or clip
742 CALL GMREDI_SLOPE_LIMIT(
743 O SlopeX, SlopeY,
744 O SlopeSqr, taperFct,
745 U hTransLay, baseSlope, recipLambda,
746 U dSigmaDr,
747 I dSigmaDx, dSigmaDy,
748 I ldd97_LrhoS, locMixLayer, rC,
749 I kLow_S,
750 I k, bi, bj, myTime, myIter, myThid )
751
752 cph(
753 #ifdef ALLOW_AUTODIFF_TAMC
754 cph(
755 CADJ STORE taperfct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
756 cph)
757 #endif /* ALLOW_AUTODIFF_TAMC */
758 cph)
759
760 #ifdef GM_NON_UNITY_DIAGONAL
761 c IF ( GM_nonUnitDiag ) THEN
762 DO j=1-Oly+1,sNy+Oly-1
763 DO i=1-Olx+1,sNx+Olx-1
764 Kvy(i,j,k,bi,bj) =
765 #ifdef ALLOW_KAPREDI_CONTROL
766 & ( kapredi(i,j,k,bi,bj)
767 #else
768 & ( GM_isopycK
769 #endif
770 #ifdef GM_VISBECK_VARIABLE_K
771 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))
772 #endif
773 & )*taperFct(i,j)
774 ENDDO
775 ENDDO
776 #ifdef ALLOW_AUTODIFF_TAMC
777 # ifdef GM_EXCLUDE_CLIPPING
778 CADJ STORE Kvy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
779 # endif
780 #endif
781 DO j=1-Oly+1,sNy+Oly-1
782 DO i=1-Olx+1,sNx+Olx-1
783 Kvy(i,j,k,bi,bj) = MAX( Kvy(i,j,k,bi,bj), GM_Kmin_horiz )
784 ENDDO
785 ENDDO
786 c ENDIF
787 #endif /* GM_NON_UNITY_DIAGONAL */
788
789 #ifdef GM_EXTRA_DIAGONAL
790
791 #ifdef ALLOW_AUTODIFF_TAMC
792 CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
793 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
794 #endif /* ALLOW_AUTODIFF_TAMC */
795 IF ( GM_ExtraDiag ) THEN
796 DO j=1-Oly+1,sNy+Oly-1
797 DO i=1-Olx+1,sNx+Olx-1
798 Kvz(i,j,k,bi,bj) =
799 #ifdef ALLOW_KAPREDI_CONTROL
800 & ( kapredi(i,j,k,bi,bj)
801 #else
802 & ( GM_isopycK
803 #endif
804 #ifdef ALLOW_KAPGM_CONTROL
805 & - GM_skewflx*kapgm(i,j,k,bi,bj)
806 #else
807 & - GM_skewflx*GM_background_K
808 #endif
809 #ifdef GM_VISBECK_VARIABLE_K
810 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*GM_advect
811 #endif
812 & )*SlopeY(i,j)*taperFct(i,j)
813 ENDDO
814 ENDDO
815 ENDIF
816 #endif /* GM_EXTRA_DIAGONAL */
817
818 #ifdef ALLOW_DIAGNOSTICS
819 IF (doDiagRediFlx) THEN
820 km1 = MAX(k-1,1)
821 DO j=1,sNy+1
822 DO i=1,sNx
823 C store in tmp1k Kvz_Redi
824 #ifdef ALLOW_KAPREDI_CONTROL
825 tmp1k(i,j) = ( kapredi(i,j,k,bi,bj)
826 #else
827 tmp1k(i,j) = ( GM_isopycK
828 #endif
829 #ifdef GM_VISBECK_VARIABLE_K
830 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*0.5 _d 0
831 #endif
832 & )*SlopeY(i,j)*taperFct(i,j)
833 ENDDO
834 ENDDO
835 DO j=1,sNy+1
836 DO i=1,sNx
837 C- Vertical gradients interpolated to U points
838 dTdz = (
839 & +recip_drC(k)*
840 & ( maskC(i,j-1,k,bi,bj)*
841 & (theta(i,j-1,km1,bi,bj)-theta(i,j-1,k,bi,bj))
842 & +maskC(i, j ,k,bi,bj)*
843 & (theta(i, j ,km1,bi,bj)-theta(i, j ,k,bi,bj))
844 & )
845 & +recip_drC(kp1)*
846 & ( maskC(i,j-1,kp1,bi,bj)*
847 & (theta(i,j-1,k,bi,bj)-theta(i,j-1,kp1,bi,bj))
848 & +maskC(i, j ,kp1,bi,bj)*
849 & (theta(i, j ,k,bi,bj)-theta(i, j ,kp1,bi,bj))
850 & ) ) * 0.25 _d 0
851 tmp1k(i,j) = dxG(i,j,bi,bj)*drF(k)
852 & * _hFacS(i,j,k,bi,bj)
853 & * tmp1k(i,j) * dTdz
854 ENDDO
855 ENDDO
856 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KvzTz', k,1,2,bi,bj,myThid)
857 ENDIF
858 #endif /* ALLOW_DIAGNOSTICS */
859
860 C-- end 3rd loop on vertical level index k
861 ENDDO
862
863 #endif /* GM_NON_UNITY_DIAGONAL || GM_EXTRA_DIAGONAL */
864
865
866 #ifdef GM_BOLUS_ADVEC
867 IF (GM_AdvForm) THEN
868 CALL GMREDI_CALC_PSI_B(
869 I bi, bj, iMin, iMax, jMin, jMax,
870 I sigmaX, sigmaY, sigmaR,
871 I ldd97_LrhoW, ldd97_LrhoS,
872 I myThid )
873 ENDIF
874 #endif
875
876 #ifdef ALLOW_TIMEAVE
877 C-- Time-average
878 IF ( taveFreq.GT.0. ) THEN
879
880 CALL TIMEAVE_CUMULATE( GM_Kwx_T, Kwx, Nr,
881 & deltaTclock, bi, bj, myThid )
882 CALL TIMEAVE_CUMULATE( GM_Kwy_T, Kwy, Nr,
883 & deltaTclock, bi, bj, myThid )
884 CALL TIMEAVE_CUMULATE( GM_Kwz_T, Kwz, Nr,
885 & deltaTclock, bi, bj, myThid )
886 #ifdef GM_VISBECK_VARIABLE_K
887 IF ( GM_Visbeck_alpha.NE.0. ) THEN
888 CALL TIMEAVE_CUMULATE( Visbeck_K_T, VisbeckK, 1,
889 & deltaTclock, bi, bj, myThid )
890 ENDIF
891 #endif
892 #ifdef GM_BOLUS_ADVEC
893 IF ( GM_AdvForm ) THEN
894 CALL TIMEAVE_CUMULATE( GM_PsiXtave, GM_PsiX, Nr,
895 & deltaTclock, bi, bj, myThid )
896 CALL TIMEAVE_CUMULATE( GM_PsiYtave, GM_PsiY, Nr,
897 & deltaTclock, bi, bj, myThid )
898 ENDIF
899 #endif
900 DO k=1,Nr
901 GM_TimeAve(k,bi,bj)=GM_TimeAve(k,bi,bj)+deltaTclock
902 ENDDO
903
904 ENDIF
905 #endif /* ALLOW_TIMEAVE */
906
907 #ifdef ALLOW_DIAGNOSTICS
908 IF ( useDiagnostics ) THEN
909 CALL GMREDI_DIAGNOSTICS_FILL(bi,bj,myThid)
910 ENDIF
911 #endif /* ALLOW_DIAGNOSTICS */
912
913 #endif /* ALLOW_GMREDI */
914
915 RETURN
916 END
917
918
919 SUBROUTINE GMREDI_CALC_TENSOR_DUMMY(
920 I iMin, iMax, jMin, jMax,
921 I sigmaX, sigmaY, sigmaR,
922 I bi, bj, myTime, myIter, myThid )
923 C /==========================================================\
924 C | SUBROUTINE GMREDI_CALC_TENSOR |
925 C | o Calculate tensor elements for GM/Redi tensor. |
926 C |==========================================================|
927 C \==========================================================/
928 IMPLICIT NONE
929
930 C == Global variables ==
931 #include "SIZE.h"
932 #include "EEPARAMS.h"
933 #include "GMREDI.h"
934
935 C == Routine arguments ==
936 C
937 _RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
938 _RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
939 _RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
940 INTEGER iMin,iMax,jMin,jMax
941 INTEGER bi, bj
942 _RL myTime
943 INTEGER myIter
944 INTEGER myThid
945 CEndOfInterface
946
947 #ifdef ALLOW_GMREDI
948
949 INTEGER i, j, k
950
951 DO k=1,Nr
952 DO j=1-Oly+1,sNy+Oly-1
953 DO i=1-Olx+1,sNx+Olx-1
954 Kwx(i,j,k,bi,bj) = 0.0
955 Kwy(i,j,k,bi,bj) = 0.0
956 Kwz(i,j,k,bi,bj) = 0.0
957 ENDDO
958 ENDDO
959 ENDDO
960 #endif /* ALLOW_GMREDI */
961
962 RETURN
963 END

  ViewVC Help
Powered by ViewVC 1.1.22