From 34675c222f1140e732cc709de6c16bed0a6df9f0 Mon Sep 17 00:00:00 2001 From: Joseph Olson Date: Fri, 17 Nov 2023 07:19:21 -0700 Subject: [PATCH 01/41] MYNN-EDMF, MYNN surface layer, and Thompson AA updates (#712) * In GFS_diagnostics make LAI, WILT and FLDCP be outputted with all LSMs. Also, output of LAI should not depend on RDLAI. * In GFS_typedefs.* add surface heat flux from the fire for use in RUC LSM. * Fix hail size output diagnostic array size (#1) * Added one more variable - frac_grid_burned_out - to GFS_typedefs.F90. Also, the surface heat flux from fires and frac_grid_burned_out are added to the model output in GFS_diagnostics.F90. --------- Co-authored-by: tanyasmirnova Co-authored-by: Anders Jensen --- ccpp/data/GFS_typedefs.F90 | 41 ++++++++--- ccpp/data/GFS_typedefs.meta | 50 +++++++++++-- ccpp/driver/GFS_diagnostics.F90 | 120 ++++++++++++++++++++------------ ccpp/physics | 2 +- 4 files changed, 152 insertions(+), 61 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 3289d24bd..17d6ee4a0 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -464,6 +464,9 @@ module GFS_typedefs !--- For fire diurnal cycle real (kind=kind_phys), pointer :: fhist (:) => null() !< instantaneous fire coef_bb real (kind=kind_phys), pointer :: coef_bb_dc (:) => null() !< instantaneous fire coef_bb + !--- wildfire heat flux + real (kind=kind_phys), pointer :: fire_heat_flux_out (:) => null() !< heat flux from wildfire + real (kind=kind_phys), pointer :: frac_grid_burned_out (:) => null() !< fraction of grid cell burning !--- For smoke and dust auxiliary inputs real (kind=kind_phys), pointer :: fire_in (:,:) => null() !< fire auxiliary inputs @@ -1050,6 +1053,9 @@ module GFS_typedefs integer :: isncond_opt=1 !< control for soil thermal conductivity option in RUC land surface model integer :: isncovr_opt=1 !< control for snow cover fraction option in RUC land surface model + ! -- Fire heat flux + logical :: add_fire_heat_flux=.false. ! null() ! real (kind=kind_phys), pointer :: det_sqv (:,:) => null() ! real (kind=kind_phys), pointer :: maxMF (:) => null() ! - integer, pointer :: nupdraft (:) => null() ! + real (kind=kind_phys), pointer :: maxwidth (:) => null() ! + real (kind=kind_phys), pointer :: ztop_plume (:) => null() ! integer, pointer :: ktop_plume (:) => null() ! real (kind=kind_phys), pointer :: exch_h (:,:) => null() ! real (kind=kind_phys), pointer :: exch_m (:,:) => null() ! @@ -1974,6 +1981,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: cldfra (:,:) => null() !< instantaneous 3D cloud fraction !--- MP quantities for 3D diagnositics real (kind=kind_phys), pointer :: refl_10cm(:,:) => null() !< instantaneous refl_10cm + real (kind=kind_phys), pointer :: max_hail_diam_sfc(:) => null() !< instantaneous max hail diameter sfc real (kind=kind_phys), pointer :: cldfra2d (:) => null() !< instantaneous 2D cloud fraction real (kind=kind_phys), pointer :: total_albedo (:) => null() !< total sky (with cloud) albedo at toa real (kind=kind_phys), pointer :: lwp_ex (:) => null() !< liquid water path from microphysics @@ -2665,6 +2673,10 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%snowfallac_ice (IM)) allocate (Sfcprop%acsnow_land (IM)) allocate (Sfcprop%acsnow_ice (IM)) + allocate (Sfcprop%xlaixy (IM)) + allocate (Sfcprop%fire_heat_flux_out (IM)) + allocate (Sfcprop%frac_grid_burned_out (IM)) + ! Sfcprop%wetness = clear_val Sfcprop%sh2o = clear_val @@ -2683,13 +2695,12 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%snowfallac_ice = clear_val Sfcprop%acsnow_land = clear_val Sfcprop%acsnow_ice = clear_val + Sfcprop%xlaixy = clear_val + Sfcprop%fire_heat_flux_out = clear_val + Sfcprop%frac_grid_burned_out = clear_val ! - if (Model%rdlai) then - allocate (Sfcprop%xlaixy (IM)) - Sfcprop%xlaixy = clear_val - end if - end if + allocate (Sfcprop%rmol (IM )) allocate (Sfcprop%flhc (IM )) allocate (Sfcprop%flqc (IM )) @@ -3472,7 +3483,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & integer :: lsoil_lsm = -1 !< number of soil layers internal to land surface model; -1 use lsoil integer :: lsnow_lsm = 3 !< maximum number of snow layers internal to land surface model logical :: exticeden = .false. !< Use variable precip ice density for NOAH LSM if true or original formulation - logical :: rdlai = .false. !< read LAI from input file (for RUC LSM or NOAH LSM WRFv4) + logical :: rdlai = .false. !< read LAI from input file at cold start (for RUC LSM or NOAH LSM WRFv4) logical :: ua_phys = .false. !< flag for using University of Arizona? extension to NOAH LSM WRFv4 logical :: usemonalb = .true. !< flag to read surface diffused shortwave albedo from input file for NOAH LSM WRFv4 real(kind=kind_phys) :: aoasis = 1.0 !< potential evaporation multiplication factor for NOAH LSM WRFv4 @@ -3515,6 +3526,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: use_ufo = .false. !< flag for gcycle surface option + logical :: add_fire_heat_flux = .false. !< Flag for fire heat flux + logical :: lcurr_sf = .false. !< flag for taking ocean currents into account in GFDL surface layer logical :: pert_cd = .false. !< flag for perturbing the surface drag coefficient for momentum in surface layer scheme integer :: ntsflg = 0 !< flag for updating skin temperature in the GFDL surface layer scheme @@ -3926,6 +3939,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & iopt_inf, iopt_rad,iopt_alb,iopt_snf,iopt_tbot,iopt_stc, & iopt_trs, iopt_diag, & ! RUC lsm options + add_fire_heat_flux, & mosaic_lu, mosaic_soil, isncond_opt, isncovr_opt, & ! GFDL surface layer options lcurr_sf, pert_cd, ntsflg, sfenth, & @@ -4702,6 +4716,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%mosaic_soil = mosaic_soil Model%isncond_opt = isncond_opt Model%isncovr_opt = isncovr_opt + Model%add_fire_heat_flux = add_fire_heat_flux ! JLS !--- tuning parameters for physical parameterizations Model%ras = ras @@ -5666,6 +5681,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & print *,' mosaic_soil = ',mosaic_soil print *,' isncond_opt = ',isncond_opt print *,' isncovr_opt = ',isncovr_opt + print *,' add_fire_heat_flux = ',add_fire_heat_flux else print *,' Unsupported LSM type - job aborted - lsm=',Model%lsm stop @@ -7700,6 +7716,7 @@ subroutine diag_create (Diag, IM, Model) !--- 3D diagnostics for Thompson MP / GFDL MP allocate (Diag%refl_10cm(IM,Model%levs)) + allocate (Diag%max_hail_diam_sfc(IM)) !--- New PBL Diagnostics allocate (Diag%dkt(IM,Model%levs)) @@ -7735,8 +7752,9 @@ subroutine diag_create (Diag, IM, Model) allocate (Diag%qbuoy (IM,Model%levs)) allocate (Diag%qdiss (IM,Model%levs)) endif - allocate (Diag%nupdraft (IM)) + allocate (Diag%maxwidth (IM)) allocate (Diag%maxmf (IM)) + allocate (Diag%ztop_plume(IM)) allocate (Diag%ktop_plume(IM)) allocate (Diag%exch_h (IM,Model%levs)) allocate (Diag%exch_m (IM,Model%levs)) @@ -7759,8 +7777,9 @@ subroutine diag_create (Diag, IM, Model) Diag%qbuoy = clear_val Diag%qdiss = clear_val endif - Diag%nupdraft = 0 + Diag%maxwidth = clear_val Diag%maxmf = clear_val + Diag%ztop_plume = clear_val Diag%ktop_plume = 0 Diag%exch_h = clear_val Diag%exch_m = clear_val @@ -7948,8 +7967,9 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) Diag%det_thl = clear_val Diag%det_sqv = clear_val endif - Diag%nupdraft = 0 + Diag%maxwidth = clear_val Diag%maxmf = clear_val + Diag%ztop_plume = clear_val Diag%ktop_plume = 0 Diag%exch_h = clear_val Diag%exch_m = clear_val @@ -8053,6 +8073,7 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) ! max hourly diagnostics Diag%refl_10cm = -35. + Diag%max_hail_diam_sfc = -999. Diag%refdmax = -35. Diag%refdmax263k = -35. Diag%t02max = -999. diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index d028a5834..deea0ad25 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -971,6 +971,22 @@ type = real kind = kind_phys active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme) +[fire_heat_flux_out] + standard_name = surface_fire_heat_flux + long_name = heat flux of fire at the surface + units = W m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme) +[frac_grid_burned_out] + standard_name = fraction_of_grid_cell_burning + long_name = ration of the burnt area to the grid cell area + units = frac + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme) [snoalb] standard_name = upper_bound_of_max_albedo_assuming_deep_snow long_name = maximum snow albedo @@ -1630,7 +1646,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_land_surface_scheme == identifier_for_noah_land_surface_scheme .or. control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme .or. (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .and. flag_for_reading_leaf_area_index_from_input)) + active = (control_for_land_surface_scheme == identifier_for_noah_land_surface_scheme .or. control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme .or. control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme) [xsaixy] standard_name = stem_area_index long_name = stem area index @@ -4648,6 +4664,12 @@ units = flag dimensions = () type = integer +[add_fire_heat_flux] + standard_name = flag_for_fire_heat_flux + long_name = flag to add fire heat flux to LSM + units = flag + dimensions = () + type = logical [isncond_opt] standard_name = control_for_soil_thermal_conductivity_option_in_ruc_lsm long_name = control for soil thermal conductivity option in RUC land surface model @@ -9006,6 +9028,13 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys +[max_hail_diam_sfc] + standard_name = max_hail_diameter_sfc + long_name = instantaneous maximum hail diameter at lowest model level + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys [dkt] standard_name = atmosphere_heat_diffusivity long_name = atmospheric heat diffusivity @@ -9189,12 +9218,13 @@ type = real kind = kind_phys active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme .and. control_for_tke_budget_output == 1) -[nupdraft] - standard_name = number_of_plumes - long_name = number of plumes per grid column - units = count +[maxwidth] + standard_name = maximum_width_of_plumes + long_name = maximum width of plumes per grid column + units = m dimensions = (horizontal_loop_extent) - type = integer + type = real + kind = kind_phys active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme) [maxMF] standard_name = maximum_mass_flux @@ -9204,6 +9234,14 @@ type = real kind = kind_phys active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme) +[ztop_plume] + standard_name = height_of_tallest_plume_in_a_column + long_name = height of tallest plume in a column + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme) [ktop_shallow] standard_name = k_level_of_highest_reaching_plume long_name = k-level of highest reaching plume diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index e3512528c..42b1d1d66 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -2175,6 +2175,28 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%gfluxi(:) enddo + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'wilt' + ExtDiag(idx)%desc = 'wiltimg point (volumetric)' + ExtDiag(idx)%unit = 'Proportion' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%smcwlt2(:) + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'fldcp' + ExtDiag(idx)%desc = 'Field Capacity (volumetric)' + ExtDiag(idx)%unit = 'fraction' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%smcref2(:) + enddo + if (Model%lsm == Model%lsm_noahmp) then idx = idx + 1 ExtDiag(idx)%axes = 2 @@ -2199,28 +2221,6 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%epi(:) enddo - idx = idx + 1 - ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'wilt' - ExtDiag(idx)%desc = 'wiltimg point (volumetric)' - ExtDiag(idx)%unit = 'Proportion' - ExtDiag(idx)%mod_name = 'gfs_phys' - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%smcwlt2(:) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'fldcp' - ExtDiag(idx)%desc = 'Field Capacity (volumetric)' - ExtDiag(idx)%unit = 'fraction' - ExtDiag(idx)%mod_name = 'gfs_phys' - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%smcref2(:) - enddo - idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'wet1' @@ -2317,6 +2317,17 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%refl_10cm(:,:) enddo + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'max_hail_diam_sfc' + ExtDiag(idx)%desc = 'Maximum hail diameter at lowest model level' + ExtDiag(idx)%unit = 'm' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%max_hail_diam_sfc(:) + enddo + idx = idx + 1 ExtDiag(idx)%axes = 3 ExtDiag(idx)%name = 'dkt' @@ -4105,7 +4116,6 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%visdfdi(:) enddo - if (Model%rdlai) then idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'xlaixy' @@ -4116,7 +4126,6 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop do nb = 1,nblks ExtDiag(idx)%data(nb)%var2 => sfcprop(nb)%xlaixy(:) enddo - endif do num = 1,Model%nvegcat write (xtra,'(i2)') num @@ -4550,6 +4559,29 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop end if thompson_extended_diagnostics if (Model%rrfs_sd .and. Model%ntsmoke>0) then + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'fire_heat' + ExtDiag(idx)%desc = 'surface fire heat flux' + ExtDiag(idx)%unit = 'W m-2' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%fire_heat_flux_out + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'burned' + ExtDiag(idx)%desc = 'ration of the burnt area to the grid cell area' + ExtDiag(idx)%unit = 'frac' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%frac_grid_burned_out + enddo + idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'emdust' @@ -4808,16 +4840,16 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop !MYNN if (Model%do_mynnedmf) then - !idx = idx + 1 - !ExtDiag(idx)%axes = 2 - !ExtDiag(idx)%name = 'ktop_plume' - !ExtDiag(idx)%desc = 'k-level of plume top' - !ExtDiag(idx)%unit = 'n/a' - !ExtDiag(idx)%mod_name = 'gfs_sfc' - !allocate (ExtDiag(idx)%data(nblks)) - !do nb = 1,nblks - ! ExtDiag(idx)%data(nb)%var2 => real(IntDiag(nb)%ktop_plume(:),kind=kind_phys) - !enddo + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'ztop_plume' + ExtDiag(idx)%desc = 'height of highest plume' + ExtDiag(idx)%unit = 'm' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ztop_plume(:) + enddo idx = idx + 1 ExtDiag(idx)%axes = 2 @@ -4830,16 +4862,16 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%maxmf(:) enddo - !idx = idx + 1 - !ExtDiag(idx)%axes = 2 - !ExtDiag(idx)%name = 'nupdraft' - !ExtDiag(idx)%desc = 'number of plumes in grid column' - !ExtDiag(idx)%unit = 'n/a' - !ExtDiag(idx)%mod_name = 'gfs_sfc' - !allocate (ExtDiag(idx)%data(nblks)) - !do nb = 1,nblks - ! ExtDiag(idx)%data(nb)%var2 => real(IntDiag(nb)%nupdraft(:),kind=kind_phys) - !enddo + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'maxwidth' + ExtDiag(idx)%desc = 'maximum width of plumes in grid column' + ExtDiag(idx)%unit = 'm' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%maxwidth(:) + enddo endif if (Model%do_mynnsfclay) then diff --git a/ccpp/physics b/ccpp/physics index 2b7bb29fd..d566ea4ae 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 2b7bb29fda845a558e6ea8000e948a4a6e0ae0d6 +Subproject commit d566ea4ae7dc777f8c1fcdfbda75a6ff150b168a From cd2c3b7ac0c613148ab2f956505b55f1d47a20ef Mon Sep 17 00:00:00 2001 From: Denise Worthen Date: Mon, 20 Nov 2023 13:13:45 -0700 Subject: [PATCH 02/41] fix grv function used by NST (#722) * point to bugfix branch: fix grv function used by NST --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index d566ea4ae..ade9c106a 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit d566ea4ae7dc777f8c1fcdfbda75a6ff150b168a +Subproject commit ade9c106a4bc32fa622341b76449070c912fd7a2 From 65c60173d420548380838ed93418c1c1b4c3c370 Mon Sep 17 00:00:00 2001 From: Dusan Jovic <48258889+DusanJovic-NOAA@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:41:31 -0500 Subject: [PATCH 03/41] Add option to use netcdf quantization (#718) * Add options to specify netcdf quantize mode * Remove old quantize routines --- io/module_fv3_io_def.F90 | 3 +- io/module_write_netcdf.F90 | 131 +++++++----------------------------- io/module_wrt_grid_comp.F90 | 34 +++++----- 3 files changed, 44 insertions(+), 124 deletions(-) diff --git a/io/module_fv3_io_def.F90 b/io/module_fv3_io_def.F90 index fd9c129e0..2689ef1c2 100644 --- a/io/module_fv3_io_def.F90 +++ b/io/module_fv3_io_def.F90 @@ -29,7 +29,8 @@ module module_fv3_io_def real,dimension(:),allocatable :: cen_lon, cen_lat real,dimension(:),allocatable :: lon1, lat1, lon2, lat2, dlon, dlat real,dimension(:),allocatable :: stdlat1, stdlat2, dx, dy - integer,dimension(:),allocatable :: ideflate, nbits, zstandard_level + integer,dimension(:),allocatable :: ideflate, quantize_nsd, zstandard_level + character(len=esmf_maxstr),dimension(:),allocatable :: quantize_mode integer,dimension(:),allocatable :: ichunk2d, jchunk2d, ichunk3d, jchunk3d, kchunk3d end module module_fv3_io_def diff --git a/io/module_write_netcdf.F90 b/io/module_write_netcdf.F90 index 86650c6e7..e9670945b 100644 --- a/io/module_write_netcdf.F90 +++ b/io/module_write_netcdf.F90 @@ -10,7 +10,7 @@ module module_write_netcdf use mpi use esmf use netcdf - use module_fv3_io_def,only : ideflate, nbits, zstandard_level, & + use module_fv3_io_def,only : ideflate, quantize_mode, quantize_nsd, zstandard_level, & ichunk2d,jchunk2d,ichunk3d,jchunk3d,kchunk3d, & dx,dy,lon1,lat1,lon2,lat2, & time_unlimited @@ -21,11 +21,6 @@ module module_write_netcdf logical :: par - interface quantize_array - module procedure quantize_array_3d - module procedure quantize_array_4d - end interface - contains !---------------------------------------------------------------------------------------- @@ -86,6 +81,7 @@ subroutine write_netcdf(wrtfb, filename, & integer, dimension(:), allocatable :: dimids_2d, dimids_3d, dimids, chunksizes integer, dimension(:), allocatable :: varids integer :: xtype + integer :: quant_mode integer :: ishuffle logical shuffle @@ -358,10 +354,10 @@ subroutine write_netcdf(wrtfb, filename, & ncerr = nf90_def_var_chunking(ncid, varids(i), NF90_CHUNKED, chunksizes) ; NC_ERR_STOP(ncerr) end if - ishuffle = NF90_SHUFFLE - ! shuffle filter off for 3d fields using lossy compression - if (rank == 3 .and. nbits(grid_id) > 0) then - ishuffle = NF90_NOSHUFFLE + ishuffle = NF90_NOSHUFFLE + ! shuffle filter on when using lossy compression + if ( quantize_nsd(grid_id) > 0) then + ishuffle = NF90_SHUFFLE end if if (ideflate(grid_id) > 0) then ncerr = nf90_def_var_deflate(ncid, varids(i), ishuffle, 1, ideflate(grid_id)) ; NC_ERR_STOP(ncerr) @@ -370,6 +366,24 @@ subroutine write_netcdf(wrtfb, filename, & ncerr = nf90_def_var_zstandard(ncid, varids(i), zstandard_level(grid_id)) ; NC_ERR_STOP(ncerr) end if + ! turn on quantize only for 3d variables and if requested + if (rank == 3 .and. quantize_nsd(grid_id) > 0) then + ! nf90_quantize_bitgroom = 1 + ! nf90_quantize_granularbr = 2 + ! nf90_quantize_bitround = 3 (nsd is number of bits) + if (trim(quantize_mode(grid_id)) == 'quantize_bitgroom') then + quant_mode = 1 + else if (trim(quantize_mode(grid_id)) == 'quantize_granularbr') then + quant_mode = 2 + else if (trim(quantize_mode(grid_id)) == 'quantize_bitround') then + quant_mode = 3 + else + if (mype==0) write(0,*)'Unknown quantize_mode ', trim(quantize_mode(grid_id)) + call ESMF_Finalize(endflag=ESMF_END_ABORT) + endif + + ncerr = nf90_def_var_quantize(ncid, varids(i), quant_mode, quantize_nsd(grid_id)) ; NC_ERR_STOP(ncerr) + end if end if if (par) then @@ -626,14 +640,6 @@ subroutine write_netcdf(wrtfb, filename, & if (typekind == ESMF_TYPEKIND_R4) then if (par) then call ESMF_FieldGet(fcstField(i), localDe=0, farrayPtr=array_r4_3d, rc=rc); ESMF_ERR_RETURN(rc) - if ((ideflate(grid_id) > 0 .or. zstandard_level(grid_id) > 0) .and. nbits(grid_id) > 0) then - dataMax = maxval(array_r4_3d) - dataMin = minval(array_r4_3d) - call mpi_allreduce(mpi_in_place,dataMax,1,mpi_real4,mpi_max,mpi_comm,ierr) - call mpi_allreduce(mpi_in_place,dataMin,1,mpi_real4,mpi_min,mpi_comm,ierr) - call quantize_array(array_r4_3d, dataMin, dataMax, nbits(grid_id), compress_err(i)) - call mpi_allreduce(mpi_in_place,compress_err(i),1,mpi_real4,mpi_max,mpi_comm,ierr) - end if ncerr = nf90_put_var(ncid, varids(i), values=array_r4_3d, start=start_idx); NC_ERR_STOP(ncerr) else if (is_cubed_sphere) then @@ -642,17 +648,11 @@ subroutine write_netcdf(wrtfb, filename, & call ESMF_ArrayGather(array, array_r4_3d_cube(:,:,:,t), rootPet=0, tile=t, rc=rc); ESMF_ERR_RETURN(rc) end do if (mype==0) then - if ((ideflate(grid_id) > 0 .or. zstandard_level(grid_id) > 0) .and. nbits(grid_id) > 0) then - call quantize_array(array_r4_3d_cube, minval(array_r4_3d_cube), maxval(array_r4_3d_cube), nbits(grid_id), compress_err(i)) - end if ncerr = nf90_put_var(ncid, varids(i), values=array_r4_3d_cube, start=start_idx); NC_ERR_STOP(ncerr) end if else call ESMF_FieldGather(fcstField(i), array_r4_3d, rootPet=0, rc=rc); ESMF_ERR_RETURN(rc) if (mype==0) then - if ((ideflate(grid_id) > 0 .or. zstandard_level(grid_id) > 0) .and. nbits(grid_id) > 0) then - call quantize_array(array_r4_3d, minval(array_r4_3d), maxval(array_r4_3d), nbits(grid_id), compress_err(i)) - end if ncerr = nf90_put_var(ncid, varids(i), values=array_r4_3d, start=start_idx); NC_ERR_STOP(ncerr) end if end if @@ -688,17 +688,6 @@ subroutine write_netcdf(wrtfb, filename, & end do ! end fieldCount - if ((ideflate(grid_id) > 0 .or. zstandard_level(grid_id) > 0) .and. nbits(grid_id) > 0 .and. do_io) then - ncerr = nf90_redef(ncid=ncid); NC_ERR_STOP(ncerr) - do i=1, fieldCount - if (compress_err(i) > 0) then - ncerr = nf90_put_att(ncid, varids(i), 'max_abs_compression_error', compress_err(i)); NC_ERR_STOP(ncerr) - ncerr = nf90_put_att(ncid, varids(i), 'nbits', nbits(grid_id)); NC_ERR_STOP(ncerr) - end if - end do - ncerr = nf90_enddef(ncid=ncid); NC_ERR_STOP(ncerr) - end if - if (.not. par) then deallocate(array_r4) deallocate(array_r8) @@ -923,77 +912,5 @@ subroutine add_dim(ncid, dim_name, dimid, grid, mype, rc) end subroutine add_dim -!---------------------------------------------------------------------------------------- - subroutine quantize_array_3d(array, dataMin, dataMax, nbits, compress_err) - - real(4), dimension(:,:,:), intent(inout) :: array - real(4), intent(in) :: dataMin, dataMax - integer, intent(in) :: nbits - real(4), intent(out) :: compress_err - - real(4) :: scale_fact, offset - real(4), dimension(:,:,:), allocatable :: array_save - ! Lossy compression if nbits>0. - ! The floating point data is quantized to improve compression - ! See doi:10.5194/gmd-10-413-2017. The method employed - ! here is identical to the 'scaled linear packing' method in - ! that paper, except that the data are scaling into an arbitrary - ! range (2**nbits-1 not just 2**16-1) and are stored as - ! re-scaled floats instead of short integers. - ! The zlib algorithm does almost as - ! well packing the re-scaled floats as it does the scaled - ! integers, and this avoids the need for the client to apply the - ! rescaling (plus it allows the ability to adjust the packing - ! range). - scale_fact = (dataMax - dataMin) / (2**nbits-1) - offset = dataMin - if (scale_fact > 0.) then - allocate(array_save, source=array) - array = scale_fact*(nint((array_save - offset) / scale_fact)) + offset - ! compute max abs compression error - compress_err = maxval(abs(array_save-array)) - deallocate(array_save) - else - ! field is constant - compress_err = 0. - end if - end subroutine quantize_array_3d - - subroutine quantize_array_4d(array, dataMin, dataMax, nbits, compress_err) - - real(4), dimension(:,:,:,:), intent(inout) :: array - real(4), intent(in) :: dataMin, dataMax - integer, intent(in) :: nbits - real(4), intent(out) :: compress_err - - real(4) :: scale_fact, offset - real(4), dimension(:,:,:,:), allocatable :: array_save - - ! Lossy compression if nbits>0. - ! The floating point data is quantized to improve compression - ! See doi:10.5194/gmd-10-413-2017. The method employed - ! here is identical to the 'scaled linear packing' method in - ! that paper, except that the data are scaling into an arbitrary - ! range (2**nbits-1 not just 2**16-1) and are stored as - ! re-scaled floats instead of short integers. - ! The zlib algorithm does almost as - ! well packing the re-scaled floats as it does the scaled - ! integers, and this avoids the need for the client to apply the - ! rescaling (plus it allows the ability to adjust the packing - ! range). - scale_fact = (dataMax - dataMin) / (2**nbits-1) - offset = dataMin - if (scale_fact > 0.) then - allocate(array_save, source=array) - array = scale_fact*(nint((array_save - offset) / scale_fact)) + offset - ! compute max abs compression error - compress_err = maxval(abs(array_save-array)) - deallocate(array_save) - else - ! field is constant - compress_err = 0. - end if - end subroutine quantize_array_4d - !---------------------------------------------------------------------------------------- end module module_write_netcdf diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index ec8135217..bcca85ab4 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -36,7 +36,8 @@ module module_wrt_grid_comp n_group, num_files, & filename_base, output_grid, output_file, & imo,jmo,ichunk2d,jchunk2d, & - ichunk3d,jchunk3d,kchunk3d,nbits, & + ichunk3d,jchunk3d,kchunk3d, & + quantize_mode,quantize_nsd, & nsout => nsout_io, & cen_lon, cen_lat, & lon1, lat1, lon2, lat2, dlon, dlat, & @@ -361,7 +362,8 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, allocate(jchunk3d(ngrids)) allocate(kchunk3d(ngrids)) allocate(ideflate(ngrids)) - allocate(nbits(ngrids)) + allocate(quantize_mode(ngrids)) + allocate(quantize_nsd(ngrids)) allocate(zstandard_level(ngrids)) allocate(wrt_int_state%out_grid_info(ngrids)) @@ -472,28 +474,33 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, call ESMF_ConfigGetAttribute(config=CF,value=zstandard_level(n),default=0,label ='zstandard_level:',rc=rc) if (zstandard_level(n) < 0) zstandard_level(n)=0 - call ESMF_ConfigGetAttribute(config=CF,value=nbits(n),default=0,label ='nbits:',rc=rc) - ! zlib compression flag call ESMF_ConfigGetAttribute(config=CF,value=ideflate(n),default=0,label ='ideflate:',rc=rc) if (ideflate(n) < 0) ideflate(n)=0 - call ESMF_ConfigGetAttribute(config=CF,value=nbits(n),default=0,label ='nbits:',rc=rc) - if (ideflate(n) > 0 .and. zstandard_level(n) > 0) then write(0,*)"wrt_initialize_p1: zlib and zstd compression cannot be both enabled at the same time" call ESMF_LogWrite("wrt_initialize_p1: zlib and zstd compression cannot be both enabled at the same time",ESMF_LOGMSG_ERROR,rc=RC) call ESMF_Finalize(endflag=ESMF_END_ABORT) end if + ! quantize_mode and quantize_nsd + call ESMF_ConfigGetAttribute(config=CF,value=quantize_mode(n),default='quantize_bitgroom',label='quantize_mode:',rc=rc) + call ESMF_ConfigGetAttribute(config=CF,value=quantize_nsd(n),default=0,label='quantize_nsd:',rc=rc) + + if (.NOT. (trim(quantize_mode(n))=='quantize_bitgroom' & + .OR. trim(quantize_mode(n))=='quantize_granularbr' & + .OR. trim(quantize_mode(n))=='quantize_bitround') ) then + write(0,*)"wrt_initialize_p1: unknown quantize_mode ", trim(quantize_mode(n)) + call ESMF_LogWrite("wrt_initialize_p1: wrt_initialize_p1: unknown quantize_mode "//trim(quantize_mode(n)),ESMF_LOGMSG_ERROR,rc=RC) + call ESMF_Finalize(endflag=ESMF_END_ABORT) + end if + if (lprnt) then - print *,'ideflate=',ideflate(n),' nbits=',nbits(n) + print *,'ideflate=',ideflate(n) + print *,'quantize_mode=',trim(quantize_mode(n)),' quantize_nsd=',quantize_nsd(n) print *,'zstandard_level=',zstandard_level(n) end if - ! nbits quantization level for lossy compression (must be between 1 and 31) - ! 1 is most compression, 31 is least. If outside this range, set to zero - ! which means use lossless compression. - if (nbits(n) < 1 .or. nbits(n) > 31) nbits(n)=0 ! lossless compression (no quantization) if (cf_output_grid /= cf) then ! destroy the temporary config object created for nest domains @@ -2386,11 +2393,6 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return endif - if (nbits(grid_id) /= 0) then - call ESMF_LogWrite("wrt_run: lossy compression is not supported for regional grids",ESMF_LOGMSG_ERROR,rc=RC) - call ESMF_Finalize(endflag=ESMF_END_ABORT) - end if - call write_netcdf(wrt_int_state%wrtFB(nbdl),trim(filename), & use_parallel_netcdf, wrt_mpi_comm,wrt_int_state%mype, & grid_id,rc) From 7eec3ceb4062ad761af2b6f6a9e133f1b948b3e1 Mon Sep 17 00:00:00 2001 From: Denise Worthen Date: Wed, 29 Nov 2023 17:50:26 -0500 Subject: [PATCH 04/41] fix type mis-matches in nst water property module (#719) --- ccpp/config/ccpp_prebuild_config.py | 6 +++--- ccpp/physics | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index a96b067ac..268eb2166 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -186,9 +186,9 @@ 'physics/physics/noahmpdrv.F90', 'physics/physics/flake_driver.F90', 'physics/physics/clm_lake.f90', - 'physics/physics/sfc_nst_pre.f', - 'physics/physics/sfc_nst.f', - 'physics/physics/sfc_nst_post.f', + 'physics/physics/sfc_nst_pre.f90', + 'physics/physics/sfc_nst.f90', + 'physics/physics/sfc_nst_post.f90', 'physics/physics/sfc_ocean.F', 'physics/physics/sfc_sice.f', # HAFS FER_HIRES diff --git a/ccpp/physics b/ccpp/physics index ade9c106a..a77ed1647 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit ade9c106a4bc32fa622341b76449070c912fd7a2 +Subproject commit a77ed1647440a3acd83625f46b1605f8b8239093 From 1f7af4b8abc69d6f8c9a435804ea55ba18d18df2 Mon Sep 17 00:00:00 2001 From: ericaligo-NOAA <48365233+ericaligo-NOAA@users.noreply.github.com> Date: Fri, 1 Dec 2023 10:38:48 -0500 Subject: [PATCH 05/41] Convective Reflectivity (#720) * Convective reflectivity added for NSSL,Thompson mp,SAS,GF shal/deep * Bug fix: htop intent set to in, modified if condition for convective refl. * Bug fix for conv refl,remove conv refl computation from the cu_gf driver * clean up a bit, remove comments and temporary parameters * Take advantage of onebg to avoid division * Replace 273.16 with already defined physical constant, con_t0c --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index a77ed1647..c0aa212db 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit a77ed1647440a3acd83625f46b1605f8b8239093 +Subproject commit c0aa212dbc255ac5d77934c3cd6283c994bbfd99 From ba6e8ea442b2d0d5992a8550db6d0c720ff338d2 Mon Sep 17 00:00:00 2001 From: Jili Dong Date: Mon, 4 Dec 2023 11:36:30 -0500 Subject: [PATCH 06/41] add 5 ccpp SDFs in support of RRFS multiphysics ensemble (#721) * add 5 ccpp SDFs in support of RRFS ensemble * add one more ccpp SDF for RRFS fire weather application by removing GWD in FV3_HRRR_gf --- ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml | 84 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy1.xml | 86 +++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy2.xml | 83 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy3.xml | 83 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy4.xml | 84 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy5.xml | 81 +++++++++++++++++++++++ 6 files changed, 501 insertions(+) create mode 100644 ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml create mode 100644 ccpp/suites/suite_RRFSens_phy1.xml create mode 100644 ccpp/suites/suite_RRFSens_phy2.xml create mode 100644 ccpp/suites/suite_RRFSens_phy3.xml create mode 100644 ccpp/suites/suite_RRFSens_phy4.xml create mode 100644 ccpp/suites/suite_RRFSens_phy5.xml diff --git a/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml new file mode 100644 index 000000000..3e4b862c9 --- /dev/null +++ b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml @@ -0,0 +1,84 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + 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 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + rrfs_smoke_wrapper + mynnedmf_wrapper + rrfs_smoke_postpbl + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy1.xml b/ccpp/suites/suite_RRFSens_phy1.xml new file mode 100644 index 000000000..0cd4c47b8 --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy1.xml @@ -0,0 +1,86 @@ + + + + + + + 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_pre + 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_ocean + lsm_ruc + clm_lake + 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 + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy2.xml b/ccpp/suites/suite_RRFSens_phy2.xml new file mode 100644 index 000000000..e1ecc7149 --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy2.xml @@ -0,0 +1,83 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + 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 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + drag_suite + 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_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy3.xml b/ccpp/suites/suite_RRFSens_phy3.xml new file mode 100644 index 000000000..85e7189bd --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy3.xml @@ -0,0 +1,83 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + 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 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_nssl + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy4.xml b/ccpp/suites/suite_RRFSens_phy4.xml new file mode 100644 index 000000000..35c7b052f --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy4.xml @@ -0,0 +1,84 @@ + + + + + + + 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_pre + 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_ocean + lsm_ruc + clm_lake + 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 + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_nssl + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy5.xml b/ccpp/suites/suite_RRFSens_phy5.xml new file mode 100644 index 000000000..26bb32584 --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy5.xml @@ -0,0 +1,81 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + 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 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + drag_suite + 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_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_nssl + GFS_MP_generic_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + From a82381c0b751a15e5343de5078ef836b2c444c89 Mon Sep 17 00:00:00 2001 From: Dusan Jovic <48258889+DusanJovic-NOAA@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:13:13 -0500 Subject: [PATCH 07/41] Create 'coupler.res' log file in write grid comp. Explicitly specify chunk sizes in restart files (#726) * Write coupler.res log files from the write grid comp if quilting_restart is .true. * Explicitly specify chunk sizes in write_restart_netcdf --- io/module_write_restart_netcdf.F90 | 9 +++++- io/module_wrt_grid_comp.F90 | 50 ++++++++++++++++++++++++++---- module_fcst_grid_comp.F90 | 14 ++++----- 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/io/module_write_restart_netcdf.F90 b/io/module_write_restart_netcdf.F90 index ec46d6f23..2fd4c7732 100644 --- a/io/module_write_restart_netcdf.F90 +++ b/io/module_write_restart_netcdf.F90 @@ -79,7 +79,7 @@ subroutine write_restart_netcdf(wrtfb, filename, & integer :: dimid, dimtype integer :: im_dimid, im_p1_dimid, jm_dimid, jm_p1_dimid, time_dimid integer :: im_varid, im_p1_varid, jm_varid, jm_p1_varid, time_varid - integer, dimension(:), allocatable :: dimids_2d, dimids_3d + integer, dimension(:), allocatable :: dimids_2d, dimids_3d, chunksizes integer, dimension(:), allocatable :: varids, zaxis_dimids logical shuffle @@ -335,6 +335,7 @@ subroutine write_restart_netcdf(wrtfb, filename, & ! define variables if (rank == 2) then dimids_2d = [im_dimid,jm_dimid, time_dimid] + chunksizes = [im, jm, 1] if (typekind == ESMF_TYPEKIND_R4) then ncerr = nf90_def_var(ncid, trim(fldName), NF90_FLOAT, dimids_2d, varids(i)); NC_ERR_STOP(ncerr) else if (typekind == ESMF_TYPEKIND_R8) then @@ -346,13 +347,17 @@ subroutine write_restart_netcdf(wrtfb, filename, & else if (rank == 3) then if ( .not.is_restart_core ) then dimids_3d = [im_dimid,jm_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im, jm, 1, 1] else if (staggerloc == ESMF_STAGGERLOC_CENTER) then dimids_3d = [im_dimid,jm_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im, jm, 1, 1] else if (staggerloc == ESMF_STAGGERLOC_EDGE1) then ! east dimids_3d = [im_p1_dimid,jm_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im+1, jm, 1, 1] else if (staggerloc == ESMF_STAGGERLOC_EDGE2) then ! south dimids_3d = [im_dimid,jm_p1_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im, jm+1, 1, 1] else if (mype==0) write(0,*)'Unsupported staggerloc ', staggerloc call ESMF_Finalize(endflag=ESMF_END_ABORT) @@ -374,6 +379,8 @@ subroutine write_restart_netcdf(wrtfb, filename, & ncerr = nf90_var_par_access(ncid, varids(i), par_access); NC_ERR_STOP(ncerr) end if + ncerr = nf90_def_var_chunking(ncid, varids(i), NF90_CHUNKED, chunksizes) ; NC_ERR_STOP(ncerr) + if (zstandard_level(1) > 0) then ncerr = nf90_def_var_zstandard(ncid, varids(i), zstandard_level(1)) if (ncerr /= nf90_noerr) then diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index bcca85ab4..b59fe5e45 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -44,7 +44,7 @@ module module_wrt_grid_comp stdlat1, stdlat2, dx, dy, iau_offset, & ideflate, zstandard_level, lflname_fulltime use module_write_netcdf, only : write_netcdf - use module_write_restart_netcdf + use module_write_restart_netcdf, only : write_restart_netcdf use physcons, only : pi => con_pi #ifdef INLINE_POST use post_fv3, only : post_run_fv3 @@ -68,10 +68,11 @@ module module_wrt_grid_comp integer,save :: ngrids integer,save :: wrt_mpi_comm !<-- the mpi communicator in the write comp - integer,save :: idate(7) + integer,save :: idate(7), start_time(7) logical,save :: write_nsflip logical,save :: change_wrtidate=.false. integer,save :: frestart(999) = -1 + integer,save :: calendar_type = 3 logical :: lprnt ! !----------------------------------------------------------------------- @@ -840,6 +841,7 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, h=idate(4), m=idate(5), s=idate(6),rc=rc) ! if (lprnt) write(0,*) 'in wrt initial, io_baseline time=',idate,'rc=',rc idate(7) = 1 + start_time = idate wrt_int_state%idate = idate wrt_int_state%fdate = idate ! update IO-BASETIME and idate on write grid comp when IAU is enabled @@ -1333,8 +1335,27 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return +! save calendar_type (as integer) for use in 'coupler.res' + if (index(trim(attNameList(i)),'time:calendar') > 0) then + select case( uppercase(trim(valueS)) ) + case( 'JULIAN' ) + calendar_type = JULIAN + case( 'GREGORIAN' ) + calendar_type = GREGORIAN + case( 'NOLEAP' ) + calendar_type = NOLEAP + case( 'THIRTY_DAY' ) + calendar_type = THIRTY_DAY_MONTHS + case( 'NO_CALENDAR' ) + calendar_type = NO_CALENDAR + case default + call mpp_error ( FATAL, 'fcst_initialize: calendar must be one of '// & + 'JULIAN|GREGORIAN|NOLEAP|THIRTY_DAY|NO_CALENDAR.' ) + end select + endif + ! update the time:units when idate on write grid component is changed - if ( index(trim(attNameList(i)),'time:units')>0) then + if (index(trim(attNameList(i)),'time:units') > 0) then if ( change_wrtidate ) then idx = index(trim(valueS),' since ') if(lprnt) print *,'in write grid comp, time:unit=',trim(valueS) @@ -1795,7 +1816,7 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) logical :: use_parallel_netcdf real, allocatable :: output_fh(:) - logical :: is_restart_bundle + logical :: is_restart_bundle, restart_written integer :: tileCount ! !----------------------------------------------------------------------- @@ -2151,6 +2172,8 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) ! if (lprnt) write(0,*)'wrt_run: loop over wrt_int_state%FBCount ',wrt_int_state%FBCount, ' nfhour ', nfhour, ' cdate ', cdate(1:6) two_phase_loop: do out_phase = 1, 2 + + restart_written = .false. file_loop_all: do nbdl=1, wrt_int_state%FBCount call ESMF_FieldBundleGet(wrt_int_state%wrtFB(nbdl), name=wrtFBName, rc=rc) @@ -2349,6 +2372,8 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) rc) endif ! cubed sphere vs. regional/nest write grid + restart_written = .true. + else ! history bundle if (trim(output_grid(grid_id)) == 'cubed_sphere_grid') then @@ -2413,13 +2438,26 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) enddo file_loop_all if (out_phase == 1 .and. mype == lead_write_task) then - !** write out log file - open(newunit=nolog,file='log.atm.f'//trim(cfhour),form='FORMATTED') + !** write history log file + open(newunit=nolog, file='log.atm.f'//trim(cfhour)) write(nolog,"('completed: fv3atm')") write(nolog,"('forecast hour: ',f10.3)") nfhour write(nolog,"('valid time: ',6(i4,2x))") wrt_int_state%fdate(1:6) close(nolog) endif + + if (out_phase == 2 .and. restart_written .and. mype == lead_write_task) then + !** write coupler.res log file + open(newunit=nolog, file='RESTART/'//trim(time_restart)//'.coupler.res', status='new') + write(nolog,"(i6,8x,a)") calendar_type , & + '(Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4)' + write(nolog,"(6i6,8x,a)") start_time(1:6), & + 'Model start time: year, month, day, hour, minute, second' + write(nolog,"(6i6,8x,a)") wrt_int_state%fdate(1:6), & + 'Current model time: year, month, day, hour, minute, second' + close(nolog) + endif + enddo two_phase_loop endif ! if ( wrt_int_state%output_history ) diff --git a/module_fcst_grid_comp.F90 b/module_fcst_grid_comp.F90 index 4bc7bfe52..ea622369c 100644 --- a/module_fcst_grid_comp.F90 +++ b/module_fcst_grid_comp.F90 @@ -921,11 +921,11 @@ subroutine fcst_initialize(fcst_comp, importState, exportState, clock, rc) ! Add time Attribute to the exportState call ESMF_AttributeAdd(exportState, convention="NetCDF", purpose="FV3", & attrList=(/ "time ", & - "time:long_name ", & - "time:units ", & - "time:cartesian_axis", & - "time:calendar_type ", & - "time:calendar " /), rc=rc) + "time:long_name ", & + "time:units ", & + "time:cartesian_axis", & + "time:calendar_type ", & + "time:calendar " /), rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return call ESMF_AttributeSet(exportState, convention="NetCDF", purpose="FV3", & @@ -1366,8 +1366,8 @@ subroutine fcst_run_phase_2(fcst_comp, importState, exportState,clock,rc) call atmos_model_restart(Atmos, timestamp) call write_stoch_restart_atm('RESTART/'//trim(timestamp)//'.atm_stoch.res.nc') - !----- write restart file ------ - if (mpp_pe() == mpp_root_pe())then + !----- write coupler.res file ------ + if (.not. quilting_restart .and. mpp_pe() == mpp_root_pe()) then call get_date (Atmos%Time, date(1), date(2), date(3), date(4), date(5), date(6)) open( newunit=unit, file='RESTART/'//trim(timestamp)//'.coupler.res' ) write( unit, '(i6,8x,a)' )calendar_type, & From f221fc5ce66cee86160efa4bc4deb9c861959e19 Mon Sep 17 00:00:00 2001 From: "Samuel Trahan (NOAA contractor)" <39415369+SamuelTrahanNOAA@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:39:28 -0500 Subject: [PATCH 08/41] bug fix: disable concurrency in GFS_phys_time_vary_init NetCDF calls (#735) * Remove nfhout, nfhout_hf, nsout * Do not open 'coupler.res' file with status 'new' * bug fix: no concurrent NetCDF calls in GFS_phys_time_vary_init --------- Co-authored-by: Dusan Jovic --- atmos_model.F90 | 4 +- ccpp/physics | 2 +- fv3_cap.F90 | 73 ++----------------------------------- io/module_fv3_io_def.F90 | 2 +- io/module_wrt_grid_comp.F90 | 5 +-- module_fv3_config.F90 | 2 +- 6 files changed, 10 insertions(+), 78 deletions(-) diff --git a/atmos_model.F90 b/atmos_model.F90 index 25cc61a88..7105f6997 100644 --- a/atmos_model.F90 +++ b/atmos_model.F90 @@ -101,7 +101,7 @@ module atmos_model_mod use fv_ufs_restart_io_mod, only: fv_dyn_restart_register, & fv_dyn_restart_output use fv_iau_mod, only: iau_external_data_type,getiauforcing,iau_initialize -use module_fv3_config, only: first_kdt, nsout, output_fh, & +use module_fv3_config, only: first_kdt, output_fh, & fcst_mpi_comm, fcst_ntasks, & quilting_restart use module_block_data, only: block_atmos_copy, block_data_copy, & @@ -976,7 +976,7 @@ subroutine update_atmos_model_state (Atmos, rc) call get_time (Atmos%Time - diag_time, isec) call get_time (Atmos%Time - Atmos%Time_init, seconds) call atmosphere_nggps_diag(Atmos%Time,ltavg=.true.,avg_max_length=avg_max_length) - if (ANY(nint(output_fh(:)*3600.0) == seconds) .or. (GFS_control%kdt == first_kdt) .or. nsout > 0) then + if (ANY(nint(output_fh(:)*3600.0) == seconds) .or. (GFS_control%kdt == first_kdt)) then if (mpp_pe() == mpp_root_pe()) write(6,*) "---isec,seconds",isec,seconds time_int = real(isec) if(Atmos%iau_offset > zero) then diff --git a/ccpp/physics b/ccpp/physics index c0aa212db..ed7e015b4 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit c0aa212dbc255ac5d77934c3cd6283c994bbfd99 +Subproject commit ed7e015b483a14fc7ae9bf9d0f0cc3d26c517f7e diff --git a/fv3_cap.F90 b/fv3_cap.F90 index ada73a861..5401e66a5 100644 --- a/fv3_cap.F90 +++ b/fv3_cap.F90 @@ -28,7 +28,7 @@ module fv3atm_cap_mod NUOPC_ModelGet ! use module_fv3_config, only: quilting, quilting_restart, output_fh, & - nfhout, nfhout_hf, nsout, dt_atmos, & + dt_atmos, & calendar, cpl_grid_id, & cplprint_flag, first_kdt @@ -36,7 +36,7 @@ module fv3atm_cap_mod num_files, filename_base, & wrttasks_per_group, n_group, & lead_wrttask, last_wrttask, & - nsout_io, iau_offset, lflname_fulltime, & + iau_offset, lflname_fulltime, & time_unlimited ! use module_fcst_grid_comp, only: fcstSS => SetServices @@ -301,7 +301,6 @@ subroutine InitializeAdvertise(gcomp, rc) if(mype == 0) print *,'af ufs config,quilting=',quilting,' calendar=', trim(calendar),' iau_offset=',iau_offset, & ' noutput_fh=',noutput_fh ! - nfhout = 0 ; nfhmax_hf = 0 ; nfhout_hf = 0 ; nsout = 0 if ( quilting ) then call ESMF_ConfigGetAttribute(config=CF,value=use_saved_routehandles, & label ='use_saved_routehandles:', & @@ -334,15 +333,6 @@ subroutine InitializeAdvertise(gcomp, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return enddo -! variables for output - call ESMF_ConfigGetAttribute(config=CF, value=nfhout, label ='nfhout:', default=-1,rc=rc) - call ESMF_ConfigGetAttribute(config=CF, value=nfhmax_hf,label ='nfhmax_hf:',default=-1,rc=rc) - call ESMF_ConfigGetAttribute(config=CF, value=nfhout_hf,label ='nfhout_hf:',default=-1,rc=rc) - call ESMF_ConfigGetAttribute(config=CF, value=nsout, label ='nsout:', default=-1,rc=rc) - nsout_io = nsout -! - if(mype==0) print *,'af ufs config,nfhout,nsout=',nfhout,nfhmax_hf,nfhout_hf, nsout,noutput_fh - call ESMF_ConfigGetAttribute(config=CF, value=time_unlimited, label ='time_unlimited:', default=.false., rc=rc) endif ! quilting @@ -819,64 +809,7 @@ subroutine InitializeAdvertise(gcomp, rc) if(iau_offset > 0) then output_startfh = iau_offset endif - if(mype==0) print *,'in fv3 cap init, output_startfh=',output_startfh,'nsout=',nsout, & - 'iau_offset=',iau_offset,'nfhmax_hf=',nfhmax_hf,'nfhout_hf=',nfhout_hf, & - 'nfhout=',nfhout -! -!--- set up output_fh with output forecast hours -! if the run does not have iau, it will have output after first step integration as fh00 -! if the run has iau, it will start output at fh=00 at the cycle time (usually StartTime+IAU_offsetTI) - if(nsout > 0) then -!--- use nsout for output frequency nsout*dt_atmos - nfh = 0 - if( nfhmax > output_startfh ) nfh = nint((nfhmax-output_startfh)/(nsout*dt_atmos/3600.))+1 - if(nfh >0) then - allocate(output_fh(nfh)) - if( output_startfh == 0) then - output_fh(1) = dt_atmos/3600. - else - output_fh(1) = output_startfh - endif - do i=2,nfh - output_fh(i) = (i-1)*nsout*dt_atmos/3600. + output_startfh - enddo - endif - elseif (nfhmax_hf > 0 ) then -!--- use high frequency output and low frequency for output forecast time - nfh = 0 - if( nfhout_hf>0 .and. nfhmax_hf>output_startfh) nfh = nint((nfhmax_hf-output_startfh)/nfhout_hf)+1 - nfh2 = 0 - if( nfhout>0 .and. nfhmax>nfhmax_hf) nfh2 = nint((nfhmax-nfhmax_hf)/nfhout) - if( nfh+nfh2 > 0) then - allocate(output_fh(nfh+nfh2)) - if( output_startfh == 0) then - output_fh(1) = dt_atmos/3600. - else - output_fh(1) = output_startfh - endif - do i=2,nfh - output_fh(i) = (i-1)*nfhout_hf + output_startfh - enddo - do i=1,nfh2 - output_fh(nfh+i) = nfhmax_hf + i*nfhout - enddo - endif - elseif (nfhout > 0 ) then -!--- use one output freqency - nfh = 0 - if( nfhout > 0 .and. nfhmax>output_startfh) nfh = nint((nfhmax-output_startfh)/nfhout) + 1 - if( nfh > 0 ) then - allocate(output_fh(nfh)) - if( output_startfh == 0) then - output_fh(1) = dt_atmos/3600. - else - output_fh(1) = output_startfh - endif - do i=2,nfh - output_fh(i) = (i-1)*nfhout + output_startfh - enddo - endif - endif + if(mype==0) print *,'in fv3 cap init, output_startfh=',output_startfh,' iau_offset=',iau_offset ! !----------------------------------------------------------------------- !*** SET THE FIRST WRITE GROUP AS THE FIRST ONE TO ACT. diff --git a/io/module_fv3_io_def.F90 b/io/module_fv3_io_def.F90 index 2689ef1c2..dfef37500 100644 --- a/io/module_fv3_io_def.F90 +++ b/io/module_fv3_io_def.F90 @@ -15,7 +15,7 @@ module module_fv3_io_def integer :: n_group integer :: num_files integer :: nbdlphys - integer :: nsout_io, iau_offset + integer :: iau_offset logical :: lflname_fulltime logical :: time_unlimited diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index b59fe5e45..e409788ab 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -38,7 +38,6 @@ module module_wrt_grid_comp imo,jmo,ichunk2d,jchunk2d, & ichunk3d,jchunk3d,kchunk3d, & quantize_mode,quantize_nsd, & - nsout => nsout_io, & cen_lon, cen_lat, & lon1, lat1, lon2, lat2, dlon, dlat, & stdlat1, stdlat2, dx, dy, iau_offset, & @@ -1876,7 +1875,7 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) if (nf_hours < 0) return - if (nsout > 0 .or. lflname_fulltime) then + if (lflname_fulltime) then ndig = max(log10(nf_hours+0.5)+1., 3.) write(cform, '("(I",I1,".",I1,",A1,I2.2,A1,I2.2)")') ndig, ndig write(cfhour, cform) nf_hours,'-',nf_minutes,'-',nf_seconds @@ -2448,7 +2447,7 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) if (out_phase == 2 .and. restart_written .and. mype == lead_write_task) then !** write coupler.res log file - open(newunit=nolog, file='RESTART/'//trim(time_restart)//'.coupler.res', status='new') + open(newunit=nolog, file='RESTART/'//trim(time_restart)//'.coupler.res') write(nolog,"(i6,8x,a)") calendar_type , & '(Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4)' write(nolog,"(6i6,8x,a)") start_time(1:6), & diff --git a/module_fv3_config.F90 b/module_fv3_config.F90 index aac606a5e..7e82c8e24 100644 --- a/module_fv3_config.F90 +++ b/module_fv3_config.F90 @@ -13,7 +13,7 @@ module module_fv3_config implicit none ! - integer :: nfhout, nfhout_hf, nsout, dt_atmos + integer :: dt_atmos integer :: first_kdt integer :: fcst_mpi_comm, fcst_ntasks ! From 87a0ccae64b180d6b45d6f50fa55718d8ff26ede Mon Sep 17 00:00:00 2001 From: "Samuel Trahan (NOAA contractor)" <39415369+SamuelTrahanNOAA@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:46:46 -0500 Subject: [PATCH 09/41] pressure is not density and weasdi is not snodi + #739 and #742 (#736) * pressure is not density * wrong variable sent for snodi * explain lakedepth corruption safeguards * module_sf_ruclsm.f90: explain the snow_mosaic=0 line * add flag to track new freezing lake ice grids * change name of lake_freeze to flag_lakefreeze --------- Co-authored-by: Jili Dong --- ccpp/data/CCPP_typedefs.F90 | 3 +++ ccpp/data/CCPP_typedefs.meta | 6 ++++++ ccpp/driver/GFS_diagnostics.F90 | 4 ++-- ccpp/physics | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ccpp/data/CCPP_typedefs.F90 b/ccpp/data/CCPP_typedefs.F90 index a7da2eca9..7d9351337 100644 --- a/ccpp/data/CCPP_typedefs.F90 +++ b/ccpp/data/CCPP_typedefs.F90 @@ -140,6 +140,7 @@ module CCPP_typedefs logical, pointer :: flag_cice(:) => null() !< logical, pointer :: flag_guess(:) => null() !< logical, pointer :: flag_iter(:) => null() !< + logical, pointer :: flag_lakefreeze(:) => null() !< real (kind=kind_phys), pointer :: ffmm_ice(:) => null() !< real (kind=kind_phys), pointer :: ffmm_land(:) => null() !< real (kind=kind_phys), pointer :: ffmm_water(:) => null() !< @@ -607,6 +608,7 @@ subroutine gfs_interstitial_create (Interstitial, IM, Model) allocate (Interstitial%flag_cice (IM)) allocate (Interstitial%flag_guess (IM)) allocate (Interstitial%flag_iter (IM)) + allocate (Interstitial%flag_lakefreeze (IM)) allocate (Interstitial%ffmm_ice (IM)) allocate (Interstitial%ffmm_land (IM)) allocate (Interstitial%ffmm_water (IM)) @@ -1297,6 +1299,7 @@ subroutine gfs_interstitial_phys_reset (Interstitial, Model) Interstitial%flag_cice = .false. Interstitial%flag_guess = .false. Interstitial%flag_iter = .true. + Interstitial%flag_lakefreeze = .false. Interstitial%ffmm_ice = Model%huge Interstitial%ffmm_land = Model%huge Interstitial%ffmm_water = Model%huge diff --git a/ccpp/data/CCPP_typedefs.meta b/ccpp/data/CCPP_typedefs.meta index 3ecb69be7..428970f2d 100644 --- a/ccpp/data/CCPP_typedefs.meta +++ b/ccpp/data/CCPP_typedefs.meta @@ -890,6 +890,12 @@ units = flag dimensions = (horizontal_loop_extent) type = logical +[flag_lakefreeze] + standard_name = flag_for_lake_water_freeze + long_name = flag for lake water freeze + units = flag + dimensions = (horizontal_loop_extent) + type = logical [ffmm_water] standard_name = Monin_Obukhov_similarity_function_for_momentum_over_water long_name = Monin-Obukhov similarity function for momentum over water diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index 42b1d1d66..f7f6d0caf 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -4005,12 +4005,12 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'snodi' - ExtDiag(idx)%desc = 'water equivalent snow depth over ice' + ExtDiag(idx)%desc = 'snow depth over ice' ExtDiag(idx)%unit = 'mm' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => sfcprop(nb)%weasdi(:) + ExtDiag(idx)%data(nb)%var2 => sfcprop(nb)%snodi(:) enddo idx = idx + 1 diff --git a/ccpp/physics b/ccpp/physics index ed7e015b4..0cdfc9d74 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit ed7e015b483a14fc7ae9bf9d0f0cc3d26c517f7e +Subproject commit 0cdfc9d7465358debb4de292861fef970b44874a From bba399053d3939241938f19ee598895eea54fd65 Mon Sep 17 00:00:00 2001 From: haiqinli <38666296+haiqinli@users.noreply.github.com> Date: Wed, 27 Dec 2023 14:10:22 -0700 Subject: [PATCH 10/41] Smoke/Dust updates for RRFS code freeze (#728) * "update smoke/dust for RRFS code freeze" * "point to the chem3d dimension update in GF for hercules/gnu" --- ccpp/data/GFS_typedefs.F90 | 75 +++++++++++++++++++------- ccpp/data/GFS_typedefs.meta | 96 ++++++++++++++++++++++++++++----- ccpp/driver/GFS_diagnostics.F90 | 72 ++++++++++++++----------- ccpp/physics | 2 +- io/fv3atm_restart_io.F90 | 4 +- io/fv3atm_rrfs_sd_io.F90 | 79 +++++++++++++++++++++------ 6 files changed, 246 insertions(+), 82 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 17d6ee4a0..5a8368a40 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -253,7 +253,8 @@ module GFS_typedefs real (kind=kind_phys), pointer :: hprime (:,:) => null() !< orographic metrics real (kind=kind_phys), pointer :: dust12m_in (:,:,:) => null() !< fengsha dust input real (kind=kind_phys), pointer :: emi_in (:,:) => null() !< anthropogenic background input - real (kind=kind_phys), pointer :: smoke_RRFS(:,:,:) => null() !< RRFS fire input + real (kind=kind_phys), pointer :: smoke_RRFS(:,:,:) => null() !< RRFS fire input hourly + real (kind=kind_phys), pointer :: smoke2d_RRFS(:,:) => null() !< RRFS fire input daily real (kind=kind_phys), pointer :: z0base (:) => null() !< background or baseline surface roughness length in m real (kind=kind_phys), pointer :: semisbase(:) => null() !< background surface emissivity real (kind=kind_phys), pointer :: sfalb_lnd (:) => null() !< surface albedo over land for LSM @@ -456,10 +457,9 @@ module GFS_typedefs real (kind=kind_phys), pointer :: emseas (:) => null() !< instantaneous sea salt emission real (kind=kind_phys), pointer :: emanoc (:) => null() !< instantaneous anthro. oc emission - !--- Smoke. These 3 arrays are hourly, so their dimension is imx24 (output is hourly) - real (kind=kind_phys), pointer :: ebb_smoke_hr(:) => null() !< hourly smoke emission - real (kind=kind_phys), pointer :: frp_hr (:) => null() !< hourly FRP - real (kind=kind_phys), pointer :: frp_std_hr (:) => null() !< hourly std. FRP + !--- Smoke. These 2 arrays are input smoke emission and frp + real (kind=kind_phys), pointer :: ebb_smoke_in(:) => null() !< input smoke emission + real (kind=kind_phys), pointer :: frp_input (:) => null() !< input FRP !--- For fire diurnal cycle real (kind=kind_phys), pointer :: fhist (:) => null() !< instantaneous fire coef_bb @@ -614,7 +614,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: nifa2d (:) => null() !< instantaneous ice-friendly sfc aerosol source !--- For fire diurnal cycle - real (kind=kind_phys), pointer :: ebu_smoke (:,:) => null() !< 3D ebu array + real (kind=kind_phys), pointer :: ebu_smoke (:,:) => null() !< 3D ebu array !--- For smoke and dust optical extinction real (kind=kind_phys), pointer :: smoke_ext (:,:) => null() !< 3D aod array @@ -623,12 +623,19 @@ module GFS_typedefs !--- For MYNN PBL transport of smoke and dust real (kind=kind_phys), pointer :: chem3d (:,:,:) => null() !< 3D aod array real (kind=kind_phys), pointer :: ddvel (:,: ) => null() !< 2D dry deposition velocity + !--- For convective wet removal of smoke and dust + real (kind=kind_phys), pointer :: wetdpc_flux (:,:) => null() !< 2D wet deposition array + !--- For large-scale wet removal of smoke and dust + real (kind=kind_phys), pointer :: wetdpr_flux (:,:) => null() !< 2D wet deposition array + !--- For dry deposition of smoke and dust + real (kind=kind_phys), pointer :: drydep_flux (:,:) => null() !< 2D dry deposition flux of smoke !--- Fire plume rise diagnostics - real (kind=kind_phys), pointer :: min_fplume (:) => null() !< minimum plume rise level - real (kind=kind_phys), pointer :: max_fplume (:) => null() !< maximum plume rise level + real (kind=kind_phys), pointer :: min_fplume (:) => null() !< minimum plume rise level + real (kind=kind_phys), pointer :: max_fplume (:) => null() !< maximum plume rise level !--- hourly fire potential index - real (kind=kind_phys), pointer :: rrfs_hwp (:) => null() !< hourly fire potential index + real (kind=kind_phys), pointer :: rrfs_hwp (:) => null() !< hourly fire potential index + real (kind=kind_phys), pointer :: rrfs_hwp_ave (:) => null() !< *Average* hourly fire potential index !--- instantaneous quantities for chemistry coupling real (kind=kind_phys), pointer :: ushfsfci(:) => null() !< instantaneous upward sensible heat flux (w/m**2) @@ -1448,8 +1455,8 @@ module GFS_typedefs integer :: ntsmoke !< tracer index for smoke integer :: ntdust !< tracer index for dust integer :: ntcoarsepm !< tracer index for coarse PM - integer :: nchem = 3 !< number of prognostic chemical species (vertically mixied) - integer :: ndvel = 3 !< number of prognostic chemical species (which are deposited, usually =nchem) + 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) integer :: ntchs !< tracer index for first prognostic chemical tracer integer :: ntche !< tracer index for last prognostic chemical tracer @@ -1510,10 +1517,13 @@ module GFS_typedefs real(kind=kind_phys) :: dust_alpha !< alpha parameter for fengsha dust scheme real(kind=kind_phys) :: dust_gamma !< gamma parameter for fengsha dust scheme real(kind=kind_phys) :: wetdep_ls_alpha !< alpha parameter for wet deposition + integer :: ebb_dcycle !< 1:retro; 2:forecast of fire emission integer :: seas_opt integer :: dust_opt integer :: drydep_opt integer :: coarsepm_settling + integer :: plume_wind_eff + logical :: extended_sd_diags integer :: wetdep_ls_opt logical :: do_plumerise integer :: addsmoke_flag @@ -1522,9 +1532,11 @@ module GFS_typedefs logical :: aero_ind_fdb ! WFA/IFA indirect logical :: aero_dir_fdb ! smoke/dust direct logical :: rrfs_smoke_debug + logical :: do_smoke_transport logical :: mix_chem logical :: enh_mix real(kind=kind_phys) :: smoke_dir_fdb_coef(7) !< smoke & dust direct feedbck coefficents + real(kind=kind_phys) :: smoke_conv_wet_coef(3) !< smoke & dust convective wet removal coefficents !--- debug flags logical :: debug @@ -2309,7 +2321,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%weasdi (IM)) allocate (Sfcprop%hprime (IM,Model%nmtvr)) allocate (Sfcprop%dust12m_in (IM,12,5)) - allocate (Sfcprop%smoke_RRFS(IM,24,3)) + allocate (Sfcprop%smoke_RRFS(IM,24,2)) + allocate (Sfcprop%smoke2d_RRFS(IM,4)) allocate (Sfcprop%emi_in (IM,1)) allocate(Sfcprop%albdirvis_lnd (IM)) allocate(Sfcprop%albdirnir_lnd (IM)) @@ -2367,6 +2380,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%dust12m_in= clear_val Sfcprop%emi_in = clear_val Sfcprop%smoke_RRFS= clear_val + Sfcprop%smoke2d_RRFS= clear_val Sfcprop%albdirvis_lnd = clear_val Sfcprop%albdirnir_lnd = clear_val Sfcprop%albdifvis_lnd = clear_val @@ -2790,9 +2804,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%emdust (IM)) allocate (Sfcprop%emseas (IM)) allocate (Sfcprop%emanoc (IM)) - allocate (Sfcprop%ebb_smoke_hr (IM)) - allocate (Sfcprop%frp_hr (IM)) - allocate (Sfcprop%frp_std_hr(IM)) + allocate (Sfcprop%ebb_smoke_in (IM)) + allocate (Sfcprop%frp_input (IM)) allocate (Sfcprop%fhist (IM)) allocate (Sfcprop%coef_bb_dc(IM)) allocate (Sfcprop%fire_in (IM,Model%fire_aux_data_levels)) @@ -2801,9 +2814,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%emdust = clear_val Sfcprop%emseas = clear_val Sfcprop%emanoc = clear_val - Sfcprop%ebb_smoke_hr = clear_val - Sfcprop%frp_hr = clear_val - Sfcprop%frp_std_hr = clear_val + Sfcprop%ebb_smoke_in = clear_val + Sfcprop%frp_input = clear_val Sfcprop%fhist = 1. Sfcprop%coef_bb_dc = clear_val Sfcprop%fire_in = clear_val @@ -3149,17 +3161,25 @@ subroutine coupling_create (Coupling, IM, Model) allocate (Coupling%dust_ext (IM,Model%levs)) allocate (Coupling%chem3d (IM,Model%levs,Model%nchem)) allocate (Coupling%ddvel (IM,Model%ndvel)) + allocate (Coupling%wetdpc_flux(IM,Model%nchem)) + allocate (Coupling%wetdpr_flux(IM,Model%nchem)) + allocate (Coupling%drydep_flux(IM,Model%ndvel)) allocate (Coupling%min_fplume(IM)) allocate (Coupling%max_fplume(IM)) allocate (Coupling%rrfs_hwp (IM)) + allocate (Coupling%rrfs_hwp_ave (IM)) Coupling%ebu_smoke = clear_val Coupling%smoke_ext = clear_val Coupling%dust_ext = clear_val Coupling%chem3d = clear_val Coupling%ddvel = clear_val + Coupling%wetdpc_flux = clear_val + Coupling%wetdpr_flux = clear_val + Coupling%drydep_flux = clear_val Coupling%min_fplume = clear_val Coupling%max_fplume = clear_val Coupling%rrfs_hwp = clear_val + Coupling%rrfs_hwp_ave = clear_val endif if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_c3) then @@ -3847,10 +3867,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & real(kind=kind_phys) :: dust_gamma = 0. real(kind=kind_phys) :: wetdep_ls_alpha = 0. integer :: dust_moist_opt = 1 ! fecan :1 else shao + integer :: ebb_dcycle = 1 ! 1:retro; 2:forecast integer :: seas_opt = 2 integer :: dust_opt = 5 integer :: drydep_opt = 1 integer :: coarsepm_settling = 1 + integer :: plume_wind_eff = 1 + logical :: extended_sd_diags = .false. integer :: wetdep_ls_opt = 1 logical :: do_plumerise = .false. integer :: addsmoke_flag = 1 @@ -3859,9 +3882,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: aero_ind_fdb = .false. ! RRFS-sd wfa/ifa emission logical :: aero_dir_fdb = .false. ! RRFS-sd smoke/dust radiation feedback logical :: rrfs_smoke_debug = .false. ! RRFS-sd plumerise debug + logical :: do_smoke_transport = .true.! RRFS-sd convective transport of smoke/dust logical :: mix_chem = .false. ! tracer mixing option by MYNN PBL logical :: enh_mix = .false. ! enhance vertmix option by MYNN PBL real(kind=kind_phys) :: smoke_dir_fdb_coef(7) =(/ 0.33, 0.67, 0.02, 0.13, 0.85, 0.05, 0.95 /) !< smoke & dust direct feedbck coefficents + real(kind=kind_phys) :: smoke_conv_wet_coef(3) =(/ 0.50, 0.50, 0.50 /) !< smoke & dust convective wet removal coefficents !-- Lightning threat index logical :: lightning_threat = .false. @@ -4020,9 +4045,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & dust_drylimit_factor, dust_moist_correction, dust_moist_opt, & dust_alpha, dust_gamma, wetdep_ls_alpha, & seas_opt, dust_opt, drydep_opt, coarsepm_settling, & + plume_wind_eff,ebb_dcycle, extended_sd_diags, & wetdep_ls_opt, smoke_forecast, aero_ind_fdb, aero_dir_fdb, & rrfs_smoke_debug, do_plumerise, plumerisefire_frq, & addsmoke_flag, enh_mix, mix_chem, smoke_dir_fdb_coef, & + do_smoke_transport,smoke_conv_wet_coef, & !--- C3/GF closures ichoice,ichoicem,ichoice_s, & !--- (DFI) time ranges with radar-prescribed microphysics tendencies @@ -4246,10 +4273,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%dust_alpha = dust_alpha Model%dust_gamma = dust_gamma Model%wetdep_ls_alpha = wetdep_ls_alpha + Model%ebb_dcycle = ebb_dcycle Model%seas_opt = seas_opt Model%dust_opt = dust_opt Model%drydep_opt = drydep_opt Model%coarsepm_settling = coarsepm_settling + Model%plume_wind_eff = plume_wind_eff + Model%extended_sd_diags = extended_sd_diags Model%wetdep_ls_opt = wetdep_ls_opt Model%do_plumerise = do_plumerise Model%plumerisefire_frq = plumerisefire_frq @@ -4258,11 +4288,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%aero_ind_fdb = aero_ind_fdb Model%aero_dir_fdb = aero_dir_fdb Model%rrfs_smoke_debug = rrfs_smoke_debug + Model%do_smoke_transport= do_smoke_transport Model%mix_chem = mix_chem Model%enh_mix = enh_mix Model%smoke_dir_fdb_coef = smoke_dir_fdb_coef + Model%smoke_conv_wet_coef = smoke_conv_wet_coef - Model%fire_aux_data_levels = 10 + Model%fire_aux_data_levels = 1 Model%ichoice_s = ichoice_s Model%ichoicem = ichoicem @@ -6375,10 +6407,13 @@ subroutine control_print(Model) print *, 'dust_alpha : ',Model%dust_alpha print *, 'dust_gamma : ',Model%dust_gamma print *, 'wetdep_ls_alpha : ',Model%wetdep_ls_alpha + print *, 'ebb_dcycle : ',Model%ebb_dcycle print *, 'seas_opt : ',Model%seas_opt print *, 'dust_opt : ',Model%dust_opt print *, 'drydep_opt : ',Model%drydep_opt print *, 'coarsepm_settling: ',Model%coarsepm_settling + print *, 'plume_wind_eff : ',Model%plume_wind_eff + print *, 'extended_sd_diags: ',Model%extended_sd_diags print *, 'wetdep_ls_opt : ',Model%wetdep_ls_opt print *, 'do_plumerise : ',Model%do_plumerise print *, 'plumerisefire_frq: ',Model%plumerisefire_frq @@ -6387,9 +6422,11 @@ subroutine control_print(Model) print *, 'aero_ind_fdb : ',Model%aero_ind_fdb print *, 'aero_dir_fdb : ',Model%aero_dir_fdb print *, 'rrfs_smoke_debug : ',Model%rrfs_smoke_debug + print *, 'do_smoke_transport : ',Model%do_smoke_transport print *, 'mix_chem : ',Model%mix_chem print *, 'enh_mix : ',Model%enh_mix print *, 'smoke_dir_fdb_coef : ',Model%smoke_dir_fdb_coef + print *, 'smoke_conv_wet_coef: ',Model%smoke_conv_wet_coef endif print *, ' ' print *, ' lsidea : ', Model%lsidea diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index deea0ad25..0c07dd093 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -921,7 +921,7 @@ standard_name = fengsha_dust12m_input long_name = fengsha dust input units = various - dimensions = (horizontal_dimension,12,5) + dimensions = (horizontal_loop_extent,12,5) type = real kind = kind_phys active = (do_smoke_coupling) @@ -929,7 +929,7 @@ standard_name = anthropogenic_background_input long_name = anthropogenic background input units = various - dimensions = (horizontal_dimension,1) + dimensions = (horizontal_loop_extent,1) type = real kind = kind_phys active = (do_smoke_coupling) @@ -937,7 +937,15 @@ standard_name = emission_smoke_RRFS long_name = emission fire RRFS units = various - dimensions = (horizontal_dimension,24,3) + dimensions = (horizontal_loop_extent,24,2) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[smoke2d_RRFS] + standard_name = emission_smoke_prvd_RRFS + long_name = emission fire RRFS daily + units = various + dimensions = (horizontal_loop_extent,4) type = real kind = kind_phys active = (do_smoke_coupling) @@ -2272,7 +2280,7 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[ebb_smoke_hr] +[ebb_smoke_in] standard_name = surface_smoke_emission long_name = emission of surface smoke units = ug m-2 s-1 @@ -2280,7 +2288,7 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[frp_hr] +[frp_input] standard_name = frp_hourly long_name = hourly fire radiative power units = MW @@ -2288,14 +2296,6 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[frp_std_hr] - standard_name = frp_std_hourly - long_name = hourly stdandard deviation of fire radiative power - units = MW - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - active = (do_smoke_coupling) [fhist] standard_name = fire_hist long_name = coefficient to scale the fire activity depending on the fire duration @@ -3012,6 +3012,30 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[wetdpc_flux] + standard_name = conv_wet_deposition_smoke_dust + long_name = convective wet removal of smoke and dust + units = kg kg-1 + dimensions = (horizontal_loop_extent,number_of_chemical_species_vertically_mixed) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[wetdpr_flux] + standard_name = mp_wet_deposition_smoke_dust + long_name = large scale wet deposition of smoke and dust + units = kg kg-1 + dimensions = (horizontal_loop_extent,number_of_chemical_species_vertically_mixed) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[drydep_flux] + standard_name = dry_deposition_flux + long_name = rrfs dry deposition flux + units = ug m-2 + dimensions = (horizontal_loop_extent,number_of_chemical_species_deposited) + type = real + kind = kind_phys + active = (do_smoke_coupling) [min_fplume] standard_name = minimum_fire_plume_sigma_pressure_level long_name = minimum model level of fire plumerise @@ -3036,6 +3060,14 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[rrfs_hwp_ave] + standard_name = hourly_wildfire_potential_average + long_name = rrfs hourly fire weather potential average + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) [ushfsfci] standard_name = surface_upward_sensible_heat_flux_for_chemistry_coupling long_name = instantaneous upward sensible heat flux for chemistry coupling @@ -6521,6 +6553,14 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[smoke_conv_wet_coef] + standard_name = smoke_dust_conv_wet_coef + long_name = smoke dust convetive wet scavanging coefficents + units = none + dimensions = (3) + type = real + kind = kind_phys + active = (do_smoke_coupling) [dust_moist_correction] standard_name = dust_moist_correction_fengsha_dust_scheme long_name = moisture correction term for fengsha dust emission @@ -6568,6 +6608,13 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[ebb_dcycle] + standard_name = control_for_diurnal_cycle_of_biomass_burning_emissions + long_name = rrfs smoke diurnal cycle option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) [seas_opt] standard_name = control_for_smoke_sea_salt long_name = rrfs smoke sea salt emission option @@ -6590,12 +6637,26 @@ type = integer active = (do_smoke_coupling) [coarsepm_settling] - standard_name = control_for_smoke_coarsepm_settling + standard_name = control_for_smoke_pm_settling long_name = rrfs smoke coarsepm settling option units = index dimensions = () type = integer active = (do_smoke_coupling) +[plume_wind_eff] + standard_name = option_for_wind_effects_on_smoke_plumerise + long_name = wind effect plumerise option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[extended_sd_diags] + standard_name = flag_for_extended_smoke_dust_diagnostics + long_name = flag for extended smoke dust diagnostics + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) [wetdep_ls_opt] standard_name = control_for_smoke_wet_deposition long_name = rrfs smoke large scale wet deposition option @@ -6652,6 +6713,13 @@ dimensions = () type = logical active = (do_smoke_coupling) +[do_smoke_transport] + standard_name = do_smoke_conv_transport + long_name = flag for rrfs smoke convective transport + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) [ncnvcld3d] standard_name = number_of_convective_cloud_variables_in_xyz_dimensioned_restart_array long_name = number of convective 3d clouds fields diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index f7f6d0caf..3bbd300d5 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -4658,82 +4658,92 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop do nb = 1,nblks ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%rrfs_hwp enddo - idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'ebb_smoke_hr' - ExtDiag(idx)%desc = 'hourly smoke emission' - ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%name = 'HWP_ave' + ExtDiag(idx)%desc = 'averaged fire weather potential' + ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%ebb_smoke_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%rrfs_hwp_ave enddo idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'fhist' - ExtDiag(idx)%desc = 'coefficient to scale the fire activity depending on the fire duration' + ExtDiag(idx)%name = 'wetdpc_smoke' + ExtDiag(idx)%desc = 'convective wet deposition smoke' ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%ebb_smoke_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%wetdpc_flux(:,1) enddo idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'frp_hr' - ExtDiag(idx)%desc = 'hourly frp' - ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%name = 'wetdpc_dust' + ExtDiag(idx)%desc = 'convective wet deposition dust' + ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%frp_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%wetdpc_flux(:,2) enddo idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'frp_std_hr' - ExtDiag(idx)%desc = 'hourly std frp' - ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%name = 'wetdpc_coarsepm' + ExtDiag(idx)%desc = 'convective wet deposition coarsepm' + ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%frp_std_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%wetdpc_flux(:,3) enddo idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'ebu_smoke' - ExtDiag(idx)%desc = 'smoke emission' - ExtDiag(idx)%unit = 'ug/m2/s' - ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'ebb_smoke_in' + ExtDiag(idx)%desc = 'input smoke emission' + ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%ebu_smoke(:,:) + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%ebb_smoke_in enddo idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'smoke_ext' - ExtDiag(idx)%desc = 'smoke extinction at 550nm' + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'fhist' + ExtDiag(idx)%desc = 'coefficient to scale the fire activity depending on the fire duration' ExtDiag(idx)%unit = ' ' - ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%fhist + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'frp_input' + ExtDiag(idx)%desc = 'input frp' + ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%smoke_ext(:,:) + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%frp_input enddo idx = idx + 1 ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dust_ext' - ExtDiag(idx)%desc = 'dust extinction at 550nm' - ExtDiag(idx)%unit = ' ' + ExtDiag(idx)%name = 'ebu_smoke' + ExtDiag(idx)%desc = 'smoke emission' + ExtDiag(idx)%unit = 'ug/m2/s' ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%dust_ext(:,:) + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%ebu_smoke(:,:) enddo idx = idx + 1 diff --git a/ccpp/physics b/ccpp/physics index 0cdfc9d74..df9e1ad0f 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 0cdfc9d7465358debb4de292861fef970b44874a +Subproject commit df9e1ad0f9dcafe58eb5ccd505046f965a6042bc diff --git a/io/fv3atm_restart_io.F90 b/io/fv3atm_restart_io.F90 index 39d2131b9..d32be0586 100644 --- a/io/fv3atm_restart_io.F90 +++ b/io/fv3atm_restart_io.F90 @@ -593,7 +593,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta if (.not.amiopen) call mpp_error( FATAL, 'Error with opening file'//trim(infile) ) ! Register axes and variables, allocate memory - call rrfs_sd_emis%register_fire(rrfssd_restart, Atm_block) + call rrfs_sd_emis%register_fire(Model, rrfssd_restart, Atm_block) !--- read new GSL created rrfssd restart/data call mpp_error(NOTE,'reading rrfssd information from INPUT/SMOKE_RRFS_data.nc') @@ -601,7 +601,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta call close_file(rrfssd_restart) !--- Copy to Sfcprop and free temporary arrays: - call rrfs_sd_emis%copy_fire(Sfcprop, Atm_block) + call rrfs_sd_emis%copy_fire(Model, Sfcprop, Atm_block) endif if_smoke ! RRFS_SD diff --git a/io/fv3atm_rrfs_sd_io.F90 b/io/fv3atm_rrfs_sd_io.F90 index 780153208..93e2981c7 100644 --- a/io/fv3atm_rrfs_sd_io.F90 +++ b/io/fv3atm_rrfs_sd_io.F90 @@ -62,15 +62,18 @@ module fv3atm_rrfs_sd_io type rrfs_sd_emissions_type integer, private :: nvar_dust12m = 5 integer, private :: nvar_emi = 1 - integer, private :: nvar_fire = 3 + integer, private :: nvar_fire = 2 + integer, private :: nvar_fire2d = 4 character(len=32), pointer, dimension(:), private :: dust12m_name => null() character(len=32), pointer, dimension(:), private :: emi_name => null() character(len=32), pointer, dimension(:), private :: fire_name => null() + character(len=32), pointer, dimension(:), private :: fire_name2d => null() real(kind=kind_phys), pointer, dimension(:,:,:,:), private :: dust12m_var => null() real(kind=kind_phys), pointer, dimension(:,:,:,:), private :: emi_var => null() real(kind=kind_phys), pointer, dimension(:,:,:,:), private :: fire_var => null() + real(kind=kind_phys), pointer, dimension(:,:,: ), private :: fire_var2d => null() contains @@ -520,70 +523,116 @@ end subroutine rrfs_sd_emissions_copy_emi ! -------------------------------------------------------------------- !>@ Allocates temporary arrays and registers variables for reading the fire data file. - subroutine rrfs_sd_emissions_register_fire(data, restart, Atm_block) + subroutine rrfs_sd_emissions_register_fire(data, Model, restart, Atm_block) implicit none class(rrfs_sd_emissions_type) :: data + type(GFS_control_type), intent(in) :: Model type(FmsNetcdfDomainFile_t) :: restart type(block_control_type), intent(in) :: Atm_block + real(kind=kind_phys), pointer, dimension(:,:) :: var_p2 => NULL() real(kind=kind_phys), pointer, dimension(:,:,:) :: var3_p2 => NULL() integer :: num, nx, ny + integer :: ebb_dcycle + + ebb_dcycle=Model%ebb_dcycle if(associated(data%fire_name)) then deallocate(data%fire_name) nullify(data%fire_name) endif + if(associated(data%fire_name2d)) then + deallocate(data%fire_name2d) + nullify(data%fire_name2d) + endif + if(associated(data%fire_var)) then deallocate(data%fire_var) nullify(data%fire_var) endif + if(associated(data%fire_var2d)) then + deallocate(data%fire_var2d) + nullify(data%fire_var2d) + endif + !--- allocate the various containers needed for rrfssd fire data call get_nx_ny_from_atm(Atm_block, nx, ny) allocate(data%fire_name(data%nvar_fire)) + allocate(data%fire_name2d(data%nvar_fire2d)) allocate(data%fire_var(nx,ny,24,data%nvar_fire)) + allocate(data%fire_var2d(nx,ny,data%nvar_fire2d)) - data%fire_name(1) = 'ebb_smoke_hr' - data%fire_name(2) = 'frp_avg_hr' - data%fire_name(3) = 'frp_std_hr' + data%fire_name(1) = 'ebb_smoke_hr' ! 2d x 24 hours + data%fire_name(2) = 'frp_avg_hr' ! 2d x 24 hours + + ! For the operational system + data%fire_name2d(1) = 'ebb_rate' ! 2d + data%fire_name2d(2) = 'frp_davg' + data%fire_name2d(3) = 'fire_end_hr' + data%fire_name2d(4) = 'hwp_davg' !--- register axis call register_axis(restart, 'lon', 'X') call register_axis(restart, 'lat', 'Y') - call register_axis(restart, 't', 24) - !--- register the 3D fields - do num = 1,data%nvar_fire + if (ebb_dcycle==1) then ! -- retro mode + !--- register the 3D fields + call register_axis(restart, 't', 24) + do num = 1,data%nvar_fire var3_p2 => data%fire_var(:,:,:,num) call register_restart_field(restart, data%fire_name(num), var3_p2, & dimensions=(/'t ', 'lat', 'lon'/), is_optional=.true.) - enddo + enddo + elseif (ebb_dcycle==2) then ! -- forecast mode + !--- register the 2D fields + call register_axis(restart, 't', 1) + do num = 1,data%nvar_fire2d + var_p2 => data%fire_var2d(:,:,num) + call register_restart_field(restart, data%fire_name2d(num), var_p2, & + dimensions=(/'lat', 'lon'/), is_optional=.true.) + enddo + else + ! -- user define their own fire emission + endif end subroutine rrfs_sd_emissions_register_fire ! -------------------------------------------------------------------- !>@ Called after register_fire() to copy data from internal arrays to the model grid and deallocate arrays - subroutine rrfs_sd_emissions_copy_fire(data, Sfcprop, Atm_block) + subroutine rrfs_sd_emissions_copy_fire(data, Model, Sfcprop, Atm_block) implicit none class(rrfs_sd_emissions_type) :: data + type(GFS_control_type), intent(in) :: Model type(GFS_sfcprop_type), intent(inout) :: Sfcprop(:) type(block_control_type), intent(in) :: Atm_block integer :: nb, ix, k, i, j + integer :: ebb_dcycle + + ebb_dcycle=Model%ebb_dcycle !$omp parallel do default(shared) private(i, j, nb, ix, k) do nb = 1, Atm_block%nblks - !--- 3D variables do ix = 1, Atm_block%blksz(nb) i = Atm_block%index(nb)%ii(ix) - Atm_block%isc + 1 j = Atm_block%index(nb)%jj(ix) - Atm_block%jsc + 1 - !--- assign hprime(1:10) and hprime(15:24) with new oro stat data - do k = 1, 24 + if (ebb_dcycle==1) then ! -- retro mode + !--- 3D variables + do k = 1, 24 Sfcprop(nb)%smoke_RRFS(ix,k,1) = data%fire_var(i,j,k,1) Sfcprop(nb)%smoke_RRFS(ix,k,2) = data%fire_var(i,j,k,2) - Sfcprop(nb)%smoke_RRFS(ix,k,3) = data%fire_var(i,j,k,3) - enddo + enddo + elseif (ebb_dcycle==2) then ! -- forecast mode + !--- 2D variables + Sfcprop(nb)%smoke2d_RRFS(ix,1) = data%fire_var2d(i,j,1) + Sfcprop(nb)%smoke2d_RRFS(ix,2) = data%fire_var2d(i,j,2) + Sfcprop(nb)%smoke2d_RRFS(ix,3) = data%fire_var2d(i,j,3) + Sfcprop(nb)%smoke2d_RRFS(ix,4) = data%fire_var2d(i,j,4) + else + ! -- user define their own fire emission + endif enddo enddo end subroutine rrfs_sd_emissions_copy_fire From 997907fe89b18fcc53405cf6722942810bf09eed Mon Sep 17 00:00:00 2001 From: Dustin Swales Date: Wed, 3 Jan 2024 14:19:16 -0700 Subject: [PATCH 11/41] Reorganization of ccpp-physics repository (#733) * Metafile cleanup * Move rte-rrtmgp submodule * More metadata fixes --- ccpp/config/ccpp_prebuild_config.py | 268 +++++++++--------- ccpp/data/CCPP_typedefs.meta | 7 +- ccpp/data/GFS_typedefs.meta | 8 +- ccpp/physics | 2 +- ...suite_FV3_GFS_v15_thompson_mynn_lam3km.xml | 1 - ccpp/suites/suite_FV3_GFS_v15p2.xml | 1 - ccpp/suites/suite_FV3_GFS_v16.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_csawmg.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_flake.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_ras.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml | 1 - .../suite_FV3_GFS_v17_coupled_p8_c3.xml | 1 - .../suite_FV3_GFS_v17_coupled_p8_sfcocn.xml | 1 - .../suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml | 1 - .../suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml | 1 - .../suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml | 1 - ...uite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml | 1 - ccpp/suites/suite_FV3_HRRR.xml | 1 - ccpp/suites/suite_FV3_HRRR_c3.xml | 1 - ccpp/suites/suite_FV3_HRRR_gf.xml | 1 - ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml | 1 - ccpp/suites/suite_FV3_RAP.xml | 1 - ccpp/suites/suite_FV3_RAP_cires_ugwp.xml | 1 - ccpp/suites/suite_FV3_RAP_clm_lake.xml | 1 - ccpp/suites/suite_FV3_RAP_flake.xml | 1 - ccpp/suites/suite_FV3_RAP_noah.xml | 1 - .../suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml | 1 - ccpp/suites/suite_FV3_RAP_sfcdiff.xml | 1 - ccpp/suites/suite_FV3_RAP_unified_ugwp.xml | 1 - ccpp/suites/suite_FV3_RRFS_v1beta.xml | 1 - ccpp/suites/suite_FV3_RRFS_v1nssl.xml | 1 - ccpp/suites/suite_FV3_WoFS_v0.xml | 1 - ccpp/suites/suite_FV3_global_nest_v1.xml | 1 - ccpp/suites/suite_RRFSens_phy1.xml | 1 - ccpp/suites/suite_RRFSens_phy2.xml | 1 - ccpp/suites/suite_RRFSens_phy3.xml | 1 - ccpp/suites/suite_RRFSens_phy4.xml | 1 - ccpp/suites/suite_RRFSens_phy5.xml | 1 - 43 files changed, 140 insertions(+), 184 deletions(-) diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index 268eb2166..1ed2c6245 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -16,12 +16,11 @@ VARIABLE_DEFINITION_FILES = [ # actual variable definition files 'framework/src/ccpp_types.F90', - 'physics/physics/machine.F', - 'physics/physics/radsw_param.f', - 'physics/physics/radlw_param.f', - 'physics/physics/h2o_def.f', - 'physics/physics/radiation_surface.f', - 'physics/physics/module_ozphys.F90', + 'physics/physics/hooks/machine.F', + 'physics/physics/Radiation/RRTMG/radsw_param.f', + 'physics/physics/Radiation/RRTMG/radlw_param.f', + 'physics/physics/photochem/h2o_def.f', + 'physics/physics/photochem/module_ozphys.F90', 'data/CCPP_typedefs.F90', 'data/GFS_typedefs.F90', 'data/CCPP_data.F90', @@ -74,138 +73,135 @@ # Relative path to source (from where ccpp_prebuild.py is called) : [ list of physics sets in which scheme may be called ]; # current restrictions are that each scheme can only belong to one physics set, and all schemes within one group in the # suite definition file have to belong to the same physics set - 'physics/physics/GFS_DCNV_generic_pre.F90', - 'physics/physics/GFS_DCNV_generic_post.F90', - 'physics/physics/GFS_GWD_generic_pre.F90', - 'physics/physics/GFS_GWD_generic_post.F90', - 'physics/physics/GFS_MP_generic_pre.F90', - 'physics/physics/GFS_MP_generic_post.F90', - 'physics/physics/GFS_PBL_generic_pre.F90', - 'physics/physics/GFS_PBL_generic_post.F90', - 'physics/physics/GFS_SCNV_generic_pre.F90', - 'physics/physics/GFS_SCNV_generic_post.F90', - 'physics/physics/GFS_debug.F90', - 'physics/physics/GFS_phys_time_vary.fv3.F90', - 'physics/physics/GFS_rad_time_vary.fv3.F90', - 'physics/physics/GFS_radiation_surface.F90', - 'physics/physics/GFS_rrtmg_post.F90', - 'physics/physics/GFS_rrtmg_pre.F90', - 'physics/physics/GFS_rrtmg_setup.F90', - 'physics/physics/GFS_stochastics.F90', - 'physics/physics/GFS_suite_interstitial_rad_reset.F90', - 'physics/physics/GFS_suite_interstitial_phys_reset.F90', - 'physics/physics/GFS_suite_interstitial_1.F90', - 'physics/physics/GFS_suite_interstitial_2.F90', - 'physics/physics/GFS_suite_stateout_reset.F90', - 'physics/physics/GFS_suite_stateout_update.F90', - 'physics/physics/GFS_suite_interstitial_3.F90', - 'physics/physics/GFS_suite_interstitial_4.F90', - 'physics/physics/GFS_suite_interstitial_5.F90', - 'physics/physics/GFS_surface_generic_pre.F90', - 'physics/physics/GFS_surface_generic_post.F90', - 'physics/physics/GFS_surface_composites_pre.F90', - 'physics/physics/GFS_surface_composites_inter.F90', - 'physics/physics/GFS_surface_composites_post.F90', - 'physics/physics/GFS_surface_loop_control_part1.F90', - 'physics/physics/GFS_surface_loop_control_part2.F90', - 'physics/physics/GFS_time_vary_pre.fv3.F90', - 'physics/physics/GFS_physics_post.F90', - 'physics/physics/cires_ugwp.F90', - 'physics/physics/cires_ugwp_post.F90', - 'physics/physics/unified_ugwp.F90', - 'physics/physics/unified_ugwp_post.F90', - 'physics/physics/ugwpv1_gsldrag.F90', - 'physics/physics/ugwpv1_gsldrag_post.F90', - 'physics/physics/cnvc90.f', - 'physics/physics/cs_conv_pre.F90', - 'physics/physics/cs_conv.F90', - 'physics/physics/cs_conv_post.F90', - 'physics/physics/cs_conv_aw_adj.F90', - 'physics/physics/cu_ntiedtke_pre.F90', - 'physics/physics/cu_ntiedtke.F90', - 'physics/physics/cu_ntiedtke_post.F90', - 'physics/physics/dcyc2t3.f', - 'physics/physics/drag_suite.F90', - 'physics/physics/shoc.F90', - 'physics/physics/get_prs_fv3.F90', - 'physics/physics/get_phi_fv3.F90', - 'physics/physics/gfdl_cloud_microphys.F90', - 'physics/physics/fv_sat_adj.F90', - 'physics/physics/gfdl_sfc_layer.F90', - 'physics/physics/zhaocarr_gscond.f', - 'physics/physics/gwdc_pre.f', - 'physics/physics/gwdc.f', - 'physics/physics/gwdc_post.f', - 'physics/physics/gwdps.f', - 'physics/physics/h2ophys.f', - 'physics/physics/samfdeepcnv.f', - 'physics/physics/samfshalcnv.f', - 'physics/physics/sascnvn.F', - 'physics/physics/shalcnv.F', - 'physics/physics/maximum_hourly_diagnostics.F90', - 'physics/physics/m_micro.F90', - 'physics/physics/m_micro_pre.F90', - 'physics/physics/m_micro_post.F90', - 'physics/physics/cu_gf_driver_pre.F90', - 'physics/physics/cu_gf_driver.F90', - 'physics/physics/cu_gf_driver_post.F90', - 'physics/physics/cu_c3_driver_pre.F90', - 'physics/physics/cu_c3_driver.F90', - 'physics/physics/cu_c3_driver_post.F90', - 'physics/physics/hedmf.f', - 'physics/physics/moninshoc.f', - 'physics/physics/satmedmfvdif.F', - 'physics/physics/satmedmfvdifq.F', - 'physics/physics/shinhongvdif.F90', - 'physics/physics/ysuvdif.F90', - 'physics/physics/mynnedmf_wrapper.F90', - 'physics/physics/mynnsfc_wrapper.F90', - 'physics/physics/sgscloud_radpre.F90', - 'physics/physics/sgscloud_radpost.F90', - 'physics/physics/myjsfc_wrapper.F90', - 'physics/physics/myjpbl_wrapper.F90', - 'physics/physics/mp_thompson_pre.F90', - 'physics/physics/mp_thompson.F90', - 'physics/physics/mp_thompson_post.F90', - 'physics/physics/mp_nssl.F90', - 'physics/physics/zhaocarr_precpd.f', - 'physics/physics/radlw_main.F90', - 'physics/physics/radsw_main.F90', - 'physics/physics/rascnv.F90', - 'physics/physics/rayleigh_damp.f', - 'physics/physics/rrtmg_lw_post.F90', - 'physics/physics/rrtmg_lw_pre.F90', - 'physics/physics/rrtmg_sw_post.F90', - 'physics/physics/rad_sw_pre.F90', - 'physics/physics/sfc_diag.f', - 'physics/physics/sfc_diag_post.F90', - 'physics/physics/lsm_ruc.F90', - 'physics/physics/sfc_cice.f', - 'physics/physics/sfc_diff.f', - 'physics/physics/lsm_noah.f', - 'physics/physics/noahmpdrv.F90', - 'physics/physics/flake_driver.F90', - 'physics/physics/clm_lake.f90', - 'physics/physics/sfc_nst_pre.f90', - 'physics/physics/sfc_nst.f90', - 'physics/physics/sfc_nst_post.f90', - 'physics/physics/sfc_ocean.F', - 'physics/physics/sfc_sice.f', - # HAFS FER_HIRES - 'physics/physics/mp_fer_hires.F90', - # SMOKE + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_DCNV_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_DCNV_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_GWD_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_GWD_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_MP_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_MP_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_PBL_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_PBL_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_SCNV_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_SCNV_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_debug.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_phys_time_vary.fv3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rad_time_vary.fv3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_radiation_surface.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_setup.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_setup.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_cloud_diagnostics.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_cloud_mp.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_cloud_overlap.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_stochastics.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_rad_reset.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_phys_reset.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_1.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_2.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_stateout_reset.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_stateout_update.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_4.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_5.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_composites_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_composites_inter.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_composites_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_loop_control_part1.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_loop_control_part2.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_time_vary_pre.fv3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/cnvc90.f', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/dcyc2t3.f', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/maximum_hourly_diagnostics.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_physics_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/sgscloud_radpre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/sgscloud_radpost.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv_pre.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv_post.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv_aw_adj.F90', + 'physics/physics/CONV/nTiedtke/cu_ntiedtke_pre.F90', + 'physics/physics/CONV/nTiedtke/cu_ntiedtke.F90', + 'physics/physics/CONV/nTiedtke/cu_ntiedtke_post.F90', + 'physics/physics/CONV/SAMF/samfdeepcnv.f', + 'physics/physics/CONV/SAMF/samfshalcnv.f', + 'physics/physics/CONV/SAS/sascnvn.F', + 'physics/physics/CONV/SAS/shalcnv.F', + 'physics/physics/CONV/Grell_Freitas/cu_gf_driver_pre.F90', + 'physics/physics/CONV/Grell_Freitas/cu_gf_driver.F90', + 'physics/physics/CONV/Grell_Freitas/cu_gf_driver_post.F90', + 'physics/physics/CONV/C3/cu_c3_driver_pre.F90', + 'physics/physics/CONV/C3/cu_c3_driver.F90', + 'physics/physics/CONV/C3/cu_c3_driver_post.F90', + 'physics/physics/CONV/RAS/rascnv.F90', + 'physics/physics/GWD/cires_ugwp.F90', + 'physics/physics/GWD/cires_ugwp_post.F90', + 'physics/physics/GWD/unified_ugwp.F90', + 'physics/physics/GWD/unified_ugwp_post.F90', + 'physics/physics/GWD/ugwpv1_gsldrag.F90', + 'physics/physics/GWD/ugwpv1_gsldrag_post.F90', + 'physics/physics/GWD/drag_suite.F90', + 'physics/physics/GWD/gwdc_pre.f', + 'physics/physics/GWD/gwdc.f', + 'physics/physics/GWD/gwdc_post.f', + 'physics/physics/GWD/gwdps.f', + 'physics/physics/GWD/rayleigh_damp.f', + '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/Morrison_Gettelman/m_micro.F90', + 'physics/physics/MP/Morrison_Gettelman/m_micro_pre.F90', + 'physics/physics/MP/Morrison_Gettelman/m_micro_post.F90', + 'physics/physics/MP/NSSL/mp_nssl.F90', + 'physics/physics/MP/Thompson/mp_thompson_pre.F90', + 'physics/physics/MP/Thompson/mp_thompson.F90', + 'physics/physics/MP/Thompson/mp_thompson_post.F90', + 'physics/physics/MP/Zhao_Carr/zhaocarr_gscond.f', + 'physics/physics/MP/Zhao_Carr/zhaocarr_precpd.f', + 'physics/physics/PBL/HEDMF/hedmf.f', + 'physics/physics/PBL/SHOC/moninshoc.f', + 'physics/physics/PBL/SHOC/shoc.F90', + 'physics/physics/PBL/MYJ/myjpbl_wrapper.F90', + 'physics/physics/PBL/MYNN_EDMF/mynnedmf_wrapper.F90', + 'physics/physics/PBL/SATMEDMF/satmedmfvdif.F', + 'physics/physics/PBL/SATMEDMF/satmedmfvdifq.F', + 'physics/physics/PBL/YSU/ysuvdif.F90', + 'physics/physics/PBL/saYSU/shinhongvdif.F90', + 'physics/physics/Radiation/RRTMG/radsw_main.F90', + 'physics/physics/Radiation/RRTMG/radlw_main.F90', + 'physics/physics/Radiation/RRTMG/rrtmg_lw_post.F90', + 'physics/physics/Radiation/RRTMG/rrtmg_sw_post.F90', + 'physics/physics/Radiation/RRTMG/rad_sw_pre.F90', + 'physics/physics/Radiation/RRTMGP/rrtmgp_aerosol_optics.F90', + 'physics/physics/Radiation/RRTMGP/rrtmgp_lw_main.F90', + 'physics/physics/Radiation/RRTMGP/rrtmgp_sw_main.F90', + 'physics/physics/SFC_Layer/GFDL/gfdl_sfc_layer.F90', + 'physics/physics/SFC_Layer/MYNN/mynnsfc_wrapper.F90', + 'physics/physics/SFC_Layer/MYJ/myjsfc_wrapper.F90', + 'physics/physics/SFC_Layer/UFS/sfc_diag.f', + 'physics/physics/SFC_Layer/UFS/sfc_diag_post.F90', + 'physics/physics/SFC_Layer/UFS/sfc_diff.f', + 'physics/physics/SFC_Layer/UFS/sfc_nst_pre.f90', + 'physics/physics/SFC_Layer/UFS/sfc_nst.f90', + 'physics/physics/SFC_Layer/UFS/sfc_nst_post.f90', + 'physics/physics/SFC_Models/Land/RUC/lsm_ruc.F90', + 'physics/physics/SFC_Models/SeaIce/CICE/sfc_cice.f', + 'physics/physics/SFC_Models/Land/Noah/lsm_noah.f', + 'physics/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90', + 'physics/physics/SFC_Models/Lake/Flake/flake_driver.F90', + 'physics/physics/SFC_Models/Lake/CLM/clm_lake.f90', + 'physics/physics/SFC_Models/Ocean/UFS/sfc_ocean.F', + 'physics/physics/SFC_Models/SeaIce/CICE/sfc_sice.f', 'physics/physics/smoke_dust/rrfs_smoke_wrapper.F90', 'physics/physics/smoke_dust/rrfs_smoke_postpbl.F90', - # RRTMGP - 'physics/physics/rrtmgp_aerosol_optics.F90', - 'physics/physics/rrtmgp_lw_main.F90', - 'physics/physics/rrtmgp_sw_main.F90', - 'physics/physics/GFS_rrtmgp_setup.F90', - 'physics/physics/GFS_rrtmgp_pre.F90', - 'physics/physics/GFS_cloud_diagnostics.F90', - 'physics/physics/GFS_rrtmgp_cloud_mp.F90', - 'physics/physics/GFS_rrtmgp_cloud_overlap.F90', - 'physics/physics/GFS_rrtmgp_post.F90' + 'physics/physics/tools/get_prs_fv3.F90', + 'physics/physics/tools/get_phi_fv3.F90' ] # Default build dir, relative to current working directory, diff --git a/ccpp/data/CCPP_typedefs.meta b/ccpp/data/CCPP_typedefs.meta index 428970f2d..a2d1105df 100644 --- a/ccpp/data/CCPP_typedefs.meta +++ b/ccpp/data/CCPP_typedefs.meta @@ -3193,11 +3193,8 @@ name = CCPP_typedefs type = module relative_path = ../physics/physics - dependencies = machine.F,radlw_param.f,radsw_param.f - dependencies = rte-rrtmgp/rrtmgp/mo_gas_optics_rrtmgp.F90,rte-rrtmgp/rte/mo_optical_props.F90 - dependencies = rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90 - dependencies = rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90,rte-rrtmgp/rte/mo_rte_config.F90 - dependencies = rte-rrtmgp/rte/mo_source_functions.F90 + dependencies = hooks/machine.F,photochem/module_ozphys.F90 + dependencies = Radiation/RRTMG/radlw_param.f,Radiation/RRTMG/radsw_param.f [ccpp-arg-table] name = CCPP_typedefs diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 0c07dd093..ebaa9af7f 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -9863,9 +9863,11 @@ [ccpp-table-properties] name = GFS_typedefs type = module - relative_path = ../physics/physics - dependencies = machine.F,physcons.F90,radlw_param.f,radsw_param.f - dependencies = GFDL_parse_tracers.F90,h2o_def.f,module_ozphys.F90 + relative_path = ../physics/physics/ + 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 [ccpp-arg-table] name = GFS_typedefs diff --git a/ccpp/physics b/ccpp/physics index df9e1ad0f..53062d634 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit df9e1ad0f9dcafe58eb5ccd505046f965a6042bc +Subproject commit 53062d634c77deb774ce5abc3813f1583292eec9 diff --git a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml index 7886743e3..922f7f305 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_GFS_v15p2.xml b/ccpp/suites/suite_FV3_GFS_v15p2.xml index 7b2eaac1b..c164a1c7e 100644 --- a/ccpp/suites/suite_FV3_GFS_v15p2.xml +++ b/ccpp/suites/suite_FV3_GFS_v15p2.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16.xml b/ccpp/suites/suite_FV3_GFS_v16.xml index e6ae5483f..bc5540ce1 100644 --- a/ccpp/suites/suite_FV3_GFS_v16.xml +++ b/ccpp/suites/suite_FV3_GFS_v16.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml b/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml index 3c41ef08d..3f972d784 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_flake.xml b/ccpp/suites/suite_FV3_GFS_v16_flake.xml index a99756c30..4f09779a2 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_flake.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_flake.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml b/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml index e540edc52..4de8927b1 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_ras.xml b/ccpp/suites/suite_FV3_GFS_v16_ras.xml index 31e1d29f3..d27a4887c 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_ras.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_ras.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml index 00675097a..53007131f 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml index 7daa7495a..64200955b 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml index b137ed9a8..8b495a18f 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml index 5b316a735..b63190e65 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8.xml b/ccpp/suites/suite_FV3_GFS_v17_p8.xml index 37ce4d90c..4fa6c222d 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml b/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml index dd79992ce..e9257a7f3 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml b/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml index a5b2b3291..fb7672ac3 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml b/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml index 0d001fc45..2a5034035 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml index e6673d7a6..0a08ee576 100644 --- a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml +++ b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml index de25bd871..3fc78efad 100644 --- a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml +++ b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml b/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml index 7231ed9ac..70018e7cc 100644 --- a/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml +++ b/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HRRR.xml b/ccpp/suites/suite_FV3_HRRR.xml index 56360ab5d..2177dc078 100644 --- a/ccpp/suites/suite_FV3_HRRR.xml +++ b/ccpp/suites/suite_FV3_HRRR.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_HRRR_c3.xml b/ccpp/suites/suite_FV3_HRRR_c3.xml index 95a426de8..e3ad50a8a 100644 --- a/ccpp/suites/suite_FV3_HRRR_c3.xml +++ b/ccpp/suites/suite_FV3_HRRR_c3.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_HRRR_gf.xml b/ccpp/suites/suite_FV3_HRRR_gf.xml index 8694976ac..48260ce9f 100644 --- a/ccpp/suites/suite_FV3_HRRR_gf.xml +++ b/ccpp/suites/suite_FV3_HRRR_gf.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml index 3e4b862c9..0f0022d1c 100644 --- a/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml +++ b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP.xml b/ccpp/suites/suite_FV3_RAP.xml index a24476213..b5a2117f6 100644 --- a/ccpp/suites/suite_FV3_RAP.xml +++ b/ccpp/suites/suite_FV3_RAP.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml b/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml index 6f16d0ea4..e6294028c 100644 --- a/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml +++ b/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_clm_lake.xml b/ccpp/suites/suite_FV3_RAP_clm_lake.xml index 2bc178eae..e7fef4461 100644 --- a/ccpp/suites/suite_FV3_RAP_clm_lake.xml +++ b/ccpp/suites/suite_FV3_RAP_clm_lake.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_flake.xml b/ccpp/suites/suite_FV3_RAP_flake.xml index c60c4324b..3239355fa 100644 --- a/ccpp/suites/suite_FV3_RAP_flake.xml +++ b/ccpp/suites/suite_FV3_RAP_flake.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_noah.xml b/ccpp/suites/suite_FV3_RAP_noah.xml index 6fd994f3c..80a515356 100644 --- a/ccpp/suites/suite_FV3_RAP_noah.xml +++ b/ccpp/suites/suite_FV3_RAP_noah.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml index a07dd850b..2d6d0377b 100644 --- a/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml +++ b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_sfcdiff.xml b/ccpp/suites/suite_FV3_RAP_sfcdiff.xml index 8a960e02e..23bbf1f54 100644 --- a/ccpp/suites/suite_FV3_RAP_sfcdiff.xml +++ b/ccpp/suites/suite_FV3_RAP_sfcdiff.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml b/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml index efca314bb..509ffea89 100644 --- a/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml +++ b/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RRFS_v1beta.xml b/ccpp/suites/suite_FV3_RRFS_v1beta.xml index 42ee00565..90165d880 100644 --- a/ccpp/suites/suite_FV3_RRFS_v1beta.xml +++ b/ccpp/suites/suite_FV3_RRFS_v1beta.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RRFS_v1nssl.xml b/ccpp/suites/suite_FV3_RRFS_v1nssl.xml index 05b1edb79..e24d2c6f2 100644 --- a/ccpp/suites/suite_FV3_RRFS_v1nssl.xml +++ b/ccpp/suites/suite_FV3_RRFS_v1nssl.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_WoFS_v0.xml b/ccpp/suites/suite_FV3_WoFS_v0.xml index 5641af472..140ba9023 100644 --- a/ccpp/suites/suite_FV3_WoFS_v0.xml +++ b/ccpp/suites/suite_FV3_WoFS_v0.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_global_nest_v1.xml b/ccpp/suites/suite_FV3_global_nest_v1.xml index 5a8dbd3e0..6f55e56f7 100644 --- a/ccpp/suites/suite_FV3_global_nest_v1.xml +++ b/ccpp/suites/suite_FV3_global_nest_v1.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_RRFSens_phy1.xml b/ccpp/suites/suite_RRFSens_phy1.xml index 0cd4c47b8..f0de1ebf4 100644 --- a/ccpp/suites/suite_RRFSens_phy1.xml +++ b/ccpp/suites/suite_RRFSens_phy1.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_RRFSens_phy2.xml b/ccpp/suites/suite_RRFSens_phy2.xml index e1ecc7149..44cafb249 100644 --- a/ccpp/suites/suite_RRFSens_phy2.xml +++ b/ccpp/suites/suite_RRFSens_phy2.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_RRFSens_phy3.xml b/ccpp/suites/suite_RRFSens_phy3.xml index 85e7189bd..da442619d 100644 --- a/ccpp/suites/suite_RRFSens_phy3.xml +++ b/ccpp/suites/suite_RRFSens_phy3.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_RRFSens_phy4.xml b/ccpp/suites/suite_RRFSens_phy4.xml index 35c7b052f..74a1e8972 100644 --- a/ccpp/suites/suite_RRFSens_phy4.xml +++ b/ccpp/suites/suite_RRFSens_phy4.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_RRFSens_phy5.xml b/ccpp/suites/suite_RRFSens_phy5.xml index 26bb32584..0321e64e9 100644 --- a/ccpp/suites/suite_RRFSens_phy5.xml +++ b/ccpp/suites/suite_RRFSens_phy5.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post From 5e7f1961ff4ee0e4793818589a3942482ca8967e Mon Sep 17 00:00:00 2001 From: Brian Curtis <64433609+BrianCurtis-NOAA@users.noreply.github.com> Date: Sat, 6 Jan 2024 10:21:16 -0500 Subject: [PATCH 12/41] switch to use fms implementation of mpp (#732) --- io/module_wrt_grid_comp.F90 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index e409788ab..b7e93e28f 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -29,7 +29,6 @@ module module_wrt_grid_comp use mpi use esmf use fms - use mpp_mod, only : mpp_init ! needed for fms 2023.02 use write_internal_state use module_fv3_io_def, only : num_pes_fcst, & @@ -253,7 +252,6 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, lprnt = lead_write_task == wrt_int_state%mype call fms_init(wrt_mpi_comm) - call mpp_init() ! print *,'in wrt, lead_write_task=', & ! lead_write_task,'last_write_task=',last_write_task, & @@ -1336,7 +1334,7 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, ! save calendar_type (as integer) for use in 'coupler.res' if (index(trim(attNameList(i)),'time:calendar') > 0) then - select case( uppercase(trim(valueS)) ) + select case( fms_mpp_uppercase(trim(valueS)) ) case( 'JULIAN' ) calendar_type = JULIAN case( 'GREGORIAN' ) @@ -1348,7 +1346,7 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, case( 'NO_CALENDAR' ) calendar_type = NO_CALENDAR case default - call mpp_error ( FATAL, 'fcst_initialize: calendar must be one of '// & + call fms_mpp_error ( FATAL, 'fcst_initialize: calendar must be one of '// & 'JULIAN|GREGORIAN|NOLEAP|THIRTY_DAY|NO_CALENDAR.' ) end select endif From 138aab1b4dcc98143803941301c81e3e933fecdc Mon Sep 17 00:00:00 2001 From: Alex Richert <82525672+AlexanderRichert-NOAA@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:28:31 -0500 Subject: [PATCH 13/41] Add CI build (#730) * Add GCC-based CI build --- .github/workflows/GCC.yml | 83 +++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 6 +++ ci/CMakeLists.txt | 70 +++++++++++++++++++++++++++++++++ ci/spack.yaml | 29 ++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 .github/workflows/GCC.yml create mode 100644 ci/CMakeLists.txt create mode 100644 ci/spack.yaml diff --git a/.github/workflows/GCC.yml b/.github/workflows/GCC.yml new file mode 100644 index 000000000..3fb022bae --- /dev/null +++ b/.github/workflows/GCC.yml @@ -0,0 +1,83 @@ +# This is a CI workflow for the fv3atm project. +# +# This workflow builds and tests the fv3atm library using GCC, and it tests +# different CMake build options. +# +# Alex Richert, 6 Dec 2023 + +name: GCC +on: + push: + branches: + - develop + pull_request: + branches: + - develop + +jobs: + GCC: + runs-on: ubuntu-latest + + strategy: + matrix: + cmake_opts: ["-D32BIT=ON", "-D32BIT=OFF"] + gcc_ver: ["11"] + mpi: ["mpich"] + + steps: + + - name: checkout-fv3atm + uses: actions/checkout@v3 + with: + path: ${{ github.workspace }}/fv3atm + submodules: recursive + + - name: cache-spack + id: cache-spack + uses: actions/cache@v3 + with: + path: ${{ github.workspace }}/spack-develop + key: spack-${{ hashFiles('fv3atm/ci/spack.yaml') }}-gcc${{ matrix.gcc_ver }}-2 + + # Building dependencies takes 40+ min + - name: spack-install + if: steps.cache-spack.outputs.cache-hit != 'true' + run: | + wget --no-verbose https://github.com/spack/spack/archive/refs/heads/develop.zip + unzip develop.zip -d ${GITHUB_WORKSPACE}/ &> unzip.out + . ${GITHUB_WORKSPACE}/spack-develop/share/spack/setup-env.sh + spack env create gcc${{ matrix.gcc_ver }} ${GITHUB_WORKSPACE}/fv3atm/ci/spack.yaml + spack env activate gcc${{ matrix.gcc_ver }} + spack compiler find | grep gcc@${{ matrix.gcc_ver }} + spack external find gmake cmake git git-lfs perl python ${{ matrix.mpi }} + spack config add "packages:all:require:['%gcc@${{ matrix.gcc_ver }}']" + spack config add "packages:mpi:require:'${{ matrix.mpi }}'" + spack concretize |& tee ${SPACK_ENV}/log.concretize + spack install -j2 --fail-fast + + - name: cache-save + uses: actions/cache/save@v3 + if: ${{ always() }} + with: + path: ${{ github.workspace }}/spack-develop + key: spack-${{ hashFiles('fv3atm/ci/spack.yaml') }}-gcc${{ matrix.gcc_ver }}-2 + + - name: build-fv3atm + run: | + . ${GITHUB_WORKSPACE}/spack-develop/share/spack/setup-env.sh + spack env activate gcc${{ matrix.gcc_ver }} + spack load $(spack find --format "{name}") + cd ${GITHUB_WORKSPACE}/fv3atm + git clone https://github.com/NOAA-EMC/CMakeModules + git clone --recurse-submodules https://github.com/NOAA-PSL/stochastic_physics stochastic_physics_repo + mkdir ${GITHUB_WORKSPACE}/build + cd ${GITHUB_WORKSPACE}/build + cmake ${GITHUB_WORKSPACE}/fv3atm -DBUILD_TESTING=ON ${{ matrix.cmake_opts }} + make -j2 + + - name: debug-artifacts + uses: actions/upload-artifact@v3 + if: ${{ failure() }} + with: + name: ccpp_prebuild_logs + path: ${{ github.workspace }}/build/ccpp/ccpp_prebuild.* diff --git a/CMakeLists.txt b/CMakeLists.txt index 549738794..bd40d09df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,9 @@ +# Enable CI build & unit testing: +if(BUILD_TESTING) + cmake_minimum_required(VERSION 3.19) + project(fv3atm VERSION 1.0 LANGUAGES C CXX Fortran) + include(ci/CMakeLists.txt) +endif() ############################################################################### ### CCPP diff --git a/ci/CMakeLists.txt b/ci/CMakeLists.txt new file mode 100644 index 000000000..71412b3af --- /dev/null +++ b/ci/CMakeLists.txt @@ -0,0 +1,70 @@ +# This file is used by fv3atm's root CMakeLists.txt when BUILD_TESTING=ON. It is +# used for CI runs and is based on the ufs-weather-model root CMakeLists.txt. It +# cannot be built directly, and should not be used for compiling for general R&D +# or operations. +# +# Alex Richert, 6 Dec 2023 + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules/Modules) + +if(${CMAKE_Fortran_COMPILER_ID} MATCHES "GNU") + if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 9.0.0) + message(FATAL_ERROR "GNU Compiler >= 9 is required") + endif() + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -ggdb -fbacktrace -cpp -fcray-pointer -ffree-line-length-none -fno-range-check") + + if(${CMAKE_Fortran_COMPILER_VERSION} VERSION_GREATER_EQUAL 10) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch -fallow-invalid-boz") + endif() + + if(NOT 32BIT) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fdefault-real-8 -fdefault-double-8") + endif() +elseif(${CMAKE_Fortran_COMPILER_ID} MATCHES "Intel") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -traceback -fpp -fno-alias -auto -safe-cray-ptr -ftz -assume byterecl -nowarn -sox -align array64byte -qno-opt-dynamic-align") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qno-opt-dynamic-align -sox -fp-model source") + set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -debug minimal -qoverride-limits") + set(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fp-model consistent") + set(CMAKE_C_FLAGS_RELEASE "-O2 -debug minimal") + + if(NOT 32BIT) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -real-size 64") + endif() +endif() + +set(32BIT OFF CACHE BOOL "Enable 32BIT (single precision arithmetic in dycore and fast physics)") +set(CCPP_32BIT OFF CACHE BOOL "Enable CCPP_32BIT (single precision arithmetic in slow physics)") +set(INLINE_POST ON CACHE BOOL "Enable inline post") +set(MULTI_GASES OFF CACHE BOOL "Enable MULTI_GASES") +set(MOVING_NEST OFF CACHE BOOL "Enable moving nest code") +set(OPENMP ON CACHE BOOL "Enable OpenMP threading") +set(PARALLEL_NETCDF OFF CACHE BOOL "Enable parallel NetCDF") + +message("32BIT ............ ${32BIT}") +message("CCPP_32BIT ....... ${CCPP_32BIT}") +message("INLINE_POST ...... ${INLINE_POST}") +message("MULTI_GASES ...... ${MULTI_GASES}") +message("MOVING_NEST ...... ${MOVING_NEST}") +message("OPENMP ........... ${OPENMP}") +message("PARALLEL_NETCDF .. ${PARALLEL_NETCDF}") + +find_package(MPI REQUIRED) +if(OPENMP) + find_package(OpenMP REQUIRED) +endif() + +find_package(NetCDF 4.7.4 REQUIRED C Fortran) +find_package(ESMF 8.3.0 MODULE REQUIRED) +find_package(FMS 2022.04 REQUIRED COMPONENTS R4 R8) +if(32BIT) + add_library(fms ALIAS FMS::fms_r4) +else() + add_library(fms ALIAS FMS::fms_r8) +endif() +find_package(bacio 2.4.0 REQUIRED) +find_package(sp 2.3.3 REQUIRED) +find_package(w3emc 2.9.2 REQUIRED) + +find_package(Python 3.6 REQUIRED COMPONENTS Interpreter) + +add_subdirectory(stochastic_physics_repo) diff --git a/ci/spack.yaml b/ci/spack.yaml new file mode 100644 index 000000000..400b7e06b --- /dev/null +++ b/ci/spack.yaml @@ -0,0 +1,29 @@ +# This file is used in the CI to define the libraries needed to build fv3atm. It +# is used by the 'spack env create' command to generate a Spack environment. It +# is generally preferred to avoid defining settings here that are not shared +# across CI workflows, such as requiring the use of a specific compiler. Any +# such modifications should be done in the appropriate CI workflow using the +# 'spack config add' command, or with search-and-replace. +# WARNING: Changing this file will automatically cause the cached Spack builds +# in GitHub Actions to be regenerated, which takes a considerable amount of +# time. +# +# Alex Richert, 6 Dec 2023 +spack: + specs: + - w3emc@2.10.0 precision=4,d,8 + - ip@develop precision=4,d,8 + - sp@2.4.0 precision=4,d,8 + - bacio@2.4.1 + - upp@develop + - esmf@8.4.2 + - fms@2023.04 +gfs_phys +openmp +pic +quad_precision +deprecated_io constants=GFS precision=32,64 + - netcdf-c@4.9.2 ~blosc + view: false + concretizer: + unify: true + packages: + mpich: + require: ['~libxml2 ~hwloc ~pci'] # minimize unneeded dependencies + yaksa: + buildable: false # minimize unneeded dependencies From 095a1d578a2adf4f10b0f0134160e31ac8aa2f11 Mon Sep 17 00:00:00 2001 From: AnningCheng-NOAA <48297505+AnningCheng-NOAA@users.noreply.github.com> Date: Tue, 16 Jan 2024 11:35:25 -0500 Subject: [PATCH 14/41] A merra2 interpolation bug found by running RRFS (#750) * physics merra2 interpolation bug fix: rrfs --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 53062d634..a492addf8 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 53062d634c77deb774ce5abc3813f1583292eec9 +Subproject commit a492addf860d29d797bca488f53d39b260584924 From 68980ad4437563f55af05f9a0eb1998441c803ba Mon Sep 17 00:00:00 2001 From: "Samuel Trahan (NOAA contractor)" <39415369+SamuelTrahanNOAA@users.noreply.github.com> Date: Wed, 17 Jan 2024 14:03:17 -0500 Subject: [PATCH 15/41] Fix out-of-bounds access in module_diag_hailcast.F90 which crashes RRFS on WCOSS2 (#746) * fix out-of-bounds write in module_diag_hailcast * only correct RWA_new where RWA_adiabat(k).ge.1.E-12 * module_diag_hailcast.F90: update comments; changes from @adams-selin --- atmos_cubed_sphere | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atmos_cubed_sphere b/atmos_cubed_sphere index caba092f6..eeb4a714d 160000 --- a/atmos_cubed_sphere +++ b/atmos_cubed_sphere @@ -1 +1 @@ -Subproject commit caba092f682c9713a485e782b8f9ba6480adaca2 +Subproject commit eeb4a714d946f554da6b16800da436e1ce66a092 From 53a3c52ba411305e5498ef3a8356aa901ec0aca8 Mon Sep 17 00:00:00 2001 From: Edward Hartnett <38856240+edwardhartnett@users.noreply.github.com> Date: Fri, 19 Jan 2024 06:45:16 -0700 Subject: [PATCH 16/41] Add doxygen to the cmake build and add doxygen build to CI. (#759) Add doxygen to the cmake build and add doxygen build to CI. --- .github/workflows/GCC.yml | 24 +- CMakeLists.txt | 15 +- docs/CMakeLists.txt | 17 + docs/Doxyfile.in | 2665 +++++++++++++++++++++++++++++++++++++ docs/user_guide.md | 5 + 5 files changed, 2716 insertions(+), 10 deletions(-) create mode 100644 docs/CMakeLists.txt create mode 100644 docs/Doxyfile.in create mode 100644 docs/user_guide.md diff --git a/.github/workflows/GCC.yml b/.github/workflows/GCC.yml index 3fb022bae..4f1b7a894 100644 --- a/.github/workflows/GCC.yml +++ b/.github/workflows/GCC.yml @@ -26,6 +26,10 @@ jobs: steps: + - name: install-doxygen + run: | + sudo apt-get install doxygen graphviz + - name: checkout-fv3atm uses: actions/checkout@v3 with: @@ -37,7 +41,7 @@ jobs: uses: actions/cache@v3 with: path: ${{ github.workspace }}/spack-develop - key: spack-${{ hashFiles('fv3atm/ci/spack.yaml') }}-gcc${{ matrix.gcc_ver }}-2 + key: spack-${{ hashFiles('fv3atm/ci/spack.yaml') }}-gcc${{ matrix.gcc_ver }}-2-${{ matrix.cmake_opts }}-${{ matrix.mpich }} # Building dependencies takes 40+ min - name: spack-install @@ -55,13 +59,6 @@ jobs: spack concretize |& tee ${SPACK_ENV}/log.concretize spack install -j2 --fail-fast - - name: cache-save - uses: actions/cache/save@v3 - if: ${{ always() }} - with: - path: ${{ github.workspace }}/spack-develop - key: spack-${{ hashFiles('fv3atm/ci/spack.yaml') }}-gcc${{ matrix.gcc_ver }}-2 - - name: build-fv3atm run: | . ${GITHUB_WORKSPACE}/spack-develop/share/spack/setup-env.sh @@ -71,13 +68,22 @@ jobs: git clone https://github.com/NOAA-EMC/CMakeModules git clone --recurse-submodules https://github.com/NOAA-PSL/stochastic_physics stochastic_physics_repo mkdir ${GITHUB_WORKSPACE}/build + sed -i 's/doc /upp_doc /' upp/docs/CMakeLists.txt cd ${GITHUB_WORKSPACE}/build - cmake ${GITHUB_WORKSPACE}/fv3atm -DBUILD_TESTING=ON ${{ matrix.cmake_opts }} + cmake ${GITHUB_WORKSPACE}/fv3atm -DBUILD_TESTING=ON ${{ matrix.cmake_opts }} -DENABLE_DOCS=ON make -j2 + ls -l /home/runner/work/fv3atm/fv3atm/fv3atm/io + - uses: actions/upload-artifact@v3 + with: + name: docs + path: | + build/docs/html + - name: debug-artifacts uses: actions/upload-artifact@v3 if: ${{ failure() }} with: name: ccpp_prebuild_logs path: ${{ github.workspace }}/build/ccpp/ccpp_prebuild.* + diff --git a/CMakeLists.txt b/CMakeLists.txt index bd40d09df..5d0dcf6f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,19 @@ +# This is the main CMake file for fv3atm. +# +# Dusan Jovic, Alex Richert +cmake_minimum_required(VERSION 3.19) + +# Handle user build options. +option(ENABLE_DOCS "Enable generation of doxygen-based documentation." OFF) + +# Determine whether or not to generate documentation. +if(ENABLE_DOCS) + find_package(Doxygen REQUIRED) + add_subdirectory(docs) +endif() + # Enable CI build & unit testing: if(BUILD_TESTING) - cmake_minimum_required(VERSION 3.19) project(fv3atm VERSION 1.0 LANGUAGES C CXX Fortran) include(ci/CMakeLists.txt) endif() diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt new file mode 100644 index 000000000..6273869d8 --- /dev/null +++ b/docs/CMakeLists.txt @@ -0,0 +1,17 @@ +# This is the CMake file for building the docs directory of fv3atm. +# +# Ed Hartnett 12/28/23 + +IF(ENABLE_DOCS) + + # Create doxyfile. + SET(abs_top_srcdir "${CMAKE_SOURCE_DIR}") + SET(abs_top_builddir "${CMAKE_BINARY_DIR}") + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) + ADD_CUSTOM_TARGET(doxygen_doc ALL + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating API Documentation with Doxygen" VERBATIM) + +ENDIF(ENABLE_DOCS) + diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in new file mode 100644 index 000000000..d89e7145e --- /dev/null +++ b/docs/Doxyfile.in @@ -0,0 +1,2665 @@ +# Doxyfile 1.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = fv3atm + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = @PROJECT_VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = YES + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which efficively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = @abs_top_srcdir@/docs/user_guide.md \ + @abs_top_srcdir@ \ + @abs_top_srcdir@/ccpp \ + @abs_top_srcdir@/cpl \ + @abs_top_srcdir@/io \ + @abs_top_srcdir@/moving_nest \ + @abs_top_srcdir@/stochastic_physics + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, +# *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.F90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to +# YES then doxygen will add the directory of each input to the include path. +# The default value is: YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: +# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /