From 5d0dddc010440afdd823f554133b9d975eccf4db Mon Sep 17 00:00:00 2001 From: Charlie Koven Date: Tue, 17 Oct 2023 14:38:49 -0700 Subject: [PATCH 01/14] adding C-starvation termination mortality to carbon starvation diagnostics --- biogeochem/EDCanopyStructureMod.F90 | 3 +- biogeochem/EDCohortDynamicsMod.F90 | 30 +++++++++---- main/EDInitMod.F90 | 13 +++--- main/EDTypesMod.F90 | 18 ++++---- main/FatesConstantsMod.F90 | 7 ++- main/FatesHistoryInterfaceMod.F90 | 68 +++++++++++++++++++++-------- main/FatesRestartInterfaceMod.F90 | 55 +++++++++++++++++++---- 7 files changed, 141 insertions(+), 53 deletions(-) diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index a52be9a30e..d781a42e94 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -43,6 +43,7 @@ module EDCanopyStructureMod use PRTGenericMod, only : struct_organ use PRTGenericMod, only : SetState use PRTGenericMod, only : carbon12_element + use FatesConstantsMod, only : i_term_mort_type_canlev ! CIME Globals use shr_log_mod , only : errMsg => shr_log_errMsg @@ -736,7 +737,7 @@ subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) if(currentCohort%canopy_layer>nclmax )then ! put the litter from the terminated cohorts ! straight into the fragmenting pools - call terminate_cohort(currentSite,currentPatch,currentCohort,bc_in) + call terminate_cohort(currentSite,currentPatch,currentCohort,bc_in,i_term_mort_type_canlev) deallocate(currentCohort, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc012: fail on deallocate(currentCohort):'//trim(smsg) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 12385a8f9d..1f14a3a2c0 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -120,6 +120,10 @@ Module EDCohortDynamicsMod use PRTAllometricCNPMod, only : acnp_bc_out_id_pefflux, acnp_bc_out_id_limiter use PRTAllometricCNPMod, only : acnp_bc_in_id_cdamage use DamageMainMod, only : undamaged_class + use FatesConstantsMod, only : n_term_mort_types + use FatesConstantsMod, only : i_term_mort_type_cstarv + use FatesConstantsMod, only : i_term_mort_type_canlev + use FatesConstantsMod, only : i_term_mort_type_numdens use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) use shr_log_mod, only : errMsg => shr_log_errMsg @@ -382,12 +386,14 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ integer :: terminate ! do we terminate (itrue) or not (ifalse) integer :: istat ! return status code character(len=255) :: smsg + integer :: termination_type !---------------------------------------------------------------------- currentCohort => currentPatch%shortest do while (associated(currentCohort)) terminate = ifalse + termination_type = 0 tallerCohort => currentCohort%taller leaf_c = currentCohort%prt%GetState(leaf_organ, carbon12_element) @@ -400,6 +406,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ ! Check if number density is so low is breaks math (level 1) if (currentcohort%n < min_n_safemath .and. level == 1) then terminate = itrue + termination_type = i_term_mort_type_numdens if ( debug ) then write(fates_log(),*) 'terminating cohorts 0',currentCohort%n/currentPatch%area,currentCohort%dbh,currentCohort%pft,call_index endif @@ -413,6 +420,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ currentCohort%n <= min_nppatch .or. & (currentCohort%dbh < 0.00001_r8 .and. store_c < 0._r8) ) then terminate = itrue + termination_type = i_term_mort_type_numdens if ( debug ) then write(fates_log(),*) 'terminating cohorts 1',currentCohort%n/currentPatch%area,currentCohort%dbh,currentCohort%pft,call_index endif @@ -421,6 +429,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ ! Outside the maximum canopy layer if (currentCohort%canopy_layer > nclmax ) then terminate = itrue + termination_type = i_term_mort_type_cstarv if ( debug ) then write(fates_log(),*) 'terminating cohorts 2', currentCohort%canopy_layer,currentCohort%pft,call_index endif @@ -430,6 +439,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ if ( ( sapw_c+leaf_c+fnrt_c ) < 1e-10_r8 .or. & store_c < 1e-10_r8) then terminate = itrue + termination_type = i_term_mort_type_cstarv if ( debug ) then write(fates_log(),*) 'terminating cohorts 3', & sapw_c,leaf_c,fnrt_c,store_c,currentCohort%pft,call_index @@ -439,6 +449,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ ! Total cohort biomass is negative if ( ( struct_c+sapw_c+leaf_c+fnrt_c+store_c ) < 0._r8) then terminate = itrue + termination_type = i_term_mort_type_cstarv if ( debug ) then write(fates_log(),*) 'terminating cohorts 4', & struct_c,sapw_c,leaf_c,fnrt_c,store_c,currentCohort%pft,call_index @@ -448,7 +459,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ endif ! if (.not.currentCohort%isnew .and. level == 2) then if (terminate == itrue) then - call terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) + call terminate_cohort(currentSite, currentPatch, currentCohort, bc_in, termination_type) deallocate(currentCohort, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc001: fail on terminate_cohorts:deallocate(currentCohort):'//trim(smsg) @@ -461,7 +472,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ end subroutine terminate_cohorts !-------------------------------------------------------------------------------------! - subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) + subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in, termination_type) ! ! !DESCRIPTION: ! Terminates an individual cohort and updates the site-level @@ -474,6 +485,7 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) type (fates_patch_type) , intent(inout), target :: currentPatch type (fates_cohort_type), intent(inout), target :: currentCohort type(bc_in_type), intent(in) :: bc_in + integer, intent(in) :: termination_type ! !LOCAL VARIABLES: type (fates_cohort_type) , pointer :: shorterCohort @@ -506,16 +518,16 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) ! Update the site-level carbon flux and individuals count for the appropriate canopy layer if(levcan==ican_upper) then - currentSite%term_nindivs_canopy(currentCohort%size_class,currentCohort%pft) = & - currentSite%term_nindivs_canopy(currentCohort%size_class,currentCohort%pft) + currentCohort%n + currentSite%term_nindivs_canopy(termination_type,currentCohort%size_class,currentCohort%pft) = & + currentSite%term_nindivs_canopy(termination_type,currentCohort%size_class,currentCohort%pft) + currentCohort%n - currentSite%term_carbonflux_canopy(currentCohort%pft) = currentSite%term_carbonflux_canopy(currentCohort%pft) + & + currentSite%term_carbonflux_canopy(termination_type,currentCohort%pft) = currentSite%term_carbonflux_canopy(termination_type,currentCohort%pft) + & currentCohort%n * (struct_c+sapw_c+leaf_c+fnrt_c+store_c+repro_c) else - currentSite%term_nindivs_ustory(currentCohort%size_class,currentCohort%pft) = & - currentSite%term_nindivs_ustory(currentCohort%size_class,currentCohort%pft) + currentCohort%n + currentSite%term_nindivs_ustory(termination_type,currentCohort%size_class,currentCohort%pft) = & + currentSite%term_nindivs_ustory(termination_type,currentCohort%size_class,currentCohort%pft) + currentCohort%n - currentSite%term_carbonflux_ustory(currentCohort%pft) = currentSite%term_carbonflux_ustory(currentCohort%pft) + & + currentSite%term_carbonflux_ustory(termination_type,currentCohort%pft) = currentSite%term_carbonflux_ustory(termination_type,currentCohort%pft) + & currentCohort%n * (struct_c+sapw_c+leaf_c+fnrt_c+store_c+repro_c) end if @@ -553,7 +565,7 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) call currentCohort%FreeMemory() - end subroutine terminate_cohort + end subroutine terminate_cohort ! ===================================================================================== diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index ee74f9b02b..fea7b419b3 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -87,6 +87,7 @@ module EDInitMod use PRTGenericMod, only : SetState use FatesSizeAgeTypeIndicesMod,only : get_age_class_index use DamageMainMod, only : undamaged_class + use FatesConstantsMod, only : n_term_mort_types ! CIME GLOBALS use shr_log_mod , only : errMsg => shr_log_errMsg @@ -166,8 +167,8 @@ subroutine init_site_vars( site_in, bc_in, bc_out ) allocate(site_in%fmort_cflux_ustory_damage(1,1)) end if - allocate(site_in%term_carbonflux_canopy(1:numpft)) - allocate(site_in%term_carbonflux_ustory(1:numpft)) + allocate(site_in%term_carbonflux_canopy(1:n_term_mort_types,1:numpft)) + allocate(site_in%term_carbonflux_ustory(1:n_term_mort_types,1:numpft)) allocate(site_in%imort_carbonflux(1:numpft)) allocate(site_in%fmort_carbonflux_canopy(1:numpft)) allocate(site_in%fmort_carbonflux_ustory(1:numpft)) @@ -285,15 +286,15 @@ subroutine zero_site( site_in ) site_in%ema_npp = -9999.9_r8 ! termination and recruitment info - site_in%term_nindivs_canopy(:,:) = 0._r8 - site_in%term_nindivs_ustory(:,:) = 0._r8 + site_in%term_nindivs_canopy(:,:,:) = 0._r8 + site_in%term_nindivs_ustory(:,:,:) = 0._r8 site_in%term_crownarea_canopy = 0._r8 site_in%term_crownarea_ustory = 0._r8 site_in%imort_crownarea = 0._r8 site_in%fmort_crownarea_canopy = 0._r8 site_in%fmort_crownarea_ustory = 0._r8 - site_in%term_carbonflux_canopy(:) = 0._r8 - site_in%term_carbonflux_ustory(:) = 0._r8 + site_in%term_carbonflux_canopy(:,:) = 0._r8 + site_in%term_carbonflux_ustory(:,:) = 0._r8 site_in%recruitment_rate(:) = 0._r8 site_in%imort_rate(:,:) = 0._r8 site_in%imort_carbonflux(:) = 0._r8 diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 020d26eafd..04ba4f9e06 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -363,15 +363,15 @@ module EDTypesMod real(r8) :: fmort_crownarea_canopy ! crownarea of canopy indivs killed due to fire per year. [m2/sec] real(r8) :: fmort_crownarea_ustory ! crownarea of understory indivs killed due to fire per year [m2/sec] - real(r8), allocatable :: term_nindivs_canopy(:,:) ! number of canopy individuals that were in cohorts which - ! were terminated this timestep, on size x pft - real(r8), allocatable :: term_nindivs_ustory(:,:) ! number of understory individuals that were in cohorts which - ! were terminated this timestep, on size x pft - - real(r8), allocatable :: term_carbonflux_canopy(:) ! carbon flux from live to dead pools associated - ! with termination mortality, per canopy level. [kgC/ha/day] - real(r8), allocatable :: term_carbonflux_ustory(:) ! carbon flux from live to dead pools associated - ! with termination mortality, per canopy level. [kgC/ha/day] + real(r8), allocatable :: term_nindivs_canopy(:,:,:) ! number of canopy individuals that were in cohorts which + ! were terminated this timestep, by termination type, size x pft + real(r8), allocatable :: term_nindivs_ustory(:,:,:) ! number of understory individuals that were in cohorts which + ! were terminated this timestep, by termination type, size x pft + + real(r8), allocatable :: term_carbonflux_canopy(:,:) ! carbon flux from live to dead pools associated + ! with termination mortality, by termination type and per canopy level. [kgC/ha/day] + real(r8), allocatable :: term_carbonflux_ustory(:,:) ! carbon flux from live to dead pools associated + ! with termination mortality, by termination type and per canopy level. [kgC/ha/day] real(r8), allocatable :: imort_carbonflux(:) ! biomass of individuals killed due to impact mortality per year. [kgC/m2/sec] real(r8), allocatable :: fmort_carbonflux_canopy(:) ! biomass of canopy indivs killed due to fire per year. [gC/m2/sec] real(r8), allocatable :: fmort_carbonflux_ustory(:) ! biomass of understory indivs killed due to fire per year [gC/m2/sec] diff --git a/main/FatesConstantsMod.F90 b/main/FatesConstantsMod.F90 index dc89d06f4f..f69c248212 100644 --- a/main/FatesConstantsMod.F90 +++ b/main/FatesConstantsMod.F90 @@ -328,5 +328,10 @@ module FatesConstantsMod real(fates_r8), parameter, public :: lmr_r_2 = -0.0402_fates_r8 ! (umol CO2/m**2/s/degree C) - + ! some integers related to termination mortality + integer, parameter, public :: n_term_mort_types = 3 + integer, parameter, public :: i_term_mort_type_cstarv = 1 + integer, parameter, public :: i_term_mort_type_canlev = 2 + integer, parameter, public :: i_term_mort_type_numdens = 3 + end module FatesConstantsMod diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index e76a3f5406..bd87dedd71 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -573,6 +573,7 @@ module FatesHistoryInterfaceMod integer :: ih_mortality_carbonflux_si_pft integer :: ih_hydraulicmortality_carbonflux_si_pft integer :: ih_cstarvmortality_carbonflux_si_pft + integer :: ih_cstarvmortality_continuous_carbonflux_si_pft integer :: ih_firemortality_carbonflux_si_pft integer :: ih_crownarea_si_pft integer :: ih_canopycrownarea_si_pft @@ -2239,6 +2240,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) hio_mortality_si_pft => this%hvars(ih_mortality_si_pft)%r82d, & hio_mortality_carbonflux_si_pft => this%hvars(ih_mortality_carbonflux_si_pft)%r82d, & hio_cstarvmortality_carbonflux_si_pft => this%hvars(ih_cstarvmortality_carbonflux_si_pft)%r82d, & + hio_cstarvmortality_continuous_carbonflux_si_pft => this%hvars(ih_cstarvmortality_continuous_carbonflux_si_pft)%r82d, & hio_hydraulicmortality_carbonflux_si_pft => this%hvars(ih_hydraulicmortality_carbonflux_si_pft)%r82d, & hio_firemortality_carbonflux_si_pft => this%hvars(ih_firemortality_carbonflux_si_pft)%r82d, & hio_crownarea_si_pft => this%hvars(ih_crownarea_si_pft)%r82d, & @@ -3291,6 +3293,9 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) hio_cstarvmortality_carbonflux_si_pft(io_si,ccohort%pft) = hio_cstarvmortality_carbonflux_si_pft(io_si,ccohort%pft) + & ccohort%cmort * total_m * ccohort%n * days_per_sec * years_per_day * ha_per_m2 + hio_cstarvmortality_continuous_carbonflux_si_pft(io_si,ccohort%pft) = hio_cstarvmortality_continuous_carbonflux_si_pft(io_si,ccohort%pft) + & + ccohort%cmort * total_m * ccohort%n * days_per_sec * years_per_day * ha_per_m2 + ! Aboveground mortality hio_abg_mortality_cflux_si_scpf(io_si,scpf) = hio_abg_mortality_cflux_si_scpf(io_si,scpf) + & (ccohort%bmort + ccohort%hmort + ccohort%cmort + & @@ -3771,32 +3776,51 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) ! pass the cohort termination mortality as a flux to the history, and then reset the termination mortality buffer ! note there are various ways of reporting the total mortality, so pass to these as well + do i_pft = 1, numpft + hio_cstarvmortality_carbonflux_si_pft(io_si,i_pft) = hio_cstarvmortality_carbonflux_si_pft(io_si,i_pft) + & + (sites(s)%term_carbonflux_ustory(i_term_mort_type_cstarv,i_pft) + & + sites(s)%term_carbonflux_canopy(i_term_mort_type_cstarv,i_pft)) * days_per_sec * ha_per_m2 + end do + do i_pft = 1, numpft do i_scls = 1,nlevsclass i_scpf = (i_pft-1)*nlevsclass + i_scls ! ! termination mortality. sum of canopy and understory indices - hio_m6_si_scpf(io_si,i_scpf) = (sites(s)%term_nindivs_canopy(i_scls,i_pft) + & - sites(s)%term_nindivs_ustory(i_scls,i_pft)) * & + ! move carbon starvation-related termination mortality to the carbon starvation mortality type and only consider + ! the otehr two types of termination mortality here. + hio_m6_si_scpf(io_si,i_scpf) = (sum(sites(s)%term_nindivs_canopy(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft)) + & + sum(sites(s)%term_nindivs_ustory(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft))) * & days_per_year / m2_per_ha hio_m6_si_scls(io_si,i_scls) = hio_m6_si_scls(io_si,i_scls) + & - (sites(s)%term_nindivs_canopy(i_scls,i_pft) + & - sites(s)%term_nindivs_ustory(i_scls,i_pft)) * & + (sum(sites(s)%term_nindivs_canopy(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft)) + & + sum(sites(s)%term_nindivs_ustory(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft))) * & days_per_year / m2_per_ha ! + ! add the carbon starvation-related termination mortality to the carbon starvation diagnostics + hio_m3_si_scpf(io_si,scpf) = hio_m3_si_scpf(io_si,scpf) + & + (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) + & + sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft)) * & + days_per_year / m2_per_ha + ! + hio_m3_si_scls(io_si,scls) = hio_m3_si_scls(io_si,scls) + & + (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) + & + sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft)) * & + days_per_year / m2_per_ha + ! ! add termination mortality to canopy and understory mortality hio_mortality_canopy_si_scls(io_si,i_scls) = hio_mortality_canopy_si_scls(io_si,i_scls) + & - sites(s)%term_nindivs_canopy(i_scls,i_pft) * days_per_year / m2_per_ha + sum(sites(s)%term_nindivs_canopy(:,i_scls,i_pft)) * days_per_year / m2_per_ha hio_mortality_understory_si_scls(io_si,i_scls) = hio_mortality_understory_si_scls(io_si,i_scls) + & - sites(s)%term_nindivs_ustory(i_scls,i_pft) * days_per_year / m2_per_ha + sum(sites(s)%term_nindivs_ustory(:,i_scls,i_pft)) * days_per_year / m2_per_ha hio_mortality_canopy_si_scpf(io_si,i_scpf) = hio_mortality_canopy_si_scpf(io_si,i_scpf) + & - sites(s)%term_nindivs_canopy(i_scls,i_pft) * days_per_year / m2_per_ha + sum(sites(s)%term_nindivs_canopy(:,i_scls,i_pft)) * days_per_year / m2_per_ha hio_mortality_understory_si_scpf(io_si,i_scpf) = hio_mortality_understory_si_scpf(io_si,i_scpf) + & - sites(s)%term_nindivs_ustory(i_scls,i_pft) * days_per_year / m2_per_ha + sum(sites(s)%term_nindivs_ustory(:,i_scls,i_pft)) * days_per_year / m2_per_ha ! ! imort on its own @@ -3877,8 +3901,8 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) (sites(s)%fmort_carbonflux_canopy(i_pft) + & sites(s)%fmort_carbonflux_ustory(i_pft) ) / g_per_kg + & sites(s)%imort_carbonflux(i_pft) + & - sites(s)%term_carbonflux_ustory(i_pft) * days_per_sec * ha_per_m2 + & - sites(s)%term_carbonflux_canopy(i_pft) * days_per_sec * ha_per_m2 + sum(sites(s)%term_carbonflux_ustory(:,i_pft)) * days_per_sec * ha_per_m2 + & + sum(sites(s)%term_carbonflux_canopy(:,i_pft)) * days_per_sec * ha_per_m2 hio_firemortality_carbonflux_si_pft(io_si,i_pft) = sites(s)%fmort_carbonflux_canopy(i_pft) / g_per_kg end do @@ -3929,8 +3953,8 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) end do end if - sites(s)%term_nindivs_canopy(:,:) = 0._r8 - sites(s)%term_nindivs_ustory(:,:) = 0._r8 + sites(s)%term_nindivs_canopy(:,:,:) = 0._r8 + sites(s)%term_nindivs_ustory(:,:,:) = 0._r8 sites(s)%imort_carbonflux(:) = 0._r8 sites(s)%imort_rate(:,:) = 0._r8 sites(s)%fmort_rate_canopy(:,:) = 0._r8 @@ -4338,10 +4362,10 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) ! mortality-associated carbon fluxes hio_canopy_mortality_carbonflux_si(io_si) = hio_canopy_mortality_carbonflux_si(io_si) + & - sum(sites(s)%term_carbonflux_canopy(:)) * days_per_sec * ha_per_m2 + sum(sites(s)%term_carbonflux_canopy(:,:)) * days_per_sec * ha_per_m2 hio_understory_mortality_carbonflux_si(io_si) = hio_understory_mortality_carbonflux_si(io_si) + & - sum(sites(s)%term_carbonflux_ustory(:)) * days_per_sec * ha_per_m2 + sum(sites(s)%term_carbonflux_ustory(:,:)) * days_per_sec * ha_per_m2 ! add site level mortality counting to crownarea diagnostic hio_canopy_mortality_crownarea_si(io_si) = hio_canopy_mortality_crownarea_si(io_si) + & @@ -4354,8 +4378,8 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) sites(s)%imort_crownarea ! and zero the site-level termination carbon flux variable - sites(s)%term_carbonflux_canopy(:) = 0._r8 - sites(s)%term_carbonflux_ustory(:) = 0._r8 + sites(s)%term_carbonflux_canopy(:,:) = 0._r8 + sites(s)%term_carbonflux_ustory(:,:) = 0._r8 ! ! add the site-level disturbance-associated cwd and litter input fluxes to thir respective flux fields @@ -6800,11 +6824,17 @@ subroutine define_history_vars(this, initialize_variables) index=ih_hydraulicmortality_carbonflux_si_pft) call this%set_history_var(vname='FATES_MORTALITY_CSTARV_CFLUX_PF', units='kg m-2 s-1', & - long='PFT-level flux of biomass carbon from live to dead pool from carbon starvation mortality', & + long='PFT-level flux of biomass carbon from live to dead pool from carbon starvation mortality (both continuous and termination)', & use_default='active', avgflag='A', vtype=site_pft_r8, hlms='CLM:ALM', & upfreq=1, ivar=ivar, initialize=initialize_variables, & index=ih_cstarvmortality_carbonflux_si_pft) + call this%set_history_var(vname='FATES_MORTALITY_CSTARV_CONT_CFLUX_PF', units='kg m-2 s-1', & + long='PFT-level flux of biomass carbon from live to dead pool from carbon starvation mortality (Continuous-only, without termination)', & + use_default='active', avgflag='A', vtype=site_pft_r8, hlms='CLM:ALM', & + upfreq=1, ivar=ivar, initialize=initialize_variables, & + index=ih_cstarvmortality_continuous_carbonflux_si_pft) + call this%set_history_var(vname='FATES_ABOVEGROUND_MORT_SZPF', units='kg m-2 s-1', & long='Aboveground flux of carbon from AGB to necromass due to mortality', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, hlms='CLM:ALM', & @@ -7079,7 +7109,7 @@ subroutine define_history_vars(this, initialize_variables) call this%set_history_var(vname='FATES_MORTALITY_CSTARV_SZPF', & units = 'm-2 yr-1', & - long='carbon starvation mortality by pft/size in number of plants per m2 per year', & + long='carbon starvation mortality by pft/size in number of plants per m2 per year (both continous and termination)', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & initialize=initialize_variables, index = ih_m3_si_scpf) @@ -7494,7 +7524,7 @@ subroutine define_history_vars(this, initialize_variables) call this%set_history_var(vname='FATES_MORTALITY_CSTARV_SZ', & units = 'm-2 yr-1', & - long='carbon starvation mortality by size in number of plants per m2 per year', & + long='carbon starvation mortality by size in number of plants per m2 per year (both continous and termination)', & use_default='active', avgflag='A', vtype=site_size_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & initialize=initialize_variables, index = ih_m3_si_scls) diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index 2961e0900a..94599f1be2 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -47,6 +47,7 @@ module FatesRestartInterfaceMod use FatesRunningMeanMod, only : rmean_type use FatesRunningMeanMod, only : ema_lpa use EDParamsMod, only : regeneration_model + use FatesConstantsMod, only : n_term_mort_types ! CIME GLOBALS use shr_log_mod , only : errMsg => shr_log_errMsg @@ -1948,6 +1949,8 @@ subroutine set_restart_vectors(this,nc,nsites,sites) integer :: io_idx_si_pft ! each site-pft index integer :: io_idx_si_vtmem ! indices for veg-temp memory at site integer :: io_idx_pa_ncl ! each canopy layer within each patch + integer :: io_idx_si_scpf_term ! loop counter for scls, pft, and termination type + integer :: io_idx_si_pft_term ! loop counter for pft, and termination type ! Some counters (for checking mostly) integer :: totalcohorts ! total cohort count on this thread (diagnostic) @@ -1970,6 +1973,7 @@ subroutine set_restart_vectors(this,nc,nsites,sites) integer :: i_cdam ! loop counter for damage integer :: icdi ! loop counter for damage integer :: icdj ! loop counter for damage + integer :: i_term_type ! loop counter for termination type type(fates_restart_variable_type) :: rvar type(fates_patch_type),pointer :: cpatch @@ -2127,6 +2131,8 @@ subroutine set_restart_vectors(this,nc,nsites,sites) io_idx_si_cdpf = io_idx_co_1st io_idx_si_scpf = io_idx_co_1st io_idx_si_pft = io_idx_co_1st + io_idx_si_scpf_term = io_idx_co_1st + io_idx_si_pft_term = io_idx_co_1st ! recruitment rate do i_pft = 1,numpft @@ -2148,8 +2154,6 @@ subroutine set_restart_vectors(this,nc,nsites,sites) rio_imortrate_siscpf(io_idx_si_scpf) = sites(s)%imort_rate(i_scls, i_pft) rio_fmortrate_crown_siscpf(io_idx_si_scpf) = sites(s)%fmort_rate_crown(i_scls, i_pft) rio_fmortrate_cambi_siscpf(io_idx_si_scpf) = sites(s)%fmort_rate_cambial(i_scls, i_pft) - rio_termnindiv_cano_siscpf(io_idx_si_scpf) = sites(s)%term_nindivs_canopy(i_scls,i_pft) - rio_termnindiv_usto_siscpf(io_idx_si_scpf) = sites(s)%term_nindivs_ustory(i_scls,i_pft) rio_growflx_fusion_siscpf(io_idx_si_scpf) = sites(s)%growthflux_fusion(i_scls, i_pft) rio_abg_term_flux_siscpf(io_idx_si_scpf) = sites(s)%term_abg_flux(i_scls, i_pft) rio_abg_imort_flux_siscpf(io_idx_si_scpf) = sites(s)%imort_abg_flux(i_scls, i_pft) @@ -2158,9 +2162,25 @@ subroutine set_restart_vectors(this,nc,nsites,sites) end do end do + do i_scls = 1, nlevsclass + do i_pft = 1, numpft + do i_term_type = 1, n_term_mort_types + rio_termnindiv_cano_siscpf(io_idx_si_scpf_term) = sites(s)%term_nindivs_canopy(i_term_type,i_scls,i_pft) + rio_termnindiv_usto_siscpf(io_idx_si_scpf_term) = sites(s)%term_nindivs_ustory(i_term_type,i_scls,i_pft) + io_idx_si_scpf_term = io_idx_si_scpf_term + 1 + end do + end do + end do + + do i_pft = 1, numpft + do i_term_type = 1, n_term_mort_types + rio_termcflux_cano_sipft(io_idx_si_pft_term) = sites(s)%term_carbonflux_canopy(i_term_type,i_pft) + rio_termcflux_usto_sipft(io_idx_si_pft_term) = sites(s)%term_carbonflux_ustory(i_term_type,i_pft) + io_idx_si_pft_term = io_idx_si_pft_term + 1 + end do + end do + do i_pft = 1, numpft - rio_termcflux_cano_sipft(io_idx_si_pft) = sites(s)%term_carbonflux_canopy(i_pft) - rio_termcflux_usto_sipft(io_idx_si_pft) = sites(s)%term_carbonflux_ustory(i_pft) rio_fmortcflux_cano_sipft(io_idx_si_pft) = sites(s)%fmort_carbonflux_canopy(i_pft) rio_fmortcflux_usto_sipft(io_idx_si_pft) = sites(s)%fmort_carbonflux_ustory(i_pft) rio_imortcflux_sipft(io_idx_si_pft) = sites(s)%imort_carbonflux(i_pft) @@ -2894,6 +2914,8 @@ subroutine get_restart_vectors(this, nc, nsites, sites) integer :: io_idx_si_cdpf ! damage x size x pft within site integer :: io_idx_pa_ncl ! each canopy layer within each patch + integer :: io_idx_si_scpf_term ! loop counter for scls, pft, and termination type + integer :: io_idx_si_pft_term ! loop counter for pft, and termination type ! Some counters (for checking mostly) integer :: totalcohorts ! total cohort count on this thread (diagnostic) @@ -2913,6 +2935,7 @@ subroutine get_restart_vectors(this, nc, nsites, sites) integer :: i_cdam ! loop counter for damage class integer :: icdj ! loop counter for damage class integer :: icdi ! loop counter for damage class + integer :: i_term_type ! loop counter for termination type associate( rio_npatch_si => this%rvars(ir_npatch_si)%int1d, & rio_cd_status_si => this%rvars(ir_cd_status_si)%int1d, & @@ -3055,6 +3078,8 @@ subroutine get_restart_vectors(this, nc, nsites, sites) io_idx_si_cdpf = io_idx_co_1st io_idx_si_scpf = io_idx_co_1st io_idx_si_pft = io_idx_co_1st + io_idx_si_scpf_term = io_idx_co_1st + io_idx_si_pft_term = io_idx_co_1st ! read seed_bank info(site-level, but PFT-resolved) do i_pft = 1,numpft @@ -3083,8 +3108,6 @@ subroutine get_restart_vectors(this, nc, nsites, sites) sites(s)%imort_rate(i_scls, i_pft) = rio_imortrate_siscpf(io_idx_si_scpf) sites(s)%fmort_rate_crown(i_scls, i_pft) = rio_fmortrate_crown_siscpf(io_idx_si_scpf) sites(s)%fmort_rate_cambial(i_scls, i_pft) = rio_fmortrate_cambi_siscpf(io_idx_si_scpf) - sites(s)%term_nindivs_canopy(i_scls,i_pft) = rio_termnindiv_cano_siscpf(io_idx_si_scpf) - sites(s)%term_nindivs_ustory(i_scls,i_pft) = rio_termnindiv_usto_siscpf(io_idx_si_scpf) sites(s)%growthflux_fusion(i_scls, i_pft) = rio_growflx_fusion_siscpf(io_idx_si_scpf) sites(s)%term_abg_flux(i_scls,i_pft) = rio_abg_term_flux_siscpf(io_idx_si_scpf) sites(s)%imort_abg_flux(i_scls,i_pft) = rio_abg_imort_flux_siscpf(io_idx_si_scpf) @@ -3093,9 +3116,25 @@ subroutine get_restart_vectors(this, nc, nsites, sites) end do end do + do i_scls = 1, nlevsclass + do i_pft = 1, numpft + do i_term_type = 1, n_term_mort_types + sites(s)%term_nindivs_canopy(i_term_type,i_scls,i_pft) = rio_termnindiv_cano_siscpf(io_idx_si_scpf_term) + sites(s)%term_nindivs_ustory(i_term_type,i_scls,i_pft) = rio_termnindiv_usto_siscpf(io_idx_si_scpf_term) + io_idx_si_scpf_term = io_idx_si_scpf_term + 1 + end do + end do + end do + + do i_pft = 1, numpft + do i_term_type = 1, n_term_mort_types + sites(s)%term_carbonflux_canopy(i_term_type,i_pft) = rio_termcflux_cano_sipft(io_idx_si_pft_term) + sites(s)%term_carbonflux_ustory(i_term_type,i_pft) = rio_termcflux_usto_sipft(io_idx_si_pft_term) + io_idx_si_pft_term = io_idx_si_pft_term + 1 + end do + end do + do i_pft = 1, numpft - sites(s)%term_carbonflux_canopy(i_pft) = rio_termcflux_cano_sipft(io_idx_si_pft) - sites(s)%term_carbonflux_ustory(i_pft) = rio_termcflux_usto_sipft(io_idx_si_pft) sites(s)%fmort_carbonflux_canopy(i_pft) = rio_fmortcflux_cano_sipft(io_idx_si_pft) sites(s)%fmort_carbonflux_ustory(i_pft) = rio_fmortcflux_usto_sipft(io_idx_si_pft) sites(s)%imort_carbonflux(i_pft) = rio_imortcflux_sipft(io_idx_si_pft) From ad307d29622d52214f50b3dd1711e32d730c37c9 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Wed, 22 Nov 2023 10:37:50 -0800 Subject: [PATCH 02/14] debug --- main/FatesHistoryInterfaceMod.F90 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index e20d363ae0..7835a01098 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -2170,7 +2170,10 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) integer :: model_day_int ! Integer model day since simulation start integer :: ageclass_since_anthrodist ! what is the equivalent age class for ! time-since-anthropogenic-disturbance of secondary forest - + integer :: i_term_mort_type_cstarv ! Jenny add comment here + integer :: i_term_mort_type_canlev ! + integer :: n_term_mort_types ! + real(r8) :: store_max ! The target nutrient mass for storage element of interest [kg] real(r8) :: n_perm2 ! individuals per m2 for the whole column real(r8) :: dbh ! diameter ("at breast height") @@ -3803,12 +3806,12 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) days_per_year / m2_per_ha ! ! add the carbon starvation-related termination mortality to the carbon starvation diagnostics - hio_m3_si_scpf(io_si,scpf) = hio_m3_si_scpf(io_si,scpf) + & + hio_m3_si_scpf(io_si,i_scpf) = hio_m3_si_scpf(io_si,i_scpf) + & (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) + & sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft)) * & days_per_year / m2_per_ha ! - hio_m3_si_scls(io_si,scls) = hio_m3_si_scls(io_si,scls) + & + hio_m3_si_scls(io_si,i_scls) = hio_m3_si_scls(io_si,i_scls) + & (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) + & sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft)) * & days_per_year / m2_per_ha From 019fa589a9c7ff311b957d2566840a310e901303 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Wed, 22 Nov 2023 11:11:54 -0800 Subject: [PATCH 03/14] added comments --- main/FatesHistoryInterfaceMod.F90 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 7835a01098..f38d9d2391 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -2169,10 +2169,12 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) integer :: el ! Loop index for elements integer :: model_day_int ! Integer model day since simulation start integer :: ageclass_since_anthrodist ! what is the equivalent age class for - ! time-since-anthropogenic-disturbance of secondary forest - integer :: i_term_mort_type_cstarv ! Jenny add comment here - integer :: i_term_mort_type_canlev ! - integer :: n_term_mort_types ! + ! time-since-anthropogenic-disturbance of secondary forest + + ! Descriptions for the following 3 variables might not be quite right - Jenny K. + integer :: i_term_mort_type_cstarv ! index for carbon starvation-related termination mortality + integer :: i_term_mort_type_canlev ! index for termination mortality type by canopy level + integer :: n_term_mort_types ! number of termination mortality types real(r8) :: store_max ! The target nutrient mass for storage element of interest [kg] real(r8) :: n_perm2 ! individuals per m2 for the whole column @@ -3795,7 +3797,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) ! ! termination mortality. sum of canopy and understory indices ! move carbon starvation-related termination mortality to the carbon starvation mortality type and only consider - ! the otehr two types of termination mortality here. + ! the other two types of termination mortality here. hio_m6_si_scpf(io_si,i_scpf) = (sum(sites(s)%term_nindivs_canopy(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft)) + & sum(sites(s)%term_nindivs_ustory(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft))) * & days_per_year / m2_per_ha From e5f6160119f73e2c24bd74d5b92bfe34ac98c6c6 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Wed, 22 Nov 2023 11:20:31 -0800 Subject: [PATCH 04/14] debug --- main/EDInitMod.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index ef2bfae6a0..cdb25ff9ab 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -130,8 +130,8 @@ subroutine init_site_vars( site_in, bc_in, bc_out ) integer :: el ! - allocate(site_in%term_nindivs_canopy(1:nlevsclass,1:numpft)) - allocate(site_in%term_nindivs_ustory(1:nlevsclass,1:numpft)) + allocate(site_in%term_nindivs_canopy(1:n_term_mort_types,1:nlevsclass,1:numpft)) + allocate(site_in%term_nindivs_ustory(1:n_term_mort_types,1:nlevsclass,1:numpft)) allocate(site_in%demotion_rate(1:nlevsclass)) allocate(site_in%promotion_rate(1:nlevsclass)) allocate(site_in%imort_rate(1:nlevsclass,1:numpft)) From ae8f117bb9c6d0fecd5d3055f4c12771379f6e5a Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Mon, 18 Dec 2023 11:29:37 -0800 Subject: [PATCH 05/14] bug fix --- biogeochem/EDCohortDynamicsMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 1f14a3a2c0..d9c2299902 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -429,7 +429,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ ! Outside the maximum canopy layer if (currentCohort%canopy_layer > nclmax ) then terminate = itrue - termination_type = i_term_mort_type_cstarv + termination_type = i_term_mort_type_canlev if ( debug ) then write(fates_log(),*) 'terminating cohorts 2', currentCohort%canopy_layer,currentCohort%pft,call_index endif From 85e7c18be7ccb01be97836f57de9120d77df7a5a Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Thu, 21 Dec 2023 03:05:44 -0800 Subject: [PATCH 06/14] corrected comments --- main/FatesHistoryInterfaceMod.F90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index f38d9d2391..926f0f096d 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -2171,9 +2171,8 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) integer :: ageclass_since_anthrodist ! what is the equivalent age class for ! time-since-anthropogenic-disturbance of secondary forest - ! Descriptions for the following 3 variables might not be quite right - Jenny K. - integer :: i_term_mort_type_cstarv ! index for carbon starvation-related termination mortality - integer :: i_term_mort_type_canlev ! index for termination mortality type by canopy level + integer :: i_term_mort_type_cstarv ! index for carbon starvation termination mortality + integer :: i_term_mort_type_canlev ! index for termination mortality due to being pushed out of lowest canopy level integer :: n_term_mort_types ! number of termination mortality types real(r8) :: store_max ! The target nutrient mass for storage element of interest [kg] From 052d52c07d9c031d37b7f5714c44c48e2a770199 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Thu, 21 Dec 2023 09:37:15 -0800 Subject: [PATCH 07/14] fixed error in variable declaration, added c-starve related termination mortality to M3 canopy and understory mortalities, fixed units for FATES_M3_MORTALITY_* history variables --- main/FatesHistoryInterfaceMod.F90 | 42 +++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 926f0f096d..d417b816e7 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -2132,6 +2132,11 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) use EDParamsMod , only : nlevleaf use EDParamsMod , only : ED_val_history_height_bin_edges use FatesInterfaceTypesMod , only : nlevdamage + + use FatesConstantsMod, only : n_term_mort_types + use FatesConstantsMod, only : i_term_mort_type_cstarv + use FatesConstantsMod, only : i_term_mort_type_canlev + use FatesConstantsMod, only : i_term_mort_type_numdens ! Arguments class(fates_history_interface_type) :: this @@ -2170,10 +2175,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) integer :: model_day_int ! Integer model day since simulation start integer :: ageclass_since_anthrodist ! what is the equivalent age class for ! time-since-anthropogenic-disturbance of secondary forest - - integer :: i_term_mort_type_cstarv ! index for carbon starvation termination mortality - integer :: i_term_mort_type_canlev ! index for termination mortality due to being pushed out of lowest canopy level - integer :: n_term_mort_types ! number of termination mortality types + real(r8) :: store_max ! The target nutrient mass for storage element of interest [kg] real(r8) :: n_perm2 ! individuals per m2 for the whole column @@ -3797,6 +3799,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) ! termination mortality. sum of canopy and understory indices ! move carbon starvation-related termination mortality to the carbon starvation mortality type and only consider ! the other two types of termination mortality here. + hio_m6_si_scpf(io_si,i_scpf) = (sum(sites(s)%term_nindivs_canopy(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft)) + & sum(sites(s)%term_nindivs_ustory(i_term_mort_type_canlev:n_term_mort_types,i_scls,i_pft))) * & days_per_year / m2_per_ha @@ -3816,8 +3819,27 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) + & sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft)) * & days_per_year / m2_per_ha + + + ! add c-starve termination mortality to canopy and understory M3 mortality (N/m^2/yr) + hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) = hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) + & + (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * & + days_per_year / m2_per_ha + + hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) = hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) + & + (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * & + days_per_year / m2_per_ha + + hio_m3_mortality_canopy_si_scls(io_si,i_scls) = hio_m3_mortality_canopy_si_scls(io_si,i_scls) + & + (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * & + days_per_year / m2_per_ha + + hio_m3_mortality_ustory_si_scls(io_si,scls) = hio_m3_mortality_ustory_si_scls(io_si,scls) + & + (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * & + days_per_year / m2_per_ha + ! - ! add termination mortality to canopy and understory mortality + ! add termination mortality to canopy and understory mortality (N/m^2/yr) hio_mortality_canopy_si_scls(io_si,i_scls) = hio_mortality_canopy_si_scls(io_si,i_scls) + & sum(sites(s)%term_nindivs_canopy(:,i_scls,i_pft)) * days_per_year / m2_per_ha @@ -3830,7 +3852,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) hio_mortality_understory_si_scpf(io_si,i_scpf) = hio_mortality_understory_si_scpf(io_si,i_scpf) + & sum(sites(s)%term_nindivs_ustory(:,i_scls,i_pft)) * days_per_year / m2_per_ha - ! + ! ! imort on its own hio_m4_si_scpf(io_si,i_scpf) = sites(s)%imort_rate(i_scls, i_pft) / m2_per_ha hio_m4_si_scls(io_si,i_scls) = hio_m4_si_scls(io_si,i_scls) + sites(s)%imort_rate(i_scls, i_pft) / m2_per_ha @@ -7219,14 +7241,14 @@ subroutine define_history_vars(this, initialize_variables) initialize=initialize_variables, index = ih_mortality_canopy_si_scpf) call this%set_history_var(vname='FATES_M3_MORTALITY_CANOPY_SZPF', & - units = 'N/ha/yr', & + units = 'm-2 yr-1', & long='C starvation mortality of canopy plants by pft/size', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & initialize=initialize_variables, index = ih_m3_mortality_canopy_si_scpf ) call this%set_history_var(vname='FATES_M3_MORTALITY_USTORY_SZPF', & - units = 'N/ha/yr', & + units = 'm-2 yr-1', & long='C starvation mortality of understory plants by pft/size', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & @@ -7497,14 +7519,14 @@ subroutine define_history_vars(this, initialize_variables) initialize=initialize_variables, index = ih_nplant_understory_si_scls) call this%set_history_var(vname='FATES_M3_MORTALITY_CANOPY_SZ', & - units = 'N/ha/yr', & + units = 'm-2 yr-1', & long='C starvation mortality of canopy plants by size', & use_default='inactive', avgflag='A', vtype=site_size_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & initialize=initialize_variables, index = ih_m3_mortality_canopy_si_scls ) call this%set_history_var(vname='FATES_M3_MORTALITY_USTORY_SZ', & - units = 'N/ha/yr', & + units = 'm-2 yr-1', & long='C starvation mortality of understory plants by size', & use_default='inactive', avgflag='A', vtype=site_size_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & From d9113d168debb550bded8e07e90d7a815d01f98b Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Thu, 21 Dec 2023 10:04:35 -0800 Subject: [PATCH 08/14] bug fix --- main/FatesHistoryInterfaceMod.F90 | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index d417b816e7..754e586256 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -3823,20 +3823,16 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) ! add c-starve termination mortality to canopy and understory M3 mortality (N/m^2/yr) hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) = hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) + & - (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * & - days_per_year / m2_per_ha + (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) = hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) + & - (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * & - days_per_year / m2_per_ha + (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha hio_m3_mortality_canopy_si_scls(io_si,i_scls) = hio_m3_mortality_canopy_si_scls(io_si,i_scls) + & - (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * & - days_per_year / m2_per_ha + (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha - hio_m3_mortality_ustory_si_scls(io_si,scls) = hio_m3_mortality_ustory_si_scls(io_si,scls) + & - (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * & - days_per_year / m2_per_ha + hio_m3_mortality_ustory_si_scls(io_si,i_scls) = hio_m3_mortality_ustory_si_scls(io_si,i_scls) + & + (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha ! ! add termination mortality to canopy and understory mortality (N/m^2/yr) From d9edfc53c57162468b96775f2ddd1ca722b18e09 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Thu, 21 Dec 2023 10:24:45 -0800 Subject: [PATCH 09/14] bug fix; added error check for termination_type --- biogeochem/EDCohortDynamicsMod.F90 | 6 ++++++ main/FatesHistoryInterfaceMod.F90 | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index d9c2299902..ef87851ec1 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -503,6 +503,12 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in, ter !---------------------------------------------------------------------- + ! check termination_type; it should not be 0 + if (termination_type == 0) then + write(fates_log(),*) 'termination_type=0' + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + leaf_c = currentCohort%prt%GetState(leaf_organ, carbon12_element) store_c = currentCohort%prt%GetState(store_organ, carbon12_element) sapw_c = currentCohort%prt%GetState(sapw_organ, carbon12_element) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 754e586256..daaba0a19b 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -3823,16 +3823,16 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) ! add c-starve termination mortality to canopy and understory M3 mortality (N/m^2/yr) hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) = hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) + & - (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha + sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) = hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) + & - (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha + sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha hio_m3_mortality_canopy_si_scls(io_si,i_scls) = hio_m3_mortality_canopy_si_scls(io_si,i_scls) + & - (sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha + sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha hio_m3_mortality_ustory_si_scls(io_si,i_scls) = hio_m3_mortality_ustory_si_scls(io_si,i_scls) + & - (sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha + sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha ! ! add termination mortality to canopy and understory mortality (N/m^2/yr) From f479db4608ac8abb2df556cf7a08d33538c37202 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Thu, 21 Dec 2023 10:36:59 -0800 Subject: [PATCH 10/14] bug fix --- main/FatesHistoryInterfaceMod.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index daaba0a19b..020acc8857 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -3825,13 +3825,13 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) = hio_m3_mortality_canopy_si_scpf(io_si,i_scpf) + & sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha - hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) = hio_m3_mortality_ustory_si_scpf(io_si,i_scpf) + & + hio_m3_mortality_understory_si_scpf(io_si,i_scpf) = hio_m3_mortality_understory_si_scpf(io_si,i_scpf) + & sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha hio_m3_mortality_canopy_si_scls(io_si,i_scls) = hio_m3_mortality_canopy_si_scls(io_si,i_scls) + & sites(s)%term_nindivs_canopy(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha - hio_m3_mortality_ustory_si_scls(io_si,i_scls) = hio_m3_mortality_ustory_si_scls(io_si,i_scls) + & + hio_m3_mortality_understory_si_scls(io_si,i_scls) = hio_m3_mortality_understory_si_scls(io_si,i_scls) + & sites(s)%term_nindivs_ustory(i_term_mort_type_cstarv,i_scls,i_pft) * days_per_year / m2_per_ha ! From a470a431b3eb947fe09e214db98625ffdd782f0e Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Fri, 19 Jan 2024 10:22:03 -0800 Subject: [PATCH 11/14] shorten history variable name --- main/FatesHistoryInterfaceMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 4b1e3a374d..15941bdcaf 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -6927,7 +6927,7 @@ subroutine define_history_vars(this, initialize_variables) upfreq=1, ivar=ivar, initialize=initialize_variables, & index=ih_cstarvmortality_carbonflux_si_pft) - call this%set_history_var(vname='FATES_MORTALITY_CSTARV_CONT_CFLUX_PF', units='kg m-2 s-1', & + call this%set_history_var(vname='FATES_MORT_CSTARV_CONT_CFLUX_PF', units='kg m-2 s-1', & long='PFT-level flux of biomass carbon from live to dead pool from carbon starvation mortality (Continuous-only, without termination)', & use_default='active', avgflag='A', vtype=site_pft_r8, hlms='CLM:ALM', & upfreq=1, ivar=ivar, initialize=initialize_variables, & From 4d052e73b7c148aa94f255b41e28761f948abff3 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Fri, 19 Jan 2024 10:36:35 -0800 Subject: [PATCH 12/14] clean up loops to avoid duplication --- main/FatesRestartInterfaceMod.F90 | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index 84dd713349..90e282253b 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -2208,11 +2208,6 @@ subroutine set_restart_vectors(this,nc,nsites,sites) rio_abg_imort_flux_siscpf(io_idx_si_scpf) = sites(s)%imort_abg_flux(i_scls, i_pft) rio_abg_fmort_flux_siscpf(io_idx_si_scpf) = sites(s)%fmort_abg_flux(i_scls, i_pft) io_idx_si_scpf = io_idx_si_scpf + 1 - end do - end do - - do i_scls = 1, nlevsclass - do i_pft = 1, numpft do i_term_type = 1, n_term_mort_types rio_termnindiv_cano_siscpf(io_idx_si_scpf_term) = sites(s)%term_nindivs_canopy(i_term_type,i_scls,i_pft) rio_termnindiv_usto_siscpf(io_idx_si_scpf_term) = sites(s)%term_nindivs_ustory(i_term_type,i_scls,i_pft) @@ -2223,13 +2218,10 @@ subroutine set_restart_vectors(this,nc,nsites,sites) do i_pft = 1, numpft do i_term_type = 1, n_term_mort_types - rio_termcflux_cano_sipft(io_idx_si_pft_term) = sites(s)%term_carbonflux_canopy(i_term_type,i_pft) - rio_termcflux_usto_sipft(io_idx_si_pft_term) = sites(s)%term_carbonflux_ustory(i_term_type,i_pft) - io_idx_si_pft_term = io_idx_si_pft_term + 1 + rio_termcflux_cano_sipft(io_idx_si_pft_term) = sites(s)%term_carbonflux_canopy(i_term_type,i_pft) + rio_termcflux_usto_sipft(io_idx_si_pft_term) = sites(s)%term_carbonflux_ustory(i_term_type,i_pft) + io_idx_si_pft_term = io_idx_si_pft_term + 1 end do - end do - - do i_pft = 1, numpft rio_fmortcflux_cano_sipft(io_idx_si_pft) = sites(s)%fmort_carbonflux_canopy(i_pft) rio_fmortcflux_usto_sipft(io_idx_si_pft) = sites(s)%fmort_carbonflux_ustory(i_pft) rio_imortcflux_sipft(io_idx_si_pft) = sites(s)%imort_carbonflux(i_pft) @@ -3181,11 +3173,6 @@ subroutine get_restart_vectors(this, nc, nsites, sites) sites(s)%imort_abg_flux(i_scls,i_pft) = rio_abg_imort_flux_siscpf(io_idx_si_scpf) sites(s)%fmort_abg_flux(i_scls,i_pft) = rio_abg_fmort_flux_siscpf(io_idx_si_scpf) io_idx_si_scpf = io_idx_si_scpf + 1 - end do - end do - - do i_scls = 1, nlevsclass - do i_pft = 1, numpft do i_term_type = 1, n_term_mort_types sites(s)%term_nindivs_canopy(i_term_type,i_scls,i_pft) = rio_termnindiv_cano_siscpf(io_idx_si_scpf_term) sites(s)%term_nindivs_ustory(i_term_type,i_scls,i_pft) = rio_termnindiv_usto_siscpf(io_idx_si_scpf_term) @@ -3200,9 +3187,6 @@ subroutine get_restart_vectors(this, nc, nsites, sites) sites(s)%term_carbonflux_ustory(i_term_type,i_pft) = rio_termcflux_usto_sipft(io_idx_si_pft_term) io_idx_si_pft_term = io_idx_si_pft_term + 1 end do - end do - - do i_pft = 1, numpft sites(s)%fmort_carbonflux_canopy(i_pft) = rio_fmortcflux_cano_sipft(io_idx_si_pft) sites(s)%fmort_carbonflux_ustory(i_pft) = rio_fmortcflux_usto_sipft(io_idx_si_pft) sites(s)%imort_carbonflux(i_pft) = rio_imortcflux_sipft(io_idx_si_pft) From d3e850e0f38d91d4c6385d47a01fd60886e8dab3 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Fri, 19 Jan 2024 15:17:31 -0800 Subject: [PATCH 13/14] update long name for termination mortality history variables --- main/FatesHistoryInterfaceMod.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 15941bdcaf..bb359b84aa 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -7242,7 +7242,7 @@ subroutine define_history_vars(this, initialize_variables) call this%set_history_var(vname='FATES_MORTALITY_TERMINATION_SZPF', & units = 'm-2 yr-1', & - long='termination mortality by pft/size in number pf plants per m2 per year', & + long='termination mortality (excluding C-starvation) by pft/size in number pf plants per m2 per year', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & initialize=initialize_variables, index = ih_m6_si_scpf) @@ -7664,7 +7664,7 @@ subroutine define_history_vars(this, initialize_variables) call this%set_history_var(vname='FATES_MORTALITY_TERMINATION_SZ', & units = 'm-2 yr-1', & - long='termination mortality by size in number of plants per m2 per year', & + long='termination mortality (excluding C-starvation) by size in number of plants per m2 per year', & use_default='active', avgflag='A', vtype=site_size_r8, & hlms='CLM:ALM', upfreq=1, ivar=ivar, & initialize=initialize_variables, index = ih_m6_si_scls) From b01c84260504e8219c7dddcf781c3d30966eeec2 Mon Sep 17 00:00:00 2001 From: "[Jennifer Kowalczyk]" <[jenniferkowalczyk@lbl.gov]> Date: Fri, 19 Jan 2024 15:21:59 -0800 Subject: [PATCH 14/14] update comments --- main/EDTypesMod.F90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 179da693a4..d310f0b84b 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -386,12 +386,12 @@ module EDTypesMod ! were terminated this timestep, by termination type, size x pft real(r8), allocatable :: term_carbonflux_canopy(:,:) ! carbon flux from live to dead pools associated - ! with termination mortality, by termination type and per canopy level. [kgC/ha/day] + ! with termination mortality, by termination type and pft. [kgC/ha/day] real(r8), allocatable :: term_carbonflux_ustory(:,:) ! carbon flux from live to dead pools associated - ! with termination mortality, by termination type and per canopy level. [kgC/ha/day] - real(r8), allocatable :: imort_carbonflux(:) ! biomass of individuals killed due to impact mortality per year. [kgC/m2/sec] - real(r8), allocatable :: fmort_carbonflux_canopy(:) ! biomass of canopy indivs killed due to fire per year. [gC/m2/sec] - real(r8), allocatable :: fmort_carbonflux_ustory(:) ! biomass of understory indivs killed due to fire per year [gC/m2/sec] + ! with termination mortality, by termination type and pft. [kgC/ha/day] + real(r8), allocatable :: imort_carbonflux(:) ! biomass of individuals killed due to impact mortality per year, by pft. [kgC/m2/sec] + real(r8), allocatable :: fmort_carbonflux_canopy(:) ! biomass of canopy indivs killed due to fire per year, by pft. [gC/m2/sec] + real(r8), allocatable :: fmort_carbonflux_ustory(:) ! biomass of understory indivs killed due to fire per year, by pft [gC/m2/sec] real(r8), allocatable :: term_abg_flux(:,:) ! aboveground biomass lost due to termination mortality x size x pft real(r8), allocatable :: imort_abg_flux(:,:) ! aboveground biomass lost due to impact mortality x size x pft [kgC/m2/sec]