Skip to content

Commit de213c9

Browse files
authored
Add RCON Microphysics (#2144)
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.
1 parent d96478d commit de213c9

12 files changed

+6410
-45
lines changed

Registry/Registry.EM_COMMON

+8-1
Original file line numberDiff line numberDiff line change
@@ -3045,7 +3045,8 @@ package ntu mp_physics==56 - moist:qv,qc
30453045
package etampnew mp_physics==95 - moist:qv,qc,qr,qs;scalar:qt;state:f_ice_phy,f_rain_phy,f_rimef_phy
30463046
package gsfcgcescheme mp_physics==97 - moist:qv,qc,qr,qi,qs,qg
30473047
package madwrf_mp mp_physics==96 - moist:qv,qc,qi,qs
3048-
3048+
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
3049+
30493050
package nssl2mconc nssl_2moment_on==1 - scalar:qndrop,qnr,qni,qns,qng;state:re_cloud,re_ice,re_snow
30503051
package nssl3mg nssl_3moment==1 - scalar:qzr,qzg
30513052
package nssl3m nssl_3moment==2 - scalar:qzr,qzg,qzh
@@ -3097,6 +3098,7 @@ package jensen_ishmael_dfi mp_physics_dfi==55 - dfi_moist:dfi
30973098
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
30983099
package etampnew_dfi mp_physics_dfi==95 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qs;dfi_scalar:dfi_qt
30993100
package gsfcgcescheme_dfi mp_physics_dfi==97 - dfi_moist:dfi_qv,dfi_qc,dfi_qr,dfi_qi,dfi_qs,dfi_qg
3101+
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
31003102

31013103
package noprogn progn==0 - -
31023104
package progndrop progn==1 - scalar:qndrop;dfi_scalar:dfi_qndrop;state:qndropsource
@@ -3654,3 +3656,8 @@ rconfig integer windfarm_wake_model namelist,physics max_domai
36543656
# wake overlap method, M1, M2, M3, M4 [1, 2, 3, 4]
36553657
rconfig integer windfarm_overlap_method namelist,physics max_domains 4 rh "windfarm_overlap_method" "" ""
36563658
rconfig real windfarm_deg namelist,physics max_domains 0 - "windfarm_deg" "for windfarm ideal case" "degree"
3659+
3660+
3661+
# outputs for RCON model.
3662+
state real CLOUDNC ij misc 1 - rh "CLOUDNC" "ACCUMULATED TOTAL GRID SCALE CLOUD PRECIPITATION" "mm"
3663+

Registry/registry.var

+2
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ package wdm6scheme mp_physics==16 - moist:qv,qc
596596
# Note: Options 17, 19, 21, 22 are deprecated but still reserved for compatibility -- for now
597597
package nssl_2mom mp_physics==18 - moist:qv,qc,qr,qi,qs,qg
598598
package thompsonaero mp_physics==28 - moist:qv,qc,qr,qi,qs,qg
599+
package rcon_mp_scheme mp_physics==29 - moist:qv,qc,qr,qi,qs,qg
599600
package p3_1category mp_physics==50 - moist:qv,qc,qr,qi
600601
package p3_1category_nc mp_physics==51 - moist:qv,qc,qr,qi
601602
package p3_2category mp_physics==52 - moist:qv,qc,qr,qi,qi2
@@ -627,6 +628,7 @@ package wdm6_4dvar mp_physics_4dvar==16 - g_moist:g_q
627628
# Note: Options 17, 19, 21, 22 are deprecated but still reserved for compatibility -- for now
628629
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
629630
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
631+
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
630632
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
631633
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
632634
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

dyn_em/module_initialize_real.F

+24-12
Original file line numberDiff line numberDiff line change
@@ -237,21 +237,27 @@ SUBROUTINE init_domain_rk ( grid &
237237
geogrid_flag_error = geogrid_flag_error + 1
238238
END IF
239239

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

246-
IF ( ( config_flags%mp_physics .EQ. thompsonaero ) .AND. &
248+
IF ( ( (config_flags%mp_physics .EQ. thompsonaero .OR. &
249+
config_flags%mp_physics .EQ. rcon_mp_scheme &
250+
) ) .AND. &
247251
( config_flags%dust_emis .EQ. 1 ) .AND. ( flag_clayfrac .EQ. 0 ) ) THEN
248-
CALL wrf_message ( '----- ERROR: mp=28 AND dust_emis= 1 AND flag_clayfrac = 0 ' )
252+
CALL wrf_message ( '----- ERROR: mp=28 or mp=29 AND dust_emis= 1 AND flag_clayfrac = 0 ' )
249253
geogrid_flag_error = geogrid_flag_error + 1
250254
END IF
251255

252-
IF ( ( config_flags%mp_physics .EQ. thompsonaero ) .AND. &
253-
( config_flags%dust_emis .EQ. 1 ) .AND. ( flag_sandfrac .EQ. 0 ) ) THEN
254-
CALL wrf_message ( '----- ERROR: mp=28 AND dust_emis= 1 AND flag_sandfrac = 0 ' )
256+
IF ( ( (config_flags%mp_physics .EQ. thompsonaero .OR. &
257+
config_flags%mp_physics .EQ. rcon_mp_scheme &
258+
) ) .AND. &
259+
( config_flags%dust_emis .EQ. 1 ) .AND. ( flag_sandfrac .EQ. 0 ) ) THEN
260+
CALL wrf_message ( '----- ERROR: mp=28 or mp=29 AND dust_emis= 1 AND flag_sandfrac = 0 ' )
255261
geogrid_flag_error = geogrid_flag_error + 1
256262
END IF
257263

@@ -2321,10 +2327,12 @@ SUBROUTINE init_domain_rk ( grid &
23212327
! QNWFA - Number concentration water-friendly aerosols
23222328
! QNIFA - Number concentration ice-friendly aerosols
23232329
! QNBCA - Number concentration black carbon aerosols
2330+
! Also used in RCON Microphysics, mp=29
23242331
23252332
aer_init_opt = config_flags%aer_init_opt
23262333
2327-
if_thompsonaero_3d: IF (config_flags%mp_physics .EQ. THOMPSONAERO .AND. &
2334+
if_thompsonaero_3d: IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
2335+
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .AND. &
23282336
config_flags%wif_input_opt .GT. 0) THEN
23292337
23302338
select_aer_init_opt_3d: select case (aer_init_opt)
@@ -2731,9 +2739,10 @@ SUBROUTINE init_domain_rk ( grid &
27312739
27322740
end select select_aer_init_opt_3d
27332741
2734-
ELSE IF (config_flags%mp_physics .EQ. THOMPSONAERO .and. &
2742+
ELSE IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
2743+
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .and. &
27352744
config_flags%wif_input_opt .EQ. 0 ) THEN
2736-
CALL wrf_error_fatal ('wif_input_opt=0 but mp_physics=28' )
2745+
CALL wrf_error_fatal ('wif_input_opt=0 but mp_physics=28 or mp_physics=29' )
27372746
END IF if_thompsonaero_3d
27382747
27392748
!=========================================================================================
@@ -4493,7 +4502,8 @@ SUBROUTINE init_domain_rk ( grid &
44934502
!.. to read biomass burning aerosol emissions
44944503
!+---+-----------------------------------------------------------------+
44954504

4496-
if_thompsonaero_2d: IF (config_flags%mp_physics .EQ. THOMPSONAERO .AND. &
4505+
if_thompsonaero_2d: IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
4506+
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .AND. &
44974507
config_flags%wif_input_opt .GT. 0) THEN
44984508

44994509
select_aer_init_opt_2d: select case (aer_init_opt)
@@ -4782,7 +4792,9 @@ SUBROUTINE init_domain_rk ( grid &
47824792
!+---+-----------------------------------------------------------------+
47834793

47844794
IF ( config_flags%mp_physics .EQ. THOMPSON .OR. &
4785-
config_flags%mp_physics .EQ. THOMPSONAERO ) THEN
4795+
config_flags%mp_physics .EQ. THOMPSONAERO .OR. &
4796+
config_flags%mp_physics .EQ. RCON_MP_SCHEME &
4797+
) THEN
47864798

47874799
!..As it occurs up above, temporarily utilizing the v_1 variable,
47884800
!.. to hold temperature, which it does when time_loop=0.

dyn_em/solve_em.F

+4-1
Original file line numberDiff line numberDiff line change
@@ -3977,7 +3977,10 @@ END SUBROUTINE CMAQ_DRIVER
39773977
& ,pert_thom_qc=config_flags%pert_thom_qc &
39783978
& ,pert_thom_qi=config_flags%pert_thom_qi &
39793979
& ,pert_thom_qs=config_flags%pert_thom_qs &
3980-
& ,pert_thom_ni=config_flags%pert_thom_ni )
3980+
& ,pert_thom_ni=config_flags%pert_thom_ni &
3981+
& ,cloudnc=grid%cloudnc &
3982+
)
3983+
39813984
39823985
BENCH_END(micro_driver_tim)
39833986

main/depend.common

+10
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,14 @@ module_mp_thompson.o: \
971971
module_mp_radar.o
972972

973973

974+
module_mp_rcon.o: \
975+
../frame/module_domain.o \
976+
../share/module_model_constants.o \
977+
../frame/module_timing.o \
978+
../frame/module_wrf_error.o \
979+
module_mp_radar.o
980+
981+
974982
module_mp_nssl_2mom.o: \
975983
../frame/module_wrf_error.o \
976984
../share/module_model_constants.o
@@ -1335,6 +1343,7 @@ module_physics_init.o: \
13351343
module_fdda_spnudging.o \
13361344
module_fddaobs_rtfdda.o \
13371345
module_mp_thompson.o \
1346+
module_mp_rcon.o \
13381347
module_mp_gsfcgce.o \
13391348
module_mp_gsfcgce_4ice_nuwrf.o \
13401349
module_mp_morr_two_moment.o \
@@ -1381,6 +1390,7 @@ module_microphysics_driver.o: \
13811390
module_mp_wsm6r.o \
13821391
module_mp_fer_hires.o \
13831392
module_mp_thompson.o \
1393+
module_mp_rcon.o \
13841394
module_mp_gsfcgce.o \
13851395
module_mp_gsfcgce_4ice_nuwrf.o \
13861396
module_mp_morr_two_moment.o \

main/real_em.F

+8-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ PROGRAM real_data
1515
USE module_configure, ONLY : grid_config_rec_type, model_config_rec, &
1616
initial_config, get_config_as_buffer, set_config_as_buffer
1717
USE module_timing
18-
USE module_state_description, ONLY : realonly, THOMPSONAERO
18+
USE module_state_description, ONLY : realonly, THOMPSONAERO, RCON_MP_SCHEME
1919
#ifdef NO_LEAP_CALENDAR
2020
USE module_symbols_util, ONLY: wrfu_cal_noleap
2121
#else
@@ -802,7 +802,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
802802
ALLOCATE ( qbdy3dtemp2(ims:ime,kms:kme,jms:jme) )
803803
ALLOCATE ( mbdy2dtemp2(ims:ime,1:1, jms:jme) )
804804

805-
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
805+
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
806806
IF ( ALLOCATED ( qn1bdy3dtemp1 ) ) DEALLOCATE ( qn1bdy3dtemp1 )
807807
IF ( ALLOCATED ( qn2bdy3dtemp1 ) ) DEALLOCATE ( qn2bdy3dtemp1 )
808808
IF ( ALLOCATED ( qn1bdy3dtemp2 ) ) DEALLOCATE ( qn1bdy3dtemp2 )
@@ -885,7 +885,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
885885
END DO
886886
END DO
887887

888-
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
888+
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
889889
CALL couple ( grid%mu_2 , grid%mub , qn1bdy3dtemp1 , grid%scalar(:,:,:,P_QNWFA) , 't' , grid%msfty , &
890890
grid%c1h, grid%c2h, grid%c1h, grid%c2h, &
891891
ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, ips, ipe, jps, jpe, kps, kpe )
@@ -965,7 +965,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
965965
ims , ime , jms , jme , 1 , 1 , &
966966
ips , ipe , jps , jpe , 1 , 1 )
967967

968-
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
968+
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
969969
CALL stuff_bdy ( qn1bdy3dtemp1 , grid%scalar_bxs(:,:,:,P_QNWFA), grid%scalar_bxe(:,:,:,P_QNWFA), &
970970
grid%scalar_bys(:,:,:,P_QNWFA), grid%scalar_bye(:,:,:,P_QNWFA), &
971971
'T' , spec_bdy_width , &
@@ -1071,7 +1071,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
10711071
END DO
10721072
END DO
10731073
1074-
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
1074+
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
10751075
CALL couple ( grid%mu_2 , grid%mub , qn1bdy3dtemp2 , grid%scalar(:,:,:,P_QNWFA) , 't' , grid%msfty , &
10761076
grid%c1h, grid%c2h, grid%c1h, grid%c2h, &
10771077
ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, ips, ipe, jps, jpe, kps, kpe )
@@ -1168,7 +1168,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
11681168
ids , ide , jds , jde , 1 , 1 , &
11691169
ims , ime , jms , jme , 1 , 1 , &
11701170
ips , ipe , jps , jpe , 1 , 1 )
1171-
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
1171+
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
11721172
CALL stuff_bdytend ( qn1bdy3dtemp2 , qn1bdy3dtemp1 , REAL(interval_seconds) , &
11731173
grid%scalar_btxs(:,:,:,P_QNWFA), grid%scalar_btxe(:,:,:,P_QNWFA), &
11741174
grid%scalar_btys(:,:,:,P_QNWFA), grid%scalar_btye(:,:,:,P_QNWFA), &
@@ -1306,7 +1306,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
13061306
END DO
13071307
END DO
13081308
1309-
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
1309+
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
13101310
DO j = jps , jpe
13111311
DO k = kps , kpe
13121312
DO i = ips , ipe
@@ -1383,7 +1383,7 @@ SUBROUTINE assemble_output ( grid , config_flags , loop , time_loop_max , curren
13831383
ims , ime , jms , jme , 1 , 1 , &
13841384
ips , ipe , jps , jpe , 1 , 1 )
13851385
1386-
IF (config_flags%mp_physics.eq.THOMPSONAERO .AND. config_flags%aer_init_opt .gt. 0) THEN
1386+
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
13871387
CALL stuff_bdy ( qn1bdy3dtemp1 , grid%scalar_bxs(:,:,:,P_QNWFA), grid%scalar_bxe(:,:,:,P_QNWFA), &
13881388
grid%scalar_bys(:,:,:,P_QNWFA), grid%scalar_bye(:,:,:,P_QNWFA), &
13891389
'T' , spec_bdy_width , &

phys/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ MODULES = \
9797
module_mp_etanew.o \
9898
module_mp_fer_hires.o \
9999
module_mp_thompson.o \
100+
module_mp_rcon.o \
100101
module_fire_emis.o \
101102
module_mp_SBM_polar_radar.o \
102103
module_mp_full_sbm.o \

0 commit comments

Comments
 (0)