C $Header: /u/gcmpack/MITgcm/pkg/gmredi/gmredi_residual_flow.F,v 1.2 2015/01/20 20:51:20 jmc Exp $ C $Name: $ #include "GMREDI_OPTIONS.h" CBOP C !ROUTINE: GMREDI_RESIDUAL_FLOW C !INTERFACE: SUBROUTINE GMREDI_RESIDUAL_FLOW( U uFld, vFld, wFld, I bi, bj, myIter, myThid ) C !DESCRIPTION: C Add GM-bolus velocity to Eulerian velocity to get Residual Mean velocity. C !USES: IMPLICIT NONE C == GLobal variables == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "GMREDI.h" #ifdef ALLOW_EDDYPSI # include "DYNVARS.h" # include "FFIELDS.h" #endif C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == C uFld :: zonal velocity (updated) C vFld :: meridional velocity (updated) C wFld :: vertical volume transport (updated) C bi,bj :: tile indices C myIter :: my Iteration number C myThid :: my Thread Id number INTEGER bi, bj, myIter, myThid _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) #ifdef ALLOW_GMREDI #ifdef GM_BOLUS_ADVEC C !LOCAL VARIABLES: C == Local variables == C i, j, k :: loop indices INTEGER i, j, k INTEGER kp1 _RL maskp1 _RL delPsi #ifdef ALLOW_EDDYPSI _RL ustar, vstar #endif CEOP IF ( GM_AdvForm .AND. .NOT.GM_AdvSeparate & .AND. .NOT.GM_InMomAsStress ) THEN DO k=1,Nr kp1 = MIN(k+1,Nr) maskp1 = 1. IF (k.GE.Nr) maskp1 = 0. DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx delPsi = GM_PsiX(i,j,kp1,bi,bj)*maskp1 & - GM_PsiX(i,j, k, bi,bj) uFld(i,j,k) = uFld(i,j,k) & + delPsi*recip_drF(k)*_recip_hFacW(i,j,k,bi,bj) ENDDO ENDDO DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx delPsi = GM_PsiY(i,j,kp1,bi,bj)*maskp1 & - GM_PsiY(i,j, k, bi,bj) vFld(i,j,k) = vFld(i,j,k) & + delPsi*recip_drF(k)*_recip_hFacS(i,j,k,bi,bj) ENDDO ENDDO DO j=1-OLy,sNy+OLy-1 DO i=1-OLx,sNx+OLx-1 delPsi = ( dyG(i+1,j,bi,bj)*GM_PsiX(i+1,j,k,bi,bj) & -dyG( i ,j,bi,bj)*GM_PsiX( i ,j,k,bi,bj) & +dxG(i,j+1,bi,bj)*GM_PsiY(i,j+1,k,bi,bj) & -dxG(i, j ,bi,bj)*GM_PsiY(i, j ,k,bi,bj) & )*maskC(i,j,k,bi,bj) wFld(i,j,k) = wFld(i,j,k) + delPsi*recip_rA(i,j,bi,bj) ENDDO ENDDO ENDDO #ifdef ALLOW_EDDYPSI ELSEIF( GM_AdvForm .AND. .NOT.GM_AdvSeparate & .AND. GM_InMomAsStress ) THEN C Calculate the mean velocity from the residual and bolus DO k=1,Nr kp1 = MIN(k+1,Nr) maskp1 = 1. IF (k.GE.Nr) maskp1 = 0. DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx delPsi = GM_PsiX(i,j,kp1,bi,bj)*maskp1 & - GM_PsiX(i,j, k, bi,bj) ustar = delPsi*recip_drF(k)*_recip_hFacW(i,j,k,bi,bj) uEulerMean(i,j,k,bi,bj) = uVel(i,j,k,bi,bj) - ustar ENDDO ENDDO DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx delPsi = GM_PsiY(i,j,kp1,bi,bj)*maskp1 & - GM_PsiY(i,j, k, bi,bj) vstar = delPsi*recip_drF(k)*_recip_hFacS(i,j,k,bi,bj) vEulerMean(i,j,k,bi,bj) = vVel(i,j,k,bi,bj) - vstar ENDDO ENDDO ENDDO #ifdef ALLOW_DIAGNOSTICS IF ( useDiagnostics ) THEN CALL DIAGNOSTICS_FILL(uEulerMean,'U_EulerM',0,Nr,1,bi,bj,myThid) CALL DIAGNOSTICS_FILL(vEulerMean,'V_EulerM',0,Nr,1,bi,bj,myThid) ENDIF #endif /* ALLOW_DIAGNOSTICS */ #endif /* ALLOW_EDDYPSI */ ENDIF #endif /* GM_BOLUS_ADVEC */ #endif /* ALLOW_GMREDI */ RETURN END