From 7ce7da8d87b55f6b85b326a975a6401071cfe24b Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 02:31:30 -0600 Subject: [PATCH 1/8] modified leaf flushing logic to prevent termination mortality --- biogeochem/EDPhysiologyMod.F90 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 4c6bbb8a4e..7620ec8a4b 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -907,7 +907,7 @@ subroutine phenology_leafonoff(currentSite) real(r8) :: store_c_transfer_frac ! Fraction of storage carbon used to flush leaves integer :: ipft real(r8), parameter :: leaf_drop_fraction = 1.0_r8 - + real(r8), parameter :: carbon store buffer = 0.10_r8 !------------------------------------------------------------------------ currentPatch => CurrentSite%oldest_patch @@ -936,8 +936,11 @@ subroutine phenology_leafonoff(currentSite) ! stop flow of carbon out of bstore. if(store_c>nearzero) then - store_c_transfer_frac = & - min(EDPftvarcon_inst%phenflush_fraction(ipft)*currentCohort%laimemory, store_c)/store_c + ! flush either the amount required from the laimemory, or -most- of the storage pool + ! RF: added a criterium to stop the entire store pool emptying and triggering termination mortality + ! n.b. this might not be necessary if we adopted a more gradual approach to leaf flushing... + store_c_transfer_frac = min((EDPftvarcon_inst%phenflush_fraction(ipft)* & + currentCohort%laimemory)/store_c,(1.0_r8-carbon_store_buffer)) else store_c_transfer_frac = 0.0_r8 end if From ca00801f0d98f985e5d5dcd1b3ae5bf734b3649f Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 02:42:02 -0600 Subject: [PATCH 2/8] zero outs dayssinceleafon --- biogeochem/EDPhysiologyMod.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 7620ec8a4b..038edfa10e 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -697,6 +697,7 @@ subroutine phenology( currentSite, bc_in ) (currentSite%nchilldays >= 1)) then currentSite%cstatus = phen_cstat_notcold ! Set to not-cold status (leaves can come on) currentSite%cleafondate = model_day_int + dayssincecleafon = 0 !rezero this so that the leaves don't immediately fall off again! if ( debug ) write(fates_log(),*) 'leaves on' endif !GDD From 9a1d9c091d306971bdb7556880d4473508d106f2 Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 03:00:34 -0600 Subject: [PATCH 3/8] modifications to GDD --- biogeochem/EDPhysiologyMod.F90 | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 038edfa10e..5bc92291d9 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -661,10 +661,32 @@ subroutine phenology( currentSite, bc_in ) endif ! ! accumulate the GDD using daily mean temperatures - if (bc_in%t_veg24_si .gt. tfrz) then + ! Don't accumulate GDD during the growing season (that wouldn't make sense) + if (bc_in%t_veg24_si .gt. tfrz .and. currentSite%cstatus == phen_cstat_iscold) then currentSite%grow_deg_days = currentSite%grow_deg_days + bc_in%t_veg24_si - tfrz endif + !this logic is to prevent GDD accumulating after the leaves have fallen and before the + ! beginnning of the accumulation period, to prevend erroneous autumn leaf flushing. + if(model_day_int>365)then !only do this after the first year to prevent odd behaviour + + if(currentSite%lat .gt. 0.0_r8)then !Northern Hemisphere + ! In the north, don't accumulate when we are past the leaf fall date. + ! Accumulation starts on day 1 of year in NH. + ! The 180 is to prevent going into an 'always off' state after initialization + if( model_day_int .gt. currentSite%cleafoffdate.and.hlm_day_of_year.gt.180)then ! + currentSite%grow_deg_days = 0._r8 + endif + else !Southern Hemisphere + ! In the South, don't accumulate after the leaf off date, and before the start of + ! the accumulation phase (day 181). + if(model_day_int .gt. currentSite%cleafoffdate.and.hlm_day_of_year.lt.gddstart) then! + currentSite%grow_deg_days = 0._r8 + endif + endif + endif !year1 + + ! Calculate the number of days since the leaves last came on ! and off. If this is the beginning of the simulation, that day might ! not had occured yet, so set it to last year to get things rolling @@ -698,6 +720,7 @@ subroutine phenology( currentSite, bc_in ) currentSite%cstatus = phen_cstat_notcold ! Set to not-cold status (leaves can come on) currentSite%cleafondate = model_day_int dayssincecleafon = 0 !rezero this so that the leaves don't immediately fall off again! + currentSite%grow_deg_days = 0._r8 ! zero GDD for the rest of the year until counting season begins. if ( debug ) write(fates_log(),*) 'leaves on' endif !GDD From 6bb362f880fcdd21f64f8dc1ef030b63e89dcd6e Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 03:55:29 -0600 Subject: [PATCH 4/8] back to fixed leafflush logic --- biogeochem/EDPhysiologyMod.F90 | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 5bc92291d9..a1c0b2e3d0 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -662,31 +662,10 @@ subroutine phenology( currentSite, bc_in ) ! ! accumulate the GDD using daily mean temperatures ! Don't accumulate GDD during the growing season (that wouldn't make sense) - if (bc_in%t_veg24_si .gt. tfrz .and. currentSite%cstatus == phen_cstat_iscold) then + if (bc_in%t_veg24_si .gt. tfrz) then currentSite%grow_deg_days = currentSite%grow_deg_days + bc_in%t_veg24_si - tfrz endif - !this logic is to prevent GDD accumulating after the leaves have fallen and before the - ! beginnning of the accumulation period, to prevend erroneous autumn leaf flushing. - if(model_day_int>365)then !only do this after the first year to prevent odd behaviour - - if(currentSite%lat .gt. 0.0_r8)then !Northern Hemisphere - ! In the north, don't accumulate when we are past the leaf fall date. - ! Accumulation starts on day 1 of year in NH. - ! The 180 is to prevent going into an 'always off' state after initialization - if( model_day_int .gt. currentSite%cleafoffdate.and.hlm_day_of_year.gt.180)then ! - currentSite%grow_deg_days = 0._r8 - endif - else !Southern Hemisphere - ! In the South, don't accumulate after the leaf off date, and before the start of - ! the accumulation phase (day 181). - if(model_day_int .gt. currentSite%cleafoffdate.and.hlm_day_of_year.lt.gddstart) then! - currentSite%grow_deg_days = 0._r8 - endif - endif - endif !year1 - - ! Calculate the number of days since the leaves last came on ! and off. If this is the beginning of the simulation, that day might ! not had occured yet, so set it to last year to get things rolling @@ -719,8 +698,6 @@ subroutine phenology( currentSite, bc_in ) (currentSite%nchilldays >= 1)) then currentSite%cstatus = phen_cstat_notcold ! Set to not-cold status (leaves can come on) currentSite%cleafondate = model_day_int - dayssincecleafon = 0 !rezero this so that the leaves don't immediately fall off again! - currentSite%grow_deg_days = 0._r8 ! zero GDD for the rest of the year until counting season begins. if ( debug ) write(fates_log(),*) 'leaves on' endif !GDD @@ -931,7 +908,7 @@ subroutine phenology_leafonoff(currentSite) real(r8) :: store_c_transfer_frac ! Fraction of storage carbon used to flush leaves integer :: ipft real(r8), parameter :: leaf_drop_fraction = 1.0_r8 - real(r8), parameter :: carbon store buffer = 0.10_r8 + real(r8), parameter :: carbon_store_buffer = 0.10_r8 !------------------------------------------------------------------------ currentPatch => CurrentSite%oldest_patch From 2e183945edd5635fb39b8b31b1d9ef5d373af07a Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 03:58:27 -0600 Subject: [PATCH 5/8] back tozero out dayssinceleafon --- biogeochem/EDPhysiologyMod.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index a1c0b2e3d0..5d6b5d7d2b 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -698,6 +698,7 @@ subroutine phenology( currentSite, bc_in ) (currentSite%nchilldays >= 1)) then currentSite%cstatus = phen_cstat_notcold ! Set to not-cold status (leaves can come on) currentSite%cleafondate = model_day_int + dayssincecleafon = 0 if ( debug ) write(fates_log(),*) 'leaves on' endif !GDD From 6efbee491da1ee349e35cd9c8cf4a4b79da2c7c4 Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 05:19:42 -0600 Subject: [PATCH 6/8] back to GDD modifications --- biogeochem/EDPhysiologyMod.F90 | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 5d6b5d7d2b..f3ed013cfb 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -662,10 +662,30 @@ subroutine phenology( currentSite, bc_in ) ! ! accumulate the GDD using daily mean temperatures ! Don't accumulate GDD during the growing season (that wouldn't make sense) - if (bc_in%t_veg24_si .gt. tfrz) then + if (bc_in%t_veg24_si .gt. tfrz.and. currentSite%cstatus == phen_cstat_iscold) then currentSite%grow_deg_days = currentSite%grow_deg_days + bc_in%t_veg24_si - tfrz endif + !this logic is to prevent GDD accumulating after the leaves have fallen and before the + ! beginnning of the accumulation period, to prevend erroneous autumn leaf flushing. + if(model_day_int>365)then !only do this after the first year to prevent odd behaviour + + if(currentSite%lat .gt. 0.0_r8)then !Northern Hemisphere + ! In the north, don't accumulate when we are past the leaf fall date. + ! Accumulation starts on day 1 of year in NH. + ! The 180 is to prevent going into an 'always off' state after initialization + if( model_day_int .gt. currentSite%cleafoffdate.and.hlm_day_of_year.gt.180)then ! + currentSite%grow_deg_days = 0._r8 + endif + else !Southern Hemisphere + ! In the South, don't accumulate after the leaf off date, and before the start of + ! the accumulation phase (day 181). + if(model_day_int .gt. currentSite%cleafoffdate.and.hlm_day_of_year.lt.gddstart) then! + currentSite%grow_deg_days = 0._r8 + endif + endif + endif !year1 + ! Calculate the number of days since the leaves last came on ! and off. If this is the beginning of the simulation, that day might ! not had occured yet, so set it to last year to get things rolling @@ -699,6 +719,7 @@ subroutine phenology( currentSite, bc_in ) currentSite%cstatus = phen_cstat_notcold ! Set to not-cold status (leaves can come on) currentSite%cleafondate = model_day_int dayssincecleafon = 0 + currentSite%grow_deg_days = 0._r8 ! zero GDD for the rest of the year until counting season begins. if ( debug ) write(fates_log(),*) 'leaves on' endif !GDD From 5f27116babff1d26509a8b18ad553b97419f2354 Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 06:48:35 -0600 Subject: [PATCH 7/8] added min time off criteria --- biogeochem/EDPhysiologyMod.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index f3ed013cfb..cc6e498094 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -715,6 +715,7 @@ subroutine phenology( currentSite, bc_in ) if ( (currentSite%cstatus == phen_cstat_iscold .or. & currentSite%cstatus == phen_cstat_nevercold) .and. & (currentSite%grow_deg_days > gdd_threshold) .and. & + (dayssincecleafoff > ED_val_phen_mindayson) .and. & (currentSite%nchilldays >= 1)) then currentSite%cstatus = phen_cstat_notcold ! Set to not-cold status (leaves can come on) currentSite%cleafondate = model_day_int From 43f14aa95116b794f1f4b77f4724b33828e49487 Mon Sep 17 00:00:00 2001 From: rosiealice Date: Fri, 27 Sep 2019 07:19:18 -0600 Subject: [PATCH 8/8] made phen_mindayson 90 instead of 30 --- parameter_files/fates_params_default.cdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parameter_files/fates_params_default.cdl b/parameter_files/fates_params_default.cdl index 41a49c5e42..82142bf816 100644 --- a/parameter_files/fates_params_default.cdl +++ b/parameter_files/fates_params_default.cdl @@ -1172,7 +1172,7 @@ data: fates_phen_drought_threshold = 0.15 ; - fates_phen_mindayson = 30 ; + fates_phen_mindayson = 90 ; fates_phen_ncolddayslim = 5 ;