Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
cb18737
initial connection of tempo microphysics to WRF
AndersJensen-NOAA Jan 9, 2026
e2450bc
add TEMPO package and optional packages and connect to phys_init
AndersJensen-NOAA Jan 9, 2026
b0fd109
fix typo in Registry
AndersJensen-NOAA Jan 9, 2026
5ce548e
move TEMPO objects to be with other MP objects
AndersJensen-NOAA Jan 9, 2026
e891c46
TEMPO connection to physics init
AndersJensen-NOAA Jan 9, 2026
d45f59b
TEMPO connection to microphysics driver
AndersJensen-NOAA Jan 9, 2026
9ff03a3
update TEMPO tag
AndersJensen-NOAA Jan 9, 2026
6d78b09
switch TEMPO from manage externals to git submodule
AndersJensen-NOAA Jan 13, 2026
1f684ec
add TEMPO diagnostics, aerosolaware, and hailaware args to microphysi…
AndersJensen-NOAA Jan 13, 2026
93801b2
add TEMPO dependencies
AndersJensen-NOAA Jan 13, 2026
39edba6
added qnwfa2d to tempo aerosolaware state and connected tempo diagnos…
AndersJensen-NOAA Jan 14, 2026
344d841
fix typo snownvc -> snowncv
AndersJensen-NOAA Jan 14, 2026
b891265
small tempo refactor for ccpp compliance
AndersJensen-NOAA Jan 15, 2026
9c3259c
removed tempo_module_init and combined with driver for ccpp compliance
AndersJensen-NOAA Jan 15, 2026
09bf02a
add wrf config flag checks to diagnostic output
AndersJensen-NOAA Jan 15, 2026
8b97b4e
change from tempo_drvier -> tempo_run for ccpp compliance
AndersJensen-NOAA Jan 21, 2026
9135bb5
fix to scalar/state declarations when using tempo_aerosolaware
AndersJensen-NOAA Jan 22, 2026
14c1733
adds option to use aerosol climo and surface emissions with TEMPO
AndersJensen-NOAA Jan 22, 2026
eee91c8
sets aer_init_opt for TEMPO
AndersJensen-NOAA Jan 22, 2026
ccc12aa
update pointer to NCAR/TEMPO
AndersJensen-NOAA Feb 2, 2026
fd8d63a
update .gitmodules to point to NCAR/TEMPO
AndersJensen-NOAA Feb 2, 2026
9a7bc4b
Merge branch 'develop' into tempo_for_wrf
dudhia Feb 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
[submodule "phys/MYNN-EDMF"]
path = phys/MYNN-EDMF
url = https://github.com/NCAR/MYNN-EDMF
[submodule "phys/TEMPO"]
path = phys/TEMPO
url = https://github.com/NCAR/TEMPO.git
[submodule "phys/MYNN-SFC"]
path = phys/MYNN-SFC
url = https://github.com/NCAR/MYNN-SFC.git
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,13 @@ wrf : framework_only
echo "MYNN-EDMF submodule files populating WRF directories" ; \
echo "------------------------------------------------------------------------------" ; \
fi
@if [ \( ! -f phys/module_mp_tempo_driver.F90 \) -o \( ! -f phys/module_mp_tempo_main.F90 \) -o \
\( ! -f phys/module_mp_tempo_cfgs.F90 \) -o \( ! -f phys/module_mp_tempo_aerosols.F90 \) -o \
\( ! -f phys/module_mp_tempo_ml.F90 \) -o \( ! -f phys/module_mp_tempo_diags.F90 \) -o \
\( ! -f phys/module_mp_tempo_utils.F90 \) -o \( ! -f phys/module_mp_tempo_params.F90 \) ] ; then \
echo " " ; \
echo "------------------------------------------------------------------------------" ; \
echo "Error Error Error TEMPO submodule files not populating WRF directories" ; \
@if [ \( ! -f phys/module_sf_mynnsfc_driver.F \) -o \
\( ! -f phys/module_sf_mynnsfc_land.F \) -o \
\( ! -f phys/module_sf_mynnsfc_water.F \) -o \
Expand All @@ -151,6 +158,7 @@ wrf : framework_only
exit 31 ; \
else \
echo "------------------------------------------------------------------------------" ; \
echo "TEMPO submodule files populating WRF directories" ; \
echo "MYNN-SFC submodule files populating WRF directories" ; \
echo "------------------------------------------------------------------------------" ; \
fi
Expand Down
7 changes: 5 additions & 2 deletions Registry/Registry.EM_COMMON
Original file line number Diff line number Diff line change
Expand Up @@ -2425,7 +2425,8 @@ rconfig integer nssl_3moment namelist,physics 1 0
rconfig integer nssl_density_on namelist,physics 1 -1 rh "NSSL graupel/hail density flag" "" ""
rconfig integer nssl_ssat_output namelist,physics 1 0 rh "NSSL ssat output flag" "" ""


rconfig integer tempo_aerosolaware namelist,physics 1 1 rh "TEMPO aerosol-aware flag" "" ""
rconfig integer tempo_hailaware namelist,physics 1 1 rh "TEMPO hail-aware flag" "" ""

rconfig integer CCNTY namelist,physics 1 2 rh "Aerosol background type for NTU microphysics" "" ""

Expand Down Expand Up @@ -3044,6 +3045,7 @@ package wdm7scheme mp_physics==26 - moist:qv,qc
package udmscheme mp_physics==27 - moist:qv,qc,qr,qi,qs,qg,qh;scalar:qnn,qnc,qnr;state:re_cloud,re_ice,re_snow
package thompsonaero mp_physics==28 - 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
package thompsongh mp_physics==38 - moist:qv,qc,qr,qi,qs,qg;scalar:qni,qnr,qnc,qng,qvolg,qnwfa,qnifa,qnbca;state:re_cloud,re_ice,re_snow,qnwfa2d,qnifa2d,taod5503d,taod5502d
package tempo mp_physics==88 - moist:qv,qc,qr,qi,qs,qg;scalar:qni,qnr;state:re_cloud,re_ice,re_snow
package p3_1category mp_physics==50 - moist:qv,qc,qr,qi;scalar:qni,qnr,qir,qib;state:re_cloud,re_ice,vmi3d,rhopo3d,di3d,refl_10cm,th_old,qv_old
package p3_1category_nc mp_physics==51 - moist:qv,qc,qr,qi;scalar:qnc,qni,qnr,qir,qib;state:re_cloud,re_ice,vmi3d,rhopo3d,di3d,refl_10cm,th_old,qv_old
package p3_2category mp_physics==52 - moist:qv,qc,qr,qi,qi2;scalar:qnc,qni,qnr,qir,qib,qni2,qir2,qib2;state:re_cloud,re_ice,vmi3d,rhopo3d,di3d,vmi3d_2,rhopo3d_2,di3d_2,refl_10cm,th_old,qv_old
Expand All @@ -3066,7 +3068,8 @@ package nssl_graupelvol nssl_density_on==1 - scalar:qvol
package nssl_hailvol nssl_density_on==2 - scalar:qvolg,qvolh
package nssl_ssat_out nssl_ssat_output==1 - state:ssat
package nssl_ssati_out nssl_ssat_output==2 - state:ssat,ssati

package tempo_aerosol tempo_aerosolaware==1 - scalar:qnc,qnwfa,qnifa;state:qnwfa2d,qnifa2d
package tempo_hail tempo_hailaware==1 - scalar:qng,qvolg

package radar_refl compute_radar_ref==1 - state:refl_10cm,refd_max
endif
Expand Down
4 changes: 4 additions & 0 deletions clean
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ if ( "$arg" == '-a' || "$arg" == '-aa' ) then
run/MPTABLE.TBL
/bin/rm -f phys/module_bl_mynnedmf.F phys/module_bl_mynnedmf_common.F \
phys/module_bl_mynnedmf_driver.F
/bin/rm -f phys/module_mp_tempo_cfgs.F90 phys/module_mp_tempo_params.F90 \
phys/module_mp_tempo_utils.F90 phys/module_mp_tempo_diags.F90 \
phys/module_mp_tempo_ml.F90 phys/module_mp_tempo_driver.F90 \
phys/module_mp_tempo_aerosols.F90 phys/module_mp_tempo_main.F90
endif
endif

Expand Down
15 changes: 11 additions & 4 deletions dyn_em/module_initialize_real.F
Original file line number Diff line number Diff line change
Expand Up @@ -2332,7 +2332,8 @@ SUBROUTINE init_domain_rk ( grid &
aer_init_opt = config_flags%aer_init_opt

if_thompsonaero_3d: IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .AND. &
.OR. (config_flags%mp_physics .EQ. TEMPO .AND. config_flags%tempo_aerosolaware .EQ. 1) &
.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 @@ -2740,7 +2741,8 @@ SUBROUTINE init_domain_rk ( grid &
end select select_aer_init_opt_3d

ELSE IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .and. &
.OR. (config_flags%mp_physics .EQ. TEMPO .AND. config_flags%tempo_aerosolaware .EQ. 1) &
.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 or mp_physics=29' )
END IF if_thompsonaero_3d
Expand Down Expand Up @@ -4510,7 +4512,8 @@ SUBROUTINE init_domain_rk ( grid &
!+---+-----------------------------------------------------------------+

if_thompsonaero_2d: IF ((config_flags%mp_physics .EQ. THOMPSONAERO &
.OR. config_flags%mp_physics .EQ. RCON_MP_SCHEME) .AND. &
.OR. (config_flags%mp_physics .EQ. TEMPO .AND. config_flags%tempo_aerosolaware .EQ. 1) &
.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 All @@ -4533,7 +4536,11 @@ SUBROUTINE init_domain_rk ( grid &
do j = jts, min(jde-1,jte)
do i = its, min(ide-1,ite)
z1 = (grid%phb(i,2,j)-grid%phb(i,1,j))/g
grid%qnwfa2d(i,j) = grid%w_wif_now(i,1,j) * 0.000196 * (50./z1)
if (config_flags%mp_physics .EQ. TEMPO) then
grid%qnwfa2d(i,j) = grid%w_wif_now(i,1,j) * 0.000196 * (5./z1)
else
grid%qnwfa2d(i,j) = grid%w_wif_now(i,1,j) * 0.000196 * (50./z1)
endif
enddo
enddo

Expand Down
26 changes: 26 additions & 0 deletions main/depend.common
Original file line number Diff line number Diff line change
Expand Up @@ -1002,6 +1002,28 @@ module_mp_nssl_2mom.o: \
../frame/module_wrf_error.o \
../share/module_model_constants.o

module_mp_tempo_ml.o: \
module_mp_tempo_params.o
module_mp_tempo_utils.o: \
module_mp_tempo_params.o
module_mp_tempo_aerosols.o: \
module_mp_tempo_params.o
module_mp_tempo_diags.o: \
module_mp_tempo_params.o \
module_mp_tempo_utils.o
module_mp_tempo_driver.o : \
module_mp_tempo_params.o \
module_mp_tempo_cfgs.o \
module_mp_tempo_utils.o \
module_mp_tempo_main.o \
module_mp_tempo_ml.o
module_mp_tempo_main.o : \
module_mp_tempo_params.o \
module_mp_tempo_cfgs.o \
module_mp_tempo_utils.o \
module_mp_tempo_diags.o \
module_mp_tempo_aerosols.o \
module_mp_tempo_ml.o

module_mp_fast_sbm.o: \
../frame/module_domain.o \
Expand Down Expand Up @@ -1362,6 +1384,8 @@ module_physics_init.o: \
module_fdda_spnudging.o \
module_fddaobs_rtfdda.o \
module_mp_thompson.o \
module_mp_tempo_cfgs.o \
module_mp_tempo_driver.o \
module_mp_rcon.o \
module_mp_gsfcgce.o \
module_mp_gsfcgce_4ice_nuwrf.o \
Expand Down Expand Up @@ -1409,6 +1433,8 @@ module_microphysics_driver.o: \
module_mp_wsm6r.o \
module_mp_fer_hires.o \
module_mp_thompson.o \
module_mp_tempo_cfgs.o \
module_mp_tempo_driver.o \
module_mp_rcon.o \
module_mp_gsfcgce.o \
module_mp_gsfcgce_4ice_nuwrf.o \
Expand Down
28 changes: 27 additions & 1 deletion phys/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,14 @@ MODULES = \
module_mp_etanew.o \
module_mp_fer_hires.o \
module_mp_thompson.o \
module_mp_tempo_cfgs.o \
module_mp_tempo_params.o \
module_mp_tempo_utils.o \
module_mp_tempo_diags.o \
module_mp_tempo_ml.o \
module_mp_tempo_aerosols.o \
module_mp_tempo_main.o \
module_mp_tempo_driver.o \
module_mp_rcon.o \
module_fire_emis.o \
module_mp_SBM_polar_radar.o \
Expand Down Expand Up @@ -238,7 +246,7 @@ DIAGNOSTIC_MODULES_EM = \
module_diag_zld.o \
module_diag_trad_fields.o \
module_diag_solar.o

PHYSMMM_MODULES = \
physics_mmm/sf_sfclayrev.o \
physics_mmm/cu_ntiedtke.o \
Expand Down Expand Up @@ -287,6 +295,24 @@ submodules :
else \
echo No action required for MYNN-EDMF submodule ; \
fi
@if [ \( ! -f module_mp_tempo_driver.F90 \) -o \( ! -f module_mp_tempo_main.F90 \) -o \
\( ! -f module_mp_tempo_cfgs.F90 \) -o \( ! -f module_mp_tempo_aerosols.F90 \) -o \
\( ! -f module_mp_tempo_ml.F90 \) -o \( ! -f modulemp_tempo_diags.F90 \) -o \
\( ! -f module_mp_tempo_utils.F90 \) -o \( ! -f module_mp_tempo_params.F90 \) ] ; then \
echo Pulling in TEMPO submodule ; \
( cd .. ; git submodule update --init --recursive ) ; \
ln -sf TEMPO/src/module_mp_tempo_cfgs.F90 module_mp_tempo_cfgs.F90 ; \
ln -sf TEMPO/src/module_mp_tempo_params.F90 module_mp_tempo_params.F90 ; \
ln -sf TEMPO/src/module_mp_tempo_utils.F90 module_mp_tempo_utils.F90 ; \
ln -sf TEMPO/src/module_mp_tempo_diags.F90 module_mp_tempo_diags.F90 ; \
ln -sf TEMPO/src/module_mp_tempo_ml.F90 module_mp_tempo_ml.F90 ; \
ln -sf TEMPO/src/module_mp_tempo_aerosols.F90 module_mp_tempo_aerosols.F90 ; \
ln -sf TEMPO/src/module_mp_tempo_main.F90 module_mp_tempo_main.F90 ; \
ln -sf TEMPO/src/module_mp_tempo_driver.F90 module_mp_tempo_driver.F90 ; \
else \
echo No action required for TEMPO submodule ; \
fi

@if [ \( ! -f module_sf_mynnsfc_driver.F \) -o \( ! -f module_sf_mynnsfc_common.F \) -o \
\( ! -f module_sf_mynnsfc_land.F \) -o \( ! -f module_sf_mynnsfc_water.F \) -o \
\( ! -f module_sf_mynnsfc_ice.F \) ] ; then \
Expand Down
1 change: 1 addition & 0 deletions phys/TEMPO
Submodule TEMPO added at e41f02
113 changes: 112 additions & 1 deletion phys/module_microphysics_driver.F
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ SUBROUTINE microphysics_driver( &
,WSM7SCHEME, WDM7SCHEME, UDMSCHEME &
,NUWRF4ICESCHEME &
,MILBRANDT2MOM , CAMMGMPSCHEME,FULL_KHAIN_LYNN, P3_1CATEGORY, P3_1CATEGORY_NC, P3_2CATEGORY, P3_1CAT_3MOM &
,MORR_TM_AERO, JENSEN_ISHMAEL, SPRINKLER, NTU !,MILBRANDT3MOM
,MORR_TM_AERO, JENSEN_ISHMAEL, SPRINKLER, NTU, TEMPO !,MILBRANDT3MOM
USE module_state_description, ONLY : WSM6RSCHEME
#if ( WRFPLUS == 1 )
USE module_state_description, ONLY : LSCONDSCHEME, MKESSLERSCHEME
Expand Down Expand Up @@ -224,6 +224,9 @@ SUBROUTINE microphysics_driver( &
USE module_mp_fer_hires
USE module_mp_rcon
USE module_mp_thompson
USE module_mp_tempo_cfgs, only : ty_tempo_cfgs
USE module_mp_tempo_driver, only : tempo_run, ty_tempo_driver_diags, &
tempo_aerosol_surface_emissions
USE module_mp_full_sbm
#if ( BUILD_SBM_FAST == 1 )
USE module_mp_fast_sbm
Expand Down Expand Up @@ -796,6 +799,9 @@ SUBROUTINE microphysics_driver( &
character*256 :: errmsg
integer :: errflg

type(ty_tempo_cfgs) :: tempo_cfgs
type(ty_tempo_driver_diags) :: tempo_driver_diags
logical :: config_tempo_aerosolaware, config_tempo_hailaware
!---------------------------------------------------------------------
! check for microphysics type. We need a clean way to
! specify these things!
Expand Down Expand Up @@ -1381,6 +1387,111 @@ SUBROUTINE microphysics_driver( &
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling thompson_et_al' )
ENDIF
CASE (TEMPO)
! add surface emissions
if (present(qnwfa_curr) .and. present(qnwfa2d)) then
call tempo_aerosol_surface_emissions(dt=dt, &
nwfa=qnwfa_curr, nwfa2d=qnwfa2d, &
ims=ims, ime=ime, jms=jms, &
jme=jme, kms=kms, kme=kme, kts=kts)
endif

CALL wrf_debug ( 100 , 'microphysics_driver: calling tempo' )
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)) THEN

config_tempo_aerosolaware = .false.
config_tempo_hailaware = .false.
if (config_flags%tempo_aerosolaware == 1) config_tempo_aerosolaware = .true.
if (config_flags%tempo_hailaware == 1) config_tempo_hailaware = .true.
tempo_cfgs%aerosolaware_flag = config_tempo_aerosolaware
tempo_cfgs%hailaware_flag = config_tempo_hailaware
CALL tempo_run( &
tempo_cfgs=tempo_cfgs, &
dt=dt, &
itimestep=itimestep, &
th=th, &
pii=pi_phy, &
p=p, &
w=w, &
dz=dz8w, &
qv=qv_curr, &
qc=qc_curr, &
qr=qr_curr, &
qi=qi_curr, &
qs=qs_curr, &
qg=qg_curr, &
ni=qni_curr, &
nr=qnr_curr, &
nc=qnc_curr, & ! optionally present when tempo_aerosolaware == 1
nwfa=qnwfa_curr, & ! optionally present when tempo_aerosolaware == 1
nifa=qnifa_curr, & ! optionally present when tempo_aerosolaware == 1
ng=qng_curr, & ! optionally present when tempo_hailaware == 1
qb=qvolg_curr, & ! optionally present when tempo_hailaware == 1
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, &
tempo_diags = tempo_driver_diags)
! map tempo diagnostics to WRF variable names noting that some wrf variables are optional
do j = jts, jte
do i = its, ite
if (present(snowncv)) then
snowncv(i,j) = tempo_driver_diags%ice_liquid_equiv_precip(i,j) + &
tempo_driver_diags%snow_liquid_equiv_precip(i,j)
endif
if (present(snownc)) snownc(i,j) = snownc(i,j) + snowncv(i,j)

if (present(graupelncv)) then
graupelncv(i,j) = tempo_driver_diags%graupel_liquid_equiv_precip(i,j)
endif
if (present(graupelnc)) graupelnc(i,j) = graupelnc(i,j) + graupelncv(i,j)

if (present(rainncv)) then
rainncv(i,j) = tempo_driver_diags%rain_precip(i,j) + snowncv(i,j) + graupelncv(i,j)
endif
if (present(rainnc)) rainnc(i,j) = rainnc(i,j) + rainncv(i,j)
! ratio of frozen precipitation to total is not optional in wrf
sr(i,j) = tempo_driver_diags%frozen_fraction(i,j)

if (config_flags%nwp_diagnostics == 1) then
if (present(hail_maxk1)) then
if (allocated(tempo_driver_diags%max_hail_diameter_sfc)) then
hail_maxk1(i,j) = tempo_driver_diags%max_hail_diameter_sfc(i,j)
endif
endif
if (present(hail_max2d)) then
if (allocated(tempo_driver_diags%max_hail_diameter_column)) then
hail_max2d(i,j) = tempo_driver_diags%max_hail_diameter_column(i,j)
endif
endif
endif
! 3d tempo diagnostics
do k = kts, kte
if (do_radar_ref == 1) then
if (present(refl_10cm)) then
if (allocated(tempo_driver_diags%refl10cm)) then
refl_10cm(i,k,j) = tempo_driver_diags%refl10cm(i,k,j)
endif
endif
endif
! effective radius values are not optional in wrf
if (allocated(tempo_driver_diags%re_cloud)) then
re_cloud(i,k,j) = tempo_driver_diags%re_cloud(i,k,j)
endif
if (allocated(tempo_driver_diags%re_ice)) then
re_ice(i,k,j) = tempo_driver_diags%re_ice(i,k,j)
endif
if (allocated(tempo_driver_diags%re_snow)) then
re_snow(i,k,j) = tempo_driver_diags%re_snow(i,k,j)
endif
enddo
enddo
enddo
ELSE
CALL wrf_error_fatal ( 'arguments not present for calling tempo' )
ENDIF
#if (EM_CORE==1)
CASE (NTU)
CALL wrf_debug(100, 'microphysics_driver: calling ntu')
Expand Down
Loading