diff --git a/components/elm/bld/ELMBuildNamelist.pm b/components/elm/bld/ELMBuildNamelist.pm index cbf067e67607..50d173fbc603 100755 --- a/components/elm/bld/ELMBuildNamelist.pm +++ b/components/elm/bld/ELMBuildNamelist.pm @@ -830,7 +830,17 @@ sub setup_cmdl_fates_mode { "use_fates_tree_damage", "use_century_decomp", "use_snicar_ad", - "use_vertsoilc"); + "use_vertsoilc", + "use_fates_daylength_factor", + "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 ) { if ( defined($nl->get_value($var)) ) { $nl_flags->{$var} = $nl->get_value($var); @@ -3429,7 +3439,16 @@ sub setup_logic_fates { "use_fates_planthydro", "use_fates_potentialveg", "use_fates_sp", - "use_fates_tree_damage"); + "use_fates_tree_damage", + "use_fates_daylength_factor", + "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($test_files, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $var,'use_fates'=>$nl_flags->{'use_fates'}); diff --git a/components/elm/bld/namelist_files/namelist_defaults.xml b/components/elm/bld/namelist_files/namelist_defaults.xml index 3e3ce90223f7..d58f5108d7ec 100644 --- a/components/elm/bld/namelist_files/namelist_defaults.xml +++ b/components/elm/bld/namelist_files/namelist_defaults.xml @@ -2226,6 +2226,15 @@ this mask will have smb calculated over the entire global land surface .false. .false. .false. +.true. +nonacclimating +ballberry1987 +net +ryan1991 +linear +default +1D_Taylor +norman .true. .true. .true. diff --git a/components/elm/bld/namelist_files/namelist_definition.xml b/components/elm/bld/namelist_files/namelist_definition.xml index 87a6da722af1..78563ddca7c0 100644 --- a/components/elm/bld/namelist_files/namelist_definition.xml +++ b/components/elm/bld/namelist_files/namelist_definition.xml @@ -359,6 +359,57 @@ Toggle to turn on FATES no competition mode (only relevant if FATES is being use Toggle to turn on FATES satellite phenology mode (only relevant if FATES is being used). + +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 + + + +Set the FATES 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 (only relevant if FATES is on). diff --git a/components/elm/src/main/controlMod.F90 b/components/elm/src/main/controlMod.F90 index dc7fa975dbb4..285ab360b9f9 100755 --- a/components/elm/src/main/controlMod.F90 +++ b/components/elm/src/main/controlMod.F90 @@ -272,6 +272,15 @@ subroutine control_init( ) fates_parteh_mode, & fates_seeddisp_cadence, & use_fates_tree_damage, & + use_fates_daylength_factor, & + fates_photosynth_acclimation, & + fates_stomatal_model, & + fates_stomatal_assimilation, & + fates_leafresp_model, & + fates_cstarvation_model, & + fates_regeneration_model, & + fates_hydro_solver, & + fates_radiation_model, & fates_history_dimlevel namelist /elm_inparm / use_betr @@ -829,6 +838,15 @@ subroutine control_spmd() call mpi_bcast (use_fates_potentialveg, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_fates_ed_prescribed_phys, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_fates_inventory_init, 1, MPI_LOGICAL, 0, mpicom, ier) + call mpi_bcast (use_fates_daylength_factor, 1, MPI_LOGICAL, 0, mpicom, ier) + call mpi_bcast (fates_photosynth_acclimation, len(fates_photosynth_acclimation), 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_hydro_solver, len(fates_hydro_solver) , MPI_CHARACTER, 0, mpicom, ier) + call mpi_bcast (fates_radiation_model, len(fates_radiation_model) , MPI_CHARACTER, 0, mpicom, ier) call mpi_bcast (fates_inventory_ctrl_filename, len(fates_inventory_ctrl_filename), & MPI_CHARACTER, 0, mpicom, ier) call mpi_bcast (fates_parteh_mode, 1, MPI_INTEGER, 0, mpicom, ier) @@ -1251,6 +1269,15 @@ subroutine control_print () write(iulog, *) ' use_fates_luh = ', use_fates_luh write(iulog, *) ' use_fates_lupft = ', use_fates_lupft write(iulog, *) ' use_fates_potentialveg = ', use_fates_potentialveg + write(iulog, *) ' use_fates_daylength_factor = ', use_fates_daylength_factor + write(iulog, *) ' fates_photosynth_acclimation = ', trim(fates_photosynth_acclimation) + 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_hydro_solver = ', fates_hydro_solver + write(iulog, *) ' fates_radiation_model = ', fates_radiation_model write(iulog, *) ' fates_inventory_ctrl_filename = ',fates_inventory_ctrl_filename write(iulog, *) ' fates_seeddisp_cadence = ', fates_seeddisp_cadence write(iulog, *) ' fates_seeddisp_cadence: 0, 1, 2, 3 => off, daily, monthly, or yearly dispersal' diff --git a/components/elm/src/main/elm_varctl.F90 b/components/elm/src/main/elm_varctl.F90 index 69a3209e52fe..c36a04984b43 100644 --- a/components/elm/src/main/elm_varctl.F90 +++ b/components/elm/src/main/elm_varctl.F90 @@ -222,6 +222,14 @@ module elm_varctl logical, public :: use_fates = .false. ! true => use ED integer, public :: fates_spitfire_mode = 0 ! 0 for no fire; 1 for constant ignitions character(len=256), public :: fates_harvest_mode = '' ! five different harvest modes; see namelist_definitions + character(len=256), public :: fates_photosynth_acclimation = '' ! nonacclimating, kumarathunge2019 + 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_hydro_solver = '' ! 1D Taylor, 2D Picard, 2D Newton + character(len=256), public :: fates_radiation_model = '' ! Norman or two-stream radiation model logical, public :: use_fates_fixed_biogeog = .false. ! true => use fixed biogeography mode 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 @@ -234,6 +242,7 @@ module elm_varctl logical, public :: use_fates_luh = .false. ! true => FATES land use transitions mode logical, public :: use_fates_lupft = .false. ! true => FATES land use x pft mode logical, public :: use_fates_potentialveg = .false. ! true => FATES potential veg only + logical, public :: use_fates_daylength_factor = .false. ! true => enable fates to use host land model daylength factor character(len=256), public :: fluh_timeseries = '' ! filename for land use harmonization data character(len=256), public :: flandusepftdat = '' ! filename for fates landuse x pft data character(len=256), public :: fates_inventory_ctrl_filename = '' ! filename for inventory control diff --git a/components/elm/src/main/elmfates_interfaceMod.F90 b/components/elm/src/main/elmfates_interfaceMod.F90 index e7134a580fdc..455ad5456ebb 100644 --- a/components/elm/src/main/elmfates_interfaceMod.F90 +++ b/components/elm/src/main/elmfates_interfaceMod.F90 @@ -58,6 +58,15 @@ module ELMFatesInterfaceMod use elm_varctl , only : use_fates_luh use elm_varctl , only : use_fates_lupft use elm_varctl , only : use_fates_potentialveg + use elm_varctl , only : use_fates_daylength_factor + use elm_varctl , only : fates_photosynth_acclimation + use elm_varctl , only : fates_stomatal_model + use elm_varctl , only : fates_stomatal_assimilation + use elm_varctl , only : fates_leafresp_model + use elm_varctl , only : fates_cstarvation_model + use elm_varctl , only : fates_regeneration_model + use elm_varctl , only : fates_hydro_solver + use elm_varctl , only : fates_radiation_model use elm_varctl , only : flandusepftdat use elm_varctl , only : use_fates_tree_damage use elm_varctl , only : nsrest, nsrBranch @@ -410,6 +419,16 @@ subroutine ELMFatesGlobals2() integer :: pass_num_luh_states integer :: pass_num_luh_transitions integer :: pass_lupftdat + integer :: pass_daylength_factor_switch + integer :: pass_photosynth_acclimation_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 + ! ---------------------------------------------------------------------------------- ! FATES lightning definitions ! 1 : use a global constant lightning rate found in fates_params. @@ -594,6 +613,75 @@ subroutine ELMFatesGlobals2() end if call set_fates_ctrlparms('use_cohort_age_tracking',ival=pass_cohort_age_tracking) + 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) + + 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_Newton') then + pass_hydro_solver = 3 + end if + call set_fates_ctrlparms('hydr_solver',ival=pass_hydro_solver) + + + 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_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_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_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_stomatal_model) == 'ballberry1987') then + pass_stomatal_model = 1 + else if (trim(fates_stomatal_model) == 'medlyn2011') then + pass_stomatal_model = 2 + end if + call set_fates_ctrlparms('stomatal_model',ival=pass_stomatal_model) + + if(trim(fates_photosynth_acclimation) == 'kumarathunge2019') then + pass_photosynth_acclimation_switch = 1 + else if(trim(fates_photosynth_acclimation) == 'nonacclimating') then + pass_photosynth_acclimation_switch = 0 + end if + call set_fates_ctrlparms('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(use_fates_inventory_init) then pass_inventory_init = 1 else