Skip to content

Commit

Permalink
Add RCON Microphysics (#2144)
Browse files Browse the repository at this point in the history
TYPE: new feature

KEYWORDS: microphysics, physics, rainfall, warm rain, cloud water

SOURCE: Robert Conrick (U. of Washington); robert.conrick@gmail.com

DESCRIPTION OF CHANGES:
This is the release of the RCON microphysics scheme, the intent of which is to improve warm rain representation within the Thompson-Eidhammer scheme.

LIST OF MODIFIED FILES: 
        modified:   Registry/Registry.EM_COMMON
        modified:   Registry/registry.var
        modified:   dyn_em/solve_em.F
        modified:   phys/Makefile
        modified:   phys/module_microphysics_driver.F
        new file:   phys/module_mp_rcon.F
        modified:   phys/module_physics_init.F

The code has passed the regression tests.

RELEASE NOTE: 
Release of the RCON Microphysics package into WRF, which improves upon the warm rain representation of the Thompson-Eidhammer scheme.

RCON is based heavily on the Thompson-Eidhammer scheme with a couple significant changes that improve upon the code in module_mp_rcon.F to generate more realistic rainfall during warm rain events with additional benefits for cold rain, especially warm processes during cold rain events.

Among the most significant changes for rain productions are 1) the use of a wider cloud water DSD of lognormal shape instead of the gamma DSD used by the Thompson-Eidhammer parameterization and 2) enhancement of
the cloud-to-rain autoconversion parameterization to accommodate the new shape. The changes here also allow for sedimentation of cloud water within the lowest model layer, which effectively creates a drizzle mode in the scheme.

Accompanying published reference: 
Conrick, R., C. F. Mass, and L. McMurdie, 2023: Improving Simulations of Warm Rain in a Bulk Microphysics Scheme. Mon. Wea. Rev., 152, 169-185, https://doi.org/10.1175/MWR-D-23-0035.1.
  • Loading branch information
rconrick authored Jan 23, 2025
1 parent d96478d commit de213c9
Show file tree
Hide file tree
Showing 12 changed files with 6,410 additions and 45 deletions.
9 changes: 8 additions & 1 deletion Registry/Registry.EM_COMMON
Original file line number Diff line number Diff line change
Expand Up @@ -3045,7 +3045,8 @@ package ntu mp_physics==56 - moist:qv,qc
package etampnew mp_physics==95 - moist:qv,qc,qr,qs;scalar:qt;state:f_ice_phy,f_rain_phy,f_rimef_phy
package gsfcgcescheme mp_physics==97 - moist:qv,qc,qr,qi,qs,qg
package madwrf_mp mp_physics==96 - moist:qv,qc,qi,qs

package rcon_mp_scheme mp_physics==29 - moist:qv,qc,qr,qi,qs,qg;scalar:qni,qnr,qnc,qnwfa,qnifa,qnbca;state:re_cloud,re_ice,re_snow,qnwfa2d,qnifa2d,taod5503d,taod5502d,cloudnc

package nssl2mconc nssl_2moment_on==1 - scalar:qndrop,qnr,qni,qns,qng;state:re_cloud,re_ice,re_snow
package nssl3mg nssl_3moment==1 - scalar:qzr,qzg
package nssl3m nssl_3moment==2 - scalar:qzr,qzg,qzh
Expand Down Expand Up @@ -3097,6 +3098,7 @@ package jensen_ishmael_dfi mp_physics_dfi==55 - dfi_moist:dfi
package ntu_dfi mp_physics_dfi==56 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg,dfi_qh;dfi_scalar:dfi_qnc,dfi_qnr,dfi_qni,dfi_qns,dfi_qng,dfi_qnh,dfi_qdcn,dfi_qtcn,dfi_qccn,dfi_qrcn,dfi_qnin,dfi_fi,dfi_fs,dfi_vi,dfi_vs,dfi_vg,dfi_ai,dfi_as,dfi_ag,dfi_ah,dfi_i3m
package etampnew_dfi mp_physics_dfi==95 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qs;dfi_scalar:dfi_qt
package gsfcgcescheme_dfi mp_physics_dfi==97 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg
package rcon_dfi mp_physics_dfi==29 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg;dfi_scalar:dfi_qni,dfi_qnr,dfi_qnc,dfi_qnwfa,dfi_qnifa,dfi_qnbca;state:dfi_re_cloud,dfi_re_ice,dfi_re_snow

