2 |
C $Name$ |
C $Name$ |
3 |
|
|
4 |
#include "GMREDI_OPTIONS.h" |
#include "GMREDI_OPTIONS.h" |
5 |
|
#ifdef ALLOW_KPP |
6 |
|
# include "KPP_OPTIONS.h" |
7 |
|
#endif |
8 |
#undef OLD_VISBECK_CALC |
#undef OLD_VISBECK_CALC |
9 |
|
|
10 |
CStartOfInterface |
CBOP |
11 |
|
C !ROUTINE: GMREDI_CALC_TENSOR |
12 |
|
C !INTERFACE: |
13 |
SUBROUTINE GMREDI_CALC_TENSOR( |
SUBROUTINE GMREDI_CALC_TENSOR( |
14 |
I bi, bj, iMin, iMax, jMin, jMax, |
I iMin, iMax, jMin, jMax, |
15 |
I sigmaX, sigmaY, sigmaR, |
I sigmaX, sigmaY, sigmaR, |
16 |
I myThid ) |
I bi, bj, myTime, myIter, myThid ) |
17 |
C /==========================================================\ |
|
18 |
C | SUBROUTINE GMREDI_CALC_TENSOR | |
C !DESCRIPTION: \bv |
19 |
C | o Calculate tensor elements for GM/Redi tensor. | |
C *==========================================================* |
20 |
C |==========================================================| |
C | SUBROUTINE GMREDI_CALC_TENSOR |
21 |
C \==========================================================/ |
C | o Calculate tensor elements for GM/Redi tensor. |
22 |
|
C *==========================================================* |
23 |
|
C *==========================================================* |
24 |
|
C \ev |
25 |
|
|
26 |
|
C !USES: |
27 |
IMPLICIT NONE |
IMPLICIT NONE |
28 |
|
|
29 |
C == Global variables == |
C == Global variables == |
34 |
#include "PARAMS.h" |
#include "PARAMS.h" |
35 |
#include "GMREDI.h" |
#include "GMREDI.h" |
36 |
#include "GMREDI_TAVE.h" |
#include "GMREDI_TAVE.h" |
37 |
|
#ifdef ALLOW_KPP |
38 |
|
# include "KPP.h" |
39 |
|
#endif |
40 |
|
|
41 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
42 |
#include "tamc.h" |
#include "tamc.h" |
43 |
#include "tamc_keys.h" |
#include "tamc_keys.h" |
44 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
45 |
|
|
46 |
|
C !INPUT/OUTPUT PARAMETERS: |
47 |
C == Routine arguments == |
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 |
C |
53 |
|
INTEGER iMin,iMax,jMin,jMax |
54 |
_RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
55 |
_RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
56 |
_RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
57 |
INTEGER bi,bj,iMin,iMax,jMin,jMax |
INTEGER bi, bj |
58 |
|
_RL myTime |
59 |
|
INTEGER myIter |
60 |
INTEGER myThid |
INTEGER myThid |
61 |
CEndOfInterface |
CEOP |
62 |
|
|
63 |
#ifdef ALLOW_GMREDI |
#ifdef ALLOW_GMREDI |
64 |
|
|
65 |
|
C !LOCAL VARIABLES: |
66 |
C == Local variables == |
C == Local variables == |
67 |
INTEGER i,j,k,kp1 |
INTEGER i,j,k,kp1 |
68 |
_RL SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
78 |
_RL ldd97_LrhoS(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL ldd97_LrhoS(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
79 |
_RL Cspd, LrhoInf, LrhoSup, fCoriLoc |
_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 |
#ifdef GM_VISBECK_VARIABLE_K |
89 |
#ifdef OLD_VISBECK_CALC |
#ifdef OLD_VISBECK_CALC |
90 |
_RL deltaH,zero_rs |
_RL deltaH,zero_rs |
140 |
#endif |
#endif |
141 |
|
|
142 |
C-- set ldd97_Lrho (for tapering scheme ldd97): |
C-- set ldd97_Lrho (for tapering scheme ldd97): |
143 |
IF (GM_taper_scheme.EQ.'ldd97') THEN |
IF ( GM_taper_scheme.EQ.'ldd97' .OR. |
144 |
|
& GM_taper_scheme.EQ.'fm07' ) THEN |
145 |
Cspd = 2. _d 0 |
Cspd = 2. _d 0 |
146 |
LrhoInf = 15. _d 3 |
LrhoInf = 15. _d 3 |
147 |
LrhoSup = 100. _d 3 |
LrhoSup = 100. _d 3 |
158 |
ENDDO |
ENDDO |
159 |
C- U point location (West): |
C- U point location (West): |
160 |
DO j=1-Oly,sNy+Oly |
DO j=1-Oly,sNy+Oly |
161 |
|
kLow_W(1-Olx,j) = 0 |
162 |
ldd97_LrhoW(1-Olx,j) = LrhoSup |
ldd97_LrhoW(1-Olx,j) = LrhoSup |
163 |
DO i=1-Olx+1,sNx+Olx |
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)) |
fCoriLoc = op5*(fCori(i-1,j,bi,bj)+fCori(i,j,bi,bj)) |
166 |
IF (fCoriLoc.NE.0.) THEN |
IF (fCoriLoc.NE.0.) THEN |
167 |
ldd97_LrhoW(i,j) = Cspd/ABS(fCoriLoc) |
ldd97_LrhoW(i,j) = Cspd/ABS(fCoriLoc) |
173 |
ENDDO |
ENDDO |
174 |
C- V point location (South): |
C- V point location (South): |
175 |
DO i=1-Olx+1,sNx+Olx |
DO i=1-Olx+1,sNx+Olx |
176 |
|
kLow_S(i,1-Oly) = 0 |
177 |
ldd97_LrhoS(i,1-Oly) = LrhoSup |
ldd97_LrhoS(i,1-Oly) = LrhoSup |
178 |
ENDDO |
ENDDO |
179 |
DO j=1-Oly+1,sNy+Oly |
DO j=1-Oly+1,sNy+Oly |
180 |
DO i=1-Olx,sNx+Olx |
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)) |
fCoriLoc = op5*(fCori(i,j-1,bi,bj)+fCori(i,j,bi,bj)) |
183 |
IF (fCoriLoc.NE.0.) THEN |
IF (fCoriLoc.NE.0.) THEN |
184 |
ldd97_LrhoS(i,j) = Cspd/ABS(fCoriLoc) |
ldd97_LrhoS(i,j) = Cspd/ABS(fCoriLoc) |
198 |
ENDDO |
ENDDO |
199 |
ENDDO |
ENDDO |
200 |
ENDIF |
ENDIF |
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
|
201 |
|
|
202 |
DO k=2,Nr |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
203 |
C-- 1rst loop on k : compute Tensor Coeff. at W points. |
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 |
#ifdef ALLOW_AUTODIFF_TAMC |
234 |
kkey = (igmkey-1)*Nr + k |
kkey = (igmkey-1)*Nr + k |
235 |
DO j=1-Oly,sNy+Oly |
DO j=1-Oly,sNy+Oly |
277 |
CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
278 |
CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
279 |
CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
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 */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
284 |
|
|
285 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
340 |
CALL GMREDI_SLOPE_LIMIT( |
CALL GMREDI_SLOPE_LIMIT( |
341 |
O SlopeX, SlopeY, |
O SlopeX, SlopeY, |
342 |
O SlopeSqr, taperFct, |
O SlopeSqr, taperFct, |
343 |
|
U hTransLay, baseSlope, recipLambda, |
344 |
U dSigmaDr, |
U dSigmaDr, |
345 |
I dSigmaDx, dSigmaDy, |
I dSigmaDx, dSigmaDy, |
346 |
I ldd97_LrhoC,rF(k),k, |
I ldd97_LrhoC, locMixLayer, rF, |
347 |
I bi, bj, myThid ) |
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 |
DO j=1-Oly+1,sNy+Oly-1 |
351 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
364 |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
365 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
366 |
|
|
367 |
|
C Components of Redi/GM tensor |
368 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
369 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
370 |
C Components of Redi/GM tensor |
Kwx(i,j,k,bi,bj)= SlopeX(i,j)*taperFct(i,j) |
371 |
Kwx(i,j,k,bi,bj)= SlopeX(i,j)*taperFct(i,j) |
Kwy(i,j,k,bi,bj)= SlopeY(i,j)*taperFct(i,j) |
372 |
Kwy(i,j,k,bi,bj)= SlopeY(i,j)*taperFct(i,j) |
Kwz(i,j,k,bi,bj)= SlopeSqr(i,j)*taperFct(i,j) |
373 |
Kwz(i,j,k,bi,bj)= SlopeSqr(i,j)*taperFct(i,j) |
ENDDO |
374 |
|
ENDDO |
375 |
|
|
376 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
377 |
#ifdef OLD_VISBECK_CALC |
#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 |
C- note (jmc) : moved here since only used in VISBECK_VARIABLE_K |
382 |
C but do not know if *taperFct (or **2 ?) is necessary |
C but do not know if *taperFct (or **2 ?) is necessary |
383 |
Ssq(i,j)=SlopeSqr(i,j)*taperFct(i,j) |
Ssq(i,j)=SlopeSqr(i,j)*taperFct(i,j) |
384 |
|
|
385 |
C-- Depth average of M^2/N^2 * N |
C-- Depth average of M^2/N^2 * N |
403 |
& *GM_Visbeck_alpha*GM_Visbeck_length*GM_Visbeck_length*SN |
& *GM_Visbeck_alpha*GM_Visbeck_length*GM_Visbeck_length*SN |
404 |
ENDIF |
ENDIF |
405 |
|
|
|
#endif /* OLD_VISBECK_CALC */ |
|
|
#endif /* GM_VISBECK_VARIABLE_K */ |
|
406 |
ENDDO |
ENDDO |
407 |
ENDDO |
ENDDO |
408 |
|
#endif /* OLD_VISBECK_CALC */ |
409 |
|
#endif /* GM_VISBECK_VARIABLE_K */ |
410 |
|
|
411 |
C-- end 1rst loop on vertical level index k |
C-- end 1rst loop on vertical level index k |
412 |
ENDDO |
ENDDO |
416 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
417 |
CADJ STORE VisbeckK(:,:,bi,bj) = comlev1_bibj, key=igmkey, byte=isbyte |
CADJ STORE VisbeckK(:,:,bi,bj) = comlev1_bibj, key=igmkey, byte=isbyte |
418 |
#endif |
#endif |
419 |
IF ( GM_Visbeck_alpha.NE.0. ) THEN |
IF ( GM_Visbeck_alpha.GT.0. ) THEN |
420 |
C- Limit range that KapGM can take |
C- Limit range that KapGM can take |
421 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
422 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
432 |
cph) |
cph) |
433 |
#endif /* GM_VISBECK_VARIABLE_K */ |
#endif /* GM_VISBECK_VARIABLE_K */ |
434 |
|
|
435 |
|
C- express the Tensor in term of Diffusivity (= m**2 / s ) |
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
|
|
|
|
|
C-- 2nd loop on k : compute Tensor Coeff. at U,V levels. |
|
436 |
DO k=1,Nr |
DO k=1,Nr |
|
kp1 = MIN(Nr,k+1) |
|
|
maskp1 = 1. _d 0 |
|
|
IF (k.GE.Nr) maskp1 = 0. _d 0 |
|
|
|
|
437 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
438 |
kkey = (igmkey-1)*Nr + k |
kkey = (igmkey-1)*Nr + k |
439 |
#if (defined (GM_NON_UNITY_DIAGONAL) || \ |
# if (defined (GM_NON_UNITY_DIAGONAL) || \ |
440 |
defined (GM_VISBECK_VARIABLE_K)) |
defined (GM_VISBECK_VARIABLE_K)) |
441 |
CADJ STORE Kwx(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte |
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 |
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 |
CADJ STORE Kwz(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte |
444 |
|
# endif |
445 |
#endif |
#endif |
|
#endif |
|
|
|
|
|
C- express the Tensor in term of Diffusivity (= m**2 / s ) |
|
446 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
447 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
448 |
#ifdef ALLOW_KAPGM_CONTROL |
#ifdef ALLOW_KAPREDI_CONTROL |
449 |
Kgm_tmp = GM_isopycK + GM_skewflx*kapgm(i,j,k,bi,bj) |
Kgm_tmp = kapredi(i,j,k,bi,bj) |
450 |
#else |
#else |
451 |
Kgm_tmp = GM_isopycK + GM_skewflx*GM_background_K |
Kgm_tmp = GM_isopycK |
452 |
|
#endif |
453 |
|
#if (defined (ALLOW_AUTODIFF) && defined (ALLOW_KAPGM_CONTROL)) |
454 |
|
& + GM_skewflx*kapgm(i,j,k,bi,bj) |
455 |
|
#else |
456 |
|
& + GM_skewflx*GM_background_K |
457 |
#endif |
#endif |
458 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
459 |
& + VisbeckK(i,j,bi,bj)*(1. _d 0 + GM_skewflx) |
& + VisbeckK(i,j,bi,bj)*(1. _d 0 + GM_skewflx) |
460 |
#endif |
#endif |
461 |
Kwx(i,j,k,bi,bj)= Kgm_tmp*Kwx(i,j,k,bi,bj) |
Kwx(i,j,k,bi,bj)= Kgm_tmp*Kwx(i,j,k,bi,bj) |
462 |
Kwy(i,j,k,bi,bj)= Kgm_tmp*Kwy(i,j,k,bi,bj) |
Kwy(i,j,k,bi,bj)= Kgm_tmp*Kwy(i,j,k,bi,bj) |
463 |
|
#ifdef ALLOW_KAPREDI_CONTROL |
464 |
|
Kwz(i,j,k,bi,bj)= ( kapredi(i,j,k,bi,bj) |
465 |
|
#else |
466 |
Kwz(i,j,k,bi,bj)= ( GM_isopycK |
Kwz(i,j,k,bi,bj)= ( GM_isopycK |
467 |
|
#endif |
468 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
469 |
& + VisbeckK(i,j,bi,bj) |
& + VisbeckK(i,j,bi,bj) |
470 |
#endif |
#endif |
471 |
& )*Kwz(i,j,k,bi,bj) |
& )*Kwz(i,j,k,bi,bj) |
472 |
ENDDO |
ENDDO |
473 |
ENDDO |
ENDDO |
474 |
|
ENDDO |
475 |
|
|
476 |
|
#ifdef ALLOW_DIAGNOSTICS |
477 |
|
IF ( useDiagnostics .AND. GM_taper_scheme.EQ.'fm07' ) THEN |
478 |
|
CALL DIAGNOSTICS_FILL( hTransLay, 'GM_hTrsL', 0,1,2,bi,bj,myThid) |
479 |
|
CALL DIAGNOSTICS_FILL( baseSlope, 'GM_baseS', 0,1,2,bi,bj,myThid) |
480 |
|
CALL DIAGNOSTICS_FILL(recipLambda,'GM_rLamb', 0,1,2,bi,bj,myThid) |
481 |
|
ENDIF |
482 |
|
#endif /* ALLOW_DIAGNOSTICS */ |
483 |
|
|
484 |
|
|
485 |
#if ( defined (GM_NON_UNITY_DIAGONAL) || defined (GM_EXTRA_DIAGONAL) ) |
#if ( defined (GM_NON_UNITY_DIAGONAL) || defined (GM_EXTRA_DIAGONAL) ) |
486 |
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
487 |
|
C-- 2nd k loop : compute Tensor Coeff. at U point |
488 |
|
|
489 |
|
#ifdef ALLOW_KPP |
490 |
|
IF ( useKPP ) THEN |
491 |
|
DO j=1-Oly,sNy+Oly |
492 |
|
DO i=2-Olx,sNx+Olx |
493 |
|
locMixLayer(i,j) = ( KPPhbl(i-1,j,bi,bj) |
494 |
|
& + KPPhbl( i ,j,bi,bj) )*op5 |
495 |
|
ENDDO |
496 |
|
ENDDO |
497 |
|
ELSE |
498 |
|
#else |
499 |
|
IF ( .TRUE. ) THEN |
500 |
|
#endif |
501 |
|
DO j=1-Oly,sNy+Oly |
502 |
|
DO i=2-Olx,sNx+Olx |
503 |
|
locMixLayer(i,j) = ( hMixLayer(i-1,j,bi,bj) |
504 |
|
& + hMixLayer( i ,j,bi,bj) )*op5 |
505 |
|
ENDDO |
506 |
|
ENDDO |
507 |
|
ENDIF |
508 |
|
DO j=1-Oly,sNy+Oly |
509 |
|
DO i=1-Olx,sNx+Olx |
510 |
|
hTransLay(i,j) = 0. |
511 |
|
baseSlope(i,j) = 0. |
512 |
|
recipLambda(i,j)= 0. |
513 |
|
ENDDO |
514 |
|
DO i=2-Olx,sNx+Olx |
515 |
|
hTransLay(i,j) = MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) ) |
516 |
|
ENDDO |
517 |
|
ENDDO |
518 |
|
|
519 |
|
DO k=Nr,1,-1 |
520 |
|
kp1 = MIN(Nr,k+1) |
521 |
|
maskp1 = 1. _d 0 |
522 |
|
IF (k.GE.Nr) maskp1 = 0. _d 0 |
523 |
|
#ifdef ALLOW_AUTODIFF_TAMC |
524 |
|
kkey = (igmkey-1)*Nr + k |
525 |
|
#endif |
526 |
|
|
527 |
C Gradient of Sigma at U points |
C Gradient of Sigma at U points |
528 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
542 |
CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
543 |
CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
544 |
CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
545 |
CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
546 |
|
CADJ STORE locMixLayer(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
547 |
|
CADJ STORE baseSlope(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
548 |
|
CADJ STORE hTransLay(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
549 |
|
CADJ STORE recipLambda(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
550 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
551 |
|
|
552 |
C Calculate slopes for use in tensor, taper and/or clip |
C Calculate slopes for use in tensor, taper and/or clip |
553 |
CALL GMREDI_SLOPE_LIMIT( |
CALL GMREDI_SLOPE_LIMIT( |
554 |
O SlopeX, SlopeY, |
O SlopeX, SlopeY, |
555 |
O SlopeSqr, taperFct, |
O SlopeSqr, taperFct, |
556 |
|
U hTransLay, baseSlope, recipLambda, |
557 |
U dSigmaDr, |
U dSigmaDr, |
558 |
I dSigmaDx, dSigmaDy, |
I dSigmaDx, dSigmaDy, |
559 |
I ldd97_LrhoW,rC(k),k, |
I ldd97_LrhoW, locMixLayer, rC, |
560 |
I bi, bj, myThid ) |
I kLow_W, |
561 |
|
I k, bi, bj, myTime, myIter, myThid ) |
562 |
|
|
|
cph( NEW |
|
563 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
|
cph( |
|
564 |
CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE SlopeSqr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
565 |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
|
cph) |
|
566 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
cph) |
|
567 |
|
|
568 |
#ifdef GM_NON_UNITY_DIAGONAL |
#ifdef GM_NON_UNITY_DIAGONAL |
569 |
c IF ( GM_nonUnitDiag ) THEN |
c IF ( GM_nonUnitDiag ) THEN |
570 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
571 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
572 |
Kux(i,j,k,bi,bj) = |
Kux(i,j,k,bi,bj) = |
573 |
|
#ifdef ALLOW_KAPREDI_CONTROL |
574 |
|
& ( kapredi(i,j,k,bi,bj) |
575 |
|
#else |
576 |
& ( GM_isopycK |
& ( GM_isopycK |
577 |
|
#endif |
578 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
579 |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj)) |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj)) |
580 |
#endif |
#endif |
581 |
& ) |
& )*taperFct(i,j) |
|
& *taperFct(i,j) |
|
582 |
ENDDO |
ENDDO |
583 |
ENDDO |
ENDDO |
584 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
600 |
CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
601 |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
602 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
603 |
IF (GM_ExtraDiag) THEN |
IF ( GM_ExtraDiag ) THEN |
604 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
605 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
606 |
Kuz(i,j,k,bi,bj) = |
Kuz(i,j,k,bi,bj) = |
607 |
#ifdef ALLOW_KAPGM_CONTROL |
#ifdef ALLOW_KAPREDI_CONTROL |
608 |
& ( GM_isopycK - GM_skewflx*kapgm(i,j,k,bi,bj) |
& ( kapredi(i,j,k,bi,bj) |
609 |
#else |
#else |
610 |
& ( GM_isopycK - GM_skewflx*GM_background_K |
& ( GM_isopycK |
611 |
|
#endif |
612 |
|
#if (defined (ALLOW_AUTODIFF) && defined (ALLOW_KAPGM_CONTROL)) |
613 |
|
& - GM_skewflx*kapgm(i,j,k,bi,bj) |
614 |
|
#else |
615 |
|
& - GM_skewflx*GM_background_K |
616 |
#endif |
#endif |
617 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
618 |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*GM_advect |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*GM_advect |
629 |
DO j=1,sNy |
DO j=1,sNy |
630 |
DO i=1,sNx+1 |
DO i=1,sNx+1 |
631 |
C store in tmp1k Kuz_Redi |
C store in tmp1k Kuz_Redi |
632 |
|
#ifdef ALLOW_KAPREDI_CONTROL |
633 |
|
tmp1k(i,j) = ( kapredi(i,j,k,bi,bj) |
634 |
|
#else |
635 |
tmp1k(i,j) = ( GM_isopycK |
tmp1k(i,j) = ( GM_isopycK |
636 |
|
#endif |
637 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
638 |
& +(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*0.5 _d 0 |
& +(VisbeckK(i,j,bi,bj)+VisbeckK(i-1,j,bi,bj))*0.5 _d 0 |
639 |
#endif |
#endif |
665 |
ENDIF |
ENDIF |
666 |
#endif /* ALLOW_DIAGNOSTICS */ |
#endif /* ALLOW_DIAGNOSTICS */ |
667 |
|
|
668 |
|
C-- end 2nd loop on vertical level index k |
669 |
|
ENDDO |
670 |
|
|
671 |
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
672 |
|
C-- 3rd k loop : compute Tensor Coeff. at V point |
673 |
|
|
674 |
|
#ifdef ALLOW_KPP |
675 |
|
IF ( useKPP ) THEN |
676 |
|
DO j=2-Oly,sNy+Oly |
677 |
|
DO i=1-Olx,sNx+Olx |
678 |
|
locMixLayer(i,j) = ( KPPhbl(i,j-1,bi,bj) |
679 |
|
& + KPPhbl(i, j ,bi,bj) )*op5 |
680 |
|
ENDDO |
681 |
|
ENDDO |
682 |
|
ELSE |
683 |
|
#else |
684 |
|
IF ( .TRUE. ) THEN |
685 |
|
#endif |
686 |
|
DO j=2-Oly,sNy+Oly |
687 |
|
DO i=1-Olx,sNx+Olx |
688 |
|
locMixLayer(i,j) = ( hMixLayer(i,j-1,bi,bj) |
689 |
|
& + hMixLayer(i, j ,bi,bj) )*op5 |
690 |
|
ENDDO |
691 |
|
ENDDO |
692 |
|
ENDIF |
693 |
|
DO j=1-Oly,sNy+Oly |
694 |
|
DO i=1-Olx,sNx+Olx |
695 |
|
hTransLay(i,j) = 0. |
696 |
|
baseSlope(i,j) = 0. |
697 |
|
recipLambda(i,j)= 0. |
698 |
|
ENDDO |
699 |
|
ENDDO |
700 |
|
DO j=2-Oly,sNy+Oly |
701 |
|
DO i=1-Olx,sNx+Olx |
702 |
|
hTransLay(i,j) = MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) ) |
703 |
|
ENDDO |
704 |
|
ENDDO |
705 |
|
|
706 |
C Gradient of Sigma at V points |
C Gradient of Sigma at V points |
707 |
|
DO k=Nr,1,-1 |
708 |
|
kp1 = MIN(Nr,k+1) |
709 |
|
maskp1 = 1. _d 0 |
710 |
|
IF (k.GE.Nr) maskp1 = 0. _d 0 |
711 |
|
#ifdef ALLOW_AUTODIFF_TAMC |
712 |
|
kkey = (igmkey-1)*Nr + k |
713 |
|
#endif |
714 |
|
|
715 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
716 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
717 |
dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k) |
dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k) |
728 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
729 |
CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDx(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
730 |
CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDy(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
731 |
CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE dSigmaDr(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
732 |
|
CADJ STORE baseSlope(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
733 |
|
CADJ STORE hTransLay(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
734 |
|
CADJ STORE recipLambda(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
735 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
736 |
|
|
737 |
C Calculate slopes for use in tensor, taper and/or clip |
C Calculate slopes for use in tensor, taper and/or clip |
738 |
CALL GMREDI_SLOPE_LIMIT( |
CALL GMREDI_SLOPE_LIMIT( |
739 |
O SlopeX, SlopeY, |
O SlopeX, SlopeY, |
740 |
O SlopeSqr, taperFct, |
O SlopeSqr, taperFct, |
741 |
|
U hTransLay, baseSlope, recipLambda, |
742 |
U dSigmaDr, |
U dSigmaDr, |
743 |
I dSigmaDx, dSigmaDy, |
I dSigmaDx, dSigmaDy, |
744 |
I ldd97_LrhoS,rC(k),k, |
I ldd97_LrhoS, locMixLayer, rC, |
745 |
I bi, bj, myThid ) |
I kLow_S, |
746 |
|
I k, bi, bj, myTime, myIter, myThid ) |
747 |
|
|
748 |
cph( |
cph( |
749 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
758 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
759 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
760 |
Kvy(i,j,k,bi,bj) = |
Kvy(i,j,k,bi,bj) = |
761 |
|
#ifdef ALLOW_KAPREDI_CONTROL |
762 |
|
& ( kapredi(i,j,k,bi,bj) |
763 |
|
#else |
764 |
& ( GM_isopycK |
& ( GM_isopycK |
765 |
|
#endif |
766 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
767 |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj)) |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj)) |
768 |
#endif |
#endif |
769 |
& ) |
& )*taperFct(i,j) |
|
& *taperFct(i,j) |
|
770 |
ENDDO |
ENDDO |
771 |
ENDDO |
ENDDO |
772 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
788 |
CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
789 |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
CADJ STORE taperFct(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte |
790 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
791 |
IF (GM_ExtraDiag) THEN |
IF ( GM_ExtraDiag ) THEN |
792 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
793 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
794 |
Kvz(i,j,k,bi,bj) = |
Kvz(i,j,k,bi,bj) = |
795 |
#ifdef ALLOW_KAPGM_CONTROL |
#ifdef ALLOW_KAPREDI_CONTROL |
796 |
& ( GM_isopycK - GM_skewflx*kapgm(i,j,k,bi,bj) |
& ( kapredi(i,j,k,bi,bj) |
797 |
|
#else |
798 |
|
& ( GM_isopycK |
799 |
|
#endif |
800 |
|
#if (defined (ALLOW_AUTODIFF) && defined (ALLOW_KAPGM_CONTROL)) |
801 |
|
& - GM_skewflx*kapgm(i,j,k,bi,bj) |
802 |
#else |
#else |
803 |
& ( GM_isopycK - GM_skewflx*GM_background_K |
& - GM_skewflx*GM_background_K |
804 |
#endif |
#endif |
805 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
806 |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*GM_advect |
& +op5*(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*GM_advect |
813 |
|
|
814 |
#ifdef ALLOW_DIAGNOSTICS |
#ifdef ALLOW_DIAGNOSTICS |
815 |
IF (doDiagRediFlx) THEN |
IF (doDiagRediFlx) THEN |
816 |
c km1 = MAX(k-1,1) |
km1 = MAX(k-1,1) |
817 |
DO j=1,sNy+1 |
DO j=1,sNy+1 |
818 |
DO i=1,sNx |
DO i=1,sNx |
819 |
C store in tmp1k Kvz_Redi |
C store in tmp1k Kvz_Redi |
820 |
|
#ifdef ALLOW_KAPREDI_CONTROL |
821 |
|
tmp1k(i,j) = ( kapredi(i,j,k,bi,bj) |
822 |
|
#else |
823 |
tmp1k(i,j) = ( GM_isopycK |
tmp1k(i,j) = ( GM_isopycK |
824 |
|
#endif |
825 |
#ifdef GM_VISBECK_VARIABLE_K |
#ifdef GM_VISBECK_VARIABLE_K |
826 |
& +(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*0.5 _d 0 |
& +(VisbeckK(i,j,bi,bj)+VisbeckK(i,j-1,bi,bj))*0.5 _d 0 |
827 |
#endif |
#endif |
853 |
ENDIF |
ENDIF |
854 |
#endif /* ALLOW_DIAGNOSTICS */ |
#endif /* ALLOW_DIAGNOSTICS */ |
855 |
|
|
856 |
#endif /* GM_NON_UNITY_DIAGONAL || GM_EXTRA_DIAGONAL */ |
C-- end 3rd loop on vertical level index k |
|
|
|
|
C-- end 2nd loop on vertical level index k |
|
857 |
ENDDO |
ENDDO |
858 |
|
|
859 |
|
#endif /* GM_NON_UNITY_DIAGONAL || GM_EXTRA_DIAGONAL */ |
860 |
|
|
861 |
|
|
862 |
#ifdef GM_BOLUS_ADVEC |
#ifdef GM_BOLUS_ADVEC |
863 |
IF (GM_AdvForm) THEN |
IF (GM_AdvForm) THEN |
913 |
|
|
914 |
|
|
915 |
SUBROUTINE GMREDI_CALC_TENSOR_DUMMY( |
SUBROUTINE GMREDI_CALC_TENSOR_DUMMY( |
916 |
I bi, bj, iMin, iMax, jMin, jMax, |
I iMin, iMax, jMin, jMax, |
917 |
I sigmaX, sigmaY, sigmaR, |
I sigmaX, sigmaY, sigmaR, |
918 |
I myThid ) |
I bi, bj, myTime, myIter, myThid ) |
919 |
C /==========================================================\ |
C /==========================================================\ |
920 |
C | SUBROUTINE GMREDI_CALC_TENSOR | |
C | SUBROUTINE GMREDI_CALC_TENSOR | |
921 |
C | o Calculate tensor elements for GM/Redi tensor. | |
C | o Calculate tensor elements for GM/Redi tensor. | |
933 |
_RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
934 |
_RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
935 |
_RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
936 |
INTEGER bi,bj,iMin,iMax,jMin,jMax |
INTEGER iMin,iMax,jMin,jMax |
937 |
|
INTEGER bi, bj |
938 |
|
_RL myTime |
939 |
|
INTEGER myIter |
940 |
INTEGER myThid |
INTEGER myThid |
941 |
CEndOfInterface |
CEndOfInterface |
942 |
|
|
|
INTEGER i, j, k |
|
|
|
|
943 |
#ifdef ALLOW_GMREDI |
#ifdef ALLOW_GMREDI |
944 |
|
|
945 |
|
INTEGER i, j, k |
946 |
|
|
947 |
DO k=1,Nr |
DO k=1,Nr |
948 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
949 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |