C $Header: /u/gcmpack/MITgcm/model/src/adams_bashforth2.F,v 1.10 2014/08/14 16:49:19 jmc Exp $ C $Name: $ #include "CPP_OPTIONS.h" CBOP C !ROUTINE: ADAMS_BASHFORTH2 C !INTERFACE: SUBROUTINE ADAMS_BASHFORTH2( I bi, bj, kArg, kSize, U gTracer, gTrNm1, O AB_gTr, I startAB, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R ADAMS_BASHFORTH2 C | o Extrapolate forward in time using quasi-second order C | Adams-Bashforth method. C *==========================================================* C | Either apply to tendency (kArg>0) at level k=kArg, C | or apply to state variable (kArg=0) for all levels C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C bi,bj :: Tile indices C kArg :: if >0: apply AB on tendency at level k=kArg C :: if =0: apply AB on state variable and process all levels C kSize :: 3rd dimension of tracer and tendency arrays C gTracer :: in: Tendency/State at current time C :: out (kArg >0): Extrapolated Tendency at current time C gTrNm1 :: in: Tendency/State at previous time C :: out: (kArg >0) Save tendency at current time C :: out: (kArg =0) Extrapolated State at current time C AB_gTr :: Adams-Bashforth tendency increment C startAB :: number of previous time level available to start/restart AB C myIter :: Current time step number C myThid :: my Thread Id. number INTEGER bi, bj, kArg, kSize _RL gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize) _RL gTrNm1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize) _RL AB_gTr (1-OLx:sNx+OLx,1-OLy:sNy+OLy) INTEGER startAB INTEGER myIter, myThid C !LOCAL VARIABLES: C == Local variables == C k :: level index C i,j :: Loop counters C abFac :: Adams bashforth extrapolation factor INTEGER i, j, k _RL abFac CEOP C Adams-Bashforth extrapolation factor IF ( myIter.EQ.nIter0 .AND. startAB.EQ.0 ) THEN abFac = 0. _d 0 ELSE abFac = 0.5 _d 0 + abEps ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| IF ( kArg.EQ.0 ) THEN C- Extrapolate forward in time the state variable, with AB weights: DO k=1,kSize DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx AB_gTr(i,j) = abFac*( gTracer(i,j,k) - gTrNm1(i,j,k) ) gTrNm1(i,j,k) = gTracer(i,j,k) + AB_gTr(i,j) ENDDO ENDDO ENDDO ELSE C- Extrapolate forward in time the tendency, with AB weights: k = kArg DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx AB_gTr(i,j) = abFac*( gTracer(i,j,k) - gTrNm1(i,j,k) ) gTrNm1(i,j,k) = gTracer(i,j,k) gTracer(i,j,k) = gTracer(i,j,k) + AB_gTr(i,j) ENDDO ENDDO ENDIF RETURN END