C $Header: /u/gcmpack/MITgcm/model/src/correction_step.F,v 1.29 2017/08/21 18:34:47 jmc Exp $ C $Name: $ #include "PACKAGES_CONFIG.h" #include "CPP_OPTIONS.h" CBOP C !ROUTINE: CORRECTION_STEP C !INTERFACE: SUBROUTINE CORRECTION_STEP( bi, bj, iMin, iMax, jMin, jMax, I phiSurfX, phiSurfY, I myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R CORRECTION_STEP C | o Corrects the horizontal flow fields with the surface C | pressure (and Non-Hydrostatic pressure). C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #ifdef ALLOW_NONHYDROSTATIC #include "NH_VARS.h" #endif C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C bi, bj :: Tile indices C iMin,iMax,jMin,jMax :: Loop counters range C phiSurfX, phiSurfY :: Surface Potential gradient C myTime :: Current time in simulation C myIter :: Current iteration number in simulation C myThid :: my Thread Id number _RL phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy) INTEGER bi, bj INTEGER iMin, iMax, jMin, jMax _RL myTime INTEGER myIter INTEGER myThid C !LOCAL VARIABLES: C == Local variables == C i, j :: Loop counters C k :: Level index C psFac, nhFac :: Scaling parameters for supressing gradients C gU_dpx :: implicit part of pressure gradient tendency C gV_dpy :: implicit part of pressure gradient tendency INTEGER i,j INTEGER k _RL psFac, nhFac _RL gU_dpx(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL gV_dpy(1-OLx:sNx+OLx,1-OLy:sNy+OLy) CEOP C-- Loop over all layers, top to bottom DO k=1,Nr #ifdef ALLOW_SOLVE4_PS_AND_DRAG IF ( selectImplicitDrag.EQ.2 ) THEN C On/off scaling parameter psFac = pfFacMom*implicSurfPress C Pressure gradient tendency (zonal mom): Implicit part DO j=jMin,jMax DO i=iMin,iMax gU_dpx(i,j) = & -psFac*dU_psFacX(i,j,k,bi,bj)*phiSurfX(i,j) c & *_maskW(i,j,k,bi,bj) ENDDO ENDDO C Pressure gradient tendency (merid mom): Implicit part DO j=jMin,jMax DO i=iMin,iMax gV_dpy(i,j) = & -psFac*dV_psFacY(i,j,k,bi,bj)*phiSurfY(i,j) c & *_maskS(i,j,k,bi,bj) ENDDO ENDDO ELSE #endif /* ALLOW_SOLVE4_PS_AND_DRAG */ C On/off scaling parameters (including anelastic & deep-model factors) psFac = pfFacMom*implicSurfPress & *recip_deepFacC(k)*recip_rhoFacC(k) IF ( use3Dsolver ) THEN nhFac = pfFacMom*implicitNHPress & *recip_deepFacC(k)*recip_rhoFacC(k) ELSE nhFac = 0. ENDIF C Pressure gradient tendency (zonal mom): Implicit part DO j=jMin,jMax DO i=iMin,iMax gU_dpx(i,j) = -( & psFac*phiSurfX(i,j) #ifdef ALLOW_NONHYDROSTATIC & + nhFac*_recip_dxC(i,j,bi,bj) & *(phi_nh(i,j,k,bi,bj)-phi_nh(i-1,j,k,bi,bj)) #endif & )*_maskW(i,j,k,bi,bj) ENDDO ENDDO C Pressure gradient tendency (merid mom): Implicit part DO j=jMin,jMax DO i=iMin,iMax gV_dpy(i,j) = -( & psFac*phiSurfY(i,j) #ifdef ALLOW_NONHYDROSTATIC & + nhFac*_recip_dyC(i,j,bi,bj) & *(phi_nh(i,j,k,bi,bj)-phi_nh(i,j-1,k,bi,bj)) #endif & )*_maskS(i,j,k,bi,bj) ENDDO ENDDO #ifdef ALLOW_SOLVE4_PS_AND_DRAG ENDIF #endif /* ALLOW_SOLVE4_PS_AND_DRAG */ C Update zonal velocity: add implicit pressure gradient tendency DO j=jMin,jMax DO i=iMin,iMax uVel(i,j,k,bi,bj)=( gU(i,j,k,bi,bj) & + deltaTMom*gU_dpx(i,j) & )*_maskW(i,j,k,bi,bj) #ifdef ALLOW_OBCS & *maskInW(i,j,bi,bj) #endif ENDDO ENDDO C Update merid. velocity: add implicit pressure gradient tendency DO j=jMin,jMax DO i=iMin,iMax vVel(i,j,k,bi,bj)=( gV(i,j,k,bi,bj) & + deltaTMom*gV_dpy(i,j) & )*_maskS(i,j,k,bi,bj) #ifdef ALLOW_OBCS & *maskInS(i,j,bi,bj) #endif ENDDO ENDDO #ifdef ALLOW_DIAGNOSTICS c IF ( useDiagnostics ) THEN c CALL DIAGNOSTICS_FILL( gU_dpx, c & 'UDIAG7 ', k, 1, 2, bi, bj, myThid ) c CALL DIAGNOSTICS_FILL( gV_dpy, c & 'UDIAG8 ', k, 1, 2, bi, bj, myThid ) c ENDIF #endif /* ALLOW_DIAGNOSTICS */ C- end of k loop ENDDO RETURN END