diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm index 07e78952f9..463b9b3a15 100755 --- a/bld/CLMBuildNamelist.pm +++ b/bld/CLMBuildNamelist.pm @@ -808,7 +808,11 @@ sub setup_cmdl_fates_mode { "use_fates_cohort_age_tracking","use_fates_inventory_init","use_fates_fixed_biogeog", "use_fates_nocomp","use_fates_sp","fates_inventory_ctrl_filename","fates_harvest_mode", "fates_parteh_mode","use_fates_tree_damage","fates_seeddisp_cadence","use_fates_luh","fluh_timeseries", - "flandusepftdat","use_fates_potentialveg","use_fates_lupft","fates_history_dimlevel" ); + "flandusepftdat","use_fates_potentialveg","use_fates_lupft","fates_history_dimlevel", + "use_fates_daylength_factor", "use_fates_photosynth_acclimation", "fates_stomatal_model", + "fates_stomatal_assimilation", "fates_leafresp_model", "fates_cstarvation_model", + "fates_regeneration_model", "fates_hydro_solver", "fates_radiation_model" + ); # dis-allow fates specific namelist items with non-fates runs foreach my $var ( @list ) { @@ -4702,7 +4706,11 @@ sub setup_logic_fates { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'fates_paramfile', 'phys'=>$nl_flags->{'phys'}); my @list = ( "fates_spitfire_mode", "use_fates_planthydro", "use_fates_ed_st3", "use_fates_ed_prescribed_phys", "use_fates_inventory_init","fates_seeddisp_cadence","fates_history_dimlevel", - "fates_harvest_mode","fates_parteh_mode", "use_fates_cohort_age_tracking","use_fates_tree_damage" ); + "fates_harvest_mode","fates_parteh_mode", "use_fates_cohort_age_tracking","use_fates_tree_damage", + "use_fates_daylength_factor", "use_fates_photosynth_acclimation", "fates_stomatal_model", + "fates_stomatal_assimilation", "fates_leafresp_model", "fates_cstarvation_model", + "fates_regeneration_model", "fates_hydro_solver", "fates_radiation_model" + ); foreach my $var ( @list ) { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $var, 'use_fates'=>$nl_flags->{'use_fates'}, diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml index 7c75b471a6..ebfdaecbaf 100644 --- a/bld/namelist_files/namelist_defaults_ctsm.xml +++ b/bld/namelist_files/namelist_defaults_ctsm.xml @@ -2386,11 +2386,20 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2 .true. +.false. 0 no_harvest +ballberry +net +ryan1991 +linear +default +norman +1D_Taylor .false. .false. .false. +.true. .false. .false. .false. diff --git a/bld/namelist_files/namelist_definition_ctsm.xml b/bld/namelist_files/namelist_definition_ctsm.xml index 2d5ab0e4c7..d3f96f662e 100644 --- a/bld/namelist_files/namelist_definition_ctsm.xml +++ b/bld/namelist_files/namelist_definition_ctsm.xml @@ -775,6 +775,57 @@ Allowed values are: This option is older than the luhdata options and may be depricated at some point in the future. + +Set the FATES radiation model + + + +Set the FATES hydro solver method + + + +Set the FATES seed regeneration model +Valid values: + default: default scheme + trs: Tree Recruitment Scheme (Hanbury-Brown et al., 2022) + trs_no_seed_dyn: Tree Recruitment Scheme (Hanbury-Brown et al., 2022) without seed dynamics + + + +Set the FATES carbon starvation model + + + +Set the FATES leaf maintenance respiration model + + + +Set net or gross asslimiation for the FATES stomatal model + + + +Set the FATES stomatal conductance model + + + +If TRUE, enable FATES to use a photosynthesis temperature acclimation model. +(Only relevant if FATES is on) + + + +If TRUE, enable FATES to utilize the day length factor from the host land model. +(Only relevant if FATES is on) + + Toggle to turn on plant hydraulics diff --git a/src/main/clm_varctl.F90 b/src/main/clm_varctl.F90 index 9539060200..3be27207b7 100644 --- a/src/main/clm_varctl.F90 +++ b/src/main/clm_varctl.F90 @@ -331,6 +331,13 @@ module clm_varctl ! see bld/namelist_files/namelist_definition_clm4_5.xml for details logical, public :: use_fates_tree_damage = .false. ! true => turn on tree damage module character(len=256), public :: fates_harvest_mode = '' ! five different harvest modes; see namelist definition + character(len=256), public :: fates_stomatal_model = '' ! stomatal conductance model, Ball-berry or Medlyn + character(len=256), public :: fates_stomatal_assimilation = '' ! net or gross assimilation modes + character(len=256), public :: fates_leafresp_model = '' ! Leaf maintenance respiration model, Ryan or Atkin + character(len=256), public :: fates_cstarvation_model = '' ! linear or exponential function + character(len=256), public :: fates_regeneration_model = '' ! default, TRS, or TRS without seed dynamics + character(len=256), public :: fates_radiation_model = '' ! Norman or two-stream radiation model + character(len=256), public :: fates_hydro_solver = '' ! 1D Taylor, 2D Picard, 2D Newton logical, public :: use_fates_planthydro = .false. ! true => turn on fates hydro logical, public :: use_fates_cohort_age_tracking = .false. ! true => turn on cohort age tracking logical, public :: use_fates_ed_st3 = .false. ! true => static stand structure @@ -338,6 +345,9 @@ module clm_varctl logical, public :: use_fates_inventory_init = .false. ! true => initialize fates from inventory logical, public :: use_fates_fixed_biogeog = .false. ! true => use fixed biogeography mode logical, public :: use_fates_nocomp = .false. ! true => use no comopetition mode + logical, public :: use_fates_daylength_factor = .false. ! true => enable fates to use host land model daylength factor + + logical, public :: use_fates_photosynth_acclimation = .false. ! true => enable fates to use photosynthetic temperature acclimation ! FATES history dimension level ! fates can produce history at either the daily timescale (dynamics) diff --git a/src/main/controlMod.F90 b/src/main/controlMod.F90 index 3f5c58ac0e..e7fa8934b2 100644 --- a/src/main/controlMod.F90 +++ b/src/main/controlMod.F90 @@ -242,9 +242,18 @@ subroutine control_init(dtime) fluh_timeseries, & flandusepftdat, & fates_inventory_ctrl_filename, & + fates_stomatal_model, & + fates_stomatal_assimilation, & + fates_leafresp_model, & + fates_cstarvation_model, & + fates_regeneration_model, & + fates_radiation_model, & + fates_hydro_solver, & fates_parteh_mode, & fates_seeddisp_cadence, & use_fates_tree_damage, & + use_fates_daylength_factor, & + use_fates_photosynth_acclimation, & fates_history_dimlevel ! Ozone vegetation stress method @@ -799,6 +808,13 @@ subroutine control_spmd() call mpi_bcast (fates_spitfire_mode, 1, MPI_INTEGER, 0, mpicom, ier) call mpi_bcast (fates_harvest_mode, len(fates_harvest_mode) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_stomatal_model, len(fates_stomatal_model) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_stomatal_assimilation, len(fates_stomatal_assimilation) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_leafresp_model, len(fates_leafresp_model) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_cstarvation_model, len(fates_cstarvation_model) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_regeneration_model, len(fates_regeneration_model) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_radiation_model, len(fates_radiation_model) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_hydro_solver, len(fates_hydro_solver) , MPI_CHARACTER, 0, mpicom, ier) call mpi_bcast (use_fates_planthydro, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_fates_tree_damage, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_fates_cohort_age_tracking, 1, MPI_LOGICAL, 0, mpicom, ier) @@ -812,6 +828,8 @@ subroutine control_spmd() call mpi_bcast (use_fates_lupft, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_fates_potentialveg, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_fates_bgc, 1, MPI_LOGICAL, 0, mpicom, ier) + call mpi_bcast (use_fates_daylength_factor, 1, MPI_LOGICAL, 0, mpicom, ier) + call mpi_bcast (use_fates_photosynth_acclimation, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (fates_inventory_ctrl_filename, len(fates_inventory_ctrl_filename), MPI_CHARACTER, 0, mpicom, ier) call mpi_bcast (fates_paramfile, len(fates_paramfile) , MPI_CHARACTER, 0, mpicom, ier) call mpi_bcast (fluh_timeseries, len(fluh_timeseries) , MPI_CHARACTER, 0, mpicom, ier) @@ -1200,11 +1218,20 @@ subroutine control_print () if (use_fates) then write(iulog, *) ' fates_spitfire_mode = ', fates_spitfire_mode write(iulog, *) ' fates_harvest_mode = ', fates_harvest_mode + write(iulog, *) ' fates_stomatal_model = ', fates_stomatal_model + write(iulog, *) ' fates_stomatal_assimilation = ', fates_stomatal_assimilation + write(iulog, *) ' fates_leafresp_model = ', fates_leafresp_model + write(iulog, *) ' fates_cstarvation_model = ', fates_cstarvation_model + write(iulog, *) ' fates_regeneration_model = ', fates_regeneration_model + write(iulog, *) ' fates_radiation_model = ', fates_radiation_model + write(iulog, *) ' fates_hydro_solver = ', fates_hydro_solver write(iulog, *) ' fates_paramfile = ', fates_paramfile write(iulog, *) ' fates_parteh_mode = ', fates_parteh_mode write(iulog, *) ' use_fates_planthydro = ', use_fates_planthydro write(iulog, *) ' use_fates_tree_damage = ', use_fates_tree_damage write(iulog, *) ' use_fates_cohort_age_tracking = ', use_fates_cohort_age_tracking + write(iulog, *) ' use_fates_daylength_factor = ', use_fates_daylength_factor + write(iulog, *) ' use_fates_photosynth_acclimation = ', use_fates_photosynth_acclimation write(iulog, *) ' use_fates_ed_st3 = ',use_fates_ed_st3 write(iulog, *) ' use_fates_ed_prescribed_phys = ',use_fates_ed_prescribed_phys write(iulog, *) ' use_fates_inventory_init = ',use_fates_inventory_init diff --git a/src/utils/clmfates_interfaceMod.F90 b/src/utils/clmfates_interfaceMod.F90 index 269189d1b7..fda2ca0461 100644 --- a/src/utils/clmfates_interfaceMod.F90 +++ b/src/utils/clmfates_interfaceMod.F90 @@ -52,9 +52,18 @@ module CLMFatesInterfaceMod use clm_varctl , only : use_fates_tree_damage use clm_varctl , only : use_fates_planthydro use clm_varctl , only : use_fates_cohort_age_tracking + use clm_varctl , only : use_fates_daylength_factor + use clm_varctl , only : use_fates_photosynth_acclimation use clm_varctl , only : use_fates_ed_st3 use clm_varctl , only : use_fates_ed_prescribed_phys use clm_varctl , only : fates_harvest_mode + use clm_varctl , only : fates_stomatal_model + use clm_varctl , only : fates_stomatal_assimilation + use clm_varctl , only : fates_leafresp_model + use clm_varctl , only : fates_cstarvation_model + use clm_varctl , only : fates_regeneration_model + use clm_varctl , only : fates_hydro_solver + use clm_varctl , only : fates_radiation_model use clm_varctl , only : use_fates_inventory_init use clm_varctl , only : use_fates_fixed_biogeog use clm_varctl , only : use_fates_nocomp @@ -399,6 +408,15 @@ subroutine CLMFatesGlobals2() integer :: pass_use_potentialveg integer :: pass_num_luh_states integer :: pass_num_luh_transitions + integer :: pass_photosynth_acclimation_switch + integer :: pass_daylength_factor_switch + integer :: pass_stomatal_model + integer :: pass_stomatal_assimilation + integer :: pass_leafresp_model + integer :: pass_cstarvation_model + integer :: pass_regeneration_model + integer :: pass_hydro_solver + integer :: pass_radiation_model call t_startf('fates_globals2') @@ -515,6 +533,73 @@ subroutine CLMFatesGlobals2() end if call set_fates_ctrlparms('use_cohort_age_tracking',ival=pass_cohort_age_tracking) + if(use_fates_photosynth_acclimation) then + pass_photosynth_acclimation_switch = 1 + else + pass_photosynth_acclimation_switch = 0 + end if + call set_fates_ctrlparms('use_photosynth_acclimation',ival=pass_photosynth_acclimation_switch) + + if(use_fates_daylength_factor) then + pass_daylength_factor_switch = 1 + else + pass_daylength_factor_switch = 0 + end if + call set_fates_ctrlparms('use_daylength_factor_switch',ival=pass_daylength_factor_switch) + + if (trim(fates_stomatal_model) == 'ballberry') then + pass_stomatal_model = 1 + else if (trim(fates_stomatal_model) == 'medlyn') then + pass_stomatal_model = 2 + end if + call set_fates_ctrlparms('stomatal_model',ival=pass_stomatal_model) + + if (trim(fates_stomatal_assimilation) == 'net') then + pass_stomatal_assimilation = 1 + else if (trim(fates_stomatal_assimilation) == 'gross') then + pass_stomatal_assimilation = 2 + end if + call set_fates_ctrlparms('stomatal_assim_model',ival=pass_stomatal_assimilation) + + if (trim(fates_leafresp_model) == 'ryan1991') then + pass_leafresp_model = 1 + else if (trim(fates_leafresp_model) == 'atkin2017') then + pass_leafresp_model = 2 + end if + call set_fates_ctrlparms('maintresp_leaf_model',ival=pass_leafresp_model) + + if (trim(fates_cstarvation_model) == 'linear') then + pass_cstarvation_model = 1 + else if (trim(fates_cstarvation_model) == 'expontential') then + pass_cstarvation_model = 2 + end if + call set_fates_ctrlparms('mort_cstarvation_model',ival=pass_cstarvation_model) + + if (trim(fates_regeneration_model) == 'default') then + pass_regeneration_model = 1 + else if (trim(fates_regeneration_model) == 'trs') then + pass_regeneration_model = 2 + else if (trim(fates_regeneration_model) == 'trs_no_seed_dyn') then + pass_regeneration_model = 3 + end if + call set_fates_ctrlparms('regeneration_model',ival=pass_regeneration_model) + + if (trim(fates_hydro_solver) == '1D_Taylor') then + pass_hydro_solver = 1 + else if (trim(fates_hydro_solver) == '2D_Picard') then + pass_hydro_solver = 2 + else if (trim(fates_hydro_solver) == '2D_Taylor') then + pass_hydro_solver = 3 + end if + call set_fates_ctrlparms('hydr_solver',ival=pass_hydro_solver) + + if (trim(fates_radiation_model) == 'norman') then + pass_radiation_model = 1 + else if (trim(fates_hydro_solver) == 'twostream') then + pass_radiation_model = 2 + end if + call set_fates_ctrlparms('radiation_model',ival=pass_radiation_model) + ! FATES logging and harvest modes pass_logging = 0 pass_lu_harvest = 0