--- MITgcm/pkg/ptracers/ptracers_integrate.F 2007/10/19 14:43:50 1.34 +++ MITgcm/pkg/ptracers/ptracers_integrate.F 2011/01/18 19:37:41 1.41 @@ -1,4 +1,4 @@ -C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/ptracers/ptracers_integrate.F,v 1.34 2007/10/19 14:43:50 jmc Exp $ +C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/ptracers/ptracers_integrate.F,v 1.41 2011/01/18 19:37:41 heimbach Exp $ C $Name: $ #include "PTRACERS_OPTIONS.h" @@ -25,8 +25,13 @@ #include "EEPARAMS.h" #include "PARAMS.h" #include "DYNVARS.h" +#ifdef ALLOW_LONGSTEP +#include "LONGSTEP_PARAMS.h" +#endif #include "PTRACERS_SIZE.h" -#include "PTRACERS.h" +#include "PTRACERS_PARAMS.h" +#include "PTRACERS_RESTART.h" +#include "PTRACERS_FIELDS.h" #include "GAD.h" #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" @@ -44,8 +49,8 @@ C vTrans :: meridional transport in level k C rTrans :: vertical volume transport at interface k C rTransKp1 :: vertical volume transport at interface k+1 -C KappaRtr :: vertical diffusion of passive tracers, interf k -C rFlx :: vertical flux +C KappaRtr :: vertical diffusion of passive tracers, interf k +C rFlx :: vertical flux C myTime :: model time C myIter :: time-step number C myThid :: thread number @@ -82,7 +87,7 @@ INTEGER kUp,kDown,km1 INTEGER GAD_TR LOGICAL calcAdvection - INTEGER iterNb, startAB + INTEGER iterNb CEOP C Loop ranges for daughter routines @@ -119,29 +124,32 @@ #ifdef ALLOW_AUTODIFF_TAMC rFlx(1,1,kDown,iTracer) = rFlx(1,1,kDown,iTracer) c -CADJ STORE ptracer(:,:,k,bi,bj,iTracer) +CADJ STORE pTracer(:,:,k,bi,bj,iTracer) +CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte +CADJ STORE gpTrNm1(:,:,k,bi,bj,iTracer) +CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte +# ifdef NONLIN_FRSURF +CADJ STORE gpTr(:,:,k,bi,bj,iTracer) CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte -CADJ STORE gPtrnm1(:,:,k,bi,bj,iTracer) +CADJ STORE rFlx(:,:,k,iTracer) CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte +# endif #endif /* ALLOW_AUTODIFF_TAMC */ C Calculate active tracer tendencies (gPtr) due to internal processes C (advection, [explicit] diffusion, parameterizations,...) - calcAdvection = .NOT.multiDimAdvection - & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND - & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD - & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH + calcAdvection = .NOT.PTRACERS_MultiDimAdv(iTracer) GAD_TR = GAD_TR1 + iTracer - 1 CALL GAD_CALC_RHS( - I bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown, + I bi,bj,iMin,iMax,jMin,jMax,k,km1,kUp,kDown, I xA, yA, maskUp, uFld, vFld, wFld, I uTrans, vTrans, rTrans, rTransKp1, I PTRACERS_diffKh(iTracer), I PTRACERS_diffK4(iTracer), I KappaRtr(1-Olx,1-Oly,iTracer), - I gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer), + I gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), I pTracer(1-Olx,1-Oly,1,1,1,iTracer), - I GAD_TR, + I PTRACERS_dTLev, GAD_TR, I PTRACERS_advScheme(iTracer), I PTRACERS_advScheme(iTracer), I calcAdvection, PTRACERS_ImplVertAdv(iTracer), @@ -157,27 +165,30 @@ & CALL PTRACERS_FORCING( I bi,bj,iMin,iMax,jMin,jMax,k,iTracer, U gPtr(1-Olx,1-Oly,1,1,1,iTracer), - I surfaceForcingPtr(1-Olx,1-Oly,1,1,iTracer), + I surfaceForcingPTr(1-Olx,1-Oly,1,1,iTracer), I myIter,myTime,myThid) C If using Adams-Bashforth II, then extrapolate tendencies C gPtr is now the tracer tendency for explicit advection/diffusion - IF ( PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND - & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD - & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH ) THEN + IF ( PTRACERS_AdamsBashGtr(iTracer) ) THEN #ifdef ALLOW_MATRIX C If matrix is being computed, block call to S/R ADAMS_BASHFORTH2 to -C prevent gPtr from being replaced by the average of gPtr and gPtrNm1. +C prevent gPtr from being replaced by the average of gPtr and gpTrNm1. IF (.NOT.useMATRIX) THEN #endif +C compute iter at beginning of ptracer time step +#ifdef ALLOW_LONGSTEP + iterNb = myIter - LS_nIter + 1 + IF (LS_whenToSample.GE.2) iterNb = myIter - LS_nIter +#else iterNb = myIter IF (staggerTimeStep) iterNb = myIter - 1 - startAB = nIter0 - PTRACERS_Iter0 +#endif CALL ADAMS_BASHFORTH2( - I bi,bj,K, - U gPtr(1-Olx,1-Oly,1,1,1,iTracer), - U gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer), - I startAB, iterNb, myThid ) + I bi,bj,K, + U gPtr(1-Olx,1-Oly,1,1,1,iTracer), + U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), + I PTRACERS_startAB(iTracer), iterNb, myThid ) #ifdef ALLOW_MATRIX ENDIF #endif @@ -188,7 +199,7 @@ & CALL PTRACERS_FORCING( I bi,bj,iMin,iMax,jMin,jMax,k,iTracer, U gPtr(1-Olx,1-Oly,1,1,1,iTracer), - I surfaceForcingPtr(1-Olx,1-Oly,1,1,iTracer), + I surfaceForcingPTr(1-Olx,1-Oly,1,1,iTracer), I myIter,myTime,myThid) #ifdef NONLIN_FRSURF @@ -198,12 +209,10 @@ I bi,bj,K, U gPtr(1-Olx,1-Oly,1,1,1,iTracer), I myThid ) - IF ( PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND - & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD - & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH ) + IF ( PTRACERS_AdamsBashGtr(iTracer) ) & CALL FREESURF_RESCALE_G( I bi,bj,K, - U gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer), + U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), I myThid ) ENDIF #endif /* NONLIN_FRSURF */ @@ -212,19 +221,11 @@ CALL TIMESTEP_TRACER( I bi,bj,iMin,iMax,jMin,jMax,k, I PTRACERS_advScheme(iTracer), + I PTRACERS_dTLev(k), I pTracer(1-Olx,1-Oly,1,1,1,iTracer), I gPtr(1-Olx,1-Oly,1,1,1,iTracer), I myIter,myThid ) -#ifdef ALLOW_OBCS -C Apply open boundary conditions - IF (useOBCS) THEN - CALL OBCS_APPLY_PTRACER( - I bi, bj, k, iTracer, - U gPtr(1-Olx,1-Oly,k,bi,bj,iTracer), - I myThid ) - END IF -#endif /* ALLOW_OBCS */ C end of tracer loop ENDDO