/[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.25 - (show annotations) (download)
Wed Feb 7 00:01:15 2007 UTC (17 years, 3 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint59, checkpoint58y_post, checkpoint58w_post, checkpoint59a, checkpoint59b, checkpoint58v_post, checkpoint58x_post
Changes since 1.24: +13 -1 lines
Updating for case ALLOW_KAPGM_CONTROL

1 C $Header: /u/gcmpack/MITgcm/pkg/gmredi/gmredi_calc_tensor.F,v 1.24 2006/06/20 22:55:08 jmc Exp $
2 C $Name: $
3
4 #include "GMREDI_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE GMREDI_CALC_TENSOR(
8 I bi, bj, iMin, iMax, jMin, jMax,
9 I sigmaX, sigmaY, sigmaR,
10 I myThid )
11 C /==========================================================\
12 C | SUBROUTINE GMREDI_CALC_TENSOR |
13 C | o Calculate tensor elements for GM/Redi tensor. |
14 C |==========================================================|
15 C \==========================================================/
16 IMPLICIT NONE
17
18 C == Global variables ==
19 #include "SIZE.h"
20 #include "GRID.h"
21 #include "DYNVARS.h"
22 #include "EEPARAMS.h"
23 #include "PARAMS.h"
24 #include "GMREDI.h"
25 #include "GMREDI_TAVE.h"
26
27 #ifdef ALLOW_AUTODIFF_TAMC
28 #include "tamc.h"
29 #include "tamc_keys.h"
30 #endif /* ALLOW_AUTODIFF_TAMC */
31
32 C == Routine arguments ==
33 C
34 _RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
35 _RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
36 _RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
37 INTEGER bi,bj,iMin,iMax,jMin,jMax
38 INTEGER myThid
39 CEndOfInterface
40
41 #ifdef ALLOW_GMREDI
42
43 C == Local variables ==
44 INTEGER i,j,k,kp1
45 _RL SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
46 _RL SlopeY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
47 _RL dSigmaDx(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
48 _RL dSigmaDy(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
49 _RL dSigmaDr(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
50 _RL SlopeSqr(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
51 _RL taperFct(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
52 _RL maskp1, Kgm_tmp
53 _RL ldd97_LrhoC(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
54 _RL ldd97_LrhoW(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
55 _RL ldd97_LrhoS(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
56 _RL Cspd, LrhoInf, LrhoSup, fCoriLoc
57
58 #ifdef GM_VISBECK_VARIABLE_K
59 _RL deltaH,zero_rs
60 PARAMETER(zero_rs=0.D0)
61 _RL N2,SN
62 _RL Ssq(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
63 #endif
64
65 #ifdef ALLOW_DIAGNOSTICS
66 LOGICAL doDiagRediFlx
67 LOGICAL DIAGNOSTICS_IS_ON
68 EXTERNAL DIAGNOSTICS_IS_ON
69 INTEGER km1
70 _RL dTdz
71 _RL tmp1k(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
72 #endif
73
74 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
75
76 #ifdef ALLOW_AUTODIFF_TAMC
77 act1 = bi - myBxLo(myThid)
78 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
79 act2 = bj - myByLo(myThid)
80 max2 = myByHi(myThid) - myByLo(myThid) + 1
81 act3 = myThid - 1
82 max3 = nTx*nTy
83 act4 = ikey_dynamics - 1
84 igmkey = (act1 + 1) + act2*max1
85 & + act3*max1*max2
86 & + act4*max1*max2*max3
87 #endif /* ALLOW_AUTODIFF_TAMC */
88
89 #ifdef ALLOW_DIAGNOSTICS
90 doDiagRediFlx = .FALSE.
91 IF ( useDiagnostics ) THEN
92 doDiagRediFlx = DIAGNOSTICS_IS_ON('GM_KuzTz', myThid )
93 doDiagRediFlx = doDiagRediFlx .OR.
94 & DIAGNOSTICS_IS_ON('GM_KvzTz', myThid )
95 ENDIF
96 #endif
97
98 #ifdef GM_VISBECK_VARIABLE_K
99 DO j=1-Oly,sNy+Oly
100 DO i=1-Olx,sNx+Olx
101 VisbeckK(i,j,bi,bj) = 0. _d 0
102 ENDDO
103 ENDDO
104 #endif
105
106 C-- set ldd97_Lrho (for tapering scheme ldd97):
107 IF (GM_taper_scheme.EQ.'ldd97') THEN
108 Cspd = 2. _d 0
109 LrhoInf = 15. _d 3
110 LrhoSup = 100. _d 3
111 C- Tracer point location (center):
112 DO j=1-Oly,sNy+Oly
113 DO i=1-Olx,sNx+Olx
114 IF (fCori(i,j,bi,bj).NE.0.) THEN
115 ldd97_LrhoC(i,j) = Cspd/ABS(fCori(i,j,bi,bj))
116 ELSE
117 ldd97_LrhoC(i,j) = LrhoSup
118 ENDIF
119 ldd97_LrhoC(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoC(i,j),LrhoSup))
120 ENDDO
121 ENDDO
122 C- U point location (West):
123 DO j=1-Oly,sNy+Oly
124 ldd97_LrhoW(1-Olx,j) = LrhoSup
125 DO i=1-Olx+1,sNx+Olx
126 fCoriLoc = op5*(fCori(i-1,j,bi,bj)+fCori(i,j,bi,bj))
127 IF (fCoriLoc.NE.0.) THEN
128 ldd97_LrhoW(i,j) = Cspd/ABS(fCoriLoc)
129 ELSE
130 ldd97_LrhoW(i,j) = LrhoSup
131 ENDIF
132 ldd97_LrhoW(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoW(i,j),LrhoSup))
133 ENDDO
134 ENDDO
135 C- V point location (South):
136 DO i=1-Olx+1,sNx+Olx
137 ldd97_LrhoS(i,1-Oly) = LrhoSup
138 ENDDO
139 DO j=1-Oly+1,sNy+Oly
140 DO i=1-Olx,sNx+Olx
141 fCoriLoc = op5*(fCori(i,j-1,bi,bj)+fCori(i,j,bi,bj))
142 IF (fCoriLoc.NE.0.) THEN
143 ldd97_LrhoS(i,j) = Cspd/ABS(fCoriLoc)
144 ELSE
145 ldd97_LrhoS(i,j) = LrhoSup
146 ENDIF
147 ldd97_LrhoS(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoS(i,j),LrhoSup))
148 ENDDO
149 ENDDO
150 ELSE
151 C- Just initialize to zero (not use anyway)
152 DO j=1-Oly,sNy+Oly
153 DO i=1-Olx,sNx+Olx
154 ldd97_LrhoC(i,j) = 0. _d 0
155 ldd97_LrhoW(i,j) = 0. _d 0
156 ldd97_LrhoS(i,j) = 0. _d 0
157 ENDDO
158 ENDDO
159 ENDIF
160 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
161
162 DO k=2,Nr
163 C-- 1rst loop on k : compute Tensor Coeff. at W points.
164
165 #ifdef ALLOW_AUTODIFF_TAMC
166 kkey = (igmkey-1)*Nr + k
167 DO j=1-Oly,sNy+Oly
168 DO i=1-Olx,sNx+Olx
169 SlopeX(i,j) = 0. _d 0
170 SlopeY(i,j) = 0. _d 0
171 dSigmaDx(i,j) = 0. _d 0
172 dSigmaDy(i,j) = 0. _d 0
173 dSigmaDr(i,j) = 0. _d 0
174 SlopeSqr(i,j) = 0. _d 0
175 taperFct(i,j) = 0. _d 0
176 Kwx(i,j,k,bi,bj) = 0. _d 0
177 Kwy(i,j,k,bi,bj) = 0. _d 0
178 Kwz(i,j,k,bi,bj) = 0. _d 0
179 # ifdef GM_NON_UNITY_DIAGONAL
180 Kux(i,j,k,bi,bj) = 0. _d 0
181 Kvy(i,j,k,bi,bj) = 0. _d 0
182 # endif
183 # ifdef GM_EXTRA_DIAGONAL
184 Kuz(i,j,k,bi,bj) = 0. _d 0
185 Kvz(i,j,k,bi,bj) = 0. _d 0
186 # endif
187 # ifdef GM_BOLUS_ADVEC
188 GM_PsiX(i,j,k,bi,bj) = 0. _d 0
189 GM_PsiY(i,j,k,bi,bj) = 0. _d 0
190 # endif
191 ENDDO
192 ENDDO
193 #endif
194
195 DO j=1-Oly+1,sNy+Oly-1
196 DO i=1-Olx+1,sNx+Olx-1
197 C Gradient of Sigma at rVel points
198 dSigmaDx(i,j)=op25*( sigmaX(i+1, j ,k-1) +sigmaX(i,j,k-1)
199 & +sigmaX(i+1, j , k ) +sigmaX(i,j, k ) )
200 & *maskC(i,j,k,bi,bj)
201 dSigmaDy(i,j)=op25*( sigmaY( i ,j+1,k-1) +sigmaY(i,j,k-1)
202 & +sigmaY( i ,j+1, k ) +sigmaY(i,j, k ) )
203 & *maskC(i,j,k,bi,bj)
204 dSigmaDr(i,j)=sigmaR(i,j,k)
205 ENDDO
206 ENDDO
207
208 #ifdef ALLOW_AUTODIFF_TAMC
209 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
210 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
211 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
212 #endif /* ALLOW_AUTODIFF_TAMC */
213
214 C Calculate slopes for use in tensor, taper and/or clip
215 CALL GMREDI_SLOPE_LIMIT(
216 O SlopeX, SlopeY,
217 O SlopeSqr, taperFct,
218 U dSigmaDr,
219 I dSigmaDx, dSigmaDy,
220 I ldd97_LrhoC,rF(k),k,
221 I bi, bj, myThid )
222
223 DO j=1-Oly+1,sNy+Oly-1
224 DO i=1-Olx+1,sNx+Olx-1
225
226 C Mask Iso-neutral slopes
227 SlopeX(i,j)=SlopeX(i,j)*maskC(i,j,k,bi,bj)
228 SlopeY(i,j)=SlopeY(i,j)*maskC(i,j,k,bi,bj)
229 SlopeSqr(i,j)=SlopeSqr(i,j)*maskC(i,j,k,bi,bj)
230
231 ENDDO
232 ENDDO
233
234 #ifdef ALLOW_AUTODIFF_TAMC
235 CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
236 CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
237 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
238 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
239 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
240 #endif /* ALLOW_AUTODIFF_TAMC */
241
242 DO j=1-Oly+1,sNy+Oly-1
243 DO i=1-Olx+1,sNx+Olx-1
244
245 C Components of Redi/GM tensor
246 Kwx(i,j,k,bi,bj)= SlopeX(i,j)*taperFct(i,j)
247 Kwy(i,j,k,bi,bj)= SlopeY(i,j)*taperFct(i,j)
248 Kwz(i,j,k,bi,bj)= SlopeSqr(i,j)*taperFct(i,j)
249
250 #ifdef GM_VISBECK_VARIABLE_K
251
252 C- note (jmc) : moved here since only used in VISBECK_VARIABLE_K
253 C but do not know if *taperFct (or **2 ?) is necessary
254 Ssq(i,j)=SlopeSqr(i,j)*taperFct(i,j)
255
256 C-- Depth average of M^2/N^2 * N
257
258 C Calculate terms for mean Richardson number
259 C which is used in the "variable K" parameterisaton.
260 C Distance between interface above layer and the integration depth
261 deltaH=abs(GM_Visbeck_depth)-abs(rF(k))
262 C If positive we limit this to the layer thickness
263 deltaH=min(deltaH,drF(k))
264 C If negative then we are below the integration level
265 deltaH=max(deltaH,zero_rs)
266 C Now we convert deltaH to a non-dimensional fraction
267 deltaH=deltaH/GM_Visbeck_depth
268
269 IF (K.eq.2) VisbeckK(i,j,bi,bj)=0.
270 IF ( Ssq(i,j).NE.0. .AND. dSigmaDr(i,j).NE.0. ) THEN
271 N2= -Gravity*recip_RhoConst*dSigmaDr(i,j)
272 SN=sqrt(Ssq(i,j)*N2)
273 VisbeckK(i,j,bi,bj)=VisbeckK(i,j,bi,bj)+deltaH
274 & *GM_Visbeck_alpha*GM_Visbeck_length*GM_Visbeck_length*SN
275 ENDIF
276
277 #endif /* GM_VISBECK_VARIABLE_K */
278
279 ENDDO
280 ENDDO
281
282 C-- end 1rst loop on vertical level index k
283 ENDDO
284
285
286 #ifdef GM_VISBECK_VARIABLE_K
287 #ifdef ALLOW_AUTODIFF_TAMC
288 CADJ STORE VisbeckK(:,:,bi,bj) = comlev1_bibj, key=igmkey, byte=isbyte
289 #endif
290 IF ( GM_Visbeck_alpha.NE.0. ) THEN
291 C- Limit range that KapGM can take
292 DO j=1-Oly+1,sNy+Oly-1
293 DO i=1-Olx+1,sNx+Olx-1
294 VisbeckK(i,j,bi,bj)=
295 & MIN(VisbeckK(i,j,bi,bj),GM_Visbeck_maxval_K)
296 ENDDO
297 ENDDO
298 ENDIF
299 cph( NEW
300 #ifdef ALLOW_AUTODIFF_TAMC
301 CADJ STORE VisbeckK(:,:,bi,bj) = comlev1_bibj, key=igmkey, byte=isbyte
302 #endif
303 cph)
304 #endif /* GM_VISBECK_VARIABLE_K */
305
306
307 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
308
309 C-- 2nd loop on k : compute Tensor Coeff. at U,V levels.
310 DO k=1,Nr
311 kp1 = MIN(Nr,k+1)
312 maskp1 = 1. _d 0
313 IF (k.GE.Nr) maskp1 = 0. _d 0
314
315 #ifdef ALLOW_AUTODIFF_TAMC
316 kkey = (igmkey-1)*Nr + k
317 #if (defined (GM_NON_UNITY_DIAGONAL) || \
318 defined (GM_VISBECK_VARIABLE_K))
319 CADJ STORE Kwx(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
320 CADJ STORE Kwy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
321 CADJ STORE Kwz(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
322 #endif
323 #endif
324
325 C- express the Tensor in term of Diffusivity (= m**2 / s )
326 DO j=1-Oly+1,sNy+Oly-1
327 DO i=1-Olx+1,sNx+Olx-1
328 #ifdef ALLOW_KAPGM_CONTROL
329 Kgm_tmp = GM_isopycK + GM_skewflx*kapgm(i,j,k,bi,bj)
330 #else
331 Kgm_tmp = GM_isopycK + GM_skewflx*GM_background_K
332 #endif
333 #ifdef GM_VISBECK_VARIABLE_K
334 & + VisbeckK(i,j,bi,bj)*(1. _d 0 + GM_skewflx)
335 #endif
336 Kwx(i,j,k,bi,bj)= Kgm_tmp*Kwx(i,j,k,bi,bj)
337 Kwy(i,j,k,bi,bj)= Kgm_tmp*Kwy(i,j,k,bi,bj)
338 Kwz(i,j,k,bi,bj)= ( GM_isopycK
339 #ifdef GM_VISBECK_VARIABLE_K
340 & + VisbeckK(i,j,bi,bj)
341 #endif
342 & )*Kwz(i,j,k,bi,bj)
343 ENDDO
344 ENDDO
345
346 #if ( defined (GM_NON_UNITY_DIAGONAL) || defined (GM_EXTRA_DIAGONAL) )
347
348 C Gradient of Sigma at U points
349 DO j=1-Oly+1,sNy+Oly-1
350 DO i=1-Olx+1,sNx+Olx-1
351 dSigmaDx(i,j)=sigmaX(i,j,k)
352 & *_maskW(i,j,k,bi,bj)
353 dSigmaDy(i,j)=op25*( sigmaY(i-1,j+1,k) +sigmaY(i,j+1,k)
354 & +sigmaY(i-1, j ,k) +sigmaY(i, j ,k) )
355 & *_maskW(i,j,k,bi,bj)
356 dSigmaDr(i,j)=op25*( sigmaR(i-1,j, k ) +sigmaR(i,j, k )
357 & +maskp1*(sigmaR(i-1,j,kp1) +sigmaR(i,j,kp1)) )
358 & *_maskW(i,j,k,bi,bj)
359 ENDDO
360 ENDDO
361
362 #ifdef ALLOW_AUTODIFF_TAMC
363 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
364 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
365 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
366 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
367 #endif /* ALLOW_AUTODIFF_TAMC */
368
369 C Calculate slopes for use in tensor, taper and/or clip
370 CALL GMREDI_SLOPE_LIMIT(
371 O SlopeX, SlopeY,
372 O SlopeSqr, taperFct,
373 U dSigmaDr,
374 I dSigmaDx, dSigmaDy,
375 I ldd97_LrhoW,rC(k),k,
376 I bi, bj, myThid )
377
378 cph( NEW
379 #ifdef ALLOW_AUTODIFF_TAMC
380 cph(
381 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
382 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
383 cph)
384 #endif /* ALLOW_AUTODIFF_TAMC */
385 cph)
386
387 #ifdef GM_NON_UNITY_DIAGONAL
388 DO j=1-Oly+1,sNy+Oly-1
389 DO i=1-Olx+1,sNx+Olx-1
390 Kux(i,j,k,bi,bj) =
391 & ( GM_isopycK
392 #ifdef GM_VISBECK_VARIABLE_K
393 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))
394 #endif
395 & )
396 & *taperFct(i,j)
397 ENDDO
398 ENDDO
399 #ifdef ALLOW_AUTODIFF_TAMC
400 # ifdef GM_EXCLUDE_CLIPPING
401 CADJ STORE Kux(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
402 # endif
403 #endif
404 DO j=1-Oly+1,sNy+Oly-1
405 DO i=1-Olx+1,sNx+Olx-1
406 Kux(i,j,k,bi,bj) = MAX( Kux(i,j,k,bi,bj), GM_Kmin_horiz )
407 ENDDO
408 ENDDO
409 #endif /* GM_NON_UNITY_DIAGONAL */
410
411 #ifdef GM_EXTRA_DIAGONAL
412
413 #ifdef ALLOW_AUTODIFF_TAMC
414 CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
415 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
416 #endif /* ALLOW_AUTODIFF_TAMC */
417 IF (GM_ExtraDiag) THEN
418 DO j=1-Oly+1,sNy+Oly-1
419 DO i=1-Olx+1,sNx+Olx-1
420 Kuz(i,j,k,bi,bj) =
421 #ifdef ALLOW_KAPGM_CONTROL
422 & ( GM_isopycK - GM_skewflx*kapgm(i,j,k,bi,bj)
423 #else
424 & ( GM_isopycK - GM_skewflx*GM_background_K
425 #endif
426 #ifdef GM_VISBECK_VARIABLE_K
427 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*GM_advect
428 #endif
429 & )*SlopeX(i,j)*taperFct(i,j)
430 ENDDO
431 ENDDO
432 ENDIF
433 #endif /* GM_EXTRA_DIAGONAL */
434
435 #ifdef ALLOW_DIAGNOSTICS
436 IF (doDiagRediFlx) THEN
437 km1 = MAX(k-1,1)
438 DO j=1,sNy
439 DO i=1,sNx+1
440 C store in tmp1k Kuz_Redi
441 tmp1k(i,j) = ( GM_isopycK
442 #ifdef GM_VISBECK_VARIABLE_K
443 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*0.5 _d 0
444 #endif
445 & )*SlopeX(i,j)*taperFct(i,j)
446 ENDDO
447 ENDDO
448 DO j=1,sNy
449 DO i=1,sNx+1
450 C- Vertical gradients interpolated to U points
451 dTdz = (
452 & +recip_drC(k)*
453 & ( maskC(i-1,j,k,bi,bj)*
454 & (theta(i-1,j,km1,bi,bj)-theta(i-1,j,k,bi,bj))
455 & +maskC( i ,j,k,bi,bj)*
456 & (theta( i ,j,km1,bi,bj)-theta( i ,j,k,bi,bj))
457 & )
458 & +recip_drC(kp1)*
459 & ( maskC(i-1,j,kp1,bi,bj)*
460 & (theta(i-1,j,k,bi,bj)-theta(i-1,j,kp1,bi,bj))
461 & +maskC( i ,j,kp1,bi,bj)*
462 & (theta( i ,j,k,bi,bj)-theta( i ,j,kp1,bi,bj))
463 & ) ) * 0.25 _d 0
464 tmp1k(i,j) = dyG(i,j,bi,bj)*drF(k)
465 & * _hFacW(i,j,k,bi,bj)
466 & * tmp1k(i,j) * dTdz
467 ENDDO
468 ENDDO
469 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KuzTz', k,1,2,bi,bj,myThid)
470 ENDIF
471 #endif /* ALLOW_DIAGNOSTICS */
472
473 C Gradient of Sigma at V points
474 DO j=1-Oly+1,sNy+Oly-1
475 DO i=1-Olx+1,sNx+Olx-1
476 dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k)
477 & +sigmaX(i,j-1,k) +sigmaX(i+1,j-1,k) )
478 & *_maskS(i,j,k,bi,bj)
479 dSigmaDy(i,j)=sigmaY(i,j,k)
480 & *_maskS(i,j,k,bi,bj)
481 dSigmaDr(i,j)=op25*( sigmaR(i,j-1, k ) +sigmaR(i,j, k )
482 & +maskp1*(sigmaR(i,j-1,kp1) +sigmaR(i,j,kp1)) )
483 & *_maskS(i,j,k,bi,bj)
484 ENDDO
485 ENDDO
486
487 #ifdef ALLOW_AUTODIFF_TAMC
488 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
489 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
490 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
491 #endif /* ALLOW_AUTODIFF_TAMC */
492
493 C Calculate slopes for use in tensor, taper and/or clip
494 CALL GMREDI_SLOPE_LIMIT(
495 O SlopeX, SlopeY,
496 O SlopeSqr, taperFct,
497 U dSigmaDr,
498 I dSigmaDx, dSigmaDy,
499 I ldd97_LrhoS,rC(k),k,
500 I bi, bj, myThid )
501
502 cph(
503 #ifdef ALLOW_AUTODIFF_TAMC
504 cph(
505 CADJ STORE taperfct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
506 cph)
507 #endif /* ALLOW_AUTODIFF_TAMC */
508 cph)
509
510 #ifdef GM_NON_UNITY_DIAGONAL
511 DO j=1-Oly+1,sNy+Oly-1
512 DO i=1-Olx+1,sNx+Olx-1
513 Kvy(i,j,k,bi,bj) =
514 & ( GM_isopycK
515 #ifdef GM_VISBECK_VARIABLE_K
516 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))
517 #endif
518 & )
519 & *taperFct(i,j)
520 ENDDO
521 ENDDO
522 #ifdef ALLOW_AUTODIFF_TAMC
523 # ifdef GM_EXCLUDE_CLIPPING
524 CADJ STORE Kvy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
525 # endif
526 #endif
527 DO j=1-Oly+1,sNy+Oly-1
528 DO i=1-Olx+1,sNx+Olx-1
529 Kvy(i,j,k,bi,bj) = MAX( Kvy(i,j,k,bi,bj), GM_Kmin_horiz )
530 ENDDO
531 ENDDO
532 #endif /* GM_NON_UNITY_DIAGONAL */
533
534 #ifdef GM_EXTRA_DIAGONAL
535
536 #ifdef ALLOW_AUTODIFF_TAMC
537 CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
538 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
539 #endif /* ALLOW_AUTODIFF_TAMC */
540 IF (GM_ExtraDiag) THEN
541 DO j=1-Oly+1,sNy+Oly-1
542 DO i=1-Olx+1,sNx+Olx-1
543 Kvz(i,j,k,bi,bj) =
544 #ifdef ALLOW_KAPGM_CONTROL
545 & ( GM_isopycK - GM_skewflx*kapgm(i,j,k,bi,bj)
546 #else
547 & ( GM_isopycK - GM_skewflx*GM_background_K
548 #endif
549 #ifdef GM_VISBECK_VARIABLE_K
550 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*GM_advect
551 #endif
552 & )*SlopeY(i,j)*taperFct(i,j)
553 ENDDO
554 ENDDO
555 ENDIF
556 #endif /* GM_EXTRA_DIAGONAL */
557
558 #ifdef ALLOW_DIAGNOSTICS
559 IF (doDiagRediFlx) THEN
560 c km1 = MAX(k-1,1)
561 DO j=1,sNy+1
562 DO i=1,sNx
563 C store in tmp1k Kvz_Redi
564 tmp1k(i,j) = ( GM_isopycK
565 #ifdef GM_VISBECK_VARIABLE_K
566 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*0.5 _d 0
567 #endif
568 & )*SlopeY(i,j)*taperFct(i,j)
569 ENDDO
570 ENDDO
571 DO j=1,sNy+1
572 DO i=1,sNx
573 C- Vertical gradients interpolated to U points
574 dTdz = (
575 & +recip_drC(k)*
576 & ( maskC(i,j-1,k,bi,bj)*
577 & (theta(i,j-1,km1,bi,bj)-theta(i,j-1,k,bi,bj))
578 & +maskC(i, j ,k,bi,bj)*
579 & (theta(i, j ,km1,bi,bj)-theta(i, j ,k,bi,bj))
580 & )
581 & +recip_drC(kp1)*
582 & ( maskC(i,j-1,kp1,bi,bj)*
583 & (theta(i,j-1,k,bi,bj)-theta(i,j-1,kp1,bi,bj))
584 & +maskC(i, j ,kp1,bi,bj)*
585 & (theta(i, j ,k,bi,bj)-theta(i, j ,kp1,bi,bj))
586 & ) ) * 0.25 _d 0
587 tmp1k(i,j) = dxG(i,j,bi,bj)*drF(k)
588 & * _hFacS(i,j,k,bi,bj)
589 & * tmp1k(i,j) * dTdz
590 ENDDO
591 ENDDO
592 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KvzTz', k,1,2,bi,bj,myThid)
593 ENDIF
594 #endif /* ALLOW_DIAGNOSTICS */
595
596 #endif /* GM_NON_UNITY_DIAGONAL || GM_EXTRA_DIAGONAL */
597
598 C-- end 2nd loop on vertical level index k
599 ENDDO
600
601
602 #ifdef GM_BOLUS_ADVEC
603 IF (GM_AdvForm) THEN
604 CALL GMREDI_CALC_PSI_B(
605 I bi, bj, iMin, iMax, jMin, jMax,
606 I sigmaX, sigmaY, sigmaR,
607 I ldd97_LrhoW, ldd97_LrhoS,
608 I myThid )
609 ENDIF
610 #endif
611
612 #ifdef ALLOW_TIMEAVE
613 C-- Time-average
614 IF ( taveFreq.GT.0. ) THEN
615
616 CALL TIMEAVE_CUMULATE( GM_Kwx_T, Kwx, Nr,
617 & deltaTclock, bi, bj, myThid )
618 CALL TIMEAVE_CUMULATE( GM_Kwy_T, Kwy, Nr,
619 & deltaTclock, bi, bj, myThid )
620 CALL TIMEAVE_CUMULATE( GM_Kwz_T, Kwz, Nr,
621 & deltaTclock, bi, bj, myThid )
622 #ifdef GM_VISBECK_VARIABLE_K
623 IF ( GM_Visbeck_alpha.NE.0. ) THEN
624 CALL TIMEAVE_CUMULATE( Visbeck_K_T, VisbeckK, 1,
625 & deltaTclock, bi, bj, myThid )
626 ENDIF
627 #endif
628 #ifdef GM_BOLUS_ADVEC
629 IF ( GM_AdvForm ) THEN
630 CALL TIMEAVE_CUMULATE( GM_PsiXtave, GM_PsiX, Nr,
631 & deltaTclock, bi, bj, myThid )
632 CALL TIMEAVE_CUMULATE( GM_PsiYtave, GM_PsiY, Nr,
633 & deltaTclock, bi, bj, myThid )
634 ENDIF
635 #endif
636 DO k=1,Nr
637 GM_TimeAve(k,bi,bj)=GM_TimeAve(k,bi,bj)+deltaTclock
638 ENDDO
639
640 ENDIF
641 #endif /* ALLOW_TIMEAVE */
642
643 #ifdef ALLOW_DIAGNOSTICS
644 IF ( useDiagnostics ) THEN
645 CALL GMREDI_DIAGNOSTICS_FILL(bi,bj,myThid)
646 ENDIF
647 #endif /* ALLOW_DIAGNOSTICS */
648
649 #endif /* ALLOW_GMREDI */
650
651 RETURN
652 END
653
654
655 SUBROUTINE GMREDI_CALC_TENSOR_DUMMY(
656 I bi, bj, iMin, iMax, jMin, jMax,
657 I sigmaX, sigmaY, sigmaR,
658 I myThid )
659 C /==========================================================\
660 C | SUBROUTINE GMREDI_CALC_TENSOR |
661 C | o Calculate tensor elements for GM/Redi tensor. |
662 C |==========================================================|
663 C \==========================================================/
664 IMPLICIT NONE
665
666 C == Global variables ==
667 #include "SIZE.h"
668 #include "EEPARAMS.h"
669 #include "GMREDI.h"
670
671 C == Routine arguments ==
672 C
673 _RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
674 _RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
675 _RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
676 INTEGER bi,bj,iMin,iMax,jMin,jMax
677 INTEGER myThid
678 CEndOfInterface
679
680 INTEGER i, j, k
681
682 #ifdef ALLOW_GMREDI
683
684 DO k=1,Nr
685 DO j=1-Oly+1,sNy+Oly-1
686 DO i=1-Olx+1,sNx+Olx-1
687 Kwx(i,j,k,bi,bj) = 0.0
688 Kwy(i,j,k,bi,bj) = 0.0
689 Kwz(i,j,k,bi,bj) = 0.0
690 ENDDO
691 ENDDO
692 ENDDO
693 #endif /* ALLOW_GMREDI */
694
695 RETURN
696 END

  ViewVC Help
Powered by ViewVC 1.1.22