C $Header: /u/gcmpack/MITgcm/model/src/diags_phi_hyd.F,v 1.7 2014/05/02 16:57:43 jmc Exp $ C $Name: $ #include "PACKAGES_CONFIG.h" #include "CPP_OPTIONS.h" CBOP C !ROUTINE: DIAGS_PHI_HYD C !INTERFACE: SUBROUTINE DIAGS_PHI_HYD( I k, bi, bj, iMin,iMax, jMin,jMax, I phiHydC, I myTime, myIter, myThid) C !DESCRIPTION: \bv C *==========================================================* C | S/R DIAGS_PHI_HYD C | o Diagnose full hydrostatic Potential at cell center ; C | used for output & with EOS funct. of P C *==========================================================* C | NOTE: For now, only contains the (total) Potential anomaly C | since phiRef (for Atmos) is not available (not in common) C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "SURFACE.h" #include "DYNVARS.h" C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C k, bi,bj :: level & tile indices C iMin,iMax,jMin,jMax :: Loop counters C phiHydC :: hydrostatic potential anomaly at cell center C (atmos: =Geopotential ; ocean-z: =Pressure/rho) C myTime :: Current time C myIter :: Current iteration number C myThid :: Instance number for this call of the routine. INTEGER k, bi,bj, iMin,iMax, jMin,jMax _RL phiHydC(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL myTime INTEGER myIter, myThid #ifdef INCLUDE_PHIHYD_CALCULATION_CODE C !LOCAL VARIABLES: C == Local variables == C i,j :: Loop counters C phiHydCstR :: total hydrostatic Potential (anomaly, for now), C at fixed r-position, cell center level location. INTEGER i,j #ifdef NONLIN_FRSURF _RL facP, dPhiRef _RL phiHydCstR(1-OLx:sNx+OLx,1-OLy:sNy+OLy) #endif /* NONLIN_FRSURF */ CEOP DO j=jMin,jMax DO i=iMin,iMax totPhiHyd(i,j,k,bi,bj) = phiHydC(i,j) & + Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj) & + phi0surf(i,j,bi,bj) #ifdef NONLIN_FRSURF phiHydCstR(i,j) = totPhiHyd(i,j,k,bi,bj) #endif /* NONLIN_FRSURF */ ENDDO ENDDO #ifdef NONLIN_FRSURF c IF (select_rStar.GE.2 .AND. nonlinFreeSurf.GE.4 ) THEN IF (select_rStar.GE.1 .AND. nonlinFreeSurf.GE.4 ) THEN c# ifndef DISABLE_RSTAR_CODE C- Integral of b.dr = rStarFac * Integral of b.dr* : IF ( fluidIsAir ) THEN C- Consistent with Phi'= Integr[ theta'.dPi ] : DO j=jMin,jMax DO i=iMin,iMax facP = pStarFacK(i,j,bi,bj) dPhiRef = phiRef(2*k) - gravity*topoZ(i,j,bi,bj) & - phi0surf(i,j,bi,bj) totPhiHyd(i,j,k,bi,bj) = & phiHydC(i,j)*facP & + MAX( dPhiRef, 0. _d 0 )*( facP - 1. _d 0 ) & + phi0surf(i,j,bi,bj) c phiHydCstR(i,j) = phiHydCstR(i,j) c & + phiHydC(i,j)*( facP - 1. _d 0 ) ENDDO ENDDO ELSEIF ( usingPCoords ) THEN DO j=jMin,jMax DO i=iMin,iMax c & dPhiRef = phiRef(2*k) - gravity*topoZ(i,j,bi,bj) c & - phi0surf(i,j,bi,bj) C-- assume PhiRef is just (ps0 - p)/rhoConst : dPhiRef =( Ro_surf(i,j,bi,bj)-rC(k) )*recip_rhoConst totPhiHyd(i,j,k,bi,bj) = & phiHydC(i,j)*rStarFacC(i,j,bi,bj) & + MAX( dPhiRef, 0. _d 0 ) & *( rStarFacC(i,j,bi,bj) - 1. _d 0 ) & + phi0surf(i,j,bi,bj) c totPhiHyd(i,j,k,bi,bj) = phiHydCstR(i,j) ENDDO ENDDO ELSE DO j=jMin,jMax DO i=iMin,iMax dPhiRef =( Ro_surf(i,j,bi,bj)-rC(k) )*gravity totPhiHyd(i,j,k,bi,bj) = & phiHydC(i,j)*rStarFacC(i,j,bi,bj) & + MAX( dPhiRef, 0. _d 0 ) & *( rStarFacC(i,j,bi,bj) - 1. _d 0 ) & + phi0surf(i,j,bi,bj) c totPhiHyd(i,j,k,bi,bj) = phiHydCstR(i,j) ENDDO ENDDO ENDIF #ifdef ALLOW_DIAGNOSTICS C-- skip diagnostics if called from INI_PRESSURE IF ( useDiagnostics .AND. myIter.GE.0 ) THEN CALL DIAGNOSTICS_FILL(phiHydCstR,'PHIHYDcR',k,1,2,bi,bj,myThid) ENDIF #endif /* ALLOW_DIAGNOSTICS */ c# endif /* DISABLE_RSTAR_CODE */ ENDIF #endif /* NONLIN_FRSURF */ #endif /* INCLUDE_PHIHYD_CALCULATION_CODE */ RETURN END