/[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.24 - (show annotations) (download)
Tue Jun 20 22:55:08 2006 UTC (17 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58t_post, checkpoint58m_post, checkpoint58o_post, checkpoint58p_post, checkpoint58q_post, mitgcm_mapl_00, checkpoint58r_post, checkpoint58n_post, checkpoint58k_post, checkpoint58l_post, checkpoint58u_post, checkpoint58s_post
Changes since 1.23: +2 -2 lines
rename gmredi_diagnostics_driver.F to gmredi_diagnostics_fill.F
 (same name as in other packages)

1 C $Header: /u/gcmpack/MITgcm/pkg/gmredi/gmredi_calc_tensor.F,v 1.23 2006/06/07 01:55:14 heimbach 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 Kgm_tmp = GM_isopycK + GM_skewflx*GM_background_K
329 #ifdef GM_VISBECK_VARIABLE_K
330 & + VisbeckK(i,j,bi,bj)*(1. _d 0 + GM_skewflx)
331 #endif
332 Kwx(i,j,k,bi,bj)= Kgm_tmp*Kwx(i,j,k,bi,bj)
333 Kwy(i,j,k,bi,bj)= Kgm_tmp*Kwy(i,j,k,bi,bj)
334 Kwz(i,j,k,bi,bj)= ( GM_isopycK
335 #ifdef GM_VISBECK_VARIABLE_K
336 & + VisbeckK(i,j,bi,bj)
337 #endif
338 & )*Kwz(i,j,k,bi,bj)
339 ENDDO
340 ENDDO
341
342 #if ( defined (GM_NON_UNITY_DIAGONAL) || defined (GM_EXTRA_DIAGONAL) )
343
344 C Gradient of Sigma at U points
345 DO j=1-Oly+1,sNy+Oly-1
346 DO i=1-Olx+1,sNx+Olx-1
347 dSigmaDx(i,j)=sigmaX(i,j,k)
348 & *_maskW(i,j,k,bi,bj)
349 dSigmaDy(i,j)=op25*( sigmaY(i-1,j+1,k) +sigmaY(i,j+1,k)
350 & +sigmaY(i-1, j ,k) +sigmaY(i, j ,k) )
351 & *_maskW(i,j,k,bi,bj)
352 dSigmaDr(i,j)=op25*( sigmaR(i-1,j, k ) +sigmaR(i,j, k )
353 & +maskp1*(sigmaR(i-1,j,kp1) +sigmaR(i,j,kp1)) )
354 & *_maskW(i,j,k,bi,bj)
355 ENDDO
356 ENDDO
357
358 #ifdef ALLOW_AUTODIFF_TAMC
359 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
360 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
361 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
362 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
363 #endif /* ALLOW_AUTODIFF_TAMC */
364
365 C Calculate slopes for use in tensor, taper and/or clip
366 CALL GMREDI_SLOPE_LIMIT(
367 O SlopeX, SlopeY,
368 O SlopeSqr, taperFct,
369 U dSigmaDr,
370 I dSigmaDx, dSigmaDy,
371 I ldd97_LrhoW,rC(k),k,
372 I bi, bj, myThid )
373
374 cph( NEW
375 #ifdef ALLOW_AUTODIFF_TAMC
376 cph(
377 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
378 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
379 cph)
380 #endif /* ALLOW_AUTODIFF_TAMC */
381 cph)
382
383 #ifdef GM_NON_UNITY_DIAGONAL
384 DO j=1-Oly+1,sNy+Oly-1
385 DO i=1-Olx+1,sNx+Olx-1
386 Kux(i,j,k,bi,bj) =
387 & ( GM_isopycK
388 #ifdef GM_VISBECK_VARIABLE_K
389 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))
390 #endif
391 & )
392 & *taperFct(i,j)
393 ENDDO
394 ENDDO
395 #ifdef ALLOW_AUTODIFF_TAMC
396 # ifdef GM_EXCLUDE_CLIPPING
397 CADJ STORE Kux(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
398 # endif
399 #endif
400 DO j=1-Oly+1,sNy+Oly-1
401 DO i=1-Olx+1,sNx+Olx-1
402 Kux(i,j,k,bi,bj) = MAX( Kux(i,j,k,bi,bj), GM_Kmin_horiz )
403 ENDDO
404 ENDDO
405 #endif /* GM_NON_UNITY_DIAGONAL */
406
407 #ifdef GM_EXTRA_DIAGONAL
408
409 #ifdef ALLOW_AUTODIFF_TAMC
410 CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
411 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
412 #endif /* ALLOW_AUTODIFF_TAMC */
413 IF (GM_ExtraDiag) THEN
414 DO j=1-Oly+1,sNy+Oly-1
415 DO i=1-Olx+1,sNx+Olx-1
416 Kuz(i,j,k,bi,bj) =
417 & ( GM_isopycK - GM_skewflx*GM_background_K
418 #ifdef GM_VISBECK_VARIABLE_K
419 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*GM_advect
420 #endif
421 & )*SlopeX(i,j)*taperFct(i,j)
422 ENDDO
423 ENDDO
424 ENDIF
425 #endif /* GM_EXTRA_DIAGONAL */
426
427 #ifdef ALLOW_DIAGNOSTICS
428 IF (doDiagRediFlx) THEN
429 km1 = MAX(k-1,1)
430 DO j=1,sNy
431 DO i=1,sNx+1
432 C store in tmp1k Kuz_Redi
433 tmp1k(i,j) = ( GM_isopycK
434 #ifdef GM_VISBECK_VARIABLE_K
435 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*0.5 _d 0
436 #endif
437 & )*SlopeX(i,j)*taperFct(i,j)
438 ENDDO
439 ENDDO
440 DO j=1,sNy
441 DO i=1,sNx+1
442 C- Vertical gradients interpolated to U points
443 dTdz = (
444 & +recip_drC(k)*
445 & ( maskC(i-1,j,k,bi,bj)*
446 & (theta(i-1,j,km1,bi,bj)-theta(i-1,j,k,bi,bj))
447 & +maskC( i ,j,k,bi,bj)*
448 & (theta( i ,j,km1,bi,bj)-theta( i ,j,k,bi,bj))
449 & )
450 & +recip_drC(kp1)*
451 & ( maskC(i-1,j,kp1,bi,bj)*
452 & (theta(i-1,j,k,bi,bj)-theta(i-1,j,kp1,bi,bj))
453 & +maskC( i ,j,kp1,bi,bj)*
454 & (theta( i ,j,k,bi,bj)-theta( i ,j,kp1,bi,bj))
455 & ) ) * 0.25 _d 0
456 tmp1k(i,j) = dyG(i,j,bi,bj)*drF(k)
457 & * _hFacW(i,j,k,bi,bj)
458 & * tmp1k(i,j) * dTdz
459 ENDDO
460 ENDDO
461 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KuzTz', k,1,2,bi,bj,myThid)
462 ENDIF
463 #endif /* ALLOW_DIAGNOSTICS */
464
465 C Gradient of Sigma at V points
466 DO j=1-Oly+1,sNy+Oly-1
467 DO i=1-Olx+1,sNx+Olx-1
468 dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k)
469 & +sigmaX(i,j-1,k) +sigmaX(i+1,j-1,k) )
470 & *_maskS(i,j,k,bi,bj)
471 dSigmaDy(i,j)=sigmaY(i,j,k)
472 & *_maskS(i,j,k,bi,bj)
473 dSigmaDr(i,j)=op25*( sigmaR(i,j-1, k ) +sigmaR(i,j, k )
474 & +maskp1*(sigmaR(i,j-1,kp1) +sigmaR(i,j,kp1)) )
475 & *_maskS(i,j,k,bi,bj)
476 ENDDO
477 ENDDO
478
479 #ifdef ALLOW_AUTODIFF_TAMC
480 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
481 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
482 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
483 #endif /* ALLOW_AUTODIFF_TAMC */
484
485 C Calculate slopes for use in tensor, taper and/or clip
486 CALL GMREDI_SLOPE_LIMIT(
487 O SlopeX, SlopeY,
488 O SlopeSqr, taperFct,
489 U dSigmaDr,
490 I dSigmaDx, dSigmaDy,
491 I ldd97_LrhoS,rC(k),k,
492 I bi, bj, myThid )
493
494 cph(
495 #ifdef ALLOW_AUTODIFF_TAMC
496 cph(
497 CADJ STORE taperfct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
498 cph)
499 #endif /* ALLOW_AUTODIFF_TAMC */
500 cph)
501
502 #ifdef GM_NON_UNITY_DIAGONAL
503 DO j=1-Oly+1,sNy+Oly-1
504 DO i=1-Olx+1,sNx+Olx-1
505 Kvy(i,j,k,bi,bj) =
506 & ( GM_isopycK
507 #ifdef GM_VISBECK_VARIABLE_K
508 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))
509 #endif
510 & )
511 & *taperFct(i,j)
512 ENDDO
513 ENDDO
514 #ifdef ALLOW_AUTODIFF_TAMC
515 # ifdef GM_EXCLUDE_CLIPPING
516 CADJ STORE Kvy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
517 # endif
518 #endif
519 DO j=1-Oly+1,sNy+Oly-1
520 DO i=1-Olx+1,sNx+Olx-1
521 Kvy(i,j,k,bi,bj) = MAX( Kvy(i,j,k,bi,bj), GM_Kmin_horiz )
522 ENDDO
523 ENDDO
524 #endif /* GM_NON_UNITY_DIAGONAL */
525
526 #ifdef GM_EXTRA_DIAGONAL
527
528 #ifdef ALLOW_AUTODIFF_TAMC
529 CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
530 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
531 #endif /* ALLOW_AUTODIFF_TAMC */
532 IF (GM_ExtraDiag) THEN
533 DO j=1-Oly+1,sNy+Oly-1
534 DO i=1-Olx+1,sNx+Olx-1
535 Kvz(i,j,k,bi,bj) =
536 & ( GM_isopycK - GM_skewflx*GM_background_K
537 #ifdef GM_VISBECK_VARIABLE_K
538 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*GM_advect
539 #endif
540 & )*SlopeY(i,j)*taperFct(i,j)
541 ENDDO
542 ENDDO
543 ENDIF
544 #endif /* GM_EXTRA_DIAGONAL */
545
546 #ifdef ALLOW_DIAGNOSTICS
547 IF (doDiagRediFlx) THEN
548 c km1 = MAX(k-1,1)
549 DO j=1,sNy+1
550 DO i=1,sNx
551 C store in tmp1k Kvz_Redi
552 tmp1k(i,j) = ( GM_isopycK
553 #ifdef GM_VISBECK_VARIABLE_K
554 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*0.5 _d 0
555 #endif
556 & )*SlopeY(i,j)*taperFct(i,j)
557 ENDDO
558 ENDDO
559 DO j=1,sNy+1
560 DO i=1,sNx
561 C- Vertical gradients interpolated to U points
562 dTdz = (
563 & +recip_drC(k)*
564 & ( maskC(i,j-1,k,bi,bj)*
565 & (theta(i,j-1,km1,bi,bj)-theta(i,j-1,k,bi,bj))
566 & +maskC(i, j ,k,bi,bj)*
567 & (theta(i, j ,km1,bi,bj)-theta(i, j ,k,bi,bj))
568 & )
569 & +recip_drC(kp1)*
570 & ( maskC(i,j-1,kp1,bi,bj)*
571 & (theta(i,j-1,k,bi,bj)-theta(i,j-1,kp1,bi,bj))
572 & +maskC(i, j ,kp1,bi,bj)*
573 & (theta(i, j ,k,bi,bj)-theta(i, j ,kp1,bi,bj))
574 & ) ) * 0.25 _d 0
575 tmp1k(i,j) = dxG(i,j,bi,bj)*drF(k)
576 & * _hFacS(i,j,k,bi,bj)
577 & * tmp1k(i,j) * dTdz
578 ENDDO
579 ENDDO
580 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KvzTz', k,1,2,bi,bj,myThid)
581 ENDIF
582 #endif /* ALLOW_DIAGNOSTICS */
583
584 #endif /* GM_NON_UNITY_DIAGONAL || GM_EXTRA_DIAGONAL */
585
586 C-- end 2nd loop on vertical level index k
587 ENDDO
588
589
590 #ifdef GM_BOLUS_ADVEC
591 IF (GM_AdvForm) THEN
592 CALL GMREDI_CALC_PSI_B(
593 I bi, bj, iMin, iMax, jMin, jMax,
594 I sigmaX, sigmaY, sigmaR,
595 I ldd97_LrhoW, ldd97_LrhoS,
596 I myThid )
597 ENDIF
598 #endif
599
600 #ifdef ALLOW_TIMEAVE
601 C-- Time-average
602 IF ( taveFreq.GT.0. ) THEN
603
604 CALL TIMEAVE_CUMULATE( GM_Kwx_T, Kwx, Nr,
605 & deltaTclock, bi, bj, myThid )
606 CALL TIMEAVE_CUMULATE( GM_Kwy_T, Kwy, Nr,
607 & deltaTclock, bi, bj, myThid )
608 CALL TIMEAVE_CUMULATE( GM_Kwz_T, Kwz, Nr,
609 & deltaTclock, bi, bj, myThid )
610 #ifdef GM_VISBECK_VARIABLE_K
611 IF ( GM_Visbeck_alpha.NE.0. ) THEN
612 CALL TIMEAVE_CUMULATE( Visbeck_K_T, VisbeckK, 1,
613 & deltaTclock, bi, bj, myThid )
614 ENDIF
615 #endif
616 #ifdef GM_BOLUS_ADVEC
617 IF ( GM_AdvForm ) THEN
618 CALL TIMEAVE_CUMULATE( GM_PsiXtave, GM_PsiX, Nr,
619 & deltaTclock, bi, bj, myThid )
620 CALL TIMEAVE_CUMULATE( GM_PsiYtave, GM_PsiY, Nr,
621 & deltaTclock, bi, bj, myThid )
622 ENDIF
623 #endif
624 DO k=1,Nr
625 GM_TimeAve(k,bi,bj)=GM_TimeAve(k,bi,bj)+deltaTclock
626 ENDDO
627
628 ENDIF
629 #endif /* ALLOW_TIMEAVE */
630
631 #ifdef ALLOW_DIAGNOSTICS
632 IF ( useDiagnostics ) THEN
633 CALL GMREDI_DIAGNOSTICS_FILL(bi,bj,myThid)
634 ENDIF
635 #endif /* ALLOW_DIAGNOSTICS */
636
637 #endif /* ALLOW_GMREDI */
638
639 RETURN
640 END
641
642
643 SUBROUTINE GMREDI_CALC_TENSOR_DUMMY(
644 I bi, bj, iMin, iMax, jMin, jMax,
645 I sigmaX, sigmaY, sigmaR,
646 I myThid )
647 C /==========================================================\
648 C | SUBROUTINE GMREDI_CALC_TENSOR |
649 C | o Calculate tensor elements for GM/Redi tensor. |
650 C |==========================================================|
651 C \==========================================================/
652 IMPLICIT NONE
653
654 C == Global variables ==
655 #include "SIZE.h"
656 #include "EEPARAMS.h"
657 #include "GMREDI.h"
658
659 C == Routine arguments ==
660 C
661 _RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
662 _RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
663 _RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
664 INTEGER bi,bj,iMin,iMax,jMin,jMax
665 INTEGER myThid
666 CEndOfInterface
667
668 INTEGER i, j, k
669
670 #ifdef ALLOW_GMREDI
671
672 DO k=1,Nr
673 DO j=1-Oly+1,sNy+Oly-1
674 DO i=1-Olx+1,sNx+Olx-1
675 Kwx(i,j,k,bi,bj) = 0.0
676 Kwy(i,j,k,bi,bj) = 0.0
677 Kwz(i,j,k,bi,bj) = 0.0
678 ENDDO
679 ENDDO
680 ENDDO
681 #endif /* ALLOW_GMREDI */
682
683 RETURN
684 END

  ViewVC Help
Powered by ViewVC 1.1.22