/[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.30 - (show annotations) (download)
Fri Sep 7 14:27:19 2007 UTC (16 years, 8 months ago) by dfer
Branch: MAIN
CVS Tags: checkpoint59g, checkpoint59m, checkpoint59l, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint59j
Changes since 1.29: +2 -2 lines
"GM_KuzTz" diagnostics was broken by addition of 3rd k-loop.

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

  ViewVC Help
Powered by ViewVC 1.1.22