C $Header: /u/gcmpack/MITgcm/pkg/atm_phys/atm_phys_dyn2phys.F,v 1.2 2015/01/22 18:11:13 jmc Exp $
C $Name: $
#include "ATM_PHYS_OPTIONS.h"
CBOP
C !ROUTINE: ATM_PHYS_DYN2PHYS
C !INTERFACE: ==========================================================
SUBROUTINE ATM_PHYS_DYN2PHYS(
O lat2d, pHalf3d, pFull3d,
O zHalf3d, zFull3d,
O t3d, q3d, u3d, v3d,
I bi, bj, myTime, myIter, myThid )
C !DESCRIPTION:
C *==========================================================*
C | S/R ATM_PHYS_DYN2PHYS
C | o Get grid and dynamical fields (from main model common
C | blocks) and return them as argument to ATM_PHYS_DRIVER
C *==========================================================*
C \ev
C !USES: ===============================================================
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "SURFACE.h"
C !INPUT PARAMETERS: ===================================================
C bi, bj :: Tile indices
C myTime :: Current time in simulation
C myIter :: Current time-step number
C myThid :: my Thread Id number
INTEGER bi, bj
_RL myTime
INTEGER myIter, myThid
C !OUTPUT PARAMETERS: ==================================================
C lat2d :: latitude of grid-cell center [rad]
C pHalf3d :: pressure at interface between 2 levels [Pa]
C pFull3d :: pressure at level center [Pa]
C zHalf3d :: height of interface between 2 levels [m]
C zFull3d :: height of level center [m]
C t3d :: absolute temperature [K]
C q3d :: specific humidity [kg/kg]
C u3d :: wind speed, 1rst component (X-dir) [m/s]
C v3d :: wind speed, 2nd component (Y-dir) [m/s]
_RL lat2d (sNx,sNy)
_RL pHalf3d (sNx,sNy,Nr+1)
_RL pFull3d (sNx,sNy,Nr)
_RL zHalf3d (sNx,sNy,Nr+1)
_RL zFull3d (sNx,sNy,Nr)
_RL t3d (sNx,sNy,Nr)
_RL q3d (sNx,sNy,Nr)
_RL u3d (sNx,sNy,Nr)
_RL v3d (sNx,sNy,Nr)
C !LOCAL VARIABLES: ====================================================
_RL conv_theta2T
INTEGER k, kc, ki, kp
c INTEGER ioUnit
c _RS dummyRS(1)
c CHARACTER*40 namFile
CEOP
C-- latitude and pressure levels
lat2d(:,:) = yC(1:sNx,1:sNy,bi,bj)*deg2rad
#ifdef NONLIN_FRSURF
IF ( nonlinFreeSurf.GT.0 ) THEN
IF ( staggerTimeStep.AND.select_rStar.GT.0 ) THEN
DO k=1,Nr
kc = Nr-k+1
pFull3d(:,:,k) = rF(Nr+1) + ( rC(kc) - rF(Nr+1) )
& *rStarFacC(1:sNx,1:sNy,bi,bj)
ENDDO
DO k=1,Nr+1
ki = Nr-k+2
pHalf3d(:,:,k) = rF(Nr+1) + ( rF(ki) - rF(Nr+1) )
& *rStarFacC(1:sNx,1:sNy,bi,bj)
ENDDO
ELSEIF ( select_rStar.GT.0 ) THEN
DO k=1,Nr
kc = Nr-k+1
pFull3d(:,:,k) = rF(Nr+1) + ( rC(kc) - rF(Nr+1) )
& *rStarFacNm1C(1:sNx,1:sNy,bi,bj)
ENDDO
DO k=1,Nr+1
ki = Nr-k+2
pHalf3d(:,:,k) = rF(Nr+1) + ( rF(ki) - rF(Nr+1) )
& *rStarFacNm1C(1:sNx,1:sNy,bi,bj)
ENDDO
ELSE
STOP 'ATM_PHYS_DYN2PHYS: misssing code - 1 -'
ENDIF
ELSE
#else /* ndef NONLIN_FRSURF */
IF (.TRUE.) THEN
#endif /* NONLIN_FRSURF */
DO k=1,Nr
kc = Nr-k+1
pFull3d(:,:,k) = rC(kc)
ENDDO
DO k=1,Nr+1
ki = Nr-k+2
pHalf3d(:,:,k) = rF(ki)
ENDDO
ENDIF
C-- level height and 3-D dynamical fields
DO k=1,Nr
kc = Nr-k+1
zFull3d(:,:,k) = ( phiRef(2*kc)
& + totPhiHyd(1:sNx,1:sNy,kc,bi,bj)
& )*recip_gravity
conv_theta2T = (rC(kc)/atm_po)**atm_kappa
t3d(:,:,k) = theta(1:sNx,1:sNy,kc,bi,bj)*conv_theta2T
q3d(:,:,k) = MAX( salt(1:sNx,1:sNy,kc,bi,bj), 0. _d 0 )
u3d(:,:,k) = ( uVel(1:sNx, 1:sNy,kc,bi,bj)
& + uVel(2:sNx+1,1:sNy,kc,bi,bj) )*0.5 _d 0
v3d(:,:,k) = ( vVel(1:sNx,1:sNy, kc,bi,bj)
& + vVel(1:sNx,2:sNy+1,kc,bi,bj) )*0.5 _d 0
IF ( nonlinFreeSurf.LE.0 ) THEN
zFull3d(:,:,k) = zFull3d(:,:,k)
& - Bo_surf(1:sNx,1:sNy,bi,bj)
& *etaN(1:sNx,1:sNy,bi,bj)
& *recip_gravity
ENDIF
#ifdef NONLIN_FRSURF
IF ( select_rStar.GE.1 ) THEN
t3d(:,:,k) = t3d(:,:,k)*pStarFacK(1:sNx,1:sNy,bi,bj)
ENDIF
#endif /* NONLIN_FRSURF */
ENDDO
c ioUnit = 0
c WRITE(namFile,'(A,I10.10)') 'z1_Atm.', myIter
c CALL MDS_WRITEVEC_LOC(
c I namFile, writeBinaryPrec, ioUnit,
c I 'RL', sNx*sNy, zFull3d(1,1,Nr), dummyRS,
c I bi, bj, 1, myIter, myThid )
DO k=1,Nr+1
ki = Nr-k+2
zHalf3d(:,:,k) = phiRef(2*ki-1)*recip_gravity
ENDDO
DO k=1,Nr
kc = Nr-k+1
kp = MIN(kc+1,Nr)
zHalf3d(:,:,k) = zHalf3d(:,:,k)
& + ( totPhiHyd(1:sNx,1:sNy,kp,bi,bj)
& +totPhiHyd(1:sNx,1:sNy,kc,bi,bj) )*0.5
& *recip_gravity
IF ( nonlinFreeSurf.LE.0 ) THEN
zHalf3d(:,:,k) = zHalf3d(:,:,k)
& - Bo_surf(1:sNx,1:sNy,bi,bj)
& *etaN(1:sNx,1:sNy,bi,bj)
& *recip_gravity
ENDIF
ENDDO
RETURN
END