116 |
C fMer :: Flux of temperature (T) in the meridional direction |
C fMer :: Flux of temperature (T) in the meridional direction |
117 |
C fVer :: Flux of temperature (T) in the vertical direction |
C fVer :: Flux of temperature (T) in the vertical direction |
118 |
C at the upper(U) and lower(D) faces of a cell. |
C at the upper(U) and lower(D) faces of a cell. |
119 |
|
C gT_loc :: Temperature tendency (local to this S/R) |
120 |
C gtForc :: Temperature forcing tendency |
C gtForc :: Temperature forcing tendency |
121 |
C gt_AB :: Adams-Bashforth temperature tendency increment |
C gt_AB :: Adams-Bashforth temperature tendency increment |
122 |
C useVariableK :: T when vertical diffusion is not constant |
C useVariableK :: T when vertical diffusion is not constant |
133 |
_RL fZon (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL fZon (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
134 |
_RL fMer (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL fMer (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
135 |
_RL fVer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2) |
_RL fVer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2) |
136 |
|
_RL gT_loc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
137 |
_RL gtForc (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL gtForc (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
138 |
_RL gt_AB (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL gt_AB (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
139 |
#ifdef ALLOW_DIAGNOSTICS |
#ifdef ALLOW_DIAGNOSTICS |
185 |
DO k=1,Nr |
DO k=1,Nr |
186 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
187 |
DO i=1-OLx,sNx+OLx |
DO i=1-OLx,sNx+OLx |
188 |
gT(i,j,k,bi,bj) = 0. _d 0 |
gT_loc(i,j,k) = 0. _d 0 |
189 |
ENDDO |
ENDDO |
190 |
ENDDO |
ENDDO |
191 |
ENDDO |
ENDDO |
239 |
I tempAdvScheme, tempVertAdvScheme, GAD_TEMPERATURE, |
I tempAdvScheme, tempVertAdvScheme, GAD_TEMPERATURE, |
240 |
I dTtracerLev, uFld, vFld, wFld, theta, |
I dTtracerLev, uFld, vFld, wFld, theta, |
241 |
U som_T, |
U som_T, |
242 |
O gT, |
O gT_loc, |
243 |
I bi, bj, myTime, myIter, myThid ) |
I bi, bj, myTime, myIter, myThid ) |
244 |
ELSEIF (tempMultiDimAdvec) THEN |
ELSEIF (tempMultiDimAdvec) THEN |
245 |
#else /* GAD_ALLOW_TS_SOM_ADV */ |
#else /* GAD_ALLOW_TS_SOM_ADV */ |
252 |
I tempImplVertAdv, |
I tempImplVertAdv, |
253 |
I tempAdvScheme, tempVertAdvScheme, GAD_TEMPERATURE, |
I tempAdvScheme, tempVertAdvScheme, GAD_TEMPERATURE, |
254 |
I dTtracerLev, uFld, vFld, wFld, theta, |
I dTtracerLev, uFld, vFld, wFld, theta, |
255 |
O gT, |
O gT_loc, |
256 |
I bi, bj, myTime, myIter, myThid ) |
I bi, bj, myTime, myIter, myThid ) |
257 |
ENDIF |
ENDIF |
258 |
#endif /* DISABLE_MULTIDIM_ADVECTION */ |
#endif /* DISABLE_MULTIDIM_ADVECTION */ |
272 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
273 |
CADJ STORE fVer(:,:,:) = comlev1_bibj_k, key=kkey, |
CADJ STORE fVer(:,:,:) = comlev1_bibj_k, key=kkey, |
274 |
CADJ & byte=isbyte, kind = isbyte |
CADJ & byte=isbyte, kind = isbyte |
275 |
CADJ STORE gT(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, |
CADJ STORE gT_loc(:,:,k) = comlev1_bibj_k, key=kkey, |
276 |
CADJ & byte=isbyte, kind = isbyte |
CADJ & byte=isbyte, kind = isbyte |
277 |
# ifdef ALLOW_ADAMSBASHFORTH_3 |
# ifdef ALLOW_ADAMSBASHFORTH_3 |
278 |
CADJ STORE gtNm(:,:,k,bi,bj,1) = comlev1_bibj_k, key=kkey, |
CADJ STORE gtNm(:,:,k,bi,bj,1) = comlev1_bibj_k, key=kkey, |
323 |
I calcAdvection, tempImplVertAdv, AdamsBashforth_T, |
I calcAdvection, tempImplVertAdv, AdamsBashforth_T, |
324 |
I tempVertDiff4, useGMRedi, useKPP, |
I tempVertDiff4, useGMRedi, useKPP, |
325 |
O fZon, fMer, |
O fZon, fMer, |
326 |
U fVer, gT, |
U fVer, gT_loc, |
327 |
I myTime, myIter, myThid ) |
I myTime, myIter, myThid ) |
328 |
#else /* ALLOW_ADAMSBASHFORTH_3 */ |
#else /* ALLOW_ADAMSBASHFORTH_3 */ |
329 |
CALL GAD_CALC_RHS( |
CALL GAD_CALC_RHS( |
337 |
I calcAdvection, tempImplVertAdv, AdamsBashforth_T, |
I calcAdvection, tempImplVertAdv, AdamsBashforth_T, |
338 |
I tempVertDiff4, useGMRedi, useKPP, |
I tempVertDiff4, useGMRedi, useKPP, |
339 |
O fZon, fMer, |
O fZon, fMer, |
340 |
U fVer, gT, |
U fVer, gT_loc, |
341 |
I myTime, myIter, myThid ) |
I myTime, myIter, myThid ) |
342 |
#endif |
#endif |
343 |
|
|
345 |
IF ( tempForcing .AND. tracForcingOutAB.NE.1 ) THEN |
IF ( tempForcing .AND. tracForcingOutAB.NE.1 ) THEN |
346 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
347 |
DO i=1-OLx,sNx+OLx |
DO i=1-OLx,sNx+OLx |
348 |
gT(i,j,k,bi,bj) = gT(i,j,k,bi,bj) + gtForc(i,j) |
gT_loc(i,j,k) = gT_loc(i,j,k) + gtForc(i,j) |
349 |
ENDDO |
ENDDO |
350 |
ENDDO |
ENDDO |
351 |
ENDIF |
ENDIF |
354 |
#ifdef ALLOW_ADAMSBASHFORTH_3 |
#ifdef ALLOW_ADAMSBASHFORTH_3 |
355 |
CALL ADAMS_BASHFORTH3( |
CALL ADAMS_BASHFORTH3( |
356 |
I bi, bj, k, Nr, |
I bi, bj, k, Nr, |
357 |
U gT, gtNm, gt_AB, |
U gT_loc, gtNm, |
358 |
|
O gt_AB, |
359 |
I tempStartAB, iterNb, myThid ) |
I tempStartAB, iterNb, myThid ) |
360 |
#else |
#else |
361 |
CALL ADAMS_BASHFORTH2( |
CALL ADAMS_BASHFORTH2( |
362 |
I bi, bj, k, Nr, |
I bi, bj, k, Nr, |
363 |
U gT, gtNm1, gt_AB, |
U gT_loc, gtNm1(1-OLx,1-OLy,1,bi,bj), |
364 |
|
O gt_AB, |
365 |
I tempStartAB, iterNb, myThid ) |
I tempStartAB, iterNb, myThid ) |
366 |
#endif |
#endif |
367 |
#ifdef ALLOW_DIAGNOSTICS |
#ifdef ALLOW_DIAGNOSTICS |
375 |
IF ( tempForcing .AND. tracForcingOutAB.EQ.1 ) THEN |
IF ( tempForcing .AND. tracForcingOutAB.EQ.1 ) THEN |
376 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
377 |
DO i=1-OLx,sNx+OLx |
DO i=1-OLx,sNx+OLx |
378 |
gT(i,j,k,bi,bj) = gT(i,j,k,bi,bj) + gtForc(i,j) |
gT_loc(i,j,k) = gT_loc(i,j,k) + gtForc(i,j) |
379 |
ENDDO |
ENDDO |
380 |
ENDDO |
ENDDO |
381 |
ENDIF |
ENDIF |
384 |
IF (nonlinFreeSurf.GT.0) THEN |
IF (nonlinFreeSurf.GT.0) THEN |
385 |
CALL FREESURF_RESCALE_G( |
CALL FREESURF_RESCALE_G( |
386 |
I bi, bj, k, |
I bi, bj, k, |
387 |
U gT, |
U gT_loc, |
388 |
I myThid ) |
I myThid ) |
389 |
IF ( AdamsBashforthGt ) THEN |
IF ( AdamsBashforthGt ) THEN |
390 |
#ifdef ALLOW_ADAMSBASHFORTH_3 |
#ifdef ALLOW_ADAMSBASHFORTH_3 |
396 |
# endif |
# endif |
397 |
CALL FREESURF_RESCALE_G( |
CALL FREESURF_RESCALE_G( |
398 |
I bi, bj, k, |
I bi, bj, k, |
399 |
U gtNm(1-OLx,1-OLy,1,1,1,1), |
U gtNm(1-OLx,1-OLy,1,bi,bj,1), |
400 |
I myThid ) |
I myThid ) |
401 |
CALL FREESURF_RESCALE_G( |
CALL FREESURF_RESCALE_G( |
402 |
I bi, bj, k, |
I bi, bj, k, |
403 |
U gtNm(1-OLx,1-OLy,1,1,1,2), |
U gtNm(1-OLx,1-OLy,1,bi,bj,2), |
404 |
I myThid ) |
I myThid ) |
405 |
#else |
#else |
406 |
CALL FREESURF_RESCALE_G( |
CALL FREESURF_RESCALE_G( |
407 |
I bi, bj, k, |
I bi, bj, k, |
408 |
U gtNm1, |
U gtNm1(1-OLx,1-OLy,1,bi,bj), |
409 |
I myThid ) |
I myThid ) |
410 |
#endif |
#endif |
411 |
ENDIF |
ENDIF |
421 |
CALL DWNSLP_APPLY( |
CALL DWNSLP_APPLY( |
422 |
I GAD_TEMPERATURE, bi, bj, kSurfC, |
I GAD_TEMPERATURE, bi, bj, kSurfC, |
423 |
I theta(1-OLx,1-OLy,1,bi,bj), |
I theta(1-OLx,1-OLy,1,bi,bj), |
424 |
U gT(1-OLx,1-OLy,1,bi,bj), |
U gT_loc, |
425 |
I recip_hFac, recip_rA, recip_drF, |
I recip_hFac, recip_rA, recip_drF, |
426 |
I dTtracerLev, myTime, myIter, myThid ) |
I dTtracerLev, myTime, myIter, myThid ) |
427 |
ELSE |
ELSE |
428 |
CALL DWNSLP_APPLY( |
CALL DWNSLP_APPLY( |
429 |
I GAD_TEMPERATURE, bi, bj, kLowC, |
I GAD_TEMPERATURE, bi, bj, kLowC, |
430 |
I theta(1-OLx,1-OLy,1,bi,bj), |
I theta(1-OLx,1-OLy,1,bi,bj), |
431 |
U gT(1-OLx,1-OLy,1,bi,bj), |
U gT_loc, |
432 |
I recip_hFac, recip_rA, recip_drF, |
I recip_hFac, recip_rA, recip_drF, |
433 |
I dTtracerLev, myTime, myIter, myThid ) |
I dTtracerLev, myTime, myIter, myThid ) |
434 |
ENDIF |
ENDIF |
435 |
ENDIF |
ENDIF |
436 |
#endif /* ALLOW_DOWN_SLOPE */ |
#endif /* ALLOW_DOWN_SLOPE */ |
437 |
|
|
438 |
C- Integrate forward in time, storing in gT: gT <= T + dt*gT |
C- Integrate forward in time, storing in gT_loc: gT <= T + dt*gT |
439 |
CALL TIMESTEP_TRACER( |
CALL TIMESTEP_TRACER( |
440 |
I bi, bj, dTtracerLev, |
I bi, bj, dTtracerLev, |
441 |
I theta(1-OLx,1-OLy,1,bi,bj), |
I theta(1-OLx,1-OLy,1,bi,bj), |
442 |
U gT(1-OLx,1-OLy,1,bi,bj), |
U gT_loc, |
443 |
I myTime, myIter, myThid ) |
I myTime, myIter, myThid ) |
444 |
|
|
445 |
iMin = 0 |
iMin = 0 |
453 |
IF ( tempImplVertAdv ) THEN |
IF ( tempImplVertAdv ) THEN |
454 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
455 |
CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
456 |
CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte |
CADJ STORE gT_loc(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
457 |
CADJ STORE wFld(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
CADJ STORE wFld(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
458 |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte |
459 |
CADJ STORE recip_hFac(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
CADJ STORE recip_hFac(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
460 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
461 |
CALL GAD_IMPLICIT_R( |
CALL GAD_IMPLICIT_R( |
462 |
I tempImplVertAdv, tempVertAdvScheme, GAD_TEMPERATURE, |
I tempImplVertAdv, tempVertAdvScheme, GAD_TEMPERATURE, |
463 |
I dTtracerLev, |
I dTtracerLev, kappaRk, recip_hFac, wFld, |
464 |
I kappaRk, recip_hFac, wFld, theta, |
I theta(1-OLx,1-OLy,1,bi,bj), |
465 |
U gT, |
U gT_loc, |
466 |
I bi, bj, myTime, myIter, myThid ) |
I bi, bj, myTime, myIter, myThid ) |
467 |
ELSEIF ( implicitDiffusion ) THEN |
ELSEIF ( implicitDiffusion ) THEN |
468 |
#else /* INCLUDE_IMPLVERTADV_CODE */ |
#else /* INCLUDE_IMPLVERTADV_CODE */ |
470 |
#endif /* INCLUDE_IMPLVERTADV_CODE */ |
#endif /* INCLUDE_IMPLVERTADV_CODE */ |
471 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
472 |
CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
473 |
CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte |
CADJ STORE gT_loc(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte |
474 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
475 |
CALL IMPLDIFF( |
CALL IMPLDIFF( |
476 |
I bi, bj, iMin, iMax, jMin, jMax, |
I bi, bj, iMin, iMax, jMin, jMax, |
477 |
I GAD_TEMPERATURE, kappaRk, recip_hFac, |
I GAD_TEMPERATURE, kappaRk, recip_hFac, |
478 |
U gT, |
U gT_loc, |
479 |
I myThid ) |
I myThid ) |
480 |
ENDIF |
ENDIF |
481 |
|
|
484 |
& .OR. useGGL90 .OR. useGMredi .OR. ivdc_kappa.NE.0. |
& .OR. useGGL90 .OR. useGMredi .OR. ivdc_kappa.NE.0. |
485 |
IF ( taveFreq.GT.0. .AND. useVariableK |
IF ( taveFreq.GT.0. .AND. useVariableK |
486 |
& .AND.implicitDiffusion ) THEN |
& .AND.implicitDiffusion ) THEN |
487 |
CALL TIMEAVE_CUMUL_DIF_1T(TdiffRtave, gT, kappaRk, |
CALL TIMEAVE_CUMUL_DIF_1T( TdiffRtave, |
488 |
I Nr, 3, deltaTClock, bi, bj, myThid) |
I gT_loc, kappaRk, |
489 |
|
I Nr, 3, deltaTClock, bi, bj, myThid ) |
490 |
ENDIF |
ENDIF |
491 |
#endif /* ALLOW_TIMEAVE */ |
#endif /* ALLOW_TIMEAVE */ |
492 |
|
|
493 |
#ifdef ALLOW_ADAMSBASHFORTH_3 |
#ifdef ALLOW_ADAMSBASHFORTH_3 |
494 |
IF ( AdamsBashforth_T ) THEN |
IF ( AdamsBashforth_T ) THEN |
495 |
C- Save current tracer field (for AB on tracer) and then update tracer |
C- Save current tracer field (for AB on tracer) and then update tracer |
|
c m1 = 1 + MOD(iterNb+1,2) |
|
|
m2 = 1 + MOD( iterNb ,2) |
|
496 |
CALL CYCLE_AB_TRACER( |
CALL CYCLE_AB_TRACER( |
497 |
I bi, bj, |
I bi, bj, |
498 |
U theta, gT, gtNm(1-OLx,1-OLy,1,1,1,m2), |
U theta(1-OLx,1-OLy,1,bi,bj), gT_loc, |
499 |
|
U gtNm(1-OLx,1-OLy,1,bi,bj,m2), |
500 |
I myTime, myIter, myThid ) |
I myTime, myIter, myThid ) |
501 |
ELSEIF ( tempStepping ) THEN |
ELSEIF ( tempStepping ) THEN |
502 |
#else /* ALLOW_ADAMSBASHFORTH_3 */ |
#else /* ALLOW_ADAMSBASHFORTH_3 */ |
505 |
C- Update tracer fields: T(n) = T** |
C- Update tracer fields: T(n) = T** |
506 |
CALL CYCLE_TRACER( |
CALL CYCLE_TRACER( |
507 |
I bi, bj, |
I bi, bj, |
508 |
U theta, gT, |
U theta(1-OLx,1-OLy,1,bi,bj), gT_loc, |
509 |
I myTime, myIter, myThid ) |
I myTime, myIter, myThid ) |
510 |
ENDIF |
ENDIF |
511 |
|
|