Skip to content

Commit

Permalink
Some changes and housekeeping to keep Thompson and TEMPO MP distinct,…
Browse files Browse the repository at this point in the history
… for now
  • Loading branch information
dustinswales committed Sep 23, 2024
1 parent b9be2d9 commit a5981bc
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 53 deletions.
4 changes: 2 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
branch = main
[submodule "physics/MP/TEMPO"]
path = physics/MP/TEMPO/tempo
url = https://github.com/NCAR/TEMPO.git
branch = main
url = https://github.com/dustinswales/TEMPO.git
branch = feature/add_ccpp_type
129 changes: 97 additions & 32 deletions physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_pre.F90
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
ntdu1, ntdu2, ntdu3, ntdu4, ntdu5, ntss1, ntss2, &
ntss3, ntss4, ntss5, ntsu, ntbcb, ntbcl, ntocb, ntocl, ntchm, &
imp_physics,imp_physics_nssl, nssl_ccn_on, nssl_invertccn, &
imp_physics_tempo, &
imp_physics_thompson, imp_physics_gfdl, imp_physics_zhao_carr, &
imp_physics_zhao_carr_pdf, imp_physics_mg, imp_physics_wsm6, &
imp_physics_fer_hires, iovr, iovr_rand, iovr_maxrand, iovr_max, &
Expand All @@ -45,7 +46,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
gasvmr_ccl4, gasvmr_cfc113, aerodp,ext550, clouds6, clouds7, clouds8, &
clouds9, cldsa, cldfra, cldfra2d, lwp_ex,iwp_ex, lwp_fc,iwp_fc, &
faersw1, faersw2, faersw3, faerlw1, faerlw2, faerlw3, alpha, rrfs_sd, &
aero_dir_fdb, fdb_coef, spp_wts_rad, spp_rad, ico2, ozphys, &
aero_dir_fdb, fdb_coef, spp_wts_rad, spp_rad, ico2, ozphys, tempo_cfg, &
errmsg, errflg)

use machine, only: kind_phys
Expand All @@ -72,14 +73,36 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
use surface_perturbation, only: cdfnor,ppfbet

! For Thompson MP
use module_mp_thompson_params, only: Nt_c_l, Nt_c_o, &
re_qc_min, re_qc_max, &
re_qi_min, re_qi_max, &
re_qs_min, re_qs_max, configs
use module_mp_thompson_utils, only: calc_effectRad, &
make_IceNumber, &
make_DropletNumber, &
make_RainNumber
use module_mp_thompson, only: calc_effectRad_thmpsn => calc_effectRad, &
Nt_c_l_thmpsn => Nt_c, &
Nt_c_o_thmpsn => Nt_c, &
re_qc_min_thmpsn => re_qc_min, &
re_qc_max_thmpsn => re_qc_max, &
re_qi_min_thmpsn => re_qi_min, &
re_qi_max_thmpsn => re_qi_max, &
re_qs_min_thmpsn => re_qs_min, &
re_qs_max_thmpsn => re_qs_max
use module_mp_thompson_make_number_concentrations, only: &
make_IceNumber_thmpsn => make_IceNumber, &
make_DropletNumber_thmpsn => make_DropletNumber, &
make_RainNumber_thmpsn => make_RainNumber

! For TEMPO MP
! DJS to Anders: Change from Thompson -> TEMPO in submodule, propogate change here.
use module_mp_thompson_params, only: Nt_c_l_tempo => Nt_c_l, &
Nt_c_o_tempo => Nt_c_o, &
re_qc_min_tempo => re_qc_min, &
re_qc_max_tempo => re_qc_max, &
re_qi_min_tempo => re_qi_min, &
re_qi_max_tempo => re_qi_max, &
re_qs_min_tempo => re_qs_min, &
re_qs_max_tempo => re_qs_max
use module_mp_thompson_utils, only: calc_effectRad_tempo => calc_effectRad, &
make_IceNumber_tempo => make_IceNumber, &
make_DropletNumber_tempo => make_DropletNumber, &
make_RainNumber_tempo => make_RainNumber


! For NRL Ozone
use module_ozphys, only: ty_ozphys
implicit none
Expand All @@ -97,6 +120,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
lndp_type, &
kdt, imp_physics, &
imp_physics_thompson, &
imp_physics_tempo, &
imp_physics_gfdl, &
imp_physics_zhao_carr, &
imp_physics_zhao_carr_pdf, &
Expand Down Expand Up @@ -232,7 +256,9 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
qv_mp, qc_mp, qi_mp, qs_mp, &
nc_mp, ni_mp, nwfa
real (kind=kind_phys), dimension(lm) :: cldfra1d, qv1d, &
& qc1d, qi1d, qs1d, dz1d, p1d, t1d
qc1d, qi1d, qs1d, dz1d, p1d, t1d
! For TEMPO MP
type(ty_tempo_cfg), intent(in) :: tempo_cfg

! for F-A MP
real(kind=kind_phys), dimension(im,lm+LTP+1) :: tem2db, hz
Expand Down Expand Up @@ -275,7 +301,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&

