diff --git a/.gitmodules b/.gitmodules
index 22c723ac1..7f2098b7c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -8,8 +8,11 @@
branch = main
[submodule "ccpp/physics"]
path = ccpp/physics
- url = https://github.com/ufs-community/ccpp-physics
- branch = ufs/dev
+ #url = https://github.com/ufs-community/ccpp-physics
+ #branch = ufs/dev
+ url = https://github.com/RuiyuSun/ccpp-physics
+ branch = feature_gfdlmpv3
+
[submodule "upp"]
path = upp
url = https://github.com/NOAA-EMC/UPP
diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py
index 1ed2c6245..2af5d380b 100755
--- a/ccpp/config/ccpp_prebuild_config.py
+++ b/ccpp/config/ccpp_prebuild_config.py
@@ -153,8 +153,10 @@
'physics/physics/photochem/h2ophys.f',
'physics/physics/photochem/module_ozphys.F90',
'physics/physics/MP/Ferrier_Aligo/mp_fer_hires.F90',
- 'physics/physics/MP/GFDL/gfdl_cloud_microphys.F90',
- 'physics/physics/MP/GFDL/fv_sat_adj.F90',
+ 'physics/physics/MP/GFDL_2019_v1/gfdl_cloud_microphys.F90',
+ 'physics/physics/MP/GFDL_2019_v1/fv_sat_adj.F90',
+ 'physics/physics/MP/GFDL_2022_v3/gfdl_cld_mp_v3.F90',
+ 'physics/physics/MP/GFDL_2022_v3/fv_sat_adj_v3.F90',
'physics/physics/MP/Morrison_Gettelman/m_micro.F90',
'physics/physics/MP/Morrison_Gettelman/m_micro_pre.F90',
'physics/physics/MP/Morrison_Gettelman/m_micro_post.F90',
diff --git a/ccpp/data/CCPP_typedefs.F90 b/ccpp/data/CCPP_typedefs.F90
index 7d9351337..09159bd5f 100644
--- a/ccpp/data/CCPP_typedefs.F90
+++ b/ccpp/data/CCPP_typedefs.F90
@@ -829,8 +829,10 @@ subroutine gfs_interstitial_create (Interstitial, IM, Model)
end if
!
! Allocate arrays that are conditional on physics choices
- if (Model%imp_physics == Model%imp_physics_gfdl .or. Model%imp_physics == Model%imp_physics_thompson &
- .or. Model%imp_physics == Model%imp_physics_nssl &
+ if (Model%imp_physics == Model%imp_physics_gfdl &
+ .or. Model%imp_physics == Model%imp_physics_gfdl_v3 &
+ .or. Model%imp_physics == Model%imp_physics_thompson &
+ .or. Model%imp_physics == Model%imp_physics_nssl &
) then
allocate (Interstitial%graupelmp (IM))
allocate (Interstitial%icemp (IM))
@@ -988,7 +990,8 @@ subroutine gfs_interstitial_setup_tracers(Interstitial, Model)
Interstitial%ntcwx = 2
Interstitial%ntiwx = 3
Interstitial%ntrwx = 4
- elseif (Model%imp_physics == Model%imp_physics_gfdl) then
+ elseif (Model%imp_physics == Model%imp_physics_gfdl &
+ .or. Model%imp_physics == Model%imp_physics_gfdl_v3 ) then
Interstitial%ntcwx = 2
Interstitial%ntiwx = 3
Interstitial%ntrwx = 4
@@ -1016,7 +1019,8 @@ subroutine gfs_interstitial_setup_tracers(Interstitial, Model)
else
Interstitial%nvdiff = 10
endif
- elseif (Model%imp_physics == Model%imp_physics_gfdl) then
+ elseif (Model%imp_physics == Model%imp_physics_gfdl &
+ .or. Model%imp_physics == Model%imp_physics_gfdl_v3) then
Interstitial%nvdiff = 7
elseif (Model%imp_physics == Model%imp_physics_thompson) then
if (Model%ltaerosol) then
@@ -1438,8 +1442,10 @@ subroutine gfs_interstitial_phys_reset (Interstitial, Model)
end if
!
! Reset fields that are conditional on physics choices
- if (Model%imp_physics == Model%imp_physics_gfdl .or. Model%imp_physics == Model%imp_physics_thompson &
- .or. Model%imp_physics == Model%imp_physics_nssl &
+ if (Model%imp_physics == Model%imp_physics_gfdl &
+ .or. Model%imp_physics == Model%imp_physics_gfdl_v3 &
+ .or. Model%imp_physics == Model%imp_physics_thompson &
+ .or. Model%imp_physics == Model%imp_physics_nssl &
) then
Interstitial%graupelmp = clear_val
Interstitial%icemp = clear_val
diff --git a/ccpp/data/CCPP_typedefs.meta b/ccpp/data/CCPP_typedefs.meta
index a2d1105df..8f6e1a944 100644
--- a/ccpp/data/CCPP_typedefs.meta
+++ b/ccpp/data/CCPP_typedefs.meta
@@ -1127,7 +1127,7 @@
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
- active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
+ active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_gfdl_microphysics_v3_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
[gwdcu]
standard_name = tendency_of_x_wind_due_to_convective_gravity_wave_drag
long_name = zonal wind tendency due to convective gravity wave drag
@@ -1219,7 +1219,7 @@
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
- active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
+ active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_gfdl_microphysics_v3_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
[dry]
standard_name = flag_nonzero_land_surface_fraction
long_name = flag indicating presence of some land surface area fraction
@@ -1726,7 +1726,7 @@
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
- active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
+ active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_gfdl_microphysics_v3_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
[rainp]
standard_name = tendency_of_rain_water_mixing_ratio_due_to_microphysics
long_name = tendency of rain water mixing ratio due to microphysics
@@ -1982,7 +1982,7 @@
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
- active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
+ active = (control_for_microphysics_scheme == identifier_for_gfdl_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_gfdl_microphysics_v3_scheme .or. control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .or. control_for_microphysics_scheme == identifier_for_nssl_microphysics_scheme)
[snowmt]
standard_name = surface_snow_melt
long_name = snow melt during timestep
diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90
index 5a8368a40..ed36990a1 100644
--- a/ccpp/data/GFS_typedefs.F90
+++ b/ccpp/data/GFS_typedefs.F90
@@ -901,6 +901,7 @@ module GFS_typedefs
!--- new microphysical switch
integer :: imp_physics !< choice of microphysics scheme
integer :: imp_physics_gfdl = 11 !< choice of GFDL microphysics scheme
+ integer :: imp_physics_gfdl_v3 = 13 !< choice of GFDL microphysics version 3 scheme
integer :: imp_physics_thompson = 8 !< choice of Thompson microphysics scheme
integer :: imp_physics_wsm6 = 6 !< choice of WSMG microphysics scheme
integer :: imp_physics_zhao_carr = 99 !< choice of Zhao-Carr microphysics scheme
@@ -4691,7 +4692,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
Model%use_ufo = use_ufo
Model%exticeden = exticeden
if (Model%exticeden .and. &
- (Model%imp_physics /= Model%imp_physics_gfdl .and. Model%imp_physics /= Model%imp_physics_thompson .and. &
+ (Model%imp_physics /= Model%imp_physics_gfdl .and. &
+ Model%imp_physics /= Model%imp_physics_gfdl_v3 .and. &
+ Model%imp_physics /= Model%imp_physics_thompson .and. &
Model%imp_physics /= Model%imp_physics_nssl )) then
!see GFS_MP_generic_post.F90; exticeden is only compatible with GFDL,
!Thompson, or NSSL MP
@@ -6038,7 +6041,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
' mg_alf=', Model%mg_alf, ' mg_qcmin=', Model%mg_qcmin, &
' mg_do_ice_gmao=', Model%mg_do_ice_gmao, ' mg_do_liq_liu=', Model%mg_do_liq_liu
- elseif (Model%imp_physics == Model%imp_physics_gfdl) then !GFDL microphysics
+ elseif (Model%imp_physics == Model%imp_physics_gfdl .or. &
+ Model%imp_physics == Model%imp_physics_gfdl_v3) then !GFDL microphysics
Model%npdf3d = 0
if(Model%effr_in) then
Model%num_p3d = 5
@@ -6567,7 +6571,13 @@ subroutine control_print(Model)
print *, ' '
endif
if (Model%imp_physics == Model%imp_physics_gfdl) then
- print *, ' GFDL microphysical parameters'
+ print *, ' GFDL microphysical parameters v1'
+ print *, ' GFDL MP radiation inter: ', Model%lgfdlmprad
+ print *, ' lrefres : ', Model%lrefres
+ print *, ' '
+ endif
+ if (Model%imp_physics == Model%imp_physics_gfdl_v3) then
+ print *, ' GFDL microphysical parameters v3'
print *, ' GFDL MP radiation inter: ', Model%lgfdlmprad
print *, ' lrefres : ', Model%lrefres
print *, ' '
diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta
index ebaa9af7f..d0178b0b4 100644
--- a/ccpp/data/GFS_typedefs.meta
+++ b/ccpp/data/GFS_typedefs.meta
@@ -4074,6 +4074,12 @@
units = flag
dimensions = ()
type = integer
+[imp_physics_gfdl_v3]
+ standard_name = identifier_for_gfdl_microphysics_v3_scheme
+ long_name = choice of GFDL microphysics v3 scheme
+ units = flag
+ dimensions = ()
+ type = integer
[imp_physics_thompson]
standard_name = identifier_for_thompson_microphysics_scheme
long_name = choice of Thompson microphysics scheme
@@ -9867,7 +9873,7 @@
dependencies = hooks/machine.F,hooks/physcons.F90
dependencies = Radiation/RRTMG/radlw_param.f,Radiation/RRTMG/radsw_param.f
dependencies = photochem/h2o_def.f,photochem/module_ozphys.F90
- dependencies = MP/GFDL/GFDL_parse_tracers.F90
+ dependencies = MP/GFDL_parse_tracers.F90
[ccpp-arg-table]
name = GFS_typedefs
diff --git a/ccpp/suites/suite_FV3_GFS_v16_gfdlmpv3.xml b/ccpp/suites/suite_FV3_GFS_v16_gfdlmpv3.xml
new file mode 100644
index 000000000..c3d8c3b23
--- /dev/null
+++ b/ccpp/suites/suite_FV3_GFS_v16_gfdlmpv3.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+ fv_sat_adj_v3
+
+
+
+
+ GFS_time_vary_pre
+ GFS_rrtmg_setup
+ GFS_rad_time_vary
+ GFS_phys_time_vary
+
+
+
+
+ GFS_suite_interstitial_rad_reset
+ GFS_rrtmg_pre
+ GFS_radiation_surface
+ rad_sw_pre
+ rrtmg_sw
+ rrtmg_sw_post
+ rrtmg_lw
+ rrtmg_lw_post
+ GFS_rrtmg_post
+
+
+
+
+ GFS_suite_interstitial_phys_reset
+ GFS_suite_stateout_reset
+ get_prs_fv3
+ GFS_suite_interstitial_1
+ GFS_surface_generic_pre
+ GFS_surface_composites_pre
+ dcyc2t3
+ GFS_surface_composites_inter
+ GFS_suite_interstitial_2
+
+
+
+ sfc_diff
+ GFS_surface_loop_control_part1
+ sfc_nst_pre
+ sfc_nst
+ sfc_nst_post
+ lsm_noah
+ sfc_sice
+ GFS_surface_loop_control_part2
+
+
+
+ GFS_surface_composites_post
+ sfc_diag
+ sfc_diag_post
+ GFS_surface_generic_post
+ GFS_PBL_generic_pre
+ satmedmfvdifq
+ GFS_PBL_generic_post
+ GFS_GWD_generic_pre
+ cires_ugwp
+ cires_ugwp_post
+ GFS_GWD_generic_post
+ GFS_suite_stateout_update
+ h2ophys
+ get_phi_fv3
+ GFS_suite_interstitial_3
+ GFS_DCNV_generic_pre
+ samfdeepcnv
+ GFS_DCNV_generic_post
+ GFS_SCNV_generic_pre
+ samfshalcnv
+ GFS_SCNV_generic_post
+ GFS_suite_interstitial_4
+ cnvc90
+ GFS_MP_generic_pre
+ gfdl_cld_mp_v3
+ GFS_MP_generic_post
+ maximum_hourly_diagnostics
+ GFS_physics_post
+
+
+
+
+ GFS_stochastics
+
+
+
+
diff --git a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmpv3_tedmf.xml b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmpv3_tedmf.xml
new file mode 100644
index 000000000..a1c57f46c
--- /dev/null
+++ b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmpv3_tedmf.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+ fv_sat_adj_v3
+
+
+
+
+ GFS_time_vary_pre
+ GFS_rrtmg_setup
+ GFS_rad_time_vary
+ GFS_phys_time_vary
+
+
+
+
+ GFS_suite_interstitial_rad_reset
+ GFS_rrtmg_pre
+ GFS_radiation_surface
+ rad_sw_pre
+ rrtmg_sw
+ rrtmg_sw_post
+ rrtmg_lw
+ rrtmg_lw_post
+ GFS_rrtmg_post
+
+
+
+
+ GFS_suite_interstitial_phys_reset
+ GFS_suite_stateout_reset
+ get_prs_fv3
+ GFS_suite_interstitial_1
+ GFS_surface_generic_pre
+ GFS_surface_composites_pre
+ dcyc2t3
+ GFS_surface_composites_inter
+ GFS_suite_interstitial_2
+
+
+
+ sfc_diff
+ GFS_surface_loop_control_part1
+ sfc_nst_pre
+ sfc_nst
+ sfc_nst_post
+ lsm_noah
+ sfc_sice
+ GFS_surface_loop_control_part2
+
+
+
+ GFS_surface_composites_post
+ sfc_diag
+ sfc_diag_post
+ GFS_surface_generic_post
+ GFS_PBL_generic_pre
+ satmedmfvdifq
+ GFS_PBL_generic_post
+ GFS_GWD_generic_pre
+ unified_ugwp
+ unified_ugwp_post
+ GFS_GWD_generic_post
+ GFS_suite_stateout_update
+ h2ophys
+ get_phi_fv3
+ GFS_suite_interstitial_3
+ GFS_DCNV_generic_pre
+ samfdeepcnv
+ GFS_DCNV_generic_post
+ GFS_SCNV_generic_pre
+ samfshalcnv
+ GFS_SCNV_generic_post
+ GFS_suite_interstitial_4
+ cnvc90
+ GFS_MP_generic_pre
+ gfdl_cld_mp_v3
+ GFS_MP_generic_post
+ maximum_hourly_diagnostics
+ GFS_physics_post
+
+
+
+
+ GFS_stochastics
+
+
+
+