/[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.45 - (show annotations) (download)
Thu Oct 15 23:06:36 2015 UTC (8 years, 7 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, HEAD
Changes since 1.44: +48 -1 lines
- fix kapgm/kapredi C-grid interpolation (contributed by A. Nguyen).
  unless ALLOW_KAPGM_CONTROL_OLD/ALLOW_KAPREDI_CONTROL_OLD is used.

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

  ViewVC Help
Powered by ViewVC 1.1.22