!WRF:MODEL_LAYER:PHYSICS
!
!------------------------------------------------------------------
SUBROUTINE pbl_driver(itimestep,dt,u_frame,v_frame, & 1,23
RUBLTEN,RVBLTEN,RTHBLTEN, &
RQVBLTEN,RQCBLTEN,RQIBLTEN, &
RAINCV,RAINNCV,RAINBL, &
GLW,GSW,EMISS,TSK,TMN,XLAND,ZNT,HT,MAVAIL, &
UST,HOL,MOL,PBLH,CAPG,THC, &
SNOWC,HFX,QFX,REGIME, &
SMSTAV,SMSTOT,SFCRUNOFF,UDRUNOFF, &
IVGTYP,ISLTYP,VEGFRA,SFCEVP,GRDFLX, &
SFCEXC,ACSNOW,ACSNOM,ALB,XICE, &
th2,t2,q2,SMOIS,SNOW,CANWAT, &
u_phy,v_phy,th_phy,rho,moist, &
p_phy,pi_phy,p8w,t_phy,dz8w,z, &
TKE_MYJ,AKHS,AKMS, &
THZ0,QZ0,UZ0,VZ0,QSFC, &
LOWLYR, &
config_flags,DX,n_moist,TSLB,ZS,DZS, & !TSLB (STEMP)
num_soil_layers,STEPBL,IFSNOW,ISFFLX,warm_rain, &
u10,v10,tshltr,th10,qshltr,q10, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!------------------------------------------------------------------
USE module_bc
USE module_state_description
USE module_model_constants
! *** add new modules of schemes here
USE module_bl_sfclay
USE module_bl_myjsfc
USE module_bl_slab
USE module_bl_lsm
USE module_bl_mrf
USE module_bl_myjpbl
! This driver calls subroutines for the PBL parameterizations.
!
! surface layer: (between surface and pbl)
! 1. sfclay
! 2. myjsfc
! surface: ground temp/lsm scheme:
! 1. slab
! 2. OSU LSM
! pbl scheme:
! 1. mrf
! 2. myjpbl
!
!------------------------------------------------------------------
IMPLICIT NONE
!======================================================================
! Grid structure in physics part of WRF
!----------------------------------------------------------------------
! The horizontal velocities used in the physics are unstaggered
! relative to temperature/moisture variables. All predicted
! variables are carried at half levels except w, which is at full
! levels. Some arrays with names (*8w) are at w (full) levels.
!
!----------------------------------------------------------------------
! In WRF, kms (smallest number) is the bottom level and kme (largest
! number) is the top level. In your scheme, if 1 is at the top level,
! then you have to reverse the order in the k direction.
!
! kme - half level (no data at this level)
! kme ----- full level
! kme-1 - half level
! kme-1 ----- full level
! .
! .
! .
! kms+2 - half level
! kms+2 ----- full level
! kms+1 - half level
! kms+1 ----- full level
! kms - half level
! kms ----- full level
!
!======================================================================
! Definitions
!-----------
! Rho_d dry density (kg/m^3)
! Theta_m moist potential temperature (K)
! Qv water vapor mixing ratio (kg/kg)
! Qc cloud water mixing ratio (kg/kg)
! Qr rain water mixing ratio (kg/kg)
! Qi cloud ice mixing ratio (kg/kg)
! Qs snow mixing ratio (kg/kg)
!-----------------------------------------------------------------
!-- RUBLTEN Rho_dU tendency due to
! PBL parameterization (kg/m^3 . m/s)
!-- RVBLTEN Rho_dV tendency due to
! PBL parameterization (kg/m^3 . m/s)
!-- RTHBLTEN Rho_dTheta_m tendency due to
! PBL parameterization (kg/m^3 . K)
!-- RQVBLTEN Rho_dQv tendency due to
! PBL parameterization (kg/m^3 . kg/kg)
!-- RQCBLTEN Rho_dQc tendency due to
! PBL parameterization (kg/m^3 . kg/kg)
!-- RQIBLTEN Rho_dQi tendency due to
! PBL parameterization (kg/m^3 . kg/kg)
!-- itimestep number of time steps
!-- GLW downward long wave flux at ground surface (W/m^2)
!-- GSW downward short wave flux at ground surface (W/m^2)
!-- EMISS surface emissivity (between 0 and 1)
!-- TSK surface temperature (K)
!-- TMN soil temperature at lower boundary (K)
!-- XLAND land mask (1 for land, 2 for water)
!-- ZNT roughness length (m)
!-- MAVAIL surface moisture availability (between 0 and 1)
!-- UST u* in similarity theory (m/s)
!-- MOL q* (similarity theory) (kg/kg)
!-- HOL PBL height over Monin-Obukhov length
!-- PBLH PBL height (m)
!-- CAPG heat capacity for soil (J/K/m^3)
!-- THC thermal inertia (Cal/cm/K/s^0.5)
!-- SNOWC flag indicating snow coverage (1 for snow cover)
!-- HFX upward heat flux at the surface (W/m^2)
!-- QFX upward moisture flux at the surface (kg/m^2/s)
!-- REGIME flag indicating PBL regime (stable, unstable, etc.)
!-- tke_myj turbulence kinetic energy from Mellor-Yamada-Janjic (MYJ) (m^2/s^2)
!-- akhs sfc exchange coefficient of heat/moisture from MYJ
!-- akms sfc exchange coefficient of momentum from MYJ
!-- thz0 potential temperature at roughness length (K)
!-- uz0 u wind component at roughness length (m/s)
!-- vz0 v wind component at roughness length (m/s)
!-- qsfc specific humidity at lower boundary (kg/kg)
!-- u10 diagnostic 10-m u component from surface layer
!-- v10 diagnostic 10-m v component from surface layer
!-- th2 diagnostic 2-m theta from surface layer and lsm
!-- t2 diagnostic 2-m temperature from surface layer and lsm
!-- q2 diagnostic 2-m mixing ratio from surface layer and lsm
!-- tshltr diagnostic 2-m theta from MYJ
!-- th10 diagnostic 10-m theta from MYJ
!-- qshltr diagnostic 2-m specific humidity from MYJ
!-- q10 diagnostic 10-m specific humidity from MYJ
!-- lowlyr index of lowest model layer above ground
!-- rr dry air density (kg/m^3)
!-- u_phy u-velocity interpolated to theta points (m/s)
!-- v_phy v-velocity interpolated to theta points (m/s)
!-- th_phy potential temperature (K)
!-- moist moisture array (4D - last index is species) (kg/kg)
!-- p_phy pressure (Pa)
!-- pi_phy exner function (dimensionless)
!-- p8w pressure at full levels (Pa)
!-- t_phy temperature (K)
!-- dz8w dz between full levels (m)
!-- z height above sea level (m)
!-- config_flags
!-- DX horizontal space interval (m)
!-- DT time step (second)
!-- n_moist number of moisture species
!-- PSFC pressure at the surface (Pa)
!-- TSLB
!-- ZS
!-- DZS
!-- num_soil_layers number of soil layer
!-- IFSNOW ifsnow=1 for snow-cover effects
!
!-- P_QV species index for water vapor
!-- P_QC species index for cloud water
!-- P_QR species index for rain water
!-- P_QI species index for cloud ice
!-- P_QS species index for snow
!-- P_QG species index for graupel
!-- ids start index for i in domain
!-- ide end index for i in domain
!-- jds start index for j in domain
!-- jde end index for j in domain
!-- kds start index for k in domain
!-- kde end index for k in domain
!-- ims start index for i in memory
!-- ime end index for i in memory
!-- jms start index for j in memory
!-- jme end index for j in memory
!-- kms start index for k in memory
!-- kme end index for k in memory
!-- its start index for i in tile
!-- ite end index for i in tile
!-- jts start index for j in tile
!-- jte end index for j in tile
!-- kts start index for k in tile
!-- kte end index for k in tile
!
!******************************************************************
!------------------------------------------------------------------
TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
!
INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
n_moist
INTEGER, INTENT(IN ) :: num_soil_layers
INTEGER, INTENT(IN ) :: itimestep,STEPBL,IFSNOW,ISFFLX
INTEGER, DIMENSION( ims:ime , jms:jme ), &
INTENT(IN ) :: LOWLYR
!
LOGICAL, INTENT(IN ) :: warm_rain
!
REAL, INTENT(IN ) :: DT,DX
REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), &
INTENT(INOUT) :: SMOIS,TSLB
REAL, DIMENSION(1:num_soil_layers), INTENT(IN):: ZS,DZS
!
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(IN ) :: p_phy, &
pi_phy, &
p8w, &
rho, &
t_phy, &
u_phy, &
v_phy, &
dz8w, &
z, &
th_phy
!
REAL, DIMENSION( ims:ime, kms:kme, jms:jme, n_moist ), &
INTENT(IN ) :: moist
!
INTEGER, DIMENSION( ims:ime , jms:jme ), &
INTENT(IN ) :: IVGTYP, &
ISLTYP
!
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(IN ) :: EMISS, &
TMN, &
GLW, &
GSW, &
THC, &
MAVAIL, &
XLAND, &
XICE, &
VEGFRA, &
HT, &
RAINCV, &
RAINNCV
!
REAL, DIMENSION( ims:ime, jms:jme ) , &
INTENT(INOUT) :: TSK, &
UST, &
HOL, &
MOL, &
PBLH, &
CAPG, &
HFX, &
QFX, &
REGIME, &
ZNT, &
RAINBL, &
QSFC, &
AKHS, &
AKMS, &
QZ0, &
THZ0, &
UZ0, &
VZ0, &
SNOW, & !new
ALB, &
SNOWC, &
CANWAT, & ! new
SMSTAV, &
SMSTOT, &
SFCRUNOFF, &
UDRUNOFF, &
SFCEVP, &
GRDFLX, &
ACSNOW, &
ACSNOM, &
Q2, &
TH2, &
T2, &
SFCEXC
!
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(INOUT) :: RUBLTEN, &
RVBLTEN, &
RTHBLTEN, &
RQVBLTEN, &
RQCBLTEN, &
RQIBLTEN, &
TKE_MYJ
REAL , INTENT(IN ) :: u_frame, &
v_frame
REAL, DIMENSION( ims:ime, jms:jme ), &
INTENT(OUT) :: TSHLTR, &
TH10, &
QSHLTR, &
Q10, &
U10, &
V10
!
! LOCAL VAR
REAL, DIMENSION( its:ite, kts:kte, jts:jte ) ::v_phytmp
REAL, DIMENSION( its:ite, kts:kte, jts:jte ) ::u_phytmp
REAL, DIMENSION( its:ite, jts:jte ) :: TSKOLD, &
USTOLD, &
ZNTOLD, &
ZOL, &
PSFC
!
REAL, DIMENSION( its:ite, jts:jte ) :: FLHC, &
FLQC, &
QGH, &
PSIM, &
PSIH, &
GZ1OZ0, &
WSPD, &
BR, &
CHS, &
CPM, &
CHS2, &
CHKLOWQ
REAL :: DTMIN,DTBL
!
INTEGER :: i,J,K,NK,jj
LOGICAL :: radiation
!
!------------------------------------------------------------------
!
chklowq = 0.
if (config_flags%bl_pbl_physics .eq. 0) return
! RAINBL in mm (Accumulation between PBL calls)
DO j=jts,jte
DO i=its,ite
RAINBL(i,j) = RAINBL(i,j) + RAINCV(i,j) + RAINNCV(i,j)
ENDDO
ENDDO
IF (itimestep .eq. 1 .or. mod(itimestep,STEPBL) .eq. 0) THEN
radiation = .false.
IF (config_flags%ra_lw_physics .gt. 0) radiation = .true.
!----
! CALCULATE CONSTANT
DTMIN=DT/60.
! Surface schemes need PBL time step for updates and accumulations
! Assume these schemes provide no tendencies
DTBL=DT*STEPBL
! SAVE OLD VALUES
DO j=jts,jte
DO i=its,ite
TSKOLD(i,j)=TSK(i,j)
USTOLD(i,j)=UST(i,j)
ZNTOLD(i,j)=ZNT(i,j)
ENDDO
ENDDO
! REVERSE ORDER IN THE VERTICAL DIRECTION
! testing change later
DO j=jts,jte
DO k=kts,kte
DO i=its,ite
v_phytmp(i,k,j)=v_phy(i,k,j)+v_frame
u_phytmp(i,k,j)=u_phy(i,k,j)+u_frame
ENDDO
ENDDO
ENDDO
! PSFC : in Pa
DO j=jts,jte
DO i=its,ite
PSFC(I,J)=p8w(I,kms,J)
ENDDO
ENDDO
DO j=jts,jte
DO k=kts,min(kte+1,kde)
DO i=its,ite
RTHBLTEN(I,K,J)=0.
RUBLTEN(I,K,J)=0.
RVBLTEN(I,K,J)=0.
RQCBLTEN(I,K,J)=0.
RQVBLTEN(I,K,J)=0.
ENDDO
ENDDO
ENDDO
IF (P_QI .ge. PARAM_FIRST_SCALAR) THEN
DO j=jts,jte
DO k=kts,min(kte+1,kde)
DO i=its,ite
RQIBLTEN(I,K,J)=0.
ENDDO
ENDDO
ENDDO
ENDIF
sfclay_select: SELECT CASE(config_flags%bl_sfclay_physics)
CASE (SFCLAYSCHEME)
CALL wrf_debug
( 100, 'in SFCLAY' )
CALL SFCLAY
(u_phytmp,v_phytmp,t_phy,moist(ims,kms,jms,P_QV),&
p_phy,dz8w,CP,G,RCP,R_d,PSFC,CHS,CHS2,CPM, &
ZNTOLD,USTOLD,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
XLAND,HFX,QFX,TSK,FLHC,FLQC,QGH,U10,V10,TH2,T2,Q2, &
GZ1OZ0,WSPD,BR,ISFFLX, &
SVP1,SVP2,SVP3,SVPT0,EP_1,EP_2,KARMAN,EOMEG,STBOLT, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CASE (MYJSFCSCHEME)
CALL wrf_debug
(100,'in MYJSFC')
CALL MYJSFC
(ht,dz8w, &
p_phy,p8w,th_phy,t_phy, &
moist(ims,kms,jms,P_QV),u_phy,v_phy,rho, &
TSK,QSFC,THZ0,QZ0,UZ0,VZ0, &
LOWLYR, &
XLAND, &
UST,ZNT,PBLH,MAVAIL, &
AKHS,AKMS, &
CHS,CHS2,HFX,QFX,FLHC,FLQC,QGH,CPM, &
U10,V10,TH2,T2,Q2,TSHLTR,TH10,QSHLTR,Q10, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte)
CASE DEFAULT
CALL wrf_message
('The surface layer scheme does not exist')
END SELECT sfclay_select
!
IF (ISFFLX.EQ.0 ) GOTO 430
sfc_select: SELECT CASE(config_flags%bl_surface_physics)
CASE (SLABSCHEME)
CALL wrf_debug
(100,'in SLAB')
CALL SLAB
(t_phy,moist(ims,kms,jms,P_QV),p_phy,FLHC,FLQC, &
PSFC,XLAND,TMN,HFX,QFX,TSK,QSFC,CHKLOWQ, &
GSW,GLW,CAPG,THC,SNOWC,EMISS,MAVAIL, &
DTBL,RCP,XLV,DTMIN,IFSNOW, &
SVP1,SVP2,SVP3,SVPT0,EP_2,KARMAN,EOMEG,STBOLT, &
TSLB,ZS,DZS,num_soil_layers,radiation, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CASE (LSMSCHEME)
CALL wrf_debug
(100,'in LSM')
CALL lsm
(dz8w,moist(ims,kms,jms,P_QV),p8w,rho, &
t_phy,th_phy,TSK,CHS, &
HFX,QFX,QGH,GSW,GLW,SMSTAV,SMSTOT,SFCRUNOFF, &
UDRUNOFF,IVGTYP,ISLTYP,VEGFRA,SFCEVP,GRDFLX, &
SFCEXC,ACSNOW,ACSNOM,ALB,TMN,XLAND,XICE, &
th2,t2,q2,SNOWC,CHS2,QSFC,CHKLOWQ,RAINBL, &
num_soil_layers,DTBL,DZS,itimestep, &
SMOIS,TSLB,SNOW,CANWAT,CPM,RCP, & !TSLB
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CASE DEFAULT
CALL wrf_debug
(100,'The surface scheme does not exist')
END SELECT sfc_select
430 CONTINUE
! Reset RAINBL in mm (Accumulation between PBL calls)
DO j=jts,jte
DO i=its,ite
RAINBL(i,j) = 0.
ENDDO
ENDDO
!
pbl_select: SELECT CASE(config_flags%bl_pbl_physics)
CASE (MRFSCHEME)
CALL wrf_debug
(100,'in MRF')
CALL MRF
(u_phytmp,v_phytmp,th_phy,t_phy, &
moist(ims,kms,jms,P_QV),moist(ims,kms,jms,P_QC), &
moist(ims,kms,jms,P_QI),p_phy,pi_phy, &
RUBLTEN,RVBLTEN,RTHBLTEN,RQVBLTEN,RQCBLTEN,RQIBLTEN, &
CP,G,RCP,R_d,ROVG,P_QI,PARAM_FIRST_SCALAR, &
dz8w,z,XLV,R_v,PSFC, &
ZNT,UST,ZOL,HOL,PBLH,REGIME,PSIM,PSIH, &
XLAND,HFX,QFX,TSKOLD,GZ1OZ0,WSPD,BR, &
DT,DTMIN, &
SVP1,SVP2,SVP3,SVPT0,EP_1,EP_2,KARMAN,EOMEG,STBOLT, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CASE (MYJPBLSCHEME)
CALL wrf_debug
(100,'in MYJPBL')
CALL MYJPBL
(DT,STEPBL,ht,dz8w, &
p_phy,p8w,th_phy,t_phy,pi_phy, &
moist(ims,kms,jms,P_QV),u_phy,v_phy,rho, &
TSK,QSFC,CHKLOWQ,THZ0,QZ0,UZ0,VZ0, &
LOWLYR, &
XLAND, &
TKE_MYJ,UST,ZNT,PBLH, &
AKHS,AKMS, &
RUBLTEN,RVBLTEN,RTHBLTEN,RQVBLTEN, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte)
CASE DEFAULT
CALL wrf_message
('The pbl scheme does not exist')
END SELECT pbl_select
ENDIF
!
END SUBROUTINE pbl_driver