!WRF:MEDIATION_LAYER:PHYSICS
! *** add new modules of schemes here
!
MODULE module_microphysics_driver 2
CONTAINS
SUBROUTINE microphysics_driver( & 2,60
th, rho, pi_phy, p &
,ht, dz8w, p8w, dt,dx,dy &
,mp_physics, spec_zone &
,specified, channel_switch &
,warm_rain &
,t8w &
,chem_opt, progn &
,cldfra, cldfra_old, exch_h, nsource &
,qlsink, precr, preci, precs, precg &
,xland,snowh,itimestep &
,f_ice_phy,f_rain_phy,f_rimef_phy &
,lowlyr,sr, id &
,ids,ide, jds,jde, kds,kde &
,ims,ime, jms,jme, kms,kme &
,ips,ipe, jps,jpe, kps,kpe &
,i_start,i_end,j_start,j_end,kts,kte &
,num_tiles, naer &
!======================
!Variables required for CAMMGMP Scheme
,dlf,dlf2,t_phy,p_hyd,p8w_hyd,tke_pbl,z_at_w,qfx &
,rliq,turbtype3d,smaw3d,wsedl3d,cldfra_old_mp &
,cldfra_mp,cldfra_mp_all,cldfrai,cldfral,cldfra_conv&
,alt &
,accum_mode,aitken_mode,coarse_mode &
,icwmrsh3d,icwmrdp3d,shfrc3d,cmfmc3d,cmfmc2_3d &
,config_flags,fnm,fnp,rh_old_mp,lcd_old_mp &
#ifdef WRF_CHEM
,chem &! For CAMMGMP scheme Prognostic aerosols
,qme3d,prain3d,nevapr3d,rate1ord_cw2pr_st3d &
,dgnum4D,dgnumwet4D &
#endif
!======================
,qv_curr,qc_curr,qr_curr,qi_curr,qs_curr,qg_curr &
,qndrop_curr,qni_curr,qh_curr,qnh_curr &
,qzr_curr,qzi_curr,qzs_curr,qzg_curr,qzh_curr &
,qns_curr,qnr_curr,qng_curr,qnn_curr,qnc_curr &
,qvolg_curr &
,f_qv,f_qc,f_qr,f_qi,f_qs,f_qg,f_qndrop,f_qni &
,f_qns,f_qnr,f_qng,f_qnc,f_qnn,f_qh,f_qnh &
, f_qzr,f_qzi,f_qzs,f_qzg,f_qzh &
,f_qvolg &
,qrcuten, qscuten, qicuten, mu &
,qt_curr,f_qt &
,mp_restart_state,tbpvs_state,tbpvs0_state & ! for etampnew or etampold
,hail,ice2 & ! for mp_gsfcgce
! ,ccntype & ! for mp_milbrandt2mom
,w ,z &
,rainnc, rainncv &
,snownc, snowncv &
,hailnc, hailncv &
,graupelnc, graupelncv &
#ifdef WRF_CHEM
,rainprod, evapprod &
,qv_b4mp, qc_b4mp, qi_b4mp, qs_b4mp &
#endif
,refl_10cm & ! HM, 9/22/09, add for refl
! YLIN
! Added the RI_CURR array to the call
,ri_curr &
,diagflag, do_radar_ref &
)
! Framework
#if(NMM_CORE==1)
USE module_state_description, ONLY : &
KESSLERSCHEME, LINSCHEME, SBU_YLINSCHEME, WSM3SCHEME, WSM5SCHEME &
,WSM6SCHEME, ETAMPNEW, ETAMPOLD, etamp_HWRF,THOMPSON, MORR_TWO_MOMENT &
,GSFCGCESCHEME, WDM5SCHEME, WDM6SCHEME &
,MILBRANDT2MOM !,MILBRANDT3MOM
#else
USE module_state_description, ONLY : &
KESSLERSCHEME, LINSCHEME, SBU_YLINSCHEME, WSM3SCHEME, WSM5SCHEME &
,WSM6SCHEME, ETAMPNEW, ETAMPOLD, THOMPSON, MORR_TWO_MOMENT &
,GSFCGCESCHEME, WDM5SCHEME, WDM6SCHEME, NSSL_2MOM, NSSL_2MOMCCN &
,NSSL_1MOM,NSSL_1MOMLFO & ! ,NSSL_3MOM &
,MILBRANDT2MOM , CAMMGMPSCHEME !,MILBRANDT3MOM
#endif
! Model Layer
USE module_model_constants
USE module_wrf_error
USE module_configure
, only: grid_config_rec_type
#ifdef WRF_CHEM
USE module_state_description, only: num_chem ! For CAMMGMP scheme Prognostic aerosols
USE modal_aero_data
, only: ntot_amode_cam_mam => ntot_amode ! For CAMMGMP scheme Prognostic aerosols
#endif
! *** add new modules of schemes here
USE module_mp_kessler
USE module_mp_lin
USE module_mp_sbu_ylin
USE module_mp_wsm3
USE module_mp_wsm5
USE module_mp_wsm6
USE module_mp_etanew
USE module_mp_etaold
USE module_mp_thompson
USE module_mp_gsfcgce
USE module_mp_morr_two_moment
USE module_mp_wdm5
USE module_mp_wdm6
USE module_mp_milbrandt2mom
# if (EM_CORE == 1)
USE module_mp_cammgmp_driver
, ONLY: CAMMGMP ! CAM5's microphysics driver
# endif
! USE module_mp_milbrandt3mom
#if (EM_CORE==1)
USE module_mp_nssl_2mom
#endif
USE module_mp_HWRF
USE module_mixactivate
, only: prescribe_aerosol_mixactivate
! For checking model timestep is history time (for radar reflectivity)
USE module_utility, ONLY: WRFU_Clock, WRFU_Alarm
USE module_domain
, ONLY : HISTORY_ALARM, Is_alarm_tstep
!----------------------------------------------------------------------
! This driver calls subroutines for the microphys.
!
! Schemes
!
! Kessler scheme
! Lin et al. (1983), Rutledge and Hobbs (1984)
! WRF Single-Moment 3-class, Hong, Dudhia and Chen (2004)
! WRF Single-Moment 5-class, Hong, Dudhia and Chen (2004)
! WRF Single-Moment 6-class, Lim and Hong (2003 WRF workshop)
! Eta Grid-scale Cloud and Precipitation scheme (EGCP01, Ferrier)
! * etampnew - what's in the operational 4-km High-Resolution Window Runs
! * etampold - what was run in the 12-km operational NAM
! Milbrandt and Yau (2005)
!----------------------------------------------------------------------
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)
! Qg graupel mixing ratio (kg/kg)
! Qh hail mixing ratio (kg/kg)
! Qndrop droplet number mixing ratio (#/kg)
! Qni cloud ice number concentration (#/kg)
! Qns snow number concentration (#/kg)
! Qnr rain number concentration (#/kg)
! Qng graupel number concentration (#/kg)
! Qnh hail number concentration (#/kg)
! Qzr rain reflectivity (m6/kg)
! Qzi ice reflectivity (m6/kg)
! Qzs snow reflectivity (m6/kg)
! Qzg graupel reflectivity (m6/kg)
! Qzh hail reflectivity (m6/kg)
! Qvolg graupel particle volume (m3/kg)
!
!----------------------------------------------------------------------
!-- th potential temperature (K)
!-- moist_new updated moisture array (kg/kg)
!-- moist_old Old moisture array (kg/kg)
!-- rho density of air (kg/m^3)
!-- pi_phy exner function (dimensionless)
!-- p pressure (Pa)
!-- RAINNC grid scale precipitation (mm)
!-- RAINNCV one time step grid scale precipitation (mm/step)
!-- SNOWNC grid scale snow and ice (mm)
!-- SNOWNCV one time step grid scale snow and ice (mm/step)
!-- GRAUPELNC grid scale graupel (mm)
!-- GRAUPELNCV one time step grid scale graupel (mm/step)
!-- HAILNC grid scale hail (mm)
!-- HAILNCV one time step grid scale hail (mm/step)
!-- SR one time step mass ratio of snow to total precip
!-- z Height above sea level (m)
!-- dt Time step (s)
!-- G acceleration due to gravity (m/s^2)
!-- CP heat capacity at constant pressure for dry air (J/kg/K)
!-- R_d gas constant for dry air (J/kg/K)
!-- R_v gas constant for water vapor (J/kg/K)
!-- XLS latent heat of sublimation (J/kg)
!-- XLV latent heat of vaporization (J/kg)
!-- XLF latent heat of melting (J/kg)
!-- rhowater water density (kg/m^3)
!-- rhosnow snow density (kg/m^3)
!-- F_ICE_PHY Fraction of ice.
!-- F_RAIN_PHY Fraction of rain.
!-- F_RIMEF_PHY Mass ratio of rimed ice (rime factor)
!-- t8w temperature at layer interfaces
!-- cldfra, cldfra_old, current, previous cloud fraction
!-- exch_h vertical diffusivity (m2/s)
!-- qlsink Fractional cloud water sink (/s)
!-- precr rain precipitation rate at all levels (kg/m2/s)
!-- preci ice precipitation rate at all levels (kg/m2/s)
!-- precs snow precipitation rate at all levels (kg/m2/s)
!-- precg graupel precipitation rate at all levels (kg/m2/s) &
!-- 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
!-- P_QH species index for hail
!-- P_QNDROP species index for cloud drop mixing ratio
!-- P_QNR species index for rain number concentration,
!-- P_QNI species index for cloud ice number concentration
!-- P_QNS species index for snow number concentration,
!-- P_QNG species index for graupel number concentration,
!-- P_QNH species index for hail number concentration,
!-- P_QZR species index for rain reflectivity
!-- P_QZI species index for ice reflectivity
!-- P_QZS species index for snow reflectivity
!-- P_QZG species index for graupel reflectivity
!-- P_QZH species index for hail reflectivity
!-- P_QVOLG species index for graupel particle volume,
!-- id grid id number
!-- 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
!-- i_start start indices for i in tile
!-- i_end end indices for i in tile
!-- j_start start indices for j in tile
!-- j_end end indices for j in tile
!-- 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
!-- num_tiles number of tiles
!-- diagflag Logical to tell us when to produce diagnostics for history or restart
!
!======================================================================
TYPE(grid_config_rec_type), INTENT(IN ) , OPTIONAL :: config_flags
INTEGER, INTENT(IN ) :: mp_physics
LOGICAL, INTENT(IN ) :: specified
INTEGER, OPTIONAL, INTENT(IN ) :: chem_opt, progn
INTEGER, OPTIONAL, INTENT(IN ) :: hail, ice2 !, ccntype
!
INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
INTEGER, OPTIONAL, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
INTEGER, INTENT(IN ) :: kts,kte
INTEGER, INTENT(IN ) :: itimestep,num_tiles,spec_zone
INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
& i_start,i_end,j_start,j_end
LOGICAL, INTENT(IN ) :: warm_rain
!
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
INTENT(INOUT) :: th
!
!
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
INTENT(IN ) :: &
rho, &
dz8w, &
p8w, &
pi_phy, &
p
!=================
!Data for CAMMGMP scheme
REAL,INTENT(IN), OPTIONAL ::accum_mode,aitken_mode,coarse_mode
!1D variables required for CAMMGMP scheme
REAL , DIMENSION( kms:kme ) , &
INTENT(IN ) , OPTIONAL :: fnm, & !Factors for interpolation at "w" grid (interfaces)
fnp
!2D variables required for CAMMGMP scheme
REAL, DIMENSION( ims:ime, jms:jme ), &
INTENT(IN), OPTIONAL :: &
qfx, & !Moisture flux at surface (kg m-2 s-1)
rliq !Vertically-integrated reserved cloud condensate(m/s)
!3D variables required for CAMMGMP scheme
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(IN), OPTIONAL :: &
dlf, & !Detraining cloud water tendendcy
dlf2, & !dq/dt due to export of cloud water into environment by shallow convection(kg/kg/s)
t_phy, & !Temprature at the mid points (K)
p_hyd, & !Hydrostatic pressure(Pa)
p8w_hyd, & !Hydrostatic Pressure at level interface (Pa)
z_at_w, & !Height above sea level at layer interfaces (m)
tke_pbl, & !Turbulence kinetic energy
turbtype3d, & !Turbulent interface types [ no unit ]
smaw3d, & !Normalized Galperin instability function for momentum ( 0<= <=4.964 and 1 at neutral ) [no units]
alt, & !inverse density(m3/kg)
icwmrsh3d, & !Shallow cumulus in-cloud water mixing ratio (kg/m2)
icwmrdp3d, & !Deep Convection in-cloud water mixing ratio (kg/m2)
shfrc3d, & !Shallow cloud fraction
cmfmc3d, & !Deep + Shallow Convective mass flux [ kg /s/m^2 ]
cmfmc2_3d !Shallow convective mass flux [ kg/s/m^2 ]
#ifdef WRF_CHEM
!4D variables required for CAMMGMP scheme
REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme,ntot_amode_cam_mam ), &
INTENT(IN) :: &
dgnum4D, &
dgnumwet4D
#endif
!In-outs
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(INOUT) , OPTIONAL :: &
cldfra_old_mp, & !Old Cloud fraction for CAMMGMP microphysics only
rh_old_mp, & !Old RH
lcd_old_mp !Old liquid cloud fraction
!In-outs -optional
#ifdef WRF_CHEM
REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem), &
INTENT(INOUT) :: &
chem !Chem array for CAMMGMP scheme Prognostic aerosols
#endif
!outs
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(INOUT) , OPTIONAL:: &
wsedl3d, & !Sedimentation velocity of stratiform liquid cloud droplet (m/s)
cldfra_mp, & !Old Cloud fraction for CAMMGMP microphysics only
cldfra_mp_all, & !Old Cloud fraction for CAMMGMP microphysics only
cldfrai, & !Old Cloud fraction for CAMMGMP microphysics only
cldfral, & !Old Cloud fraction for CAMMGMP microphysics only
cldfra_conv
#ifdef WRF_CHEM
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(INOUT), OPTIONAL :: &
qme3d, & !Net condensation rate (kg/kg/s)
prain3d, & !Rate of conversion of condensate to precipitation (kg/kg/s)
nevapr3d, & !Evaporation rate of rain + snow (kg/kg/s)
rate1ord_cw2pr_st3d !1st order rate for direct conversion of strat. cloud water to precip (1/s)
#endif
REAL, INTENT(INOUT), DIMENSION(ims:ime, kms:kme, jms:jme ) :: &
F_ICE_PHY,F_RAIN_PHY,F_RIMEF_PHY
!!$#ifdef WRF_CHEM
! REAL, INTENT(OUT), DIMENSION(ims:ime, kms:kme, jms:jme ) :: &
REAL, OPTIONAL, INTENT(OUT), DIMENSION(ims:ime, kms:kme, jms:jme ) :: &
!!$#else
!!$ REAL, DIMENSION(ims:ime, kms:kme, jms:jme ) :: &
!!$#endif
qlsink, & ! cloud water sink (/s)
precr, & ! rain precipitation rate at all levels (kg/m2/s)
preci, & ! ice precipitation rate at all levels (kg/m2/s)
precs, & ! snow precipitation rate at all levels (kg/m2/s)
precg ! graupel precipitation rate at all levels (kg/m2/s)
!
REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: XLAND
REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN), OPTIONAL :: SNOWH
REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(OUT) :: SR
REAL, INTENT(IN ) :: dt,dx,dy
INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT) :: LOWLYR
!
! Optional
!
REAL, OPTIONAL, DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(OUT) :: refl_10cm
LOGICAL, OPTIONAL, INTENT(IN ) :: channel_switch
REAL, OPTIONAL, INTENT(INOUT ) :: naer ! aerosol number concentration (/kg)
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
OPTIONAL, &
INTENT(INOUT ) :: &
w, z, t8w &
,cldfra, cldfra_old, exch_h &
,qv_curr,qc_curr,qr_curr,qi_curr,qs_curr,qg_curr &
,qt_curr,qndrop_curr,qni_curr,qh_curr,qnh_curr &
,qns_curr,qnr_curr,qng_curr,qnn_curr,qnc_curr &
,qzr_curr,qzi_curr,qzs_curr,qzg_curr,qzh_curr &
,qvolg_curr
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
OPTIONAL, &
INTENT(IN) :: qrcuten, qscuten, qicuten
#ifdef WRF_CHEM
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(INOUT) :: rainprod, evapprod
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(INOUT) :: qv_b4mp, qc_b4mp, qi_b4mp, qs_b4mp
#endif
REAL, DIMENSION( ims:ime, jms:jme ), &
OPTIONAL, &
INTENT(IN) :: mu
! YLIN
! Added RI_CURR similar to microphysics fields above
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
OPTIONAL, &
INTENT(INOUT) :: ri_curr
REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), &
OPTIONAL, &
INTENT(OUT ) :: &
nsource
!
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT), &
OPTIONAL :: &
RAINNC &
,RAINNCV &
,SNOWNC &
,SNOWNCV &
,GRAUPELNC &
,GRAUPELNCV &
,HAILNC &
,HAILNCV
INTEGER,OPTIONAL,INTENT(IN ) :: id
REAL , DIMENSION( ims:ime , jms:jme ) , OPTIONAL , &
INTENT(IN) :: ht
REAL, DIMENSION (:), OPTIONAL, INTENT(INOUT) :: mp_restart_state &
,tbpvs_state,tbpvs0_state
!
LOGICAL, OPTIONAL :: f_qv,f_qc,f_qr,f_qi,f_qs,f_qg,f_qndrop,f_qni,f_qt &
,f_qns,f_qnr,f_qng,f_qnn,f_qnc,f_qh,f_qnh,f_qzr &
,f_qzi,f_qzs,f_qzg,f_qzh,f_qvolg
LOGICAL, OPTIONAL, INTENT(IN) :: diagflag
INTEGER, OPTIONAL, INTENT(IN) :: do_radar_ref
! LOCAL VAR
INTEGER :: i,j,k,its,ite,jts,jte,ij,sz,n
LOGICAL :: channel
REAL :: z0, z1, z2, w1, w2
!---------------------------------------------------------------------
! check for microphysics type. We need a clean way to
! specify these things!
!---------------------------------------------------------------------
channel = .FALSE.
IF ( PRESENT ( channel_switch ) ) channel = channel_switch
if (mp_physics .eq. 0) return
IF( specified ) THEN
sz = spec_zone
ELSE
sz = 0
ENDIF
#ifdef XEON_OPTIMIZED_WSM5
! the OpenMP loops are inside the scheme when running on MIC
IF ( mp_physics .EQ. WSM5SCHEME ) THEN
IF (channel) THEN
its = max(ips,ids)
ite = min(ipe,ide-1)
ELSE
its = max(ips,ids+sz)
ite = min(ipe,ide-1-sz)
ENDIF
jts = max(jps,jds+sz)
jte = min(jpe,jde-1-sz)
CALL wsm5
( &
TH=th &
,Q=qv_curr &
,QC=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w &
,DELT=dt,G=g,CPD=cp,CPV=cpv &
,RD=r_d,RV=r_v,T0C=svpt0 &
,EP1=ep_1, EP2=ep_2, QMIN=epsilon &
,XLS=xls, XLV0=xlv, XLF0=xlf &
,DEN0=rhoair0, DENR=rhowater &
,CLIQ=cliq,CICE=cice,PSAT=psat &
,RAIN=rainnc ,RAINNCV=rainncv &
,SNOW=snownc ,SNOWNCV=snowncv &
,SR=sr &
,REFL_10CM=refl_10cm &
,diagflag=diagflag &
,do_radar_ref=do_radar_ref &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
#endif
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij, its, ite, jts, jte, i,j,k,n )
DO ij = 1 , num_tiles
IF (channel) THEN
its = max(i_start(ij),ids)
ite = min(i_end(ij),ide-1)
ELSE
its = max(i_start(ij),ids+sz)
ite = min(i_end(ij),ide-1-sz)
ENDIF
jts = max(j_start(ij),jds+sz)
jte = min(j_end(ij),jde-1-sz)
! 2009-06009 rce - zero all these for safety
IF( PRESENT(qlsink) ) qlsink(its:ite,kts:kte,jts:jte) = 0.
IF( PRESENT(precr ) ) precr(its:ite,kts:kte,jts:jte) = 0.
IF( PRESENT(preci ) ) preci(its:ite,kts:kte,jts:jte) = 0.
IF( PRESENT(precs ) ) precs(its:ite,kts:kte,jts:jte) = 0.
IF( PRESENT(precg ) ) precg(its:ite,kts:kte,jts:jte) = 0.
!-----------
IF( PRESENT(chem_opt) .AND. PRESENT(progn) ) THEN
IF( chem_opt==0 .AND. progn==1 .AND. (mp_physics==LINSCHEME .OR. mp_physics==MORR_TWO_MOMENT)) THEN
IF( PRESENT( QNDROP_CURR ) ) THEN
CALL wrf_debug ( 100 , 'microphysics_driver: calling prescribe_aerosol_mixactivate' )
! 06-nov-2005 rce - id & itimestep added to arg list
call prescribe_aerosol_mixactivate
( &
id, itimestep, dt, naer, &
rho, th, pi_phy, w, cldfra, cldfra_old, &
z, dz8w, p8w, t8w, exch_h, &
qv_curr, qc_curr, qi_curr, qndrop_curr, &
nsource, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
F_QC=f_qc, F_QI=f_qi )
END IF
ELSE IF( progn==1 .AND. mp_physics/=LINSCHEME .AND. mp_physics/=MORR_TWO_MOMENT) THEN
call wrf_error_fatal
("SETTINGS ERROR: Prognostic cloud droplet number can only be used with the mp_physics=LINSCHEME or MORRISON.")
END IF
END IF
micro_select: SELECT CASE(mp_physics)
CASE (KESSLERSCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling kessler' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( Z )) THEN
CALL kessler
( &
T=th &
,QV=qv_curr &
,QC=qc_curr &
,QR=qr_curr &
,RHO=rho, PII=pi_phy,DT_IN=dt, Z=z, XLV=xlv, CP=cp &
,EP2=ep_2,SVP1=svp1,SVP2=svp2 &
,SVP3=svp3,SVPT0=svpt0,RHOWATER=rhowater &
,DZ8W=dz8w &
,RAINNC=rainnc,RAINNCV=rainncv &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling kessler' )
ENDIF
!
CASE (THOMPSON)
CALL wrf_debug ( 100 , 'microphysics_driver: calling thompson' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. PRESENT ( QG_CURR ) .AND. &
PRESENT( QNR_CURR) .AND. PRESENT ( QNI_CURR) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) ) THEN
#ifdef WRF_CHEM
qv_b4mp(its:ite,kts:kte,jts:jte) = qv_curr(its:ite,kts:kte,jts:jte)
qc_b4mp(its:ite,kts:kte,jts:jte) = qc_curr(its:ite,kts:kte,jts:jte)
qi_b4mp(its:ite,kts:kte,jts:jte) = qi_curr(its:ite,kts:kte,jts:jte)
qs_b4mp(its:ite,kts:kte,jts:jte) = qs_curr(its:ite,kts:kte,jts:jte)
#endif
CALL mp_gt_driver
( &
QV=qv_curr, &
QC=qc_curr, &
QR=qr_curr, &
QI=qi_curr, &
QS=qs_curr, &
QG=qg_curr, &
NI=qni_curr, &
NR=qnr_curr, &
TH=th, &
PII=pi_phy, &
P=p, &
DZ=dz8w, &
DT_IN=dt, &
ITIMESTEP=itimestep, &
RAINNC=RAINNC, &
RAINNCV=RAINNCV, &
SNOWNC=SNOWNC, &
SNOWNCV=SNOWNCV, &
GRAUPELNC=GRAUPELNC, &
GRAUPELNCV=GRAUPELNCV, &
SR=SR, &
#ifdef WRF_CHEM
RAINPROD=rainprod, &
EVAPPROD=evapprod, &
#endif
REFL_10CM=refl_10cm, &
diagflag=diagflag, &
do_radar_ref=do_radar_ref, &
IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling thompson_et_al' )
ENDIF
!
CASE (MORR_TWO_MOMENT)
CALL wrf_debug
(100, 'microphysics_driver: calling morrison two moment')
IF (PRESENT (QV_CURR) .AND. PRESENT (QC_CURR) .AND. &
PRESENT (QR_CURR) .AND. PRESENT (QI_CURR) .AND. &
PRESENT (QS_CURR) .AND. PRESENT (QG_CURR) .AND. &
PRESENT (QR_CURR) .AND. PRESENT (QI_CURR) .AND. &
PRESENT (QNS_CURR) .AND. PRESENT (QNI_CURR).AND. &
PRESENT (QNR_CURR) .AND. PRESENT (QNG_CURR).AND. &
PRESENT (MU) .AND. PRESENT (QSCUTEN).AND. &
PRESENT (QRCUTEN) .AND. PRESENT (QICUTEN).AND. &
PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
PRESENT (Z ) .AND.PRESENT ( W ) ) THEN
CALL mp_morr_two_moment
( &
ITIMESTEP=itimestep, & !*
TH=th, & !*
QV=qv_curr, & !*
QC=qc_curr, & !*
QR=qr_curr, & !*
QI=qi_curr, & !*
QS=qs_curr, & !*
QG=qg_curr, & !*
NI=qni_curr, & !*
NS=qns_curr, & !* ! VVT
NR=qnr_curr, & !* ! VVT
NG=qng_curr, & !* ! VVT
RHO=rho, & !*
PII=pi_phy, & !*
P=p, & !*
DT_IN=dt, & !*
DZ=dz8w, & !* !hm
HT=ht, & !*
W=w & !*
,RAINNC=RAINNC & !*
,RAINNCV=RAINNCV & !*
,SR=SR & !* !hm
,REFL_10CM=refl_10cm & ! added for radar reflectivity
,diagflag=diagflag & ! added for radar reflectivity
,do_radar_ref=do_radar_ref & ! added for radar reflectivity
,qrcuten=qrcuten & ! hm
,qscuten=qscuten & ! hm
,qicuten=qicuten & ! hm
,mu=mu & ! hm
,F_QNDROP=f_qndrop & ! hm for wrf-chem
,QNDROP=qndrop_curr & ! hm for wrf-chem
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
,QLSINK=qlsink & ! jdf for wrf-chem
,PRECR=precr,PRECI=preci,PRECS=precs,PRECG=precg & ! jdf for wrf-chem
)
ELSE
Call wrf_error_fatal
( 'arguments not present for calling morrison two moment')
ENDIF
CASE (MILBRANDT2MOM)
CALL wrf_debug
(100, 'microphysics_driver: calling milbrandt2mom')
IF (PRESENT (QV_CURR) .AND. &
PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR) .AND. &
PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR) .AND. &
PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR) .AND. &
PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR) .AND. &
PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR) .AND. &
PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR) .AND. &
PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV) .AND. &
PRESENT (HAILNC ) .AND. PRESENT (HAILNCV) .AND. &
PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
PRESENT (Z ) .AND. PRESENT ( W ) ) THEN
! PRESENT (ccntype) &
CALL mp_milbrandt2mom_driver
( &
ITIMESTEP=itimestep, &
TH=th, &
QV=qv_curr, &
QC=qc_curr, &
QR=qr_curr, &
QI=qi_curr, &
QS=qs_curr, &
QG=qg_curr, &
QH=qh_curr, &
NC=qnc_curr, &
NR=qnr_curr, &
NI=qni_curr, &
NS=qns_curr, &
NG=qng_curr, &
NH=qnh_curr, &
PII=pi_phy, &
P=p, &
DT_IN=dt, &
DZ=dz8w, &
W=w, &
RAINNC = RAINNC, &
RAINNCV = RAINNCV, &
SNOWNC = SNOWNC, &
SNOWNCV = SNOWNCV, &
HAILNC = HAILNC, &
HAILNCV = HAILNCV, &
GRPLNC = GRAUPELNC, &
GRPLNCV = GRAUPELNCV, &
SR=SR, &
! ccntype = ccntype, &
Zet = refl_10cm, & ! HM, 9/22/09 for refl
IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
Call wrf_error_fatal
( 'arguments not present for calling milbrandt2mom')
ENDIF
! CASE (MILBRANDT3MOM)
! CALL wrf_debug(100, 'microphysics_driver: calling milbrandt3mom')
! IF (PRESENT (QV_CURR) .AND. &
! PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR) .AND. &
! PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR) .AND. PRESENT (QZR_CURR) .AND. &
! PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR) .AND. PRESENT (QZI_CURR) .AND. &
! PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR) .AND. PRESENT (QZS_CURR) .AND. &
! PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR) .AND. PRESENT (QZG_CURR) .AND. &
! PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR) .AND. PRESENT (QZH_CURR) .AND. &
! PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
! PRESENT (Z ) .AND. PRESENT ( W ) ) THEN
! CALL mp_milbrandt3mom_driver( &
! ITIMESTEP=itimestep, & !*
! TH=th, & !*
! QV=qv_curr, & !*
! QC=qc_curr, & !*
! QR=qr_curr, & !*
! QI=qi_curr, & !*
! QS=qs_curr, & !*
! QG=qg_curr, & !*
! QH=qh_curr, & !*
! NC=qnc_curr, & !*
! NR=qnr_curr, & !*
! NI=qni_curr, & !*
! NS=qns_curr, & !*
! NG=qng_curr, & !*
! NH=qnh_curr, & !*
! ZR=qzr_curr, & !*
! ZI=qzi_curr, & !*
! ZS=qzs_curr, & !*
! ZG=qzg_curr, & !*
! ZH=qzh_curr, & !*
! PII=pi_phy, & !*
! P=p, & !*
! DT_IN=dt, & !*
! DZ=dz8w, & !* ! h
! W=w & !*
! ,RAINNC=RAINNC & !*
! ,RAINNCV=RAINNCV & !*
! ,SR=SR & !* !hm
! ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
! ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
! ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
! )
! ELSE
! Call wrf_error_fatal( 'arguments not present for calling milbrandt3mom')
! ENDIF
#if (EM_CORE==1)
CASE (NSSL_1MOM)
CALL wrf_debug
(100, 'microphysics_driver: calling nssl1mom')
IF (PRESENT (QV_CURR) .AND. &
PRESENT (QC_CURR) .AND. &
PRESENT (QR_CURR) .AND. &
PRESENT (QI_CURR) .AND. &
PRESENT (QS_CURR) .AND. &
PRESENT (QG_CURR) .AND. &
PRESENT (QH_CURR) .AND. &
PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV) .AND. &
PRESENT (HAILNC ) .AND. PRESENT (HAILNCV) .AND. &
PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
PRESENT (Z ) .AND. PRESENT ( W ) .AND. &
PRESENT (QVOLG_CURR) ) THEN
CALL nssl_2mom_driver
( &
ITIMESTEP=itimestep, &
TH=th, &
QV=qv_curr, &
QC=qc_curr, &
QR=qr_curr, &
QI=qi_curr, &
QS=qs_curr, &
QH=qg_curr, &
QHL=qh_curr, &
CCW=qnc_curr, &
CRW=qnr_curr, &
CCI=qni_curr, &
CSW=qns_curr, &
CHW=qng_curr, &
CHL=qnh_curr, &
VHW=qvolg_curr, &
PII=pi_phy, &
P=p, &
W=w, &
DZ=dz8w, &
DTP=dt, &
DN=rho, &
RAINNC = RAINNC, &
RAINNCV = RAINNCV, &
SNOWNC = SNOWNC, &
SNOWNCV = SNOWNCV, &
HAILNC = HAILNC, &
HAILNCV = HAILNCV, &
GRPLNC = GRAUPELNC, &
GRPLNCV = GRAUPELNCV, &
SR=SR, &
dbz = refl_10cm, &
diagflag = diagflag, &
IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
Call wrf_error_fatal
( 'arguments not present for calling nssl_2mom')
ENDIF
CASE (NSSL_1MOMLFO)
CALL wrf_debug
(100, 'microphysics_driver: calling nssl1mom')
IF (PRESENT (QV_CURR) .AND. &
PRESENT (QC_CURR) .AND. &
PRESENT (QR_CURR) .AND. &
PRESENT (QI_CURR) .AND. &
PRESENT (QS_CURR) .AND. &
PRESENT (QG_CURR) .AND. &
PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV) .AND. &
PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
PRESENT (Z ) .AND. PRESENT ( W ) ) THEN
CALL nssl_2mom_driver
( &
ITIMESTEP=itimestep, &
TH=th, &
QV=qv_curr, &
QC=qc_curr, &
QR=qr_curr, &
QI=qi_curr, &
QS=qs_curr, &
QH=qg_curr, &
PII=pi_phy, &
P=p, &
W=w, &
DZ=dz8w, &
DTP=dt, &
DN=rho, &
RAINNC = RAINNC, &
RAINNCV = RAINNCV, &
SNOWNC = SNOWNC, &
SNOWNCV = SNOWNCV, &
GRPLNC = GRAUPELNC, &
GRPLNCV = GRAUPELNCV, &
SR=SR, &
dbz = refl_10cm, &
diagflag = diagflag, &
IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
Call wrf_error_fatal
( 'arguments not present for calling nssl_2mom')
ENDIF
CASE (NSSL_2MOM)
CALL wrf_debug
(100, 'microphysics_driver: calling nssl2mom')
IF (PRESENT (QV_CURR) .AND. &
PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR) .AND. &
PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR) .AND. &
PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR) .AND. &
PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR) .AND. &
PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR) .AND. &
PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR) .AND. &
PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV) .AND. &
PRESENT (HAILNC ) .AND. PRESENT (HAILNCV) .AND. &
PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
PRESENT (Z ) .AND. PRESENT ( W ) .AND. &
PRESENT (QVOLG_CURR) ) THEN
CALL nssl_2mom_driver
( &
ITIMESTEP=itimestep, &
TH=th, &
QV=qv_curr, &
QC=qc_curr, &
QR=qr_curr, &
QI=qi_curr, &
QS=qs_curr, &
QH=qg_curr, &
QHL=qh_curr, &
CCW=qnc_curr, &
CRW=qnr_curr, &
CCI=qni_curr, &
CSW=qns_curr, &
CHW=qng_curr, &
CHL=qnh_curr, &
VHW=qvolg_curr, &
PII=pi_phy, &
P=p, &
W=w, &
DZ=dz8w, &
DTP=dt, &
DN=rho, &
RAINNC = RAINNC, &
RAINNCV = RAINNCV, &
SNOWNC = SNOWNC, &
SNOWNCV = SNOWNCV, &
HAILNC = HAILNC, &
HAILNCV = HAILNCV, &
GRPLNC = GRAUPELNC, &
GRPLNCV = GRAUPELNCV, &
SR=SR, &
dbz = refl_10cm, &
diagflag = diagflag, &
IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
Call wrf_error_fatal
( 'arguments not present for calling nssl_2mom')
ENDIF
CASE (NSSL_2MOMCCN)
CALL wrf_debug
(100, 'microphysics_driver: calling nssl_2momccn')
IF (PRESENT (QV_CURR) .AND. &
PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR) .AND. &
PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR) .AND. &
PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR) .AND. &
PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR) .AND. &
PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR) .AND. &
PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR) .AND. &
PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV) .AND. &
PRESENT (HAILNC ) .AND. PRESENT (HAILNCV) .AND. &
PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
PRESENT (Z ) .AND. PRESENT ( W ) .AND. &
PRESENT (QVOLG_CURR) .AND. PRESENT( QNN_CURR ) ) THEN
CALL nssl_2mom_driver
( &
ITIMESTEP=itimestep, &
TH=th, &
QV=qv_curr, &
QC=qc_curr, &
QR=qr_curr, &
QI=qi_curr, &
QS=qs_curr, &
QH=qg_curr, &
QHL=qh_curr, &
CCW=qnc_curr, &
CRW=qnr_curr, &
CCI=qni_curr, &
CSW=qns_curr, &
CHW=qng_curr, &
CHL=qnh_curr, &
VHW=qvolg_curr, &
cn=qnn_curr, &
PII=pi_phy, &
P=p, &
W=w, &
DZ=dz8w, &
DTP=dt, &
DN=rho, &
RAINNC = RAINNC, &
RAINNCV = RAINNCV, &
SNOWNC = SNOWNC, &
SNOWNCV = SNOWNCV, &
HAILNC = HAILNC, &
HAILNCV = HAILNCV, &
GRPLNC = GRAUPELNC, &
GRPLNCV = GRAUPELNCV, &
SR=SR, &
dbz = refl_10cm, &
diagflag = diagflag, &
IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
Call wrf_error_fatal
( 'arguments not present for calling nssl_2momccn')
ENDIF
#endif
!
CASE (GSFCGCESCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling GSFCGCE' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( HAIL ) .AND. PRESENT ( ICE2 ) .AND. &
PRESENT( Z ) .AND. PRESENT ( W ) ) THEN
CALL gsfcgce
( &
TH=th &
,QV=qv_curr &
,QL=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,RHO=rho, PII=pi_phy, P=p, DT_IN=dt, Z=z &
,HT=ht, DZ8W=dz8w, GRAV=G &
,RHOWATER=rhowater, RHOSNOW=rhosnow &
,ITIMESTEP=itimestep &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
,RAINNC=rainnc, RAINNCV=rainncv &
,SNOWNC=snownc, SNOWNCV=snowncv ,SR=sr &
,GRAUPELNC=graupelnc ,GRAUPELNCV=graupelncv &
,REFL_10CM=refl_10cm & ! added for radar reflectivity
,diagflag=diagflag & ! added for radar reflectivity
,do_radar_ref=do_radar_ref & ! added for radar reflectivity
,F_QG=f_qg &
,QG=qg_curr &
,IHAIL=hail, ICE2=ice2 &
)
! HAIL = 1, run gsfcgce with hail option
! 0, run gsfcgce with graupel option <---- default
! note: no effect if ice2 = 1
! ICE2 = 1, run gsfcgce with only snow, ice
! 2, run gsfcgce with only graupel, ice
! 0, run gsfcgce with snow, ice and hail/graupel <---- default
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling GSFCGCE' )
ENDIF
CASE (LINSCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling lin_et_al' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( Z ) ) THEN
CALL lin_et_al
( &
TH=th &
,QV=qv_curr &
,QL=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,QLSINK=qlsink &
,RHO=rho, PII=pi_phy, P=p, DT_IN=dt, Z=z &
,HT=ht, DZ8W=dz8w, GRAV=G, CP=cp &
,RAIR=r_d, RVAPOR=R_v &
,XLS=xls, XLV=xlv, XLF=xlf &
,RHOWATER=rhowater, RHOSNOW=rhosnow &
,EP2=ep_2,SVP1=svp1,SVP2=svp2 &
,SVP3=svp3,SVPT0=svpt0 &
,RAINNC=rainnc, RAINNCV=rainncv &
,SNOWNC=snownc, SNOWNCV=snowncv &
,GRAUPELNC=graupelnc, GRAUPELNCV=graupelncv, SR=sr &
,REFL_10CM=refl_10cm & ! added for radar reflectivity
,diagflag=diagflag & ! added for radar reflectivity
,do_radar_ref=do_radar_ref & ! added for radar reflectivity
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
,PRECR=precr,PRECI=preci,PRECS=precs,PRECG=precg &
,F_QG=f_qg, F_QNDROP=f_qndrop &
,QG=qg_curr &
,QNDROP=qndrop_curr &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling lin_et_al' )
ENDIF
CASE (SBU_YLINSCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling sbu_ylin' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. &
PRESENT( RI_CURR ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( Z ) ) THEN
CALL sbu_ylin
( &
TH=th &
,QV=qv_curr &
,QL=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,RI3D=ri_curr &
! ,QLSINK=qlsink &
,RHO=rho, PII=pi_phy, P=p, DT_IN=dt, Z=z &
,HT=ht, DZ8W=dz8w &
! , GRAV=G, CP=cp &
! ,RAIR=r_d, RVAPOR=R_v &
! ,XLS=xls, XLV=xlv, XLF=xlf &
! ,RHOWATER=rhowater, RHOSNOW=rhosnow &
! ,EP2=ep_2,SVP1=svp1,SVP2=svp2 &
! ,SVP3=svp3,SVPT0=svpt0 &
,RAINNC=rainnc, RAINNCV=rainncv &
! ,SNOWNC=snownc, SNOWNCV=snowncv &
! ,GRAUPELNC=graupelnc, GRAUPELNCV=graupelncv, SR=sr &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
! ,PRECR=precr,PRECI=preci,PRECS=precs,PRECG=precg &
! ,F_QG=f_qg &
! ,F_QNDROP=f_qndrop &
! ,QG=qg_curr &
! ,QNDROP=qndrop_curr &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling sbu_ylin' )
ENDIF
CASE (WSM3SCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling wsm3' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( W ) ) THEN
CALL wsm3
( &
TH=th &
,Q=qv_curr &
,QCI=qc_curr &
,QRS=qr_curr &
,W=w,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w &
,DELT=dt,G=g,CPD=cp,CPV=cpv &
,RD=r_d,RV=r_v,T0C=svpt0 &
,EP1=ep_1, EP2=ep_2, QMIN=epsilon &
,XLS=xls, XLV0=xlv, XLF0=xlf &
,DEN0=rhoair0, DENR=rhowater &
,CLIQ=cliq,CICE=cice,PSAT=psat &
,RAIN=rainnc ,RAINNCV=rainncv &
,SNOW=snownc ,SNOWNCV=snowncv &
,SR=sr &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling wsm3' )
ENDIF
#ifndef XEON_OPTIMIZED_WSM5
CASE (WSM5SCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling wsm5' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) ) THEN
CALL wsm5
( &
TH=th &
,Q=qv_curr &
,QC=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w &
,DELT=dt,G=g,CPD=cp,CPV=cpv &
,RD=r_d,RV=r_v,T0C=svpt0 &
,EP1=ep_1, EP2=ep_2, QMIN=epsilon &
,XLS=xls, XLV0=xlv, XLF0=xlf &
,DEN0=rhoair0, DENR=rhowater &
,CLIQ=cliq,CICE=cice,PSAT=psat &
,RAIN=rainnc ,RAINNCV=rainncv &
,SNOW=snownc ,SNOWNCV=snowncv &
,SR=sr &
#ifndef _ACCEL
,REFL_10CM=refl_10cm & ! added for radar reflectivity
,diagflag=diagflag & ! added for radar reflectivity
,do_radar_ref=do_radar_ref & ! added for radar reflectivity
#endif
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling wsm5' )
ENDIF
#endif
CASE (WSM6SCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling wsm6' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. PRESENT ( QG_CURR ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) ) THEN
CALL wsm6
( &
TH=th &
,Q=qv_curr &
,QC=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,QG=qg_curr &
,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w &
,DELT=dt,G=g,CPD=cp,CPV=cpv &
,RD=r_d,RV=r_v,T0C=svpt0 &
,EP1=ep_1, EP2=ep_2, QMIN=epsilon &
,XLS=xls, XLV0=xlv, XLF0=xlf &
,DEN0=rhoair0, DENR=rhowater &
,CLIQ=cliq,CICE=cice,PSAT=psat &
,RAIN=rainnc ,RAINNCV=rainncv &
,SNOW=snownc ,SNOWNCV=snowncv &
,SR=sr &
,REFL_10CM=refl_10cm & ! added for radar reflectivity
,diagflag=diagflag & ! added for radar reflectivity
,do_radar_ref=do_radar_ref & ! added for radar reflectivity
,GRAUPEL=graupelnc ,GRAUPELNCV=graupelncv &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling wsm6' )
ENDIF
CASE (WDM5SCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling wdm5' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. PRESENT( QNN_CURR ) .AND. &
PRESENT ( QNC_CURR ) .AND. PRESENT( QNR_CURR ).AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) ) THEN
CALL wdm5
( &
TH=th &
,Q=qv_curr &
,QC=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,NN=qnn_curr &
,NC=qnc_curr &
,NR=qnr_curr &
,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w &
,DELT=dt,G=g,CPD=cp,CPV=cpv,CCN0=n_ccn0 &
,RD=r_d,RV=r_v,T0C=svpt0 &
,EP1=ep_1, EP2=ep_2, QMIN=epsilon &
,XLS=xls, XLV0=xlv, XLF0=xlf &
,DEN0=rhoair0, DENR=rhowater &
,CLIQ=cliq,CICE=cice,PSAT=psat &
,RAIN=rainnc ,RAINNCV=rainncv &
,SNOW=snownc ,SNOWNCV=snowncv &
,SR=sr &
,REFL_10CM=refl_10cm & ! added for radar reflectivity
,diagflag=diagflag & ! added for radar reflectivity
,do_radar_ref=do_radar_ref & ! added for radar reflectivity
,ITIMESTEP=itimestep &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling wdm5')
ENDIF
CASE (WDM6SCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling wdm6' )
IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND. &
PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND. &
PRESENT( QS_CURR ) .AND. PRESENT ( QG_CURR ) .AND. &
PRESENT( QNN_CURR ) .AND. PRESENT ( QNC_CURR ) .AND. &
PRESENT( QNR_CURR ).AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) ) THEN
CALL wdm6
( &
TH=th &
,Q=qv_curr &
,QC=qc_curr &
,QR=qr_curr &
,QI=qi_curr &
,QS=qs_curr &
,QG=qg_curr &
,NN=qnn_curr &
,NC=qnc_curr &
,NR=qnr_curr &
,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w &
,DELT=dt,G=g,CPD=cp,CPV=cpv,CCN0=n_ccn0 &
,RD=r_d,RV=r_v,T0C=svpt0 &
,EP1=ep_1, EP2=ep_2, QMIN=epsilon &
,XLS=xls, XLV0=xlv, XLF0=xlf &
,DEN0=rhoair0, DENR=rhowater &
,CLIQ=cliq,CICE=cice,PSAT=psat &
,RAIN=rainnc ,RAINNCV=rainncv &
,SNOW=snownc ,SNOWNCV=snowncv &
,SR=sr &
,REFL_10CM=refl_10cm & ! added for radar reflectivity
,diagflag=diagflag & ! added for radar reflectivity
,do_radar_ref=do_radar_ref & ! added for radar reflectivity
,GRAUPEL=graupelnc ,GRAUPELNCV=graupelncv &
,ITIMESTEP=itimestep &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling wdm6')
ENDIF
#if(NMM_CORE==1)
CASE (ETAMP_HWRF)
CALL wrf_debug ( 100 , 'microphysics_driver: calling etampnew_HWRF')
IF ( PRESENT( qv_curr ) .AND. PRESENT( qt_curr ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( mp_restart_state ) .AND. &
PRESENT( tbpvs_state ) .AND. &
PRESENT( tbpvs0_state ) ) THEN
CALL ETAMP_NEW_HWRF
( &
ITIMESTEP=itimestep,DT=dt,DX=dx,DY=dy, GID=id &
,RAINNC=rainnc,RAINNCV=rainncv &
,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,PI_PHY=pi_phy,TH_PHY=th &
,QV=qv_curr &
,QT=qt_curr &
,LOWLYR=LOWLYR,SR=SR &
,F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY &
,F_RIMEF_PHY=F_RIMEF_PHY &
,QC=qc_curr,QR=Qr_curr,QI=Qi_curr &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling etampnew' )
ENDIF
#endif
CASE (ETAMPNEW) !-- Operational 4-km High-Resolution Window (HRW) version
CALL wrf_debug ( 100 , 'microphysics_driver: calling etampnew')
IF ( PRESENT( qv_curr ) .AND. PRESENT( qt_curr ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( mp_restart_state ) .AND. &
PRESENT( tbpvs_state ) .AND. &
PRESENT( tbpvs0_state ) ) THEN
CALL ETAMP_NEW
( &
ITIMESTEP=itimestep,DT=dt,DX=dx,DY=dy &
,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,PI_PHY=pi_phy,TH_PHY=th &
,QV=qv_curr &
,QC=qc_curr &
,QS=qs_curr &
,QR=qr_curr &
,QT=qt_curr &
,LOWLYR=LOWLYR,SR=SR &
,F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY &
,F_RIMEF_PHY=F_RIMEF_PHY &
,RAINNC=rainnc,RAINNCV=rainncv &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
,MP_RESTART_STATE=mp_restart_state &
,TBPVS_STATE=tbpvs_state,TBPVS0_STATE=tbpvs0_state &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling etampnew' )
ENDIF
#if(EM_CORE==1)
CASE (CAMMGMPSCHEME)
CALL wrf_debug ( 100 , 'microphysics_driver: calling CAMMGMPSCHEME')
IF ( PRESENT( z ) .AND. PRESENT( ht ) .AND. &
PRESENT( qs_curr ) .AND. &
PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
PRESENT( qi_curr ) .AND. PRESENT( f_qc ) .AND. &
PRESENT( qr_curr ) .AND. PRESENT( qndrop_curr ) .AND. &
PRESENT( f_qi ) .AND. PRESENT( qnc_curr ) .AND. &
PRESENT( RAINNCV ) .AND. PRESENT( SNOWNCV ) .AND. &
PRESENT( qns_curr ) .AND. PRESENT( qnr_curr ) .AND. &
#ifdef WRF_CHEM
PRESENT( chem ) .AND. PRESENT(dgnum4D ) .AND. &
PRESENT( dgnumwet4D ) .AND. &
#endif
PRESENT( qni_curr ) .AND. PRESENT( RAINNC ) ) THEN
CALL CAMMGMP
(ITIMESTEP=itimestep,DT=dt,P8W=p8w_hyd,P_HYD=p_hyd &
,T_PHY=t_phy,PI_PHY=pi_phy,Z_AT_W=z_at_w,QFX=qfx &
,TKE_PBL=tke_pbl,TURBTYPE3D=turbtype3d,SMAW3D=smaw3d &
,DLF3D=dlf,DLF2_3D=dlf2,RLIQ2D=rliq,Z_SEA_LEVEL=z &
,KVH3D=exch_h,HT=ht,ALT=alt,ACCUM_MODE=accum_mode &
,AITKEN_MODE=aitken_mode,COARSE_MODE=coarse_mode &
,ICWMRSH3D=icwmrsh3d,ICWMRDP3D=icwmrdp3d,SHFRC3D=shfrc3d &
,CMFMC3D=cmfmc3d,CMFMC2_3D=cmfmc2_3d &
,CONFIG_FLAGS=config_flags,F_ICE_PHY=f_ice_phy &
,F_RAIN_PHY=f_rain_phy &
#ifdef WRF_CHEM
,DGNUM4D=dgnum4D,DGNUMWET4D=dgnumwet4D &
#endif
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
!Output variables from CAMMGMP
,TH=th,CLDFRA_OLD_MP=cldfra_old_mp,CLDFRA_MP=cldfra_mp &
,CLDFRA_MP_ALL=cldfra_mp_all,CLDFRAI=cldfrai,CLDFRAL=cldfral &
,CLDFRA_CONV=cldfra_conv,WSEDL3D=wsedl3d &
,RAINNC=rainnc,RAINNCV=rainncv,SNOWNC=snownc,SNOWNCV=snowncv &
,SR=sr,QV_CURR=qv_curr,QC_CURR=qc_curr,QI_CURR=qi_curr &
,QS_CURR=qs_curr,QR_CURR=qr_curr,NC3D=qnc_curr &
,NI3D=qni_curr,NS3D=qns_curr,NR3D=qnr_curr,QNDROP=qndrop_curr&
,RH_OLD_MP=rh_old_mp,LCD_OLD_MP=lcd_old_mp &
#ifdef WRF_CHEM
,CHEM=chem &
,QME3D=qme3d,PRAIN3D=prain3d,NEVAPR3D=nevapr3d &
,RATE1ORD_CW2PR_ST3D=rate1ord_cw2pr_st3d &
#endif
,XLAND=XLAND,SNOWH=SNOWH &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling CAMMGMP SCHEME' )
ENDIF
#endif
CASE (ETAMPOLD) !-- What was run in the operational NAM (WRF NMM)
CALL wrf_debug ( 100 , 'microphysics_driver: calling etampold')
IF ( PRESENT( qv_curr ) .AND. PRESENT( qt_curr ) .AND. &
PRESENT( RAINNC ) .AND. PRESENT ( RAINNCV ) .AND. &
PRESENT( mp_restart_state ) .AND. &
PRESENT( tbpvs_state ) .AND. &
PRESENT( tbpvs0_state ) ) THEN
CALL ETAMP_OLD
( &
ITIMESTEP=itimestep,DT=dt,DX=dx,DY=dy &
,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,PI_PHY=pi_phy,TH_PHY=th &
,QV=qv_curr &
,QC=qc_curr &
,QS=qs_curr &
,QR=qr_curr &
,QT=qt_curr &
,LOWLYR=LOWLYR,SR=SR &
,F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY &
,F_RIMEF_PHY=F_RIMEF_PHY &
,RAINNC=rainnc,RAINNCV=rainncv &
,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
,MP_RESTART_STATE=mp_restart_state &
,TBPVS_STATE=tbpvs_state,TBPVS0_STATE=tbpvs0_state &
)
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling etampold' )
ENDIF
CASE DEFAULT
WRITE( wrf_err_message , * ) 'The microphysics option does not exist: mp_physics = ', mp_physics
CALL wrf_error_fatal
( wrf_err_message )
END SELECT micro_select
ENDDO
!$OMP END PARALLEL DO
#ifdef XEON_OPTIMIZED_WSM5
ENDIF
#endif
CALL wrf_debug
( 200 , 'microphysics_driver: returning from' )
RETURN
END SUBROUTINE microphysics_driver
END MODULE module_microphysics_driver