package noprogn progn==0 - -
package progndrop progn==1 - scalar:qndrop;dfi_scalar:dfi_qndrop;state:qndropsource
Expand Down Expand Up @@ -3654,3 +3656,8 @@ rconfig integer windfarm_wake_model namelist,physics max_domai
# wake overlap method, M1, M2, M3, M4 [1, 2, 3, 4]
rconfig integer windfarm_overlap_method namelist,physics max_domains 4 rh "windfarm_overlap_method" "" ""
rconfig real windfarm_deg namelist,physics max_domains 0 - "windfarm_deg" "for windfarm ideal case" "degree"


# outputs for RCON model.
state real CLOUDNC ij misc 1 - rh "CLOUDNC" "ACCUMULATED TOTAL GRID SCALE CLOUD PRECIPITATION" "mm"

2 changes: 2 additions & 0 deletions Registry/registry.var
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,7 @@ package wdm6scheme mp_physics==16 - moist:qv,qc
# Note: Options 17, 19, 21, 22 are deprecated but still reserved for compatibility -- for now
package nssl_2mom mp_physics==18 - moist:qv,qc,qr,qi,qs,qg
package thompsonaero mp_physics==28 - moist:qv,qc,qr,qi,qs,qg
package rcon_mp_scheme mp_physics==29 - moist:qv,qc,qr,qi,qs,qg
package p3_1category mp_physics==50 - moist:qv,qc,qr,qi
package p3_1category_nc mp_physics==51 - moist:qv,qc,qr,qi
package p3_2category mp_physics==52 - moist:qv,qc,qr,qi,qi2
Expand Down Expand Up @@ -627,6 +628,7 @@ package wdm6_4dvar mp_physics_4dvar==16 - g_moist:g_q
# Note: Options 17, 19, 21, 22 are deprecated but still reserved for compatibility -- for now
package nssl_2mom_4dvar mp_physics_4dvar==18 - g_moist:g_qv,g_qc,g_qr,g_qi,g_qs,g_qg,g_qh;a_moist:a_qv,a_qc,a_qr,a_qi,a_qs,a_qg,a_qh
package thompsonaero_4dvar mp_physics_4dvar==28 - g_moist:g_qv,g_qc,g_qr,g_qi,g_qs,g_qg;a_moist:a_qv,a_qc,a_qr,a_qi,a_qs,a_qg
package rcon_mp_scheme_4dvar mp_physics_4dvar==29 - g_moist:g_qv,g_qc,g_qr,g_qi,g_qs,g_qg;a_moist:a_qv,a_qc,a_qr,a_qi,a_qs,a_qg
package p3_1category_4dvar mp_physics_4dvar==50 - g_moist:g_qv,g_qc,g_qr,g_qi;a_moist:a_qv,a_qc,a_qr,a_qi
package p3_1category_nc_4dvar mp_physics_4dvar==51 - g_moist:g_qv,g_qc,g_qr,g_qi;a_moist:a_qv,a_qc,a_qr,a_qi
package p3_2category_4dvar mp_physics_4dvar==52 - g_moist:g_qv,g_qc,g_qr,g_qi,g_qi2;a_moist:a_qv,a_qc,a_qr,a_qi,a_qi2
Expand Down
36 changes: 24 additions & 12 deletions dyn_em/module_initialize_real.F
Original file line number Diff line number Diff line change
Expand Up @@ -237,21 +237,27 @@ SUBROUTINE init_domain_rk ( grid &
geogrid_flag_error = geogrid_flag_error + 1
END IF

IF ( ( config_flags%mp_physics .EQ. thompsonaero ) .AND. &
IF ( ( (config_flags%mp_physics .EQ. thompsonaero .OR. &
config_flags%mp_physics .EQ. rcon_mp_scheme &
) ) .AND. &
( config_flags%dust_emis .EQ. 1 ) .AND. ( flag_erod .EQ. 0 ) ) THEN
CALL wrf_message ( '----- ERROR: mp=28 AND dust_emis= 1 AND flag_erod = 0 ' )
CALL wrf_message ( '----- ERROR: mp=28 or mp=29 AND dust_emis= 1 AND flag_erod = 0 ' )
geogrid_flag_error = geogrid_flag_error + 1
END IF

IF ( ( config_flags%mp_physics .EQ. thompsonaero ) .AND. &
IF ( ( (config_flags%mp_physics .EQ. thompsonaero .OR. &
config_flags%mp_physics .EQ. rcon_mp_scheme &
) ) .AND. &
( config_flags%dust_emis .EQ. 1 ) .AND. ( flag_clayfrac .EQ. 0 ) ) THEN
CALL wrf_message ( '----- ERROR: mp=28 AND dust_emis= 1 AND flag_clayfrac = 0 ' )
CALL wrf_message ( '----- ERROR: mp=28 or mp=29 AND dust_emis= 1 AND flag_clayfrac = 0 ' )
geogrid_flag_error = geogrid_flag_error + 1
END IF

IF ( ( config_flags%mp_physics .EQ. thompsonaero ) .AND. &
( config_flags%dust_emis .EQ. 1 ) .AND. ( flag_sandfrac .EQ. 0 ) ) THEN
CALL wrf_message ( '----- ERROR: mp=28 AND dust_emis= 1 AND flag_sandfrac = 0 ' )
IF ( ( (config_flags%mp_physics .EQ. thompsonaero .OR. &
config_flags%mp_physics .EQ. rcon_mp_scheme &
) ) .AND. &
( config_flags%dust_emis .EQ. 1 ) .AND. ( flag_sandfrac .EQ. 0 ) ) THEN
CALL wrf_message ( '----- ERROR: mp=28 or mp=29 AND dust_emis= 1 AND flag_sandfrac = 0 ' )
geogrid_flag_error = geogrid_flag_error + 1
END IF

Expand Down Expand Up @@ -2321,10 +2327,12 @@ SUBROUTINE init_domain_rk ( grid &
! QNWFA - Number concentration water-friendly aerosols
! QNIFA - Number concentration ice-friendly aerosols
! QNBCA - Number concentration black carbon aerosols
! Also used in RCON Microphysics, mp=29
aer_init_opt = config_flags%aer_init_opt
if_thompsonaero_3d: IF (config_flags%mp_physics .EQ. THOMPSONAERO .AND. &
if_thompsonaero_3d: IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .AND. &
config_flags%wif_input_opt .GT. 0) THEN
select_aer_init_opt_3d: select case (aer_init_opt)
Expand Down Expand Up @@ -2731,9 +2739,10 @@ SUBROUTINE init_domain_rk ( grid &
end select select_aer_init_opt_3d
ELSE IF (config_flags%mp_physics .EQ. THOMPSONAERO .and. &
ELSE IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .and. &
config_flags%wif_input_opt .EQ. 0 ) THEN
CALL wrf_error_fatal ('wif_input_opt=0 but mp_physics=28' )
CALL wrf_error_fatal ('wif_input_opt=0 but mp_physics=28 or mp_physics=29' )
END IF if_thompsonaero_3d
!=========================================================================================
Expand Down Expand Up @@ -4493,7 +4502,8 @@ SUBROUTINE init_domain_rk ( grid &
!.. to read biomass burning aerosol emissions
!+---+-----------------------------------------------------------------+

if_thompsonaero_2d: IF (config_flags%mp_physics .EQ. THOMPSONAERO .AND. &
if_thompsonaero_2d: IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .AND. &
config_flags%wif_input_opt .GT. 0) THEN

select_aer_init_opt_2d: select case (aer_init_opt)
Expand Down Expand Up @@ -4782,7 +4792,9 @@ SUBROUTINE init_domain_rk ( grid &
!+---+-----------------------------------------------------------------+

IF ( config_flags%mp_physics .EQ. THOMPSON .OR. &
config_flags%mp_physics .EQ. THOMPSONAERO ) THEN
config_flags%mp_physics .EQ. THOMPSONAERO .OR. &
config_flags%mp_physics .EQ. RCON_MP_SCHEME &
) THEN

!..As it occurs up above, temporarily utilizing the v_1 variable,
!.. to hold temperature, which it does when time_loop=0.
Expand Down
5 changes: 4 additions & 1 deletion dyn_em/solve_em.F
Original file line number Diff line number Diff line change
Expand Up @@ -3977,7 +3977,10 @@ END SUBROUTINE CMAQ_DRIVER
& ,pert_thom_qc=config_flags%pert_thom_qc &
& ,pert_thom_qi=config_flags%pert_thom_qi &
& ,pert_thom_qs=config_flags%pert_thom_qs &
& ,pert_thom_ni=config_flags%pert_thom_ni )
& ,pert_thom_ni=config_flags%pert_thom_ni &
& ,cloudnc=grid%cloudnc &
)
BENCH_END(micro_driver_tim)
Expand Down
10 changes: 10 additions & 0 deletions main/depend.common
Original file line number Diff line number Diff line change
Expand Up @@ -971,6 +971,14 @@ module_mp_thompson.o: \
module_mp_radar.o


module_mp_rcon.o: \
../frame/module_domain.o \
../share/module_model_constants.o \
../frame/module_timing.o \
../frame/module_wrf_error.o \
module_mp_radar.o


module_mp_nssl_2mom.o: \
../frame/module_wrf_error.o \
../share/module_model_constants.o
Expand Down Expand Up @@ -1335,6 +1343,7 @@ module_physics_init.o: \
module_fdda_spnudging.o \
module_fddaobs_rtfdda.o \
module_mp_thompson.o \
module_mp_rcon.o \
module_mp_gsfcgce.o \
module_mp_gsfcgce_4ice_nuwrf.o \
module_mp_morr_two_moment.o \
Expand Down Expand Up @@ -1381,6 +1390,7 @@ module_microphysics_driver.o: \
module_mp_wsm6r.o \
module_mp_fer_hires.o \
module_mp_thompson.o \
module_mp_rcon.o \
module_mp_gsfcgce.o \
module_mp_gsfcgce_4ice_nuwrf.o \
module_mp_morr_two_moment.o \
Expand Down
16 changes: 8 additions & 8 deletions main/real_em.F
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ PROGRAM real_data
USE module_configure, ONLY : grid_config_rec_type, model_config_rec, &
initial_config, get_config_as_buffer, set_config_as_buffer
USE module_timing
USE module_state_description, ONLY : realonly, THOMPSONAERO
USE module_state_description, ONLY : realonly, THOMPSONAERO, RCON_MP_SCHEME
#ifdef NO_LEAP_CALENDAR
USE module_symbols_util, ONLY: wrfu_cal_noleap
#else
Expand Down Expand Up @@ -802,7 +802,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
ALLOCATE ( qbdy3dtemp2(ims:ime,kms:kme,jms:jme) )
ALLOCATE ( mbdy2dtemp2(ims:ime,1:1, jms:jme) )

IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ((config_flags%mp_physics.eq.THOMPSONAERO .OR. config_flags%mp_physics.eq.RCON_MP_SCHEME) .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ( ALLOCATED ( qn1bdy3dtemp1 ) ) DEALLOCATE ( qn1bdy3dtemp1 )
IF ( ALLOCATED ( qn2bdy3dtemp1 ) ) DEALLOCATE ( qn2bdy3dtemp1 )
IF ( ALLOCATED ( qn1bdy3dtemp2 ) ) DEALLOCATE ( qn1bdy3dtemp2 )
Expand Down Expand Up @@ -885,7 +885,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
END DO
END DO

IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ((config_flags%mp_physics.eq.THOMPSONAERO .OR. config_flags%mp_physics.eq.RCON_MP_SCHEME).AND. config_flags%aer_init_opt .gt. 0) THEN
CALL couple ( grid%mu_2 , grid%mub , qn1bdy3dtemp1 , grid%scalar(:,:,:,P_QNWFA) , 't' , grid%msfty , &
grid%c1h, grid%c2h, grid%c1h, grid%c2h, &
ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, ips, ipe, jps, jpe, kps, kpe )
Expand Down Expand Up @@ -965,7 +965,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
ims , ime , jms , jme , 1 , 1 , &
ips , ipe , jps , jpe , 1 , 1 )

IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ((config_flags%mp_physics.eq.THOMPSONAERO .OR. config_flags%mp_physics.eq.RCON_MP_SCHEME) .AND. config_flags%aer_init_opt .gt. 0) THEN
CALL stuff_bdy ( qn1bdy3dtemp1 , grid%scalar_bxs(:,:,:,P_QNWFA), grid%scalar_bxe(:,:,:,P_QNWFA), &
grid%scalar_bys(:,:,:,P_QNWFA), grid%scalar_bye(:,:,:,P_QNWFA), &
'T' , spec_bdy_width , &
Expand Down Expand Up @@ -1071,7 +1071,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
END DO
END DO
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ((config_flags%mp_physics.eq.THOMPSONAERO .OR. config_flags%mp_physics.eq.RCON_MP_SCHEME) .AND. config_flags%aer_init_opt .gt. 0) THEN
CALL couple ( grid%mu_2 , grid%mub , qn1bdy3dtemp2 , grid%scalar(:,:,:,P_QNWFA) , 't' , grid%msfty , &
grid%c1h, grid%c2h, grid%c1h, grid%c2h, &
ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, ips, ipe, jps, jpe, kps, kpe )
Expand Down Expand Up @@ -1168,7 +1168,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
ids , ide , jds , jde , 1 , 1 , &
ims , ime , jms , jme , 1 , 1 , &
ips , ipe , jps , jpe , 1 , 1 )
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ((config_flags%mp_physics.eq.THOMPSONAERO .OR. config_flags%mp_physics.eq.RCON_MP_SCHEME) .AND. config_flags%aer_init_opt .gt. 0) THEN
CALL stuff_bdytend ( qn1bdy3dtemp2 , qn1bdy3dtemp1 , REAL(interval_seconds) , &
grid%scalar_btxs(:,:,:,P_QNWFA), grid%scalar_btxe(:,:,:,P_QNWFA), &
grid%scalar_btys(:,:,:,P_QNWFA), grid%scalar_btye(:,:,:,P_QNWFA), &
Expand Down Expand Up @@ -1306,7 +1306,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
END DO
END DO
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ((config_flags%mp_physics.eq.THOMPSONAERO .OR. config_flags%mp_physics.eq.RCON_MP_SCHEME) .AND. config_flags%aer_init_opt .gt. 0) THEN
DO j = jps , jpe
DO k = kps , kpe
DO i = ips , ipe
Expand Down Expand Up @@ -1383,7 +1383,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
ims , ime , jms , jme , 1 , 1 , &
ips , ipe , jps , jpe , 1 , 1 )
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
IF ((config_flags%mp_physics.eq.THOMPSONAERO .OR. config_flags%mp_physics.eq.RCON_MP_SCHEME) .AND. config_flags%aer_init_opt .gt. 0) THEN
CALL stuff_bdy ( qn1bdy3dtemp1 , grid%scalar_bxs(:,:,:,P_QNWFA), grid%scalar_bxe(:,:,:,P_QNWFA), &
grid%scalar_bys(:,:,:,P_QNWFA), grid%scalar_bye(:,:,:,P_QNWFA), &
'T' , spec_bdy_width , &
Expand Down
1 change: 1 addition & 0 deletions phys/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ MODULES = \
module_mp_etanew.o \
module_mp_fer_hires.o \
module_mp_thompson.o \
module_mp_rcon.o \
module_fire_emis.o \
module_mp_SBM_polar_radar.o \
module_mp_full_sbm.o \
Expand Down
Loading

0 comments on commit de213c9

Please sign in to comment.