-
Notifications
You must be signed in to change notification settings - Fork 54
Tempo Implementation #250
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tempo Implementation #250
Changes from 10 commits
fb11da5
a42db1d
dcda3f9
a2fc440
d8d35a6
f46ecf2
de7ebe9
e1b64e4
d568900
857cd40
b8ba10f
7e47fa8
80687df
cf80fd9
279f1b1
d9d9bf4
90d7d54
7c95666
b84dc41
6e1a2ba
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,7 +26,8 @@ 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_thompson, imp_physics_gfdl, imp_physics_zhao_carr, & | ||
| imp_physics_thompson, imp_physics_tempo, 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, & | ||
| iovr_dcorr, iovr_exp, iovr_exprand, idcor, idcor_con, idcor_hogan, & | ||
|
|
@@ -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 | ||
|
|
@@ -72,15 +73,37 @@ 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, only: calc_effectRad, & | ||
| Nt_c_l, Nt_c_o, & | ||
| re_qc_min, re_qc_max, & | ||
| re_qi_min, re_qi_max, & | ||
| re_qs_min, re_qs_max | ||
| use module_mp_thompson, only: calc_effectRad_thmpsn => calc_effectRad, & | ||
| Nt_c_l_thmpsn => Nt_c_l, & | ||
| Nt_c_o_thmpsn => Nt_c_o, & | ||
| 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, & | ||
| make_DropletNumber, & | ||
| make_RainNumber | ||
| make_IceNumber_thmpsn => make_IceNumber, & | ||
| make_DropletNumber_thmpsn => make_DropletNumber, & | ||
| make_RainNumber_thmpsn => make_RainNumber | ||
|
|
||
| use module_mp_tempo_params, only: & | ||
| ty_tempo_cfg, & | ||
| 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_tempo_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 | ||
|
|
@@ -98,6 +121,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, & | ||
|
|
@@ -235,6 +259,9 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& | |
| real (kind=kind_phys), dimension(lm) :: cldfra1d, qv1d, & | ||
| & 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 | ||
|
|
||
|
|
@@ -276,7 +303,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 | ||
|
|
@@ -737,7 +764,8 @@ 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) | ||
|
|
@@ -752,7 +780,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) | ||
|
|
@@ -763,9 +791,17 @@ 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 | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same comment as https://github.com/ufs-community/ccpp-physics/pull/245/files#r1907698791. If performance isn't a concern right now, then you can disregard.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @grantfirl Let's disregard for now. |
||
| nc_mp (i,k) = Nt_c_l_thmpsn*orho(i,k) | ||
| else | ||
| 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) | ||
| else | ||
| nc_mp (i,k) = Nt_c_o_tempo*orho(i,k) | ||
| endif | ||
| endif | ||
| ni_mp (i,k) = tracer1(i,k,ntinc)/(1.-qvs) | ||
| enddo | ||
|
|
@@ -878,18 +914,26 @@ 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) | ||
| else | ||
| 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) | ||
| else | ||
| 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 | ||
|
|
@@ -900,18 +944,36 @@ 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 (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 ) | ||
| ! 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 ) | ||
| ! Scale Thompson's effective radii from meter to micron | ||
| 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 | ||
| else | ||
| 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) | ||
| ! Scale Thompson's effective radii from meter to micron | ||
| 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 | ||
| endif | ||
|
|
||
| end do | ||
| effrr(:,:) = 1000. ! rrain_def=1000. | ||
| ! Update global arrays | ||
|
|
@@ -976,7 +1038,8 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& | |
| & deltaq, sup, dcorr_con, me, icloud, kdt, & | ||
| & ntrac, ntcw, ntiw, ntrw, ntsw, ntgl, ntclamt, & | ||
| & imp_physics, imp_physics_nssl, imp_physics_fer_hires, & | ||
| & imp_physics_gfdl, imp_physics_thompson, imp_physics_wsm6, & | ||
| & imp_physics_gfdl, imp_physics_thompson, & | ||
| & imp_physics_wsm6, imp_physics_tempo, & | ||
| & imp_physics_zhao_carr, imp_physics_zhao_carr_pdf, & | ||
| & imp_physics_mg, iovr, iovr_rand, iovr_maxrand, iovr_max, & | ||
| & iovr_dcorr, iovr_exp, iovr_exprand, idcor, idcor_con, & | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I noticed that the TEMPO submodule pointer isn't pointing to the latest commit of the main branch. Is this intentional?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@grantfirl , Yes TEMPO has moved forward with MPAS development since the PR to ccpp.