C $Header: /u/gcmpack/MITgcm/pkg/monitor/mon_calc_advcfl.F,v 1.2 2016/07/22 14:21:20 jmc Exp $ C $Name: $ #include "MONITOR_OPTIONS.h" C-- File mon_calc_advcfl.F: Routines to compute Tracer Advective CFL C-- Contents C-- o MON_CALC_ADVCFL_TILE C-- o MON_CALC_ADVCFL_GLOB C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: MON_CALC_ADVCFL_TILE C !INTERFACE: SUBROUTINE MON_CALC_ADVCFL_TILE( I myNr, bi, bj, I uFld, vFld, wFld, dT_lev, O maxCFL, I myIter, myThid ) C Calculate Maximum advective CFL in 3 direction (x,y,z) C for current tile bi,bj C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" c#include "SURFACE.h" c#include "MONITOR.h" C !INPUT/OUTPUT PARAMETERS: C myNr :: number of levels C bi, bj :: tile indices C uFld :: zonal velocity C vFld :: merid velocity C wFld :: vert. velocity C dT_lev :: tracer time-step C maxCFL :: maximum advective CFL in 3 directions C myIter :: my Iteration number C myThid :: my Thread Id number INTEGER myNr, bi, bj _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr) _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr) _RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNr) _RL dT_lev(myNr) _RL maxCFL(3) INTEGER myIter, myThid CEOP C !LOCAL VARIABLES: INTEGER i,j,k _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL rTransKp1, tmpVal, recVol_dT C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| maxCFL(1) = 0. maxCFL(2) = 0. maxCFL(3) = 0. DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx rTrans(i,j) = 0. ENDDO ENDDO DO k=myNr,1,-1 C-- compute horiz. transport and time-step divided by volume C (without level thickness "drF" since it cancels) DO j=1,sNy+1 DO i=1,sNx+1 uTrans(i,j) = uFld(i,j,k)*dyG(i,j,bi,bj)*deepFacC(k) & *hFacW(i,j,k,bi,bj) vTrans(i,j) = vFld(i,j,k)*dxG(i,j,bi,bj)*deepFacC(k) & *hFacS(i,j,k,bi,bj) ENDDO ENDDO DO j=1,sNy DO i=1,sNx recVol_dT = dT_lev(k) & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k) & *recip_hFacC(i,j,k,bi,bj) tmpVal = ( & + MAX( uTrans(i+1,j), zeroRL ) & - MIN( uTrans( i ,j), zeroRL ) & )*recVol_dT maxCFL(1) = MAX( maxCFL(1), tmpVal ) tmpVal = ( & + MAX( vTrans(i,j+1), zeroRL ) & - MIN( vTrans(i, j ), zeroRL ) & )*recVol_dT maxCFL(2) = MAX( maxCFL(2), tmpVal ) ENDDO ENDDO C-- compute vert. transport and time-step divided by volume C (without grid-cell area "rA" since it cancels) DO j=1,sNy DO i=1,sNx rTransKp1 = rTrans(i,j) rTrans(i,j) = wFld(i,j,k) & *deepFac2F(k)*rhoFacF(k) recVol_dT = dT_lev(k) & *recip_deepFac2C(k)*recip_rhoFacC(k) & *recip_drF(k)*recip_hFacC(i,j,k,bi,bj) tmpVal = ( & + MAX( rTrans(i,j), zeroRL ) & - MIN( rTransKp1, zeroRL ) & )*recVol_dT maxCFL(3) = MAX( maxCFL(3), tmpVal ) ENDDO ENDDO ENDDO RETURN END C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: MON_CALC_ADVCFL_GLOB C !INTERFACE: SUBROUTINE MON_CALC_ADVCFL_GLOB( I maxCFL, myIter, myThid ) C !DESCRIPTION: C Calculate Maximum advective CFL in 3 direction (x,y,z) C in global domain (from tile-max value) C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "MONITOR.h" C !INPUT PARAMETERS: C maxCFL :: maximum advective CFL (per tile) in 3 directions C myIter :: Current iteration number in simulation C myThid :: my Thread Id number _RL maxCFL(3,nSx,nSy) INTEGER myIter INTEGER myThid CEOP C !LOCAL VARIABLES: INTEGER bi, bj _RL uCFL, vCFL, wCFL uCFL = 0. vCFL = 0. wCFL = 0. DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) uCFL = MAX( uCFL, maxCFL(1,bi,bj) ) vCFL = MAX( vCFL, maxCFL(2,bi,bj) ) wCFL = MAX( wCFL, maxCFL(3,bi,bj) ) ENDDO ENDDO _GLOBAL_MAX_RL( uCFL, myThid ) _GLOBAL_MAX_RL( vCFL, myThid ) _GLOBAL_MAX_RL( wCFL, myThid ) C- store values in common bloc _BEGIN_MASTER(myThid) mon_trAdvCFL(1) = uCFL mon_trAdvCFL(2) = vCFL mon_trAdvCFL(3) = wCFL _END_MASTER(myThid) RETURN END