!WRF:MODEL_LAYER:PHYSICS
!
MODULE module_sf_ocean_driver 1
CONTAINS
!----------------------------------------------------------------
SUBROUTINE OCEAN_DRIVER(tml,t0ml,hml,h0ml,huml,hvml,ust,u_phy,v_phy, & 1,5
tmoml,f,g,oml_gamma, &
XLAND,HFX,LH,TSK,GSW,GLW,EMISS, &
DELTSM,STBOLT, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
sf_ocean_physics,okms, okme, & !cyl
om_tmp,om_s,om_u, om_v, om_depth, om_ml, & !cyl
om_lat, om_lon, & !cyl
QFX, & !cyl
rdx, rdy, msfu, msfv, msft,xtime,om_tini,om_sini,id,omdt, & !cyl
itimestep)
!----------------------------------------------------------------
#if ( EM_CORE==1)
USE module_state_description, ONLY : OMLSCHEME , PWP3DSCHEME
USE module_sf_oml
USE module_sf_3dpwp
#endif
IMPLICIT NONE
!----------------------------------------------------------------
!
! SUBROUTINE OCEANML CALCULATES THE SEA SURFACE TEMPERATURE (TSK)
! FROM A SIMPLE OCEAN MIXED LAYER MODEL BASED ON
! (Pollard, Rhines and Thompson (1973).
!
!-- TML ocean mixed layer temperature (K)
!-- T0ML ocean mixed layer temperature (K) at initial time
!-- TMOML top 200 m ocean mean temperature (K) at initial time
!-- HML ocean mixed layer depth (m)
!-- H0ML ocean mixed layer depth (m) at initial time
!-- HUML ocean mixed layer u component of wind
!-- HVML ocean mixed layer v component of wind
!-- OML_GAMMA deep water lapse rate (K m-1)
!-- UAIR,VAIR lowest model level wind component
!-- UST frictional velocity
!-- HFX upward heat flux at the surface (W/m^2)
!-- LH latent heat flux at the surface (W/m^2)
!-- TSK surface temperature (K)
!-- GSW downward short wave flux at ground surface (W/m^2)
!-- GLW downward long wave flux at ground surface (W/m^2)
!-- EMISS emissivity of the surface
!-- XLAND land mask (1 for land, 2 for water)
!-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
!-- F Coriolis parameter
!-- DT time step (second)
!-- G acceleration due to gravity
INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte
REAL, INTENT(IN ) :: DELTSM, STBOLT
REAL, DIMENSION( ims:ime, jms:jme ) , &
INTENT(IN ) :: EMISS, &
XLAND, &
GSW, &
GLW, &
HFX, &
LH
REAL, DIMENSION( ims:ime, jms:jme ) , &
INTENT(INOUT) :: TSK
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: &
TML,T0ML,HML,H0ML,HUML,HVML
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: &
U_PHY,V_PHY
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: &
UST, F, TMOML
REAL, INTENT(IN ) :: G
REAL, INTENT(IN ) :: OML_GAMMA
! LOCAL VARS
INTEGER :: I,J
! variables for subrouting Dpwp
INTEGER, OPTIONAL, INTENT(IN ):: sf_ocean_physics
integer :: okms, okme
real, dimension(ims:ime, okms:okme, jms:jme), INTENT(INOUT):: OM_TMP,OM_S,OM_U,OM_V,OM_DEPTH
real, dimension(ims:ime, okms:okme, jms:jme):: om_density
real, dimension(ims:ime, okms:okme, jms:jme), INTENT(IN):: OM_TINI,OM_SINI
real, dimension(ims:ime, jms:jme),INTENT(INOUT):: OM_ML, OM_LAT, OM_LON
REAL, INTENT(IN ) :: rdx, rdy,xtime,omdt
REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: msfu, msfv, msft,qfx
INTEGER , INTENT(IN) :: id,itimestep
integer :: stepom
#if ( EM_CORE==1)
! calculate the steps of om
stepom=nint(omdt*60/deltsm)
stepom = max(stepom,1)
! cyl:OML1D or DPWP
if ( sf_ocean_physics .eq. OMLSCHEME ) then
DO J=jts,jte
DO i=its,ite
IF (XLAND(I,J).GT.1.5) THEN
CALL OML1D
(I,J,TML(i,j),T0ML(i,j),HML(i,j),H0ML(i,j), &
HUML(i,j),HVML(i,j),TSK(i,j),HFX(i,j), &
LH(i,j),GSW(i,j),GLW(i,j),TMOML(i,j), &
U_PHY(i,kts,j),V_PHY(i,kts,j),UST(i,j),F(i,j), &
EMISS(i,j),STBOLT,G,DELTSM,OML_GAMMA, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
ENDIF
ENDDO
ENDDO
! call 3DPWP
elseif ( sf_ocean_physics .eq. PWP3DSCHEME ) then
call wrf_debug
( 100, 'call 3DPWP' )
if ( itimestep .eq. 1 .or. mod(itimestep, stepom) .eq. 0 ) then
! run 3DPWP only when the grid resolution larger than 3.0 km
print*,'dx',1.0/rdx
if ( 1.0/rdx .ge. 3000.0 .and. 1.0/rdy .ge. 3000.0 ) then
call DPWP
(ims,ime, jms,jme, kms,kme,its,ite, jts,jte, kts,kte, &
ids,ide, jds,jde, kds,kde,okms, okme, &
om_tmp,om_s,om_u, om_v, om_density, om_depth, om_ml, &
om_lat, om_lon, &
HFX, QFX, GSW, GLW, UST, U_PHY, V_PHY, &
STBOLT, DELTSM, TSK, LH, XLAND, &
rdx, rdy, msfu, msfv, msft,xtime,om_tini,om_sini,id,omdt)
else
print*,'Domain',id,' no ocean'
do i = its, ite
do j = jts, jte
if (XLAND(i,j).GE.1.5)then
TSK(i,j) = om_tmp(i, 1, j)
endif
enddo
enddo
endif
endif
endif
#endif
END SUBROUTINE OCEAN_DRIVER
!----------------------------------------------------------------
END MODULE module_sf_ocean_driver