LP1 = LM + 1 ! num of in/out levels

if (imp_physics == imp_physics_thompson) then
if (imp_physics == imp_physics_thompson .or. imp_physics == imp_physics_tempo) then
max_relh = 1.5
else
max_relh = 1.1
Expand Down Expand Up @@ -736,7 +762,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
enddo
enddo
! for Thompson MP - prepare variables for calc_effr
if_thompson: if (imp_physics == imp_physics_thompson .and. (ltaerosol .or. mraerosol)) then
if_thompson: if ((imp_physics == imp_physics_thompson .or. imp_physics == imp_physics_tempo) .and. (ltaerosol .or. mraerosol)) then
do k=1,LMK
do i=1,IM
qvs = qlyr(i,k)
Expand All @@ -751,7 +777,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
nwfa (i,k) = tracer1(i,k,ntwa)
enddo
enddo
elseif (imp_physics == imp_physics_thompson) then
elseif (imp_physics == imp_physics_thompson .or. imp_physics == imp_physics_tempo) then
do k=1,LMK
do i=1,IM
qvs = qlyr(i,k)
Expand All @@ -762,9 +788,19 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
qi_mp (i,k) = tracer1(i,k,ntiw)/(1.-qvs)
qs_mp (i,k) = tracer1(i,k,ntsw)/(1.-qvs)
if(nint(slmsk(i)) == 1) then
nc_mp (i,k) = Nt_c_l*orho(i,k)
if (imp_physics == imp_physics_thompson) then
nc_mp (i,k) = Nt_c_l_thmpsn*orho(i,k)
endif
if (imp_physics == imp_physics_tempo) then
nc_mp (i,k) = Nt_c_l_tempo*orho(i,k)
endif
else
nc_mp (i,k) = Nt_c_o*orho(i,k)
if (imp_physics == imp_physics_thompson) then
nc_mp (i,k) = Nt_c_o_thmpsn*orho(i,k)
endif
if (imp_physics == imp_physics_tempo) then
nc_mp (i,k) = Nt_c_o_tempo*orho(i,k)
endif
endif
ni_mp (i,k) = tracer1(i,k,ntinc)/(1.-qvs)
enddo
Expand Down Expand Up @@ -877,18 +913,28 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
! not used yet -- effr_in should always be true for now
endif

