From 8b5b8c6945ca005858c83dfe626b640d98a8de59 Mon Sep 17 00:00:00 2001 From: Irena Ivanova Date: Tue, 11 Nov 2025 13:28:15 -0500 Subject: [PATCH 01/34] Add canopy mask and 3-layer canopy diffusivities --- ccpp/data/GFS_typedefs.F90 | 47 +++++++++++++++++++--------- ccpp/data/GFS_typedefs.meta | 26 +++++++++++++++ ccpp/suites/suite_FV3_GFS_v16.xml | 1 + ccpp/suites/suite_FV3_GFS_v17_p8.xml | 1 + 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 9a3225b6e..1eb5f5586 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -40,7 +40,7 @@ module GFS_typedefs integer, parameter :: dfi_radar_max_intervals = 4 !< Number of radar-derived temperature tendency and/or convection suppression intervals. Do not change. real(kind=kind_phys), parameter :: limit_unspecified = 1e12 !< special constant for "namelist value was not provided" in radar-derived temperature tendency limit range - + integer, parameter :: physics_no_tracer = -99 !> \section arg_table_GFS_typedefs @@ -320,6 +320,9 @@ module GFS_typedefs real (kind=kind_phys), pointer :: hice (:) => null() !< sea ice thickness real (kind=kind_phys), pointer :: weasd (:) => null() !< water equiv of accumulated snow depth (kg/m**2) !< over land and sea ice +! IVAI: GFS_sfcprop% + real (kind=kind_phys), pointer :: canmsk (:) => null() !< canopy/no-canopy mask array (no-canopy:0,canopy:1) +! IVAI real (kind=kind_phys), pointer :: canopy (:) => null() !< canopy water real (kind=kind_phys), pointer :: ffmm (:) => null() !< fm parameter from PBL scheme real (kind=kind_phys), pointer :: ffhh (:) => null() !< fh parameter from PBL scheme @@ -782,7 +785,7 @@ module GFS_typedefs integer :: dycore_active !< Choice of dynamical core integer :: dycore_fv3 = 1 !< Choice of FV3 dynamical core integer :: dycore_mpas = 2 !< Choice of MPAS dynamical core - + !--- coupling parameters logical :: cplflx !< default no cplflx collection logical :: cplice !< default no cplice collection (used together with cplflx) @@ -1057,8 +1060,8 @@ module GFS_typedefs real(kind=kind_phys) :: ssati_min !< minimum supersaturation over ice threshold for deposition nucleation real(kind=kind_phys) :: Nt_i_max !< maximum threshold number concentration of cloud ice water crystals in air real(kind=kind_phys) :: rr_min !< multiplicative tuning parameter for microphysical sedimentation minimum threshold - - + + !--- GFDL microphysical paramters logical :: lgfdlmprad !< flag for GFDL mp scheme and radiation consistency @@ -1279,7 +1282,7 @@ module GFS_typedefs real(kind=kind_phys) :: psauras(2) !< [in] auto conversion coeff from ice to snow in ras real(kind=kind_phys) :: prauras(2) !< [in] auto conversion coeff from cloud to rain in ras real(kind=kind_phys) :: wminras(2) !< [in] water and ice minimum threshold for ras - + integer :: seed0 !< random seed for radiation real(kind=kind_phys) :: rbcr !< Critical Richardson Number in the PBL scheme @@ -2119,6 +2122,12 @@ module GFS_typedefs !--- Extra PBL diagnostics real (kind=kind_phys), pointer :: dkt(:,:) => null() !< Eddy diffusitivity for heat real (kind=kind_phys), pointer :: dku(:,:) => null() !< Eddy diffusitivity for momentum +!IVAI +!3-LAYER CANOPY + !--- Extra PBL diagnostics in canopy + real (kind=kind_phys), pointer :: dkt_can(:,:) => null() !< Eddy diffusitivity for heat + real (kind=kind_phys), pointer :: dku_can(:,:) => null() !< Eddy diffusitivity for momentum +!IVAI ! !---vay-2018 UGWP-diagnostics instantaneous @@ -2583,6 +2592,11 @@ subroutine sfcprop_create (Sfcprop, Model) allocate (Sfcprop%sfalb_ice (IM)) allocate (Sfcprop%sfalb_lnd_bck (IM)) endif +!IVAI + if (Model%do_canopy) then + allocate (Sfcprop%canmsk (IM)) + endif +!IVAI allocate (Sfcprop%canopy (IM)) allocate (Sfcprop%ffmm (IM)) allocate (Sfcprop%ffhh (IM)) @@ -2608,6 +2622,11 @@ subroutine sfcprop_create (Sfcprop, Model) Sfcprop%sfalb_ice = clear_val Sfcprop%sfalb_lnd_bck = clear_val endif +!IVAI + if (Model%do_canopy) then + Sfcprop%canmsk = clear_val + endif +!IVAI Sfcprop%canopy = clear_val Sfcprop%ffmm = clear_val Sfcprop%ffhh = clear_val @@ -3383,7 +3402,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & communicator, ntasks, nthreads, & tile_num, isc, jsc, nx, ny, cnx, & cny, gnx, gny, ak, bk, hydrostatic) - + !--- modules use physcons, only: con_rerth, con_pi use mersenne_twister, only: random_setseed, random_number @@ -3666,7 +3685,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & real(kind=kind_phys) :: ssati_min = 0.15 !< minimum supersaturation over ice threshold for deposition nucleation real(kind=kind_phys) :: Nt_i_max = 4999.e3 !< maximum threshold number concentration of cloud ice water crystals in air real(kind=kind_phys) :: rr_min = 1000.0 !< multiplicative tuning parameter for microphysical sedimentation minimum threshold - + !--- GFDL microphysical parameters logical :: lgfdlmprad = .false. !< flag for GFDLMP radiation interaction @@ -4373,7 +4392,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & stop endif endif - + ! dtend selection: default is to match all variables: dtend_select(1)='*' do ipat=2,pat_count @@ -8572,22 +8591,22 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) endif end subroutine diag_phys_zero - + function get_physics_tracer_index (name, Model) !This function uses the FMS version of get_tracer_index, but changes the missing tracer index to the value used throughout the physics code, rather than the one used in FMS use tracer_manager_mod, only: get_tracer_index, NO_TRACER use field_manager_mod, only: MODEL_ATMOS - + character(len=*), intent(in) :: name type(GFS_control_type), intent(in) :: Model - + !--- local variables integer :: get_physics_tracer_index - + get_physics_tracer_index = get_tracer_index(MODEL_ATMOS, name, verbose = (Model%me == Model%master) .and. Model%debug) - + if (get_physics_tracer_index == NO_TRACER) get_physics_tracer_index = physics_no_tracer - + end function get_physics_tracer_index end module GFS_typedefs diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 5e6293a5f..230345354 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -1267,6 +1267,16 @@ dimensions = (horizontal_dimension) type = real kind = kind_phys +### IVAI GFS_sfcprop% +[canmsk] + standard_name = forest_canopy_mask + long_name = contiguous forest canopy mask for 3-layer canopy model + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +###IVAI [canopy] standard_name = canopy_water_amount long_name = canopy water amount @@ -9716,6 +9726,22 @@ dimensions = (horizontal_dimension,vertical_layer_dimension) type = real kind = kind_phys +###IVAI +[dkt_can] + standard_name = atmosphere_heat_diffusivity_in_canopy + long_name = atmospheric heat diffusivity in canopy + units = m2 s-1 + dimensions = (horizontal_dimension,vertical_layer_dimension) + type = real + kind = kind_phys +[dku_can] + standard_name = atmosphere_momentum_diffusivity_in_canopy + long_name = atmospheric momentum diffusivity in canopy + units = m2 s-1 + dimensions = (horizontal_dimension,vertical_layer_dimension) + type = real + kind = kind_phys +###IVAI [cldfra] standard_name = instantaneous_3d_cloud_fraction long_name = instantaneous 3D cloud fraction for all MPs diff --git a/ccpp/suites/suite_FV3_GFS_v16.xml b/ccpp/suites/suite_FV3_GFS_v16.xml index 5fba28575..1d0be8862 100644 --- a/ccpp/suites/suite_FV3_GFS_v16.xml +++ b/ccpp/suites/suite_FV3_GFS_v16.xml @@ -57,6 +57,7 @@ GFS_surface_generic_post GFS_PBL_generic_pre satmedmfvdifq + canopy_satmedmfvdifq GFS_PBL_generic_post GFS_GWD_generic_pre cires_ugwp diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8.xml b/ccpp/suites/suite_FV3_GFS_v17_p8.xml index 05b9c520b..a5fbd0e25 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8.xml @@ -53,6 +53,7 @@ GFS_surface_generic_post GFS_PBL_generic_pre satmedmfvdifq + canopy_satmedmfvdifq GFS_PBL_generic_post GFS_GWD_generic_pre unified_ugwp From 526a186458bbbdd468fc42764956eedf9d12cbf1 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Wed, 12 Nov 2025 11:04:27 -0500 Subject: [PATCH 02/34] Updating ccpp submodule for aqm_canopy_vdf. --- .gitmodules | 4 ++-- ccpp/physics | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index a773677e6..3eebd8349 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,8 +8,8 @@ branch = main [submodule "ccpp/physics"] path = ccpp/physics - url = https://github.com/ufs-community/ccpp-physics - branch = ufs/dev + url = https://github.com/noaa-oar-arl/ccpp-physics + branch = feature/aqm_canopy_vdf [submodule "upp"] path = upp url = https://github.com/NOAA-EMC/UPP diff --git a/ccpp/physics b/ccpp/physics index a78d06b4d..7cb604334 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit a78d06b4d54e2794a85ca3309e056ee67d62ed84 +Subproject commit 7cb604334931072cc82422f7174953f6b1281d5a From 4b3746029084384978f738ee85341fac9f16e1b4 Mon Sep 17 00:00:00 2001 From: iri01 Date: Wed, 12 Nov 2025 12:03:17 -0500 Subject: [PATCH 03/34] Add explicit 3-layer canopy driver routine for use in TKE-EDMF PBL over canopy --- ccpp/config/ccpp_prebuild_config_fv3.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ccpp/config/ccpp_prebuild_config_fv3.py b/ccpp/config/ccpp_prebuild_config_fv3.py index 968c48a77..e64a4b7be 100755 --- a/ccpp/config/ccpp_prebuild_config_fv3.py +++ b/ccpp/config/ccpp_prebuild_config_fv3.py @@ -189,6 +189,7 @@ 'physics/physics/PBL/MYNN_EDMF/mynnedmf_wrapper.F90', 'physics/physics/PBL/SATMEDMF/satmedmfvdif.F', 'physics/physics/PBL/SATMEDMF/satmedmfvdifq.F', + 'physics/physics/PBL/SATMEDMF/canopy_satmedmfvdifq.F', 'physics/physics/PBL/YSU/ysuvdif.F90', 'physics/physics/PBL/saYSU/shinhongvdif.F90', 'physics/physics/Radiation/RRTMG/radsw_main.F90', From db2f1184d9994ce9d5d96253d1806ac6a7f78b8e Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Wed, 12 Nov 2025 12:55:22 -0500 Subject: [PATCH 04/34] Updating ccpp submodule for vdf changes for xkz. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 7cb604334..a78d06b4d 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 7cb604334931072cc82422f7174953f6b1281d5a +Subproject commit a78d06b4d54e2794a85ca3309e056ee67d62ed84 From 6285fe81ed1abdd69439a60042745cfab836c893 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Wed, 12 Nov 2025 13:07:20 -0500 Subject: [PATCH 05/34] Fixing ccpp submodule back to latest canopy vdf. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index a78d06b4d..a5781fe1d 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit a78d06b4d54e2794a85ca3309e056ee67d62ed84 +Subproject commit a5781fe1da229487aa839fa8e362cf8a7438a92b From 2d341437f6b0e408059e266dc06718181688a9c2 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Wed, 12 Nov 2025 14:47:18 -0500 Subject: [PATCH 06/34] Updated ccpp submodule for typo in xkzm_h name vdf. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index a5781fe1d..cb1a12039 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit a5781fe1da229487aa839fa8e362cf8a7438a92b +Subproject commit cb1a120399f5909d64275e24b9d2ac9e53e674ea From 09b7fbbbb6756a58454a83efdc7b049e4847918e Mon Sep 17 00:00:00 2001 From: iri01 Date: Wed, 12 Nov 2025 22:43:17 -0500 Subject: [PATCH 07/34] Allocate and zero canopy diffusivities --- ccpp/data/GFS_typedefs.F90 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 9e27bc263..006e3f638 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -8181,6 +8181,11 @@ subroutine diag_create (Diag, Model) !--- New PBL Diagnostics allocate (Diag%dkt(IM,Model%levs)) allocate (Diag%dku(IM,Model%levs)) +!IVAI + !--- New PBL Diagnostics in 3-layer canopy + allocate (Diag%dkt_can(IM,Model%levs)) + allocate (Diag%dku_can(IM,Model%levs)) +!IVAI !-- New max hourly diag. allocate (Diag%refdmax(IM)) @@ -8559,6 +8564,11 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) ! Extra PBL diagnostics Diag%dkt = zero Diag%dku = zero +!IVAI +! Extra PBL diagnostics in 3-layer canopy + Diag%dkt_can = zero + Diag%dku_can = zero +!IVAI ! max hourly diagnostics Diag%refl_10cm = -35. From f83d6e2de2b31ab6769d47f110262e159b5f933e Mon Sep 17 00:00:00 2001 From: iri01 Date: Thu, 20 Nov 2025 13:07:43 -0500 Subject: [PATCH 08/34] Add tracer index for NO2, NO and O3 chemical tracers. Rename canopy driver routine. --- ccpp/config/ccpp_prebuild_config_fv3.py | 2 +- ccpp/data/GFS_typedefs.F90 | 54 ++++++++++++++++++++++++- ccpp/data/GFS_typedefs.meta | 23 +++++++++++ ccpp/suites/suite_FV3_GFS_v16.xml | 2 +- ccpp/suites/suite_FV3_GFS_v17_p8.xml | 2 +- 5 files changed, 79 insertions(+), 4 deletions(-) diff --git a/ccpp/config/ccpp_prebuild_config_fv3.py b/ccpp/config/ccpp_prebuild_config_fv3.py index e64a4b7be..42343dcae 100755 --- a/ccpp/config/ccpp_prebuild_config_fv3.py +++ b/ccpp/config/ccpp_prebuild_config_fv3.py @@ -189,7 +189,7 @@ 'physics/physics/PBL/MYNN_EDMF/mynnedmf_wrapper.F90', 'physics/physics/PBL/SATMEDMF/satmedmfvdif.F', 'physics/physics/PBL/SATMEDMF/satmedmfvdifq.F', - 'physics/physics/PBL/SATMEDMF/canopy_satmedmfvdifq.F', + 'physics/physics/PBL/SATMEDMF/canopy_driver.F', 'physics/physics/PBL/YSU/ysuvdif.F90', 'physics/physics/PBL/saYSU/shinhongvdif.F90', 'physics/physics/Radiation/RRTMG/radsw_main.F90', diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 006e3f638..4333ed538 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -1545,6 +1545,11 @@ module GFS_typedefs integer :: nchem !< number of prognostic chemical species (vertically mixied) integer :: ndvel !< number of prognostic chemical species (which are deposited, usually =nchem) integer :: ntchm !< number of prognostic chemical tracers (advected) +!IVAI: "cplaqm" tracer + integer :: nto3 !< tracer index for Ozone chemical species CMAQ + integer :: ntno !< tracer index for NO chemical species CMAQ + integer :: ntno2 !< tracer index for NO2 chemical species CMAQ +!IVAI integer :: ntchs !< tracer index for first prognostic chemical tracer integer :: ntche !< tracer index for last prognostic chemical tracer integer :: ntdu1 !< tracer index for dust bin1 @@ -5506,6 +5511,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & Model%dtidx = physics_no_tracer if(Model%ntchm>0) then +!IVAI + Model%ntno2 = get_physics_tracer_index('no2', Model) ! ntno2=9 (index 8 is "no2" in PBL scheme) + Model%ntno = get_physics_tracer_index('no', Model) ! ntno =10 (index 9 is "no" in PBL scheme) + Model%nto3 = get_physics_tracer_index('o3', Model) ! nto3 =11 (index 10 is "o3" in PBL scheme) +!IVAI Model%ntdu1 = get_physics_tracer_index('dust1', Model) Model%ntdu2 = get_physics_tracer_index('dust2', Model) Model%ntdu3 = get_physics_tracer_index('dust3', Model) @@ -5580,23 +5590,46 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & endif ! More specific chemical tracer names: +! IVAI: NB. ntchs is 1st chemical tracer (not so2 tracer) call label_dtend_tracer(Model,100+Model%ntchs,'so2','sulfur dioxide concentration','kg kg-1 s-1') + if(Model%ntchm>0) then ! Need better descriptions of these. call label_dtend_tracer(Model,100+Model%ntchm+Model%ntchs-1,'pp10','pp10 concentration','kg kg-1 s-1') itrac=get_physics_tracer_index('DMS', Model) if(itrac>0) then +! print*,'Index of DMS: ntdms = ', itrac call label_dtend_tracer(Model,100+itrac,'DMS','DMS concentration','kg kg-1 s-1') endif + itrac=get_physics_tracer_index('msa', Model) if(itrac>0) then +! print*,'Index of MSA: ntmsa = ', itrac call label_dtend_tracer(Model,100+itrac,'msa','msa concentration','kg kg-1 s-1') endif +!IVAI + itrac=get_physics_tracer_index('o3', Model) + if(itrac>0) then +! print*,'Index of O3: nto3 = ', itrac ! nto3 = 11 + call label_dtend_tracer(Model,100+itrac, 'o3_cpl', 'cplaqm ozone concentration','kg kg-1 s-1') + endif + + itrac=get_physics_tracer_index('no2', Model) + if(itrac>0) then +! print*,'Index of NO2: ntno2 = ', itrac ! ntno2 = 9 + call label_dtend_tracer(Model,100+itrac, 'no2_cpl', 'cplaqm nitrogen dioxide concentration','kg kg-1 s-1') + endif + + itrac=get_physics_tracer_index('no', Model) + if(itrac>0) then +! print*,'Index of NO: ntno = ', itrac ! ntno = 10 + call label_dtend_tracer(Model,100+itrac, 'no_cpl', 'cplaqm nitrogen monoxide concentration','kg kg-1 s-1') + endif +!IVAI endif endif - call label_dtend_tracer(Model,Model%index_of_temperature,'temp','temperature','K s-1') call label_dtend_tracer(Model,Model%index_of_x_wind,'u','x wind','m s-2') call label_dtend_tracer(Model,Model%index_of_y_wind,'v','y wind','m s-2') @@ -5629,6 +5662,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & call label_dtend_tracer(Model,100+Model%ntia,'ice_aero','number concentration of ice-friendly aerosols','kg-1 s-1') call label_dtend_tracer(Model,100+Model%nto,'o_ion','oxygen ion concentration','kg kg-1 s-1') call label_dtend_tracer(Model,100+Model%nto2,'o2','oxygen concentration','kg kg-1 s-1') + call label_dtend_cause(Model,Model%index_of_process_pbl,'pbl','tendency due to PBL') call label_dtend_cause(Model,Model%index_of_process_dcnv,'deepcnv','tendency due to deep convection') call label_dtend_cause(Model,Model%index_of_process_scnv,'shalcnv','tendency due to shallow convection') @@ -5711,6 +5745,12 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & enddo endif +!IVAI: NB. In PBL scheme chemical tracers indexes are offset by 1 + call fill_dtidx(Model,dtend_select,100+Model%ntno2,Model%index_of_process_pbl,have_pbl) ! ntno2= 9 (index 8 is "no2" in PBL scheme) + call fill_dtidx(Model,dtend_select,100+Model%ntno ,Model%index_of_process_pbl,have_pbl) ! ntno = 10 (index 9 is "no" in PBL scheme) + call fill_dtidx(Model,dtend_select,100+Model%nto3 ,Model%index_of_process_pbl,have_pbl) ! nto3 = 11 (index 10 is "o3" in PBL scheme) +!IVAI + call fill_dtidx(Model,dtend_select,100+Model%ntoz,Model%index_of_process_pbl,have_pbl) call fill_dtidx(Model,dtend_select,100+Model%ntoz,Model%index_of_process_prod_loss,have_oz_phys) call fill_dtidx(Model,dtend_select,100+Model%ntoz,Model%index_of_process_ozmix,have_oz_phys) @@ -6666,6 +6706,13 @@ subroutine control_chemistry_initialize(Model, tracer_types) if (Model%ntchm > 0) Model%ntche = Model%ntchs + Model%ntchm - 1 if (Model%ndchm > 0) Model%ndche = Model%ndchs + Model%ndchm - 1 +!IVAI +! print*,'control_chm_init: ntche = ', Model%ntchs, Model%ntche, Model%ntchm !IVAI +! ntchs = 9 to ntche = 197 => ntchm = 189 +! print*,'control_chm_init: ndche = ', Model%ndchs, Model%ndche, Model%ndchm !IVAI +! 198 to 201 => 4 +!IVAI + end subroutine control_chemistry_initialize @@ -7249,6 +7296,11 @@ subroutine control_print(Model) print *, ' nqrimef : ', Model%nqrimef print *, ' ntqv : ', Model%ntqv print *, ' ntoz : ', Model%ntoz +!IVAI + print *, ' ntno2 : ', Model%ntno2 ! "no2" tracer cplaqm/CMAQ + print *, ' ntno : ', Model%ntno ! "no" tracer cplaqm/CMAQ + print *, ' nto3 : ', Model%nto3 ! "o3" tracer cplaqm/CMAQ +!IVAI print *, ' ntcw : ', Model%ntcw print *, ' ntiw : ', Model%ntiw print *, ' ntrw : ', Model%ntrw diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 230345354..d8fe6b973 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -6661,6 +6661,29 @@ units = index dimensions = () type = integer +### IVAI +[ntno2] + standard_name = index_for_no2_chemical_tracer_in_tracer_concentration_array + long_name = tracer index for coupled AQM/CMAQ NO2 chemical tracer + units = index + dimensions = () + type = integer +## active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +[ntno] + standard_name = index_for_no_chemical_tracer_in_tracer_concentration_array + long_name = tracer index for coupled AQM/CMAQ NO chemical tracer + units = index + dimensions = () + type = integer +## active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +[nto3] + standard_name = index_for_ozone_chemical_tracer_in_tracer_concentration_array + long_name = tracer index for coupled AQM/CMAQ ozone chemical tracer + units = index + dimensions = () + type = integer +## active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +### IVAI [ntcw] standard_name = index_of_cloud_liquid_water_mixing_ratio_in_tracer_concentration_array long_name = tracer index for cloud condensate (or liquid water) diff --git a/ccpp/suites/suite_FV3_GFS_v16.xml b/ccpp/suites/suite_FV3_GFS_v16.xml index 1d0be8862..a53926d86 100644 --- a/ccpp/suites/suite_FV3_GFS_v16.xml +++ b/ccpp/suites/suite_FV3_GFS_v16.xml @@ -57,7 +57,7 @@ GFS_surface_generic_post GFS_PBL_generic_pre satmedmfvdifq - canopy_satmedmfvdifq + canopy_driver GFS_PBL_generic_post GFS_GWD_generic_pre cires_ugwp diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8.xml b/ccpp/suites/suite_FV3_GFS_v17_p8.xml index a5fbd0e25..473c69116 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8.xml @@ -53,7 +53,7 @@ GFS_surface_generic_post GFS_PBL_generic_pre satmedmfvdifq - canopy_satmedmfvdifq + canopy_driver GFS_PBL_generic_post GFS_GWD_generic_pre unified_ugwp From f56b929fe51fd39171c4d30a0d81c54552c654fe Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 20 Nov 2025 20:12:24 -0500 Subject: [PATCH 09/34] Updating ccpp submodule for latest vdf changes. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index cb1a12039..cbc4459ea 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit cb1a120399f5909d64275e24b9d2ac9e53e674ea +Subproject commit cbc4459ea6b49ad1030621c299e21d7adf70e6fb From 4a81e4a673d6a2a623987fd08a564194936677b9 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 11 Dec 2025 12:34:38 -0500 Subject: [PATCH 10/34] Updating ccpp-physics submodule for vdf changes... --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index cbc4459ea..7e1749b5b 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit cbc4459ea6b49ad1030621c299e21d7adf70e6fb +Subproject commit 7e1749b5b6cca0e09dac597a4369b7fc8a2e3d00 From ed54855643572bdf2e880cc3adc050be2b2ea3c3 Mon Sep 17 00:00:00 2001 From: iri01 Date: Thu, 15 Jan 2026 15:52:54 -0500 Subject: [PATCH 11/34] Clean up PBL dtend diagnostics for O3, NO2, NO. --- ccpp/data/GFS_typedefs.F90 | 44 +++++++++++++++----------------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 1d5e83279..df513a9c8 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -5511,10 +5511,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & Model%dtidx = physics_no_tracer if(Model%ntchm>0) then -!IVAI - Model%ntno2 = get_physics_tracer_index('no2', Model) ! ntno2=9 (index 8 is "no2" in PBL scheme) - Model%ntno = get_physics_tracer_index('no', Model) ! ntno =10 (index 9 is "no" in PBL scheme) - Model%nto3 = get_physics_tracer_index('o3', Model) ! nto3 =11 (index 10 is "o3" in PBL scheme) +!IVAI: GFS_v16 n=9 "no2" n=10 "no" n=11 "o3" (n=8,9, 10 in PBL resp.) + Model%ntno2 = get_physics_tracer_index('no2', Model) ! n=11 (index 10 "no2" in PBL scheme) GFS_v17_p8 + Model%ntno = get_physics_tracer_index('no', Model) ! n=12 (index 11 "no" in PBL scheme) GFS_v17_p8 + Model%nto3 = get_physics_tracer_index('o3', Model) ! n=13 (index 12 "o3" in PBL scheme) GFS_v17_p8 +! print*,'Index of NO2 : ntno2 = ', Model%ntno2 +! print*,'Index of NO : ntno = ', Model%ntno +! print*,'Index of O3 : nto3 = ', Model%nto3 ! nto3 = 11 "GFS_v16" !IVAI Model%ntdu1 = get_physics_tracer_index('dust1', Model) Model%ntdu2 = get_physics_tracer_index('dust2', Model) @@ -5608,25 +5611,6 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & ! print*,'Index of MSA: ntmsa = ', itrac call label_dtend_tracer(Model,100+itrac,'msa','msa concentration','kg kg-1 s-1') endif -!IVAI - itrac=get_physics_tracer_index('o3', Model) - if(itrac>0) then -! print*,'Index of O3: nto3 = ', itrac ! nto3 = 11 - call label_dtend_tracer(Model,100+itrac, 'o3_cpl', 'cplaqm ozone concentration','kg kg-1 s-1') - endif - - itrac=get_physics_tracer_index('no2', Model) - if(itrac>0) then -! print*,'Index of NO2: ntno2 = ', itrac ! ntno2 = 9 - call label_dtend_tracer(Model,100+itrac, 'no2_cpl', 'cplaqm nitrogen dioxide concentration','kg kg-1 s-1') - endif - - itrac=get_physics_tracer_index('no', Model) - if(itrac>0) then -! print*,'Index of NO: ntno = ', itrac ! ntno = 10 - call label_dtend_tracer(Model,100+itrac, 'no_cpl', 'cplaqm nitrogen monoxide concentration','kg kg-1 s-1') - endif -!IVAI endif endif @@ -5662,6 +5646,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & call label_dtend_tracer(Model,100+Model%ntia,'ice_aero','number concentration of ice-friendly aerosols','kg-1 s-1') call label_dtend_tracer(Model,100+Model%nto,'o_ion','oxygen ion concentration','kg kg-1 s-1') call label_dtend_tracer(Model,100+Model%nto2,'o2','oxygen concentration','kg kg-1 s-1') +!IVAI: "o3" tracer CMAQ + call label_dtend_tracer(Model,100+Model%ntno2,'no2_cpl','cplaqm NO2 concentration','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntno, 'no_cpl', 'cplaqm NO concentration','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%nto3, 'o3_cpl', 'cplaqm ozone concentration','kg kg-1 s-1') +!IVAI call label_dtend_cause(Model,Model%index_of_process_pbl,'pbl','tendency due to PBL') call label_dtend_cause(Model,Model%index_of_process_dcnv,'deepcnv','tendency due to deep convection') @@ -5746,9 +5735,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & endif !IVAI: NB. In PBL scheme chemical tracers indexes are offset by 1 - call fill_dtidx(Model,dtend_select,100+Model%ntno2,Model%index_of_process_pbl,have_pbl) ! ntno2= 9 (index 8 is "no2" in PBL scheme) - call fill_dtidx(Model,dtend_select,100+Model%ntno ,Model%index_of_process_pbl,have_pbl) ! ntno = 10 (index 9 is "no" in PBL scheme) - call fill_dtidx(Model,dtend_select,100+Model%nto3 ,Model%index_of_process_pbl,have_pbl) ! nto3 = 11 (index 10 is "o3" in PBL scheme) +! (qdiag3d) cplaqm tracers "no2", "no", "o3" + call fill_dtidx(Model,dtend_select,100+Model%ntno2,Model%index_of_process_pbl,have_pbl) ! ntno2= 11 (index 10 is "no2" in PBL scheme) GFS_v17_p8 + call fill_dtidx(Model,dtend_select,100+Model%ntno ,Model%index_of_process_pbl,have_pbl) ! ntno = 12 (index 11 is "no" in PBL scheme) GFS_v17_p8 + call fill_dtidx(Model,dtend_select,100+Model%nto3 ,Model%index_of_process_pbl,have_pbl) ! nto3 = 13 (index 12 is "o3" in PBL scheme) GFS_v17_p8 !IVAI call fill_dtidx(Model,dtend_select,100+Model%ntoz,Model%index_of_process_pbl,have_pbl) @@ -7715,7 +7705,7 @@ subroutine cldprop_create (Cldprop, Model) Cldprop%cvt = clear_val Cldprop%cvb = clear_val Cldprop%cnvw = clear_val - + end subroutine cldprop_create From 5109bc2b60afa610d291851faa6e5cbcf1f2e3ff Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 15 Jan 2026 16:16:56 -0500 Subject: [PATCH 12/34] Updating ccpp-physics submodule for canopy. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 7e1749b5b..488c0dd51 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 7e1749b5b6cca0e09dac597a4369b7fc8a2e3d00 +Subproject commit 488c0dd51967f257a9228c1be9c1c54d4258f55a From 0f4da53a6bcdab9eea26214b05ea115c26e78580 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 15 Jan 2026 17:49:05 -0500 Subject: [PATCH 13/34] Updating ccpp/framework. --- ccpp/framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/framework b/ccpp/framework index 1348388c7..3889050e5 160000 --- a/ccpp/framework +++ b/ccpp/framework @@ -1 +1 @@ -Subproject commit 1348388c7259538c458d2f25e66cc4471c2f1864 +Subproject commit 3889050e5e67ffe9db4f9ebc08872fd84406c837 From 9359a3f28d439383172191c8ae947ada979b6649 Mon Sep 17 00:00:00 2001 From: iri01 Date: Thu, 15 Jan 2026 18:11:06 -0500 Subject: [PATCH 14/34] Correct typo in horisontal dimention. --- ccpp/data/GFS_typedefs.meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 6d2a0f56f..ebfad86a5 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -1272,7 +1272,7 @@ standard_name = forest_canopy_mask long_name = contiguous forest canopy mask for 3-layer canopy model units = none - dimensions = (horizontal_loop_extent) + dimensions = (horizontal_dimension) type = real kind = kind_phys active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) From db081d0758b8bfede9b62cce704c092866bd24ae Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 15 Jan 2026 20:29:38 -0500 Subject: [PATCH 15/34] Updating GFS_typdefs.meta for canmsk dimensons. --- ccpp/data/GFS_typedefs.meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 2d1181744..fe1b761c0 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -1272,7 +1272,7 @@ standard_name = forest_canopy_mask long_name = contiguous forest canopy mask for 3-layer canopy model units = none - dimensions = (horizontal_loop_extent) + dimensions = (horizontal_dimension) type = real kind = kind_phys active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) From a53b265799f1285714ad4ed823b2765a987559d6 Mon Sep 17 00:00:00 2001 From: iri01 Date: Fri, 16 Jan 2026 14:33:29 -0500 Subject: [PATCH 16/34] Clean up unused canopy array canmsk. --- ccpp/data/GFS_typedefs.F90 | 21 ++++----------------- ccpp/data/GFS_typedefs.meta | 10 ---------- 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 11f258993..ea98972ff 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -320,9 +320,6 @@ module GFS_typedefs real (kind=kind_phys), pointer :: hice (:) => null() !< sea ice thickness real (kind=kind_phys), pointer :: weasd (:) => null() !< water equiv of accumulated snow depth (kg/m**2) !< over land and sea ice -! IVAI: GFS_sfcprop% - real (kind=kind_phys), pointer :: canmsk (:) => null() !< canopy/no-canopy mask array (no-canopy:0,canopy:1) -! IVAI real (kind=kind_phys), pointer :: canopy (:) => null() !< canopy water real (kind=kind_phys), pointer :: ffmm (:) => null() !< fm parameter from PBL scheme real (kind=kind_phys), pointer :: ffhh (:) => null() !< fh parameter from PBL scheme @@ -2617,11 +2614,6 @@ subroutine sfcprop_create (Sfcprop, Model) allocate (Sfcprop%sfalb_ice (IM)) allocate (Sfcprop%sfalb_lnd_bck (IM)) endif -!IVAI - if (Model%do_canopy) then - allocate (Sfcprop%canmsk (IM)) - endif -!IVAI allocate (Sfcprop%canopy (IM)) allocate (Sfcprop%ffmm (IM)) allocate (Sfcprop%ffhh (IM)) @@ -2647,11 +2639,6 @@ subroutine sfcprop_create (Sfcprop, Model) Sfcprop%sfalb_ice = clear_val Sfcprop%sfalb_lnd_bck = clear_val endif -!IVAI - if (Model%do_canopy) then - Sfcprop%canmsk = clear_val - endif -!IVAI Sfcprop%canopy = clear_val Sfcprop%ffmm = clear_val Sfcprop%ffhh = clear_val @@ -3605,7 +3592,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & logical :: lrseeds = .false. !< flag to use host-provided random seeds integer :: nrstreams = 2 !< number of random number streams in host-provided random seed array logical :: lextop = .false. !< flag for using an extra top layer for radiation - real(kind_phys) :: xr_con = -999.0 !< Xu-Randall cloud fraction multiplicative constant + real(kind_phys) :: xr_con = -999.0 !< Xu-Randall cloud fraction multiplicative constant real(kind_phys) :: xr_exp = -999.0 !< Xu-Randall cloud fraction exponent constant ! RRTMGP logical :: do_RRTMGP = .false. !< Use RRTMGP? @@ -6599,7 +6586,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & !--- BEGIN CODE FROM GLOOPB !--- set up random number seed needed for RAS and old SAS and when cal_pre=.true. ! Model%imfdeepcnv < 0 when Model%ras = .true. - + if (xr_con > 0.0 .and. xr_exp > 0.0) then !values have been read in from namelist, so set them to read values Model%xr_con = xr_con Model%xr_exp = xr_exp @@ -6624,9 +6611,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & Model%xr_con = 2000.0 Model%xr_exp = 0.25 endif - endif + endif endif - + if (Model%imfdeepcnv <= 0 .or. Model%cal_pre ) then if (Model%random_clds) then seed0 = Model%idate(1) + Model%idate(2) + Model%idate(3) + Model%idate(4) diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index fe1b761c0..1c2b88673 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -1267,16 +1267,6 @@ dimensions = (horizontal_dimension) type = real kind = kind_phys -### IVAI GFS_sfcprop% -[canmsk] - standard_name = forest_canopy_mask - long_name = contiguous forest canopy mask for 3-layer canopy model - units = none - dimensions = (horizontal_dimension) - type = real - kind = kind_phys - active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) -###IVAI [canopy] standard_name = canopy_water_amount long_name = canopy water amount From 9569b43365c4212e7b1529f2172cb6076ec8f9e8 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Sun, 18 Jan 2026 14:26:04 -0500 Subject: [PATCH 17/34] Updating ccpp-physics for canopy. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 488c0dd51..8b63e219f 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 488c0dd51967f257a9228c1be9c1c54d4258f55a +Subproject commit 8b63e219f47bbf0a173dca3771968d0ac614ed97 From 4e073f5861bcdf233879e3c8ba6df202848d2ff0 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Wed, 21 Jan 2026 09:44:20 -0500 Subject: [PATCH 18/34] Updating submodules to match develop. --- ccpp/framework | 2 +- mpas/MPAS-Model | 2 +- upp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ccpp/framework b/ccpp/framework index 3889050e5..22bc1a5de 160000 --- a/ccpp/framework +++ b/ccpp/framework @@ -1 +1 @@ -Subproject commit 3889050e5e67ffe9db4f9ebc08872fd84406c837 +Subproject commit 22bc1a5de8a19996310aedc3482931616cd74a1b diff --git a/mpas/MPAS-Model b/mpas/MPAS-Model index ac90200e1..38d2177ae 160000 --- a/mpas/MPAS-Model +++ b/mpas/MPAS-Model @@ -1 +1 @@ -Subproject commit ac90200e197f47f533138939203ffe757f9dc423 +Subproject commit 38d2177aef842a5c6abe26ffe876804b95fd9e0a diff --git a/upp b/upp index a307d0e81..8d41f98e6 160000 --- a/upp +++ b/upp @@ -1 +1 @@ -Subproject commit a307d0e817d9d0736fbc0cc11feac9ee40faa8f7 +Subproject commit 8d41f98e66ea858c163a387aaa0c6179851a1466 From 9237ec975300859a20771cfa5007517c7b74ca1b Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 22 Jan 2026 14:11:00 -0500 Subject: [PATCH 19/34] Updating ccpp-physics submodule for canopy. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 8b63e219f..cff17298a 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 8b63e219f47bbf0a173dca3771968d0ac614ed97 +Subproject commit cff17298a6775cf369647118c2dfd1edfb268420 From 7bfcec9196d3df5e4d2768df30443da59aa34b1a Mon Sep 17 00:00:00 2001 From: iri01 Date: Fri, 23 Jan 2026 13:47:02 -0500 Subject: [PATCH 20/34] Clean up print statements. --- ccpp/data/GFS_typedefs.F90 | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 1ad896a03..c631cb0f0 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -687,7 +687,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: dqdt_qmicro(:,:) => null() !< instantanious microphysics tendency to be passed from MP to convection !-- lake surface temperature from cdeps inline - real (kind=kind_phys), pointer :: mask_dat (:) => null() !< land-sea mask from cdeps inline + real (kind=kind_phys), pointer :: mask_dat (:) => null() !< land-sea mask from cdeps inline real (kind=kind_phys), pointer :: tsfco_dat (:) => null() !< sfc temperature from cdeps inline real (kind=kind_phys), pointer :: tice_dat (:) => null() !< sfc temperature over ice from cdeps inline real (kind=kind_phys), pointer :: hice_dat (:) => null() !< sfc ice thickness from cdeps inline @@ -5570,9 +5570,6 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & Model%ntno2 = get_physics_tracer_index('no2', Model) ! n=11 (index 10 "no2" in PBL scheme) GFS_v17_p8 Model%ntno = get_physics_tracer_index('no', Model) ! n=12 (index 11 "no" in PBL scheme) GFS_v17_p8 Model%nto3 = get_physics_tracer_index('o3', Model) ! n=13 (index 12 "o3" in PBL scheme) GFS_v17_p8 -! print*,'Index of NO2 : ntno2 = ', Model%ntno2 -! print*,'Index of NO : ntno = ', Model%ntno -! print*,'Index of O3 : nto3 = ', Model%nto3 ! nto3 = 11 "GFS_v16" !IVAI Model%ntdu1 = get_physics_tracer_index('dust1', Model) Model%ntdu2 = get_physics_tracer_index('dust2', Model) @@ -5657,13 +5654,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & itrac=get_physics_tracer_index('DMS', Model) if(itrac>0) then -! print*,'Index of DMS: ntdms = ', itrac call label_dtend_tracer(Model,100+itrac,'DMS','DMS concentration','kg kg-1 s-1') endif itrac=get_physics_tracer_index('msa', Model) if(itrac>0) then -! print*,'Index of MSA: ntmsa = ', itrac call label_dtend_tracer(Model,100+itrac,'msa','msa concentration','kg kg-1 s-1') endif endif @@ -6783,13 +6778,6 @@ subroutine control_chemistry_initialize(Model, tracer_types) if (Model%ntchm > 0) Model%ntche = Model%ntchs + Model%ntchm - 1 if (Model%ndchm > 0) Model%ndche = Model%ndchs + Model%ndchm - 1 -!IVAI -! print*,'control_chm_init: ntche = ', Model%ntchs, Model%ntche, Model%ntchm !IVAI -! ntchs = 9 to ntche = 197 => ntchm = 189 -! print*,'control_chm_init: ndche = ', Model%ndchs, Model%ndche, Model%ndchm !IVAI -! 198 to 201 => 4 -!IVAI - end subroutine control_chemistry_initialize From 972a408070c20b4da324dacdab6009dff2d90b5f Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Mon, 9 Feb 2026 12:46:59 -0500 Subject: [PATCH 21/34] Updating ccpp submodule for canopy. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index cff17298a..c2eeed82e 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit cff17298a6775cf369647118c2dfd1edfb268420 +Subproject commit c2eeed82e0eb4ebbc2bca20194bba40188df70ee From 61ddcc9f41629d48900976e2ed778e87d6958312 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Mon, 9 Feb 2026 12:52:58 -0500 Subject: [PATCH 22/34] Updating ccpp canoy submodule for merge upstream. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index c2eeed82e..da8bf5708 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit c2eeed82e0eb4ebbc2bca20194bba40188df70ee +Subproject commit da8bf5708cb9d7c9a7d218c8845c69b38955f5d7 From 68f3f741f484d908849070d6a70f1ac73fb1a387 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Tue, 10 Feb 2026 13:46:15 -0500 Subject: [PATCH 23/34] Updating ccpp/physics for canopy updates. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index da8bf5708..17a6baf67 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit da8bf5708cb9d7c9a7d218c8845c69b38955f5d7 +Subproject commit 17a6baf67b2caa0377fa933afb21e1681125409c From aad52795a02972e421851d5f9949980f00618324 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Wed, 11 Feb 2026 09:34:05 -0500 Subject: [PATCH 24/34] Updating ccpp/physics for canopy. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 17a6baf67..cb792c22d 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 17a6baf67b2caa0377fa933afb21e1681125409c +Subproject commit cb792c22db3950dd74e80817ca690353f4ff5e54 From 6b94b59bf6d3fe17043e0a460404d5fbba490cb0 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Wed, 11 Feb 2026 13:35:43 -0500 Subject: [PATCH 25/34] Updating ccpp/physics for canopy updates. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index cb792c22d..ccc6f3830 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit cb792c22db3950dd74e80817ca690353f4ff5e54 +Subproject commit ccc6f38300cd92142b13ee0d5b75e3064d38c922 From 2baaff1f40e0cd65814924569dc7b5f36f346d47 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 12 Feb 2026 09:23:25 -0500 Subject: [PATCH 26/34] Updating ccpp/physics for canopy updates. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index ccc6f3830..5a63c3ce2 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit ccc6f38300cd92142b13ee0d5b75e3064d38c922 +Subproject commit 5a63c3ce26b4f9ca75e64e25933eba1f9b80bcc4 From e934f3531b019250adc44142b88c1b67f425e473 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Mon, 16 Feb 2026 22:21:27 -0500 Subject: [PATCH 27/34] Updating ccpp/physics for canopy updates. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 5a63c3ce2..445aeabcb 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 5a63c3ce26b4f9ca75e64e25933eba1f9b80bcc4 +Subproject commit 445aeabcb87e650a95189c7d150f082b147177c5 From 234a00932e30169d68412cb2208acaacf443a596 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Mon, 16 Feb 2026 22:56:21 -0500 Subject: [PATCH 28/34] Fixing merge with develop. --- ccpp/data/GFS_typedefs.F90 | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index c94ab480b..5d1522dc7 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -1083,15 +1083,9 @@ module GFS_typedefs real(kind=kind_phys) :: ssati_min !< minimum supersaturation over ice threshold for deposition nucleation real(kind=kind_phys) :: Nt_i_max !< maximum threshold number concentration of cloud ice water crystals in air real(kind=kind_phys) :: rr_min !< multiplicative tuning parameter for microphysical sedimentation minimum threshold -<<<<<<< HEAD - - -======= real(kind=kind_phys) :: fs_fac_rain !< adjustment for rain fall speed real(kind=kind_phys) :: fs_fac_snow !< adjustment for snow fall speed - ->>>>>>> develop !--- GFDL microphysical paramters logical :: lgfdlmprad !< flag for GFDL mp scheme and radiation consistency logical :: phys_hydrostatic @@ -3736,13 +3730,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & real(kind=kind_phys) :: ssati_min = 0.15 !< minimum supersaturation over ice threshold for deposition nucleation real(kind=kind_phys) :: Nt_i_max = 4999.e3 !< maximum threshold number concentration of cloud ice water crystals in air real(kind=kind_phys) :: rr_min = 1000.0 !< multiplicative tuning parameter for microphysical sedimentation minimum threshold -<<<<<<< HEAD - -======= real(kind=kind_phys) :: fs_fac_rain = 1.0 !< adjustment for rain fall speed real(kind=kind_phys) :: fs_fac_snow = 1.0 !< adjustment for snow fall speed ->>>>>>> develop !--- GFDL microphysical parameters logical :: lgfdlmprad = .false. !< flag for GFDLMP radiation interaction From a1a502de2d40cb3826509a70dcec809f8c829b97 Mon Sep 17 00:00:00 2001 From: iri01 Date: Fri, 20 Feb 2026 12:42:31 -0500 Subject: [PATCH 29/34] Conditionally allocate the PBL diag arrays using "do_canopy" flag. Clean up comments. --- ccpp/data/GFS_typedefs.F90 | 47 ++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index c631cb0f0..04261c93c 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -1569,11 +1569,11 @@ module GFS_typedefs integer :: nchem !< number of prognostic chemical species (vertically mixied) integer :: ndvel !< number of prognostic chemical species (which are deposited, usually =nchem) integer :: ntchm !< number of prognostic chemical tracers (advected) -!IVAI: "cplaqm" tracer +! "cplaqm" tracers integer :: nto3 !< tracer index for Ozone chemical species CMAQ integer :: ntno !< tracer index for NO chemical species CMAQ integer :: ntno2 !< tracer index for NO2 chemical species CMAQ -!IVAI + integer :: ntchs !< tracer index for first prognostic chemical tracer integer :: ntche !< tracer index for last prognostic chemical tracer integer :: ntdu1 !< tracer index for dust bin1 @@ -2154,12 +2154,11 @@ module GFS_typedefs !--- Extra PBL diagnostics real (kind=kind_phys), pointer :: dkt(:,:) => null() !< Eddy diffusitivity for heat real (kind=kind_phys), pointer :: dku(:,:) => null() !< Eddy diffusitivity for momentum -!IVAI + !3-LAYER CANOPY !--- Extra PBL diagnostics in canopy real (kind=kind_phys), pointer :: dkt_can(:,:) => null() !< Eddy diffusitivity for heat real (kind=kind_phys), pointer :: dku_can(:,:) => null() !< Eddy diffusitivity for momentum -!IVAI ! !---vay-2018 UGWP-diagnostics instantaneous @@ -2265,7 +2264,6 @@ module GFS_typedefs ! Diagnostics for coupled air quality model real (kind=kind_phys), pointer :: aod (:) => null() !< instantaneous aerosol optical depth ( n/a ) -!IVAI ! Diagnostics for coupled air quality model real (kind=kind_phys), pointer :: coszens(:) => null() ! Cosine SZA for photolysis real (kind=kind_phys), pointer :: jo3o1d(:) => null() ! instantaneous O3O1D photolysis rate @@ -2275,7 +2273,6 @@ module GFS_typedefs real (kind=kind_phys), pointer :: cfrt (:) => null() ! Forest Fraction real (kind=kind_phys), pointer :: cclu (:) => null() ! Clumping Index real (kind=kind_phys), pointer :: cpopu(:) => null() ! Population density -!IVAI ! Auxiliary output arrays for debugging real (kind=kind_phys), pointer :: aux2d(:,:) => null() !< auxiliary 2d arrays in output (for debugging) @@ -5566,11 +5563,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & Model%dtidx = physics_no_tracer if(Model%ntchm>0) then -!IVAI: GFS_v16 n=9 "no2" n=10 "no" n=11 "o3" (n=8,9, 10 in PBL resp.) +! GFS_v16 n=9 "no2" n=10 "no" n=11 "o3" (n=8,9, 10 in PBL resp.) Model%ntno2 = get_physics_tracer_index('no2', Model) ! n=11 (index 10 "no2" in PBL scheme) GFS_v17_p8 Model%ntno = get_physics_tracer_index('no', Model) ! n=12 (index 11 "no" in PBL scheme) GFS_v17_p8 Model%nto3 = get_physics_tracer_index('o3', Model) ! n=13 (index 12 "o3" in PBL scheme) GFS_v17_p8 -!IVAI + Model%ntdu1 = get_physics_tracer_index('dust1', Model) Model%ntdu2 = get_physics_tracer_index('dust2', Model) Model%ntdu3 = get_physics_tracer_index('dust3', Model) @@ -5645,7 +5642,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & endif ! More specific chemical tracer names: -! IVAI: NB. ntchs is 1st chemical tracer (not so2 tracer) +! NB. ntchs is 1st chemical tracer (not so2 tracer) call label_dtend_tracer(Model,100+Model%ntchs,'so2','sulfur dioxide concentration','kg kg-1 s-1') if(Model%ntchm>0) then @@ -5696,11 +5693,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & call label_dtend_tracer(Model,100+Model%ntia,'ice_aero','number concentration of ice-friendly aerosols','kg-1 s-1') call label_dtend_tracer(Model,100+Model%nto,'o_ion','oxygen ion concentration','kg kg-1 s-1') call label_dtend_tracer(Model,100+Model%nto2,'o2','oxygen concentration','kg kg-1 s-1') -!IVAI: "o3" tracer CMAQ +! cplaqm tracers CMAQ call label_dtend_tracer(Model,100+Model%ntno2,'no2_cpl','cplaqm NO2 concentration','kg kg-1 s-1') call label_dtend_tracer(Model,100+Model%ntno, 'no_cpl', 'cplaqm NO concentration','kg kg-1 s-1') call label_dtend_tracer(Model,100+Model%nto3, 'o3_cpl', 'cplaqm ozone concentration','kg kg-1 s-1') -!IVAI call label_dtend_cause(Model,Model%index_of_process_pbl,'pbl','tendency due to PBL') call label_dtend_cause(Model,Model%index_of_process_dcnv,'deepcnv','tendency due to deep convection') @@ -5784,12 +5780,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, & enddo endif -!IVAI: NB. In PBL scheme chemical tracers indexes are offset by 1 +! NB. In PBL scheme chemical tracers indexes are offset by 1 ! (qdiag3d) cplaqm tracers "no2", "no", "o3" call fill_dtidx(Model,dtend_select,100+Model%ntno2,Model%index_of_process_pbl,have_pbl) ! ntno2= 11 (index 10 is "no2" in PBL scheme) GFS_v17_p8 call fill_dtidx(Model,dtend_select,100+Model%ntno ,Model%index_of_process_pbl,have_pbl) ! ntno = 12 (index 11 is "no" in PBL scheme) GFS_v17_p8 call fill_dtidx(Model,dtend_select,100+Model%nto3 ,Model%index_of_process_pbl,have_pbl) ! nto3 = 13 (index 12 is "o3" in PBL scheme) GFS_v17_p8 -!IVAI call fill_dtidx(Model,dtend_select,100+Model%ntoz,Model%index_of_process_pbl,have_pbl) call fill_dtidx(Model,dtend_select,100+Model%ntoz,Model%index_of_process_prod_loss,have_oz_phys) @@ -7366,11 +7361,9 @@ subroutine control_print(Model) print *, ' nqrimef : ', Model%nqrimef print *, ' ntqv : ', Model%ntqv print *, ' ntoz : ', Model%ntoz -!IVAI print *, ' ntno2 : ', Model%ntno2 ! "no2" tracer cplaqm/CMAQ print *, ' ntno : ', Model%ntno ! "no" tracer cplaqm/CMAQ print *, ' nto3 : ', Model%nto3 ! "o3" tracer cplaqm/CMAQ -!IVAI print *, ' ntcw : ', Model%ntcw print *, ' ntiw : ', Model%ntiw print *, ' ntrw : ', Model%ntrw @@ -8306,11 +8299,12 @@ subroutine diag_create (Diag, Model) !--- New PBL Diagnostics allocate (Diag%dkt(IM,Model%levs)) allocate (Diag%dku(IM,Model%levs)) -!IVAI + !--- New PBL Diagnostics in 3-layer canopy - allocate (Diag%dkt_can(IM,Model%levs)) - allocate (Diag%dku_can(IM,Model%levs)) -!IVAI + if (Model%do_canopy .and. Model%cplaqm) then + allocate (Diag%dkt_can(IM,Model%levs)) + allocate (Diag%dku_can(IM,Model%levs)) + endif !-- New max hourly diag. allocate (Diag%refdmax(IM)) @@ -8388,12 +8382,11 @@ subroutine diag_create (Diag, Model) Diag%aod = zero end if -!IVAI: ! Air quality diagnostics ! -- initialize diagnostic variables if (Model%cplaqm) then -!IVAI: photdiag arrays +! photdiag arrays allocate (Diag%coszens(IM)) Diag%coszens= zero @@ -8403,7 +8396,7 @@ subroutine diag_create (Diag, Model) allocate (Diag%jno2(IM)) Diag%jno2 = zero -!IVAI: canopy arrays read via aqm_emis_read +! Canopy arrays read via aqm_emis_read if (Model%do_canopy) then allocate (Diag%claie(IM)) Diag%claie = zero @@ -8422,7 +8415,6 @@ subroutine diag_create (Diag, Model) end if! (Model%do_canopy) end if ! (Model%cplaqm) -!IVAI ! Auxiliary arrays in output for debugging if (Model%naux2d>0) then @@ -8689,11 +8681,12 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) ! Extra PBL diagnostics Diag%dkt = zero Diag%dku = zero -!IVAI + ! Extra PBL diagnostics in 3-layer canopy - Diag%dkt_can = zero - Diag%dku_can = zero -!IVAI + if (Model%do_canopy .and. Model%cplaqm ) then + Diag%dkt_can = zero + Diag%dku_can = zero + endif ! max hourly diagnostics Diag%refl_10cm = -35. From 70ee3fd54ebad96fe769a0664dfff6c422e931e7 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Fri, 20 Feb 2026 13:46:54 -0500 Subject: [PATCH 30/34] Updating ccpp/physics for canopy changes. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index fa51a5610..9235e62c4 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit fa51a56100cb49dc39796090ae4dedb63a9e4800 +Subproject commit 9235e62c445695dce39347dbf6e84e1bf4d7851c From 3041ac3eb3188cac529edd883c6180078299f146 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Sat, 21 Feb 2026 13:48:19 -0500 Subject: [PATCH 31/34] Updating ccpp/physics for canopy changes. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 9235e62c4..20f83ffd1 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 9235e62c445695dce39347dbf6e84e1bf4d7851c +Subproject commit 20f83ffd19fbb74cbecc032e4d143dbf1730fd30 From 5e887c0e9eded4cf0e2fff436597fbce3f508968 Mon Sep 17 00:00:00 2001 From: iri01 Date: Sun, 22 Feb 2026 04:55:11 +0000 Subject: [PATCH 32/34] Add active attribute to the canopy PBL diags, optional if do_canopy & cplaqm. --- ccpp/data/GFS_typedefs.meta | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index f66ea9318..9150e5aa1 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -9939,7 +9939,6 @@ dimensions = (horizontal_dimension,vertical_layer_dimension) type = real kind = kind_phys -###IVAI [dkt_can] standard_name = atmosphere_heat_diffusivity_in_canopy long_name = atmospheric heat diffusivity in canopy @@ -9947,6 +9946,7 @@ dimensions = (horizontal_dimension,vertical_layer_dimension) type = real kind = kind_phys + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) [dku_can] standard_name = atmosphere_momentum_diffusivity_in_canopy long_name = atmospheric momentum diffusivity in canopy @@ -9954,7 +9954,7 @@ dimensions = (horizontal_dimension,vertical_layer_dimension) type = real kind = kind_phys -###IVAI + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) [cldfra] standard_name = instantaneous_3d_cloud_fraction long_name = instantaneous 3D cloud fraction for all MPs From 62909725fa7ada7a5352da91c6ea36cf770eb381 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Sun, 22 Feb 2026 10:05:56 -0500 Subject: [PATCH 33/34] Updating ccpp/physics for canopy updates. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 20f83ffd1..81ee977f5 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 20f83ffd19fbb74cbecc032e4d143dbf1730fd30 +Subproject commit 81ee977f5b551493643eb0197b0789c594585386 From a2d2f930154e5365ad7e12fcac1c227119d7eb6b Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Fri, 27 Feb 2026 14:53:15 -0500 Subject: [PATCH 34/34] Reverting .gitmodules and updating ccpp hash. --- .gitmodules | 4 ++-- ccpp/physics | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index d0678e97b..5e5f8d221 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,8 +8,8 @@ branch = develop [submodule "ccpp/physics"] path = ccpp/physics - url = https://github.com/noaa-oar-arl/ccpp-physics - branch = feature/aqm_canopy_vdf + url = https://github.com/ufs-community/ccpp-physics + branch = ufs/dev [submodule "upp"] path = upp url = https://github.com/NOAA-EMC/UPP diff --git a/ccpp/physics b/ccpp/physics index 81ee977f5..9e709790d 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 81ee977f5b551493643eb0197b0789c594585386 +Subproject commit 9e709790d12301e697634e55af25224708b54a80