/[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.28 - (show annotations) (download)
Tue Jun 26 15:34:15 2007 UTC (16 years, 11 months ago) by heimbach
Branch: MAIN
Changes since 1.27: +21 -10 lines
Modify routines to restore adjoint.

1 C $Header: /u/gcmpack/MITgcm/pkg/gmredi/gmredi_calc_tensor.F,v 1.27 2007/06/21 01:33:01 jmc 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 #ifdef ALLOW_AUTODIFF_TAMC
436 kkey = (igmkey-1)*Nr + k
437 #if (defined (GM_NON_UNITY_DIAGONAL) || \
438 defined (GM_VISBECK_VARIABLE_K))
439 CADJ STORE Kwx(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
440 CADJ STORE Kwy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
441 CADJ STORE Kwz(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
442 #endif
443 #endif
444
445 C- express the Tensor in term of Diffusivity (= m**2 / s )
446 DO k=1,Nr
447 DO j=1-Oly+1,sNy+Oly-1
448 DO i=1-Olx+1,sNx+Olx-1
449 #ifdef ALLOW_KAPGM_CONTROL
450 Kgm_tmp = GM_isopycK + GM_skewflx*kapgm(i,j,k,bi,bj)
451 #else
452 Kgm_tmp = GM_isopycK + GM_skewflx*GM_background_K
453 #endif
454 #ifdef GM_VISBECK_VARIABLE_K
455 & + VisbeckK(i,j,bi,bj)*(1. _d 0 + GM_skewflx)
456 #endif
457 Kwx(i,j,k,bi,bj)= Kgm_tmp*Kwx(i,j,k,bi,bj)
458 Kwy(i,j,k,bi,bj)= Kgm_tmp*Kwy(i,j,k,bi,bj)
459 Kwz(i,j,k,bi,bj)= ( GM_isopycK
460 #ifdef GM_VISBECK_VARIABLE_K
461 & + VisbeckK(i,j,bi,bj)
462 #endif
463 & )*Kwz(i,j,k,bi,bj)
464 ENDDO
465 ENDDO
466 ENDDO
467
468 #ifdef ALLOW_DIAGNOSTICS
469 IF ( useDiagnostics .AND. GM_taper_scheme.EQ.'fm07' ) THEN
470 CALL DIAGNOSTICS_FILL( hTransLay, 'GM_hTrsL', 0,1,2,bi,bj,myThid)
471 CALL DIAGNOSTICS_FILL( baseSlope, 'GM_baseS', 0,1,2,bi,bj,myThid)
472 CALL DIAGNOSTICS_FILL(recipLambda,'GM_rLamb', 0,1,2,bi,bj,myThid)
473 ENDIF
474 #endif /* ALLOW_DIAGNOSTICS */
475
476
477 #if ( defined (GM_NON_UNITY_DIAGONAL) || defined (GM_EXTRA_DIAGONAL) )
478 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
479 C-- 2nd k loop : compute Tensor Coeff. at U point
480
481 #ifdef ALLOW_KPP
482 IF ( useKPP ) THEN
483 DO j=1-Oly,sNy+Oly
484 DO i=2-Olx,sNx+Olx
485 locMixLayer(i,j) = ( KPPhbl(i-1,j,bi,bj)
486 & + KPPhbl( i ,j,bi,bj) )*op5
487 ENDDO
488 ENDDO
489 ELSE
490 #else
491 IF ( .TRUE. ) THEN
492 #endif
493 DO j=1-Oly,sNy+Oly
494 DO i=2-Olx,sNx+Olx
495 locMixLayer(i,j) = ( hMixLayer(i-1,j,bi,bj)
496 & + hMixLayer( i ,j,bi,bj) )*op5
497 ENDDO
498 ENDDO
499 ENDIF
500 DO j=1-Oly,sNy+Oly
501 DO i=1-Olx,sNx+Olx
502 hTransLay(i,j) = 0.
503 baseSlope(i,j) = 0.
504 recipLambda(i,j)= 0.
505 ENDDO
506 DO i=2-Olx,sNx+Olx
507 hTransLay(i,j) = MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) )
508 ENDDO
509 ENDDO
510
511 DO k=Nr,1,-1
512 kp1 = MIN(Nr,k+1)
513 maskp1 = 1. _d 0
514 IF (k.GE.Nr) maskp1 = 0. _d 0
515
516 C Gradient of Sigma at U points
517 DO j=1-Oly+1,sNy+Oly-1
518 DO i=1-Olx+1,sNx+Olx-1
519 dSigmaDx(i,j)=sigmaX(i,j,k)
520 & *_maskW(i,j,k,bi,bj)
521 dSigmaDy(i,j)=op25*( sigmaY(i-1,j+1,k)+sigmaY(i,j+1,k)
522 & +sigmaY(i-1, j ,k)+sigmaY(i, j ,k)
523 & )*_maskW(i,j,k,bi,bj)
524 dSigmaDr(i,j)=op25*( sigmaR(i-1,j, k )+sigmaR(i,j, k )
525 & +(sigmaR(i-1,j,kp1)+sigmaR(i,j,kp1))*maskp1
526 & )*_maskW(i,j,k,bi,bj)
527 ENDDO
528 ENDDO
529
530 #ifdef ALLOW_AUTODIFF_TAMC
531 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
532 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
533 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
534 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
535 CADJ STORE locMixLayer(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
536 CADJ STORE baseSlope(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
537 CADJ STORE hTransLay(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
538 CADJ STORE recipLambda(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
539 #endif /* ALLOW_AUTODIFF_TAMC */
540
541 C Calculate slopes for use in tensor, taper and/or clip
542 CALL GMREDI_SLOPE_LIMIT(
543 O SlopeX, SlopeY,
544 O SlopeSqr, taperFct,
545 U hTransLay, baseSlope, recipLambda,
546 U dSigmaDr,
547 I dSigmaDx, dSigmaDy,
548 I ldd97_LrhoW, locMixLayer, rC,
549 I kLow_W,
550 I k, bi, bj, myTime, myIter, myThid )
551
552 cph( NEW
553 #ifdef ALLOW_AUTODIFF_TAMC
554 cph(
555 CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
556 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
557 cph)
558 #endif /* ALLOW_AUTODIFF_TAMC */
559 cph)
560
561 #ifdef GM_NON_UNITY_DIAGONAL
562 c IF ( GM_nonUnitDiag ) THEN
563 DO j=1-Oly+1,sNy+Oly-1
564 DO i=1-Olx+1,sNx+Olx-1
565 Kux(i,j,k,bi,bj) =
566 & ( GM_isopycK
567 #ifdef GM_VISBECK_VARIABLE_K
568 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))
569 #endif
570 & )*taperFct(i,j)
571 ENDDO
572 ENDDO
573 #ifdef ALLOW_AUTODIFF_TAMC
574 # ifdef GM_EXCLUDE_CLIPPING
575 CADJ STORE Kux(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
576 # endif
577 #endif
578 DO j=1-Oly+1,sNy+Oly-1
579 DO i=1-Olx+1,sNx+Olx-1
580 Kux(i,j,k,bi,bj) = MAX( Kux(i,j,k,bi,bj), GM_Kmin_horiz )
581 ENDDO
582 ENDDO
583 c ENDIF
584 #endif /* GM_NON_UNITY_DIAGONAL */
585
586 #ifdef GM_EXTRA_DIAGONAL
587
588 #ifdef ALLOW_AUTODIFF_TAMC
589 CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
590 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
591 #endif /* ALLOW_AUTODIFF_TAMC */
592 IF ( GM_ExtraDiag ) THEN
593 DO j=1-Oly+1,sNy+Oly-1
594 DO i=1-Olx+1,sNx+Olx-1
595 Kuz(i,j,k,bi,bj) =
596 #ifdef ALLOW_KAPGM_CONTROL
597 & ( GM_isopycK - GM_skewflx*kapgm(i,j,k,bi,bj)
598 #else
599 & ( GM_isopycK - GM_skewflx*GM_background_K
600 #endif
601 #ifdef GM_VISBECK_VARIABLE_K
602 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*GM_advect
603 #endif
604 & )*SlopeX(i,j)*taperFct(i,j)
605 ENDDO
606 ENDDO
607 ENDIF
608 #endif /* GM_EXTRA_DIAGONAL */
609
610 #ifdef ALLOW_DIAGNOSTICS
611 IF (doDiagRediFlx) THEN
612 km1 = MAX(k-1,1)
613 DO j=1,sNy
614 DO i=1,sNx+1
615 C store in tmp1k Kuz_Redi
616 tmp1k(i,j) = ( GM_isopycK
617 #ifdef GM_VISBECK_VARIABLE_K
618 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*0.5 _d 0
619 #endif
620 & )*SlopeX(i,j)*taperFct(i,j)
621 ENDDO
622 ENDDO
623 DO j=1,sNy
624 DO i=1,sNx+1
625 C- Vertical gradients interpolated to U points
626 dTdz = (
627 & +recip_drC(k)*
628 & ( maskC(i-1,j,k,bi,bj)*
629 & (theta(i-1,j,km1,bi,bj)-theta(i-1,j,k,bi,bj))
630 & +maskC( i ,j,k,bi,bj)*
631 & (theta( i ,j,km1,bi,bj)-theta( i ,j,k,bi,bj))
632 & )
633 & +recip_drC(kp1)*
634 & ( maskC(i-1,j,kp1,bi,bj)*
635 & (theta(i-1,j,k,bi,bj)-theta(i-1,j,kp1,bi,bj))
636 & +maskC( i ,j,kp1,bi,bj)*
637 & (theta( i ,j,k,bi,bj)-theta( i ,j,kp1,bi,bj))
638 & ) ) * 0.25 _d 0
639 tmp1k(i,j) = dyG(i,j,bi,bj)*drF(k)
640 & * _hFacW(i,j,k,bi,bj)
641 & * tmp1k(i,j) * dTdz
642 ENDDO
643 ENDDO
644 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KuzTz', k,1,2,bi,bj,myThid)
645 ENDIF
646 #endif /* ALLOW_DIAGNOSTICS */
647
648 C-- end 2nd loop on vertical level index k
649 ENDDO
650
651 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
652 C-- 3rd k loop : compute Tensor Coeff. at V point
653
654 #ifdef ALLOW_KPP
655 IF ( useKPP ) THEN
656 DO j=2-Oly,sNy+Oly
657 DO i=1-Olx,sNx+Olx
658 locMixLayer(i,j) = ( KPPhbl(i,j-1,bi,bj)
659 & + KPPhbl(i, j ,bi,bj) )*op5
660 ENDDO
661 ENDDO
662 ELSE
663 #else
664 IF ( .TRUE. ) THEN
665 #endif
666 DO j=2-Oly,sNy+Oly
667 DO i=1-Olx,sNx+Olx
668 locMixLayer(i,j) = ( hMixLayer(i,j-1,bi,bj)
669 & + hMixLayer(i, j ,bi,bj) )*op5
670 ENDDO
671 ENDDO
672 ENDIF
673 DO j=1-Oly,sNy+Oly
674 DO i=1-Olx,sNx+Olx
675 hTransLay(i,j) = 0.
676 baseSlope(i,j) = 0.
677 recipLambda(i,j)= 0.
678 ENDDO
679 ENDDO
680 DO j=2-Oly,sNy+Oly
681 DO i=1-Olx,sNx+Olx
682 hTransLay(i,j) = MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) )
683 ENDDO
684 ENDDO
685
686 C Gradient of Sigma at V points
687 DO k=Nr,1,-1
688 kp1 = MIN(Nr,k+1)
689 maskp1 = 1. _d 0
690 IF (k.GE.Nr) maskp1 = 0. _d 0
691
692 DO j=1-Oly+1,sNy+Oly-1
693 DO i=1-Olx+1,sNx+Olx-1
694 dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k)
695 & +sigmaX(i,j-1,k) +sigmaX(i+1,j-1,k)
696 & )*_maskS(i,j,k,bi,bj)
697 dSigmaDy(i,j)=sigmaY(i,j,k)
698 & *_maskS(i,j,k,bi,bj)
699 dSigmaDr(i,j)=op25*( sigmaR(i,j-1, k )+sigmaR(i,j, k )
700 & +(sigmaR(i,j-1,kp1)+sigmaR(i,j,kp1))*maskp1
701 & )*_maskS(i,j,k,bi,bj)
702 ENDDO
703 ENDDO
704
705 #ifdef ALLOW_AUTODIFF_TAMC
706 CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
707 CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
708 CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
709 CADJ STORE baseSlope(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
710 CADJ STORE hTransLay(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
711 CADJ STORE recipLambda(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
712 #endif /* ALLOW_AUTODIFF_TAMC */
713
714 C Calculate slopes for use in tensor, taper and/or clip
715 CALL GMREDI_SLOPE_LIMIT(
716 O SlopeX, SlopeY,
717 O SlopeSqr, taperFct,
718 U hTransLay, baseSlope, recipLambda,
719 U dSigmaDr,
720 I dSigmaDx, dSigmaDy,
721 I ldd97_LrhoS, locMixLayer, rC,
722 I kLow_S,
723 I k, bi, bj, myTime, myIter, myThid )
724
725 cph(
726 #ifdef ALLOW_AUTODIFF_TAMC
727 cph(
728 CADJ STORE taperfct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
729 cph)
730 #endif /* ALLOW_AUTODIFF_TAMC */
731 cph)
732
733 #ifdef GM_NON_UNITY_DIAGONAL
734 c IF ( GM_nonUnitDiag ) THEN
735 DO j=1-Oly+1,sNy+Oly-1
736 DO i=1-Olx+1,sNx+Olx-1
737 Kvy(i,j,k,bi,bj) =
738 & ( GM_isopycK
739 #ifdef GM_VISBECK_VARIABLE_K
740 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))
741 #endif
742 & )*taperFct(i,j)
743 ENDDO
744 ENDDO
745 #ifdef ALLOW_AUTODIFF_TAMC
746 # ifdef GM_EXCLUDE_CLIPPING
747 CADJ STORE Kvy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
748 # endif
749 #endif
750 DO j=1-Oly+1,sNy+Oly-1
751 DO i=1-Olx+1,sNx+Olx-1
752 Kvy(i,j,k,bi,bj) = MAX( Kvy(i,j,k,bi,bj), GM_Kmin_horiz )
753 ENDDO
754 ENDDO
755 c ENDIF
756 #endif /* GM_NON_UNITY_DIAGONAL */
757
758 #ifdef GM_EXTRA_DIAGONAL
759
760 #ifdef ALLOW_AUTODIFF_TAMC
761 CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
762 CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
763 #endif /* ALLOW_AUTODIFF_TAMC */
764 IF ( GM_ExtraDiag ) THEN
765 DO j=1-Oly+1,sNy+Oly-1
766 DO i=1-Olx+1,sNx+Olx-1
767 Kvz(i,j,k,bi,bj) =
768 #ifdef ALLOW_KAPGM_CONTROL
769 & ( GM_isopycK - GM_skewflx*kapgm(i,j,k,bi,bj)
770 #else
771 & ( GM_isopycK - GM_skewflx*GM_background_K
772 #endif
773 #ifdef GM_VISBECK_VARIABLE_K
774 & +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*GM_advect
775 #endif
776 & )*SlopeY(i,j)*taperFct(i,j)
777 ENDDO
778 ENDDO
779 ENDIF
780 #endif /* GM_EXTRA_DIAGONAL */
781
782 #ifdef ALLOW_DIAGNOSTICS
783 IF (doDiagRediFlx) THEN
784 c km1 = MAX(k-1,1)
785 DO j=1,sNy+1
786 DO i=1,sNx
787 C store in tmp1k Kvz_Redi
788 tmp1k(i,j) = ( GM_isopycK
789 #ifdef GM_VISBECK_VARIABLE_K
790 & +(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*0.5 _d 0
791 #endif
792 & )*SlopeY(i,j)*taperFct(i,j)
793 ENDDO
794 ENDDO
795 DO j=1,sNy+1
796 DO i=1,sNx
797 C- Vertical gradients interpolated to U points
798 dTdz = (
799 & +recip_drC(k)*
800 & ( maskC(i,j-1,k,bi,bj)*
801 & (theta(i,j-1,km1,bi,bj)-theta(i,j-1,k,bi,bj))
802 & +maskC(i, j ,k,bi,bj)*
803 & (theta(i, j ,km1,bi,bj)-theta(i, j ,k,bi,bj))
804 & )
805 & +recip_drC(kp1)*
806 & ( maskC(i,j-1,kp1,bi,bj)*
807 & (theta(i,j-1,k,bi,bj)-theta(i,j-1,kp1,bi,bj))
808 & +maskC(i, j ,kp1,bi,bj)*
809 & (theta(i, j ,k,bi,bj)-theta(i, j ,kp1,bi,bj))
810 & ) ) * 0.25 _d 0
811 tmp1k(i,j) = dxG(i,j,bi,bj)*drF(k)
812 & * _hFacS(i,j,k,bi,bj)
813 & * tmp1k(i,j) * dTdz
814 ENDDO
815 ENDDO
816 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KvzTz', k,1,2,bi,bj,myThid)
817 ENDIF
818 #endif /* ALLOW_DIAGNOSTICS */
819
820 C-- end 3rd loop on vertical level index k
821 ENDDO
822
823 #endif /* GM_NON_UNITY_DIAGONAL || GM_EXTRA_DIAGONAL */
824
825
826 #ifdef GM_BOLUS_ADVEC
827 IF (GM_AdvForm) THEN
828 CALL GMREDI_CALC_PSI_B(
829 I bi, bj, iMin, iMax, jMin, jMax,
830 I sigmaX, sigmaY, sigmaR,
831 I ldd97_LrhoW, ldd97_LrhoS,
832 I myThid )
833 ENDIF
834 #endif
835
836 #ifdef ALLOW_TIMEAVE
837 C-- Time-average
838 IF ( taveFreq.GT.0. ) THEN
839
840 CALL TIMEAVE_CUMULATE( GM_Kwx_T, Kwx, Nr,
841 & deltaTclock, bi, bj, myThid )
842 CALL TIMEAVE_CUMULATE( GM_Kwy_T, Kwy, Nr,
843 & deltaTclock, bi, bj, myThid )
844 CALL TIMEAVE_CUMULATE( GM_Kwz_T, Kwz, Nr,
845 & deltaTclock, bi, bj, myThid )
846 #ifdef GM_VISBECK_VARIABLE_K
847 IF ( GM_Visbeck_alpha.NE.0. ) THEN
848 CALL TIMEAVE_CUMULATE( Visbeck_K_T, VisbeckK, 1,
849 & deltaTclock, bi, bj, myThid )
850 ENDIF
851 #endif
852 #ifdef GM_BOLUS_ADVEC
853 IF ( GM_AdvForm ) THEN
854 CALL TIMEAVE_CUMULATE( GM_PsiXtave, GM_PsiX, Nr,
855 & deltaTclock, bi, bj, myThid )
856 CALL TIMEAVE_CUMULATE( GM_PsiYtave, GM_PsiY, Nr,
857 & deltaTclock, bi, bj, myThid )
858 ENDIF
859 #endif
860 DO k=1,Nr
861 GM_TimeAve(k,bi,bj)=GM_TimeAve(k,bi,bj)+deltaTclock
862 ENDDO
863
864 ENDIF
865 #endif /* ALLOW_TIMEAVE */
866
867 #ifdef ALLOW_DIAGNOSTICS
868 IF ( useDiagnostics ) THEN
869 CALL GMREDI_DIAGNOSTICS_FILL(bi,bj,myThid)
870 ENDIF
871 #endif /* ALLOW_DIAGNOSTICS */
872
873 #endif /* ALLOW_GMREDI */
874
875 RETURN
876 END
877
878
879 SUBROUTINE GMREDI_CALC_TENSOR_DUMMY(
880 I iMin, iMax, jMin, jMax,
881 I sigmaX, sigmaY, sigmaR,
882 I bi, bj, myTime, myIter, myThid )
883 C /==========================================================\
884 C | SUBROUTINE GMREDI_CALC_TENSOR |
885 C | o Calculate tensor elements for GM/Redi tensor. |
886 C |==========================================================|
887 C \==========================================================/
888 IMPLICIT NONE
889
890 C == Global variables ==
891 #include "SIZE.h"
892 #include "EEPARAMS.h"
893 #include "GMREDI.h"
894
895 C == Routine arguments ==
896 C
897 _RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
898 _RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
899 _RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
900 INTEGER iMin,iMax,jMin,jMax
901 INTEGER bi, bj
902 _RL myTime
903 INTEGER myIter
904 INTEGER myThid
905 CEndOfInterface
906
907 #ifdef ALLOW_GMREDI
908
909 INTEGER i, j, k
910
911 DO k=1,Nr
912 DO j=1-Oly+1,sNy+Oly-1
913 DO i=1-Olx+1,sNx+Olx-1
914 Kwx(i,j,k,bi,bj) = 0.0
915 Kwy(i,j,k,bi,bj) = 0.0
916 Kwz(i,j,k,bi,bj) = 0.0
917 ENDDO
918 ENDDO
919 ENDDO
920 #endif /* ALLOW_GMREDI */
921
922 RETURN
923 END

  ViewVC Help
Powered by ViewVC 1.1.22