elseif (imp_physics == imp_physics_thompson) then ! Thompson MP
elseif (imp_physics == imp_physics_thompson .or. imp_physics == imp_physics_tempo) then ! Thompson MP
!
! Compute effective radii for QC, QI, QS with (GF, MYNN) or without (all others) sub-grid clouds
!
! Update number concentration, consistent with sub-grid clouds (GF, MYNN) or without (all others)
do k=1,lm
do i=1,im
if ((ltaerosol .or. mraerosol) .and. qc_mp(i,k)>1.e-12 .and. nc_mp(i,k)<100.) then
nc_mp(i,k) = make_DropletNumber(qc_mp(i,k)*rho(i,k), nwfa(i,k)*rho(i,k)) * orho(i,k)
if ((ltaerosol .or. mraerosol) .and. qc_mp(i,k)>1.e-12 .and. nc_mp(i,k)<100.) then
if (imp_physics == imp_physics_thompson) then
nc_mp(i,k) = make_DropletNumber_thmpsn(qc_mp(i,k)*rho(i,k), nwfa(i,k)*rho(i,k)) * orho(i,k)
endif
if (imp_physics == imp_physics_tempo) then
nc_mp(i,k) = make_DropletNumber_tempo(qc_mp(i,k)*rho(i,k), nwfa(i,k)*rho(i,k)) * orho(i,k)
endif
endif
if (qi_mp(i,k)>1.e-12 .and. ni_mp(i,k)<100.) then
ni_mp(i,k) = make_IceNumber(qi_mp(i,k)*rho(i,k), tlyr(i,k)) * orho(i,k)
if (imp_physics == imp_physics_thompson) then
ni_mp(i,k) = make_IceNumber_thmpsn(qi_mp(i,k)*rho(i,k), tlyr(i,k)) * orho(i,k)
endif
if (imp_physics == imp_physics_tempo) then
ni_mp(i,k) = make_IceNumber_tempo(qi_mp(i,k)*rho(i,k), tlyr(i,k)) * orho(i,k)
endif
endif
end do
end do
Expand All @@ -899,19 +945,38 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
!tgs: progclduni has different limits for ice radii (10.0-150.0) than
! calc_effectRad (4.99-125.0 for WRFv3.8.1; 2.49-125.0 for WRFv4+)
! it will raise the low limit from 5 to 10, but the high limit will remain 125.
call calc_effectRad (t1d=tlyr(i,:), p1d=plyr(i,:)*100., qv1d=qv_mp(i,:), qc1d=qc_mp(i,:), &
nc1d=nc_mp(i,:), qi1d=qi_mp(i,:), ni1d=ni_mp(i,:), qs1d=qs_mp(i,:), &
re_qc1d=effrl(i,:), re_qi1d=effri(i,:), re_qs1d=effrs(i,:), kts=1, kte=lm, &
lsml=islmsk, configs=configs )
! Scale Thompson's effective radii from meter to micron
do k=1,lm
effrl(i,k) = MAX(re_qc_min, MIN(effrl(i,k), re_qc_max))*1.e6
effri(i,k) = MAX(re_qi_min, MIN(effri(i,k), re_qi_max))*1.e6
effrs(i,k) = MAX(re_qs_min, MIN(effrs(i,k), re_qs_max))*1.e6
end do
effrl(i,lmk) = re_qc_min*1.e6
effri(i,lmk) = re_qi_min*1.e6
effrs(i,lmk) = re_qs_min*1.e6
if (imp_physics == imp_physics_thompson) then
call calc_effectRad_thmpsn (tlyr(i,:), plyr(i,:)*100., qv_mp(i,:), qc_mp(i,:), &
nc_mp(i,:), qi_mp(i,:), ni_mp(i,:), qs_mp(i,:), &
effrl(i,:), effri(i,:), effrs(i,:), islmsk, 1, lm )
endif
if (imp_physics == imp_physics_tempo) then
call calc_effectRad_tempo (t1d=tlyr(i,:), p1d=plyr(i,:)*100., qv1d=qv_mp(i,:), qc1d=qc_mp(i,:), &
nc1d=nc_mp(i,:), qi1d=qi_mp(i,:), ni1d=ni_mp(i,:), qs1d=qs_mp(i,:), &
re_qc1d=effrl(i,:), re_qi1d=effri(i,:), re_qs1d=effrs(i,:), kts=1, kte=lm, &
lsml=islmsk, configs=tempo_cfg)
end if
! Scale Thompson/TEMPO's effective radii from meter to micron
if (imp_physics == imp_physics_thompson) then
do k=1,lm
effrl(i,k) = MAX(re_qc_min_thmpsn, MIN(effrl(i,k), re_qc_max_thmpsn))*1.e6
effri(i,k) = MAX(re_qi_min_thmpsn, MIN(effri(i,k), re_qi_max_thmpsn))*1.e6
effrs(i,k) = MAX(re_qs_min_thmpsn, MIN(effrs(i,k), re_qs_max_thmpsn))*1.e6
end do
effrl(i,lmk) = re_qc_min_thmpsn*1.e6
effri(i,lmk) = re_qi_min_thmpsn*1.e6
effrs(i,lmk) = re_qs_min_thmpsn*1.e6
end if
if (imp_physics == imp_physics_tempo) then
do k=1,lm
effrl(i,k) = MAX(re_qc_min_tempo, MIN(effrl(i,k), re_qc_max_tempo))*1.e6
effri(i,k) = MAX(re_qi_min_tempo, MIN(effri(i,k), re_qi_max_tempo))*1.e6
effrs(i,k) = MAX(re_qs_min_tempo, MIN(effrs(i,k), re_qs_max_tempo))*1.e6
end do
effrl(i,lmk) = re_qc_min_tempo*1.e6
effri(i,lmk) = re_qi_min_tempo*1.e6
effrs(i,lmk) = re_qs_min_tempo*1.e6
end if
end do
effrr(:,:) = 1000. ! rrain_def=1000.
! Update global arrays
Expand Down
17 changes: 16 additions & 1 deletion physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_pre.meta
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
type = scheme
relative_path = ../../
dependencies = tools/funcphys.f90,hooks/machine.F
dependencies = MP/TEMPO/tempo/module_mp_thompson_params.F90,MP/TEMPO/tempo/module_mp_thompson_utils.F90
dependencies = MP/Thompson/module_mp_thompson.F90,MP/Thompson/module_mp_thompson_make_number_concentrations.F90
dependencies = MP/TEMPO/tempo/module_mp_thompson_params.F90
dependencies = Radiation/RRTMG/radcons.f90,Radiation/radiation_aerosols.f
dependencies = Radiation/radiation_astronomy.f,Radiation/radiation_clouds.f,Radiation/radiation_gases.f
dependencies = Radiation/RRTMG/radlw_param.f,Radiation/RRTMG/radsw_param.f,Radiation/radiation_cloud_overlap.F90
Expand Down Expand Up @@ -266,6 +267,13 @@
dimensions = ()
type = ty_ozphys
intent = in
[tempo_cfg]
standard_name = configuration_for_TEMPO_microphysics
long_name = configuration information for TEMPO microphysics
units = mixed
dimensions = ()
type = ty_tempo_cfg
intent = in
[iaermdl]
standard_name = control_for_aerosol_radiation_scheme
long_name = control of aerosol scheme in radiation
Expand Down Expand Up @@ -462,6 +470,13 @@
dimensions = ()
type = integer
intent = in
[imp_physics_tempo]
standard_name = identifier_for_tempo_microphysics_scheme
long_name = choice of TEMPO microphysics scheme
units = flag
dimensions = ()
type = integer
intent = in
[imp_physics_thompson]
standard_name = identifier_for_thompson_microphysics_scheme
long_name = choice of Thompson microphysics scheme
Expand Down
Loading

0 comments on commit a5981bc

Please sign in to comment.