130 |
C is "pipelined" in the vertical |
C is "pipelined" in the vertical |
131 |
C so we need an fVer for each |
C so we need an fVer for each |
132 |
C variable. |
C variable. |
|
C rhoK, rhoKM1 - Density at current level, and level above |
|
133 |
C KappaRT, - Total diffusion in vertical for T and S. |
C KappaRT, - Total diffusion in vertical for T and S. |
134 |
C KappaRS (background + spatially varying, isopycnal term). |
C KappaRS (background + spatially varying, isopycnal term). |
135 |
C useVariableK = T when vertical diffusion is not constant |
C useVariableK = T when vertical diffusion is not constant |
154 |
#ifdef ALLOW_PTRACERS |
#ifdef ALLOW_PTRACERS |
155 |
_RL fVerP (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2,PTRACERS_num) |
_RL fVerP (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2,PTRACERS_num) |
156 |
#endif |
#endif |
|
_RL rhokm1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
|
|
_RL rhok (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
|
157 |
_RL KappaRT (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL KappaRT (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
158 |
_RL KappaRS (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
_RL KappaRS (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr) |
159 |
_RL sigmaX (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
_RL sigmaX (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
223 |
yA(i,j) = 0. _d 0 |
yA(i,j) = 0. _d 0 |
224 |
uTrans(i,j) = 0. _d 0 |
uTrans(i,j) = 0. _d 0 |
225 |
vTrans(i,j) = 0. _d 0 |
vTrans(i,j) = 0. _d 0 |
|
rhok (i,j) = 0. _d 0 |
|
|
rhoKM1 (i,j) = 0. _d 0 |
|
226 |
rTrans (i,j) = 0. _d 0 |
rTrans (i,j) = 0. _d 0 |
227 |
rTransKp1(i,j) = 0. _d 0 |
rTransKp1(i,j) = 0. _d 0 |
228 |
fVerT (i,j,1) = 0. _d 0 |
fVerT (i,j,1) = 0. _d 0 |
246 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
247 |
DO i=1-OLx,sNx+OLx |
DO i=1-OLx,sNx+OLx |
248 |
C This is currently also used by IVDC and Diagnostics |
C This is currently also used by IVDC and Diagnostics |
|
sigmaX(i,j,k) = 0. _d 0 |
|
|
sigmaY(i,j,k) = 0. _d 0 |
|
|
sigmaR(i,j,k) = 0. _d 0 |
|
249 |
KappaRT(i,j,k) = 0. _d 0 |
KappaRT(i,j,k) = 0. _d 0 |
250 |
KappaRS(i,j,k) = 0. _d 0 |
KappaRS(i,j,k) = 0. _d 0 |
251 |
C- tracer tendency needs to be set to zero (moved here from gad_calc_rhs): |
C- tracer tendency needs to be set to zero (moved here from gad_calc_rhs): |
261 |
gPTr(i,j,k,bi,bj,itracer) = 0. _d 0 |
gPTr(i,j,k,bi,bj,itracer) = 0. _d 0 |
262 |
ENDDO |
ENDDO |
263 |
# endif |
# endif |
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
cph all the following init. are necessary for TAF |
|
|
cph although some of these are re-initialised later. |
|
|
# ifdef ALLOW_GMREDI |
|
|
Kwx(i,j,k,bi,bj) = 0. _d 0 |
|
|
Kwy(i,j,k,bi,bj) = 0. _d 0 |
|
|
Kwz(i,j,k,bi,bj) = 0. _d 0 |
|
|
# ifdef GM_NON_UNITY_DIAGONAL |
|
|
Kux(i,j,k,bi,bj) = 0. _d 0 |
|
|
Kvy(i,j,k,bi,bj) = 0. _d 0 |
|
|
# endif |
|
|
# ifdef GM_EXTRA_DIAGONAL |
|
|
Kuz(i,j,k,bi,bj) = 0. _d 0 |
|
|
Kvz(i,j,k,bi,bj) = 0. _d 0 |
|
|
# endif |
|
|
# ifdef GM_BOLUS_ADVEC |
|
|
GM_PsiX(i,j,k,bi,bj) = 0. _d 0 |
|
|
GM_PsiY(i,j,k,bi,bj) = 0. _d 0 |
|
|
# endif |
|
|
# ifdef GM_VISBECK_VARIABLE_K |
|
|
VisbeckK(i,j,bi,bj) = 0. _d 0 |
|
|
# endif |
|
|
# endif /* ALLOW_GMREDI */ |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
264 |
ENDDO |
ENDDO |
265 |
ENDDO |
ENDDO |
266 |
ENDDO |
ENDDO |
267 |
|
|
268 |
iMin = 1-OLx |
c iMin = 1-OLx |
269 |
iMax = sNx+OLx |
c iMax = sNx+OLx |
270 |
jMin = 1-OLy |
c jMin = 1-OLy |
271 |
jMax = sNy+OLy |
c jMax = sNy+OLy |
272 |
|
|
273 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
274 |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
281 |
#endif |
#endif |
282 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
283 |
|
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_MSG('ENTERING UPWARD K LOOP',myThid) |
|
|
#endif |
|
|
|
|
|
C-- Start of diagnostic loop |
|
|
DO k=Nr,1,-1 |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
C? Patrick, is this formula correct now that we change the loop range? |
|
|
C? Do we still need this? |
|
|
cph kkey formula corrected. |
|
|
cph Needed for rhok, rhokm1, in the case useGMREDI. |
|
|
kkey = (itdkey-1)*Nr + k |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
|
|
|
C-- Integrate continuity vertically for vertical velocity |
|
|
c CALL INTEGRATE_FOR_W( |
|
|
c I bi, bj, k, uVel, vVel, |
|
|
c O wVel, |
|
|
c I myThid ) |
|
|
|
|
|
#ifdef ALLOW_OBCS |
|
|
#ifdef ALLOW_NONHYDROSTATIC |
|
|
C-- Apply OBC to W if in N-H mode |
|
|
c IF (useOBCS.AND.nonHydrostatic) THEN |
|
|
c CALL OBCS_APPLY_W( bi, bj, k, wVel, myThid ) |
|
|
c ENDIF |
|
|
#endif /* ALLOW_NONHYDROSTATIC */ |
|
|
#endif /* ALLOW_OBCS */ |
|
|
|
|
|
C-- Attention: by defining "SINGLE_LAYER_MODE" in CPP_OPTIONS.h |
|
|
C-- MOST of THERMODYNAMICS will be disabled |
|
|
#ifndef SINGLE_LAYER_MODE |
|
|
|
|
|
C-- Calculate gradients of potential density for isoneutral |
|
|
C slope terms (e.g. GM/Redi tensor or IVDC diffusivity) |
|
|
c IF ( k.GT.1 .AND. (useGMRedi.OR.ivdc_kappa.NE.0.) ) THEN |
|
|
IF ( useGMRedi .OR. (k.GT.1 .AND. ivdc_kappa.NE.0.) ) THEN |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('FIND_RHO',myThid) |
|
|
#endif |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte |
|
|
CADJ STORE salt (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
CALL FIND_RHO( |
|
|
I bi, bj, iMin, iMax, jMin, jMax, k, k, |
|
|
I theta, salt, |
|
|
O rhoK, |
|
|
I myThid ) |
|
|
|
|
|
IF (k.GT.1) THEN |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE theta(:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte |
|
|
CADJ STORE salt (:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
CALL FIND_RHO( |
|
|
I bi, bj, iMin, iMax, jMin, jMax, k-1, k, |
|
|
I theta, salt, |
|
|
O rhoKm1, |
|
|
I myThid ) |
|
|
ENDIF |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('GRAD_SIGMA',myThid) |
|
|
#endif |
|
|
CALL GRAD_SIGMA( |
|
|
I bi, bj, iMin, iMax, jMin, jMax, k, |
|
|
I rhoK, rhoKm1, rhoK, |
|
|
O sigmaX, sigmaY, sigmaR, |
|
|
I myThid ) |
|
|
ENDIF |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE rhok (:,:) = comlev1_bibj_k , key=kkey, byte=isbyte |
|
|
CADJ STORE rhokm1 (:,:) = comlev1_bibj_k , key=kkey, byte=isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
C-- Implicit Vertical Diffusion for Convection |
|
|
c ==> should use sigmaR !!! |
|
|
IF (k.GT.1 .AND. ivdc_kappa.NE.0.) THEN |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('CALC_IVDC',myThid) |
|
|
#endif |
|
|
CALL CALC_IVDC( |
|
|
I bi, bj, iMin, iMax, jMin, jMax, k, |
|
|
I rhoKm1, rhoK, |
|
|
I myTime, myIter, myThid) |
|
|
ENDIF |
|
|
|
|
|
#endif /* SINGLE_LAYER_MODE */ |
|
|
|
|
|
C-- end of diagnostic k loop (Nr:1) |
|
|
ENDDO |
|
|
|
|
284 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
285 |
cph avoids recomputation of integrate_for_w |
cph avoids recomputation of integrate_for_w |
286 |
CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
287 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
288 |
|
|
|
#ifdef ALLOW_OBCS |
|
|
C-- Calculate future values on open boundaries |
|
|
IF (useOBCS) THEN |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('OBCS_CALC',myThid) |
|
|
#endif |
|
|
CALL OBCS_CALC( bi, bj, myTime+deltaT, myIter+1, |
|
|
I uVel, vVel, wVel, theta, salt, |
|
|
I myThid ) |
|
|
ENDIF |
|
|
#endif /* ALLOW_OBCS */ |
|
|
|
|
|
#ifndef ALLOW_AUTODIFF_TAMC |
|
|
IF ( buoyancyRelation(1:7) .EQ. 'OCEANIC' ) THEN |
|
|
#endif |
|
|
C-- Determines forcing terms based on external fields |
|
|
C relaxation terms, etc. |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('EXTERNAL_FORCING_SURF',myThid) |
|
|
#endif |
|
|
CALL EXTERNAL_FORCING_SURF( |
|
|
I bi, bj, iMin, iMax, jMin, jMax, |
|
|
I myTime, myIter, myThid ) |
|
|
#ifndef ALLOW_AUTODIFF_TAMC |
|
|
ENDIF |
|
|
#endif |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
cph needed for KPP |
|
|
CADJ STORE surfacetendencyU(:,:,bi,bj) |
|
|
CADJ & = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
CADJ STORE surfacetendencyV(:,:,bi,bj) |
|
|
CADJ & = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
CADJ STORE surfacetendencyS(:,:,bi,bj) |
|
|
CADJ & = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
CADJ STORE surfacetendencyT(:,:,bi,bj) |
|
|
CADJ & = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
# ifdef ALLOW_SEAICE |
|
|
CADJ STORE surfacetendencyTice(:,:,bi,bj) |
|
|
CADJ & = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
# endif |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
|
|
289 |
C-- Attention: by defining "SINGLE_LAYER_MODE" in CPP_OPTIONS.h |
C-- Attention: by defining "SINGLE_LAYER_MODE" in CPP_OPTIONS.h |
290 |
C-- MOST of THERMODYNAMICS will be disabled |
C-- MOST of THERMODYNAMICS will be disabled |
291 |
#ifndef SINGLE_LAYER_MODE |
#ifndef SINGLE_LAYER_MODE |
292 |
|
|
|
#ifdef ALLOW_GMREDI |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
cph storing here is needed only for one GMREDI_OPTIONS: |
|
|
cph define GM_BOLUS_ADVEC |
|
|
cph but I've avoided the #ifdef for now, in case more things change |
|
|
CADJ STORE sigmaX(:,:,:) = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
CADJ STORE sigmaY(:,:,:) = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
CADJ STORE sigmaR(:,:,:) = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
|
|
|
C-- Calculate iso-neutral slopes for the GM/Redi parameterisation |
|
|
IF (useGMRedi) THEN |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('GMREDI_CALC_TENSOR',myThid) |
|
|
#endif |
|
|
CALL GMREDI_CALC_TENSOR( |
|
|
I bi, bj, iMin, iMax, jMin, jMax, |
|
|
I sigmaX, sigmaY, sigmaR, |
|
|
I myThid ) |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
ELSE |
|
|
CALL GMREDI_CALC_TENSOR_DUMMY( |
|
|
I bi, bj, iMin, iMax, jMin, jMax, |
|
|
I sigmaX, sigmaY, sigmaR, |
|
|
I myThid ) |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
ENDIF |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE Kwx(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
CADJ STORE Kwy(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
CADJ STORE Kwz(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
|
|
|
#endif /* ALLOW_GMREDI */ |
|
|
|
|
|
#ifdef ALLOW_KPP |
|
|
C-- Compute KPP mixing coefficients |
|
|
IF (useKPP) THEN |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('KPP_CALC',myThid) |
|
|
#endif |
|
|
CALL KPP_CALC( |
|
|
I bi, bj, myTime, myThid ) |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
ELSE |
|
|
CALL KPP_CALC_DUMMY( |
|
|
I bi, bj, myTime, myThid ) |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
ENDIF |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE KPPghat (:,:,:,bi,bj) |
|
|
CADJ & , KPPfrac (:,: ,bi,bj) |
|
|
CADJ & = comlev1_bibj, key=itdkey, byte=isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
|
|
|
#endif /* ALLOW_KPP */ |
|
|
|
|
293 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
294 |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
295 |
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte |
305 |
#endif |
#endif |
306 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
307 |
|
|
|
#ifdef ALLOW_AIM |
|
|
C AIM - atmospheric intermediate model, physics package code. |
|
|
IF ( useAIM ) THEN |
|
|
#ifdef ALLOW_DEBUG |
|
|
IF ( debugLevel .GE. debLevB ) |
|
|
& CALL DEBUG_CALL('AIM_DO_PHYSICS',myThid) |
|
|
#endif |
|
|
CALL TIMER_START('AIM_DO_PHYSICS [THERMODYNAMICS]', myThid) |
|
|
CALL AIM_DO_PHYSICS( bi, bj, myTime, myIter, myThid ) |
|
|
CALL TIMER_STOP( 'AIM_DO_PHYSICS [THERMODYNAMICS]', myThid) |
|
|
ENDIF |
|
|
#endif /* ALLOW_AIM */ |
|
|
|
|
308 |
#ifndef DISABLE_MULTIDIM_ADVECTION |
#ifndef DISABLE_MULTIDIM_ADVECTION |
309 |
C-- Some advection schemes are better calculated using a multi-dimensional |
C-- Some advection schemes are better calculated using a multi-dimensional |
310 |
C method in the absence of any other terms and, if used, is done here. |
C method in the absence of any other terms and, if used, is done here. |