Skip to content

Commit fb4086b

Browse files
authored
Merge pull request #431 from jkshuman/fire_mortality
Fire mortality diagnostics update
2 parents 120e49c + be04146 commit fb4086b

12 files changed

+497
-135
lines changed

biogeochem/EDCohortDynamicsMod.F90

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ module EDCohortDynamicsMod
2121
use EDTypesMod , only : min_npm2, min_nppatch
2222
use EDTypesMod , only : min_n_safemath
2323
use EDTypesMod , only : nlevleaf
24+
use EDTypesMod , only : ican_upper
2425
use FatesInterfaceMod , only : hlm_use_planthydro
2526
use FatesInterfaceMod , only : hlm_parteh_mode
2627
use FatesPlantHydraulicsMod, only : FuseCohortHydraulics
@@ -602,19 +603,23 @@ subroutine terminate_cohorts( currentSite, currentPatch, level )
602603
endif ! if (.not.currentCohort%isnew .and. level == 2) then
603604

604605
if (terminate == 1) then
606+
605607
! preserve a record of the to-be-terminated cohort for mortality accounting
606-
if (currentCohort%canopy_layer .eq. 1) then
607-
levcan = 1
608-
else
609-
levcan = 2
610-
endif
608+
levcan = currentCohort%canopy_layer
611609

612-
currentSite%terminated_nindivs(currentCohort%size_class,currentCohort%pft,levcan) = &
613-
currentSite%terminated_nindivs(currentCohort%size_class,currentCohort%pft,levcan) + currentCohort%n
614-
!
615-
currentSite%termination_carbonflux(levcan) = currentSite%termination_carbonflux(levcan) + &
616-
currentCohort%n * (struct_c+sapw_c+leaf_c+fnrt_c+store_c+repro_c)
617-
610+
if(levcan==ican_upper) then
611+
currentSite%term_nindivs_canopy(currentCohort%size_class,currentCohort%pft) = &
612+
currentSite%term_nindivs_canopy(currentCohort%size_class,currentCohort%pft) + currentCohort%n
613+
614+
currentSite%term_carbonflux_canopy = currentSite%term_carbonflux_canopy + &
615+
currentCohort%n * (struct_c+sapw_c+leaf_c+fnrt_c+store_c+repro_c)
616+
else
617+
currentSite%term_nindivs_ustory(currentCohort%size_class,currentCohort%pft) = &
618+
currentSite%term_nindivs_ustory(currentCohort%size_class,currentCohort%pft) + currentCohort%n
619+
620+
currentSite%term_carbonflux_ustory = currentSite%term_carbonflux_ustory + &
621+
currentCohort%n * (struct_c+sapw_c+leaf_c+fnrt_c+store_c+repro_c)
622+
end if
618623

619624
!put the litter from the terminated cohorts straight into the fragmenting pools
620625
if (currentCohort%n.gt.0.0_r8) then
@@ -927,7 +932,6 @@ subroutine fuse_cohorts(currentSite, currentPatch, bc_in)
927932
currentCohort%cmort = (currentCohort%n*currentCohort%cmort + nextc%n*nextc%cmort)/newn
928933
currentCohort%hmort = (currentCohort%n*currentCohort%hmort + nextc%n*nextc%hmort)/newn
929934
currentCohort%bmort = (currentCohort%n*currentCohort%bmort + nextc%n*nextc%bmort)/newn
930-
currentCohort%fmort = (currentCohort%n*currentCohort%fmort + nextc%n*nextc%fmort)/newn
931935
currentCohort%frmort = (currentCohort%n*currentCohort%frmort + nextc%n*nextc%frmort)/newn
932936

933937
! logging mortality, Yi Xu
@@ -1303,7 +1307,6 @@ subroutine copy_cohort( currentCohort,copyc )
13031307
! Mortality diagnostics
13041308
n%cmort = o%cmort
13051309
n%bmort = o%bmort
1306-
n%fmort = o%fmort
13071310
n%hmort = o%hmort
13081311
n%frmort = o%frmort
13091312

biogeochem/EDPatchDynamicsMod.F90

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ module EDPatchDynamicsMod
1717
use EDTypesMod , only : dtype_ifall
1818
use EDTypesMod , only : dtype_ilog
1919
use EDTypesMod , only : dtype_ifire
20+
use EDTypesMod , only : ican_upper
2021
use FatesInterfaceMod , only : hlm_use_planthydro
2122
use FatesInterfaceMod , only : hlm_numSWb
2223
use FatesInterfaceMod , only : bc_in_type
@@ -139,7 +140,6 @@ subroutine disturbance_rates( site_in, bc_in)
139140
currentCohort%bmort = bmort
140141
currentCohort%hmort = hmort
141142
currentCohort%frmort = frmort
142-
currentCohort%fmort = 0.0_r8 ! Fire mortality is initialized as zero, but may be changed
143143

144144
call LoggingMortality_frac(currentCohort%pft, currentCohort%dbh, &
145145
lmort_direct,lmort_collateral,lmort_infra )
@@ -216,7 +216,6 @@ subroutine disturbance_rates( site_in, bc_in)
216216
currentCohort => currentPatch%shortest
217217
do while(associated(currentCohort))
218218
if(currentCohort%canopy_layer == 1)then
219-
currentCohort%fmort = 0.0_r8
220219
currentCohort%cmort = currentCohort%cmort*(1.0_r8 - fates_mortality_disturbance_fraction)
221220
currentCohort%hmort = currentCohort%hmort*(1.0_r8 - fates_mortality_disturbance_fraction)
222221
currentCohort%bmort = currentCohort%bmort*(1.0_r8 - fates_mortality_disturbance_fraction)
@@ -267,7 +266,6 @@ subroutine disturbance_rates( site_in, bc_in)
267266
currentCohort%lmort_direct = 0.0_r8
268267
currentCohort%lmort_collateral = 0.0_r8
269268
currentCohort%lmort_infra = 0.0_r8
270-
currentCohort%fmort = 0.0_r8
271269
end if
272270
currentCohort => currentCohort%taller
273271
enddo !currentCohort
@@ -323,13 +321,15 @@ subroutine spawn_patches( currentSite, bc_in)
323321
real(r8) :: leaf_litter_local(maxpft) ! initial value of leaf litter. KgC/m2
324322
real(r8) :: cwd_ag_local(ncwd) ! initial value of above ground coarse woody debris. KgC/m2
325323
real(r8) :: cwd_bg_local(ncwd) ! initial value of below ground coarse woody debris. KgC/m2
324+
integer :: levcan ! canopy level
326325
real(r8) :: leaf_c ! leaf carbon [kg]
327-
real(r8) :: fnrt_c ! fineroot carbon [kg]
328-
real(r8) :: sapw_c ! sapwood carbon [kg]
329-
real(r8) :: store_c ! storage carbon [kg]
330-
real(r8) :: struct_c ! structure carbon [kg]
331-
real(r8) :: total_c ! total carbon of plant [kg]
326+
real(r8) :: fnrt_c ! fineroot carbon [kg]
327+
real(r8) :: sapw_c ! sapwood carbon [kg]
328+
real(r8) :: store_c ! storage carbon [kg]
329+
real(r8) :: struct_c ! structure carbon [kg]
330+
real(r8) :: total_c ! total carbon of plant [kg]
332331

332+
!---------------------------------------------------------------------
333333

334334
storesmallcohort => null() ! storage of the smallest cohort for insertion routine
335335
storebigcohort => null() ! storage of the largest cohort for insertion routine
@@ -449,7 +449,6 @@ subroutine spawn_patches( currentSite, bc_in)
449449
nc%cmort = nan ! The mortality diagnostics are set to nan because the cohort should dissappear
450450
nc%hmort = nan
451451
nc%bmort = nan
452-
nc%fmort = nan
453452
nc%frmort = nan
454453
nc%lmort_direct = nan
455454
nc%lmort_collateral = nan
@@ -492,7 +491,6 @@ subroutine spawn_patches( currentSite, bc_in)
492491
! number density in EDCLMLink, and the number density of this new patch is donated
493492
! so with the number density must come the effective mortality rates.
494493

495-
nc%fmort = 0.0_r8 ! Should had also been zero in the donor
496494
nc%cmort = currentCohort%cmort
497495
nc%hmort = currentCohort%hmort
498496
nc%bmort = currentCohort%bmort
@@ -517,7 +515,6 @@ subroutine spawn_patches( currentSite, bc_in)
517515
! Those remaining in the existing
518516
currentCohort%n = currentCohort%n * (1._r8 - patch_site_areadis/currentPatch%area)
519517

520-
nc%fmort = 0.0_r8
521518
nc%cmort = currentCohort%cmort
522519
nc%hmort = currentCohort%hmort
523520
nc%bmort = currentCohort%bmort
@@ -540,11 +537,40 @@ subroutine spawn_patches( currentSite, bc_in)
540537
! loss of individuals from source patch due to area shrinking
541538
currentCohort%n = currentCohort%n * (1._r8 - patch_site_areadis/currentPatch%area)
542539

540+
levcan = currentCohort%canopy_layer
541+
542+
if(levcan==ican_upper) then
543+
544+
! before changing number densities, track total rate of trees that died
545+
! due to fire, as well as from each fire mortality term
546+
currentSite%fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) = &
547+
currentSite%fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) + &
548+
nc%n * currentCohort%fire_mort / hlm_freq_day
549+
550+
currentSite%fmort_carbonflux_canopy = currentSite%fmort_carbonflux_canopy + &
551+
(nc%n * currentCohort%fire_mort) * &
552+
total_c * g_per_kg * days_per_sec * ha_per_m2
553+
554+
else
555+
currentSite%fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) = &
556+
currentSite%fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) + &
557+
nc%n * currentCohort%fire_mort / hlm_freq_day
558+
559+
currentSite%fmort_carbonflux_ustory = currentSite%fmort_carbonflux_ustory + &
560+
(nc%n * currentCohort%fire_mort) * &
561+
total_c * g_per_kg * days_per_sec * ha_per_m2
562+
end if
563+
564+
currentSite%fmort_rate_cambial(currentCohort%size_class, currentCohort%pft) = &
565+
currentSite%fmort_rate_cambial(currentCohort%size_class, currentCohort%pft) + &
566+
nc%n * currentCohort%cambial_mort / hlm_freq_day
567+
currentSite%fmort_rate_crown(currentCohort%size_class, currentCohort%pft) = &
568+
currentSite%fmort_rate_crown(currentCohort%size_class, currentCohort%pft) + &
569+
nc%n * currentCohort%crownfire_mort / hlm_freq_day
570+
543571
! loss of individual from fire in new patch.
544572
nc%n = nc%n * (1.0_r8 - currentCohort%fire_mort)
545573

546-
nc%fmort = currentCohort%fire_mort/hlm_freq_day
547-
548574
nc%cmort = currentCohort%cmort
549575
nc%hmort = currentCohort%hmort
550576
nc%bmort = currentCohort%bmort
@@ -553,7 +579,8 @@ subroutine spawn_patches( currentSite, bc_in)
553579
nc%lmort_direct = currentCohort%lmort_direct
554580
nc%lmort_collateral = currentCohort%lmort_collateral
555581
nc%lmort_infra = currentCohort%lmort_infra
556-
582+
583+
557584
! Logging is the dominant disturbance
558585
elseif (currentPatch%disturbance_rates(dtype_ilog) > currentPatch%disturbance_rates(dtype_ifall) .and. &
559586
currentPatch%disturbance_rates(dtype_ilog) > currentPatch%disturbance_rates(dtype_ifire)) then ! Logging
@@ -574,7 +601,6 @@ subroutine spawn_patches( currentSite, bc_in)
574601
nc%hmort = nan
575602
nc%bmort = nan
576603
nc%frmort = nan
577-
nc%fmort = nan
578604
nc%lmort_direct = nan
579605
nc%lmort_collateral = nan
580606
nc%lmort_infra = nan
@@ -616,7 +642,6 @@ subroutine spawn_patches( currentSite, bc_in)
616642
currentCohort%n = currentCohort%n * (1._r8 - patch_site_areadis/currentPatch%area)
617643

618644

619-
nc%fmort = 0.0_r8
620645
nc%cmort = currentCohort%cmort
621646
nc%hmort = currentCohort%hmort
622647
nc%bmort = currentCohort%bmort
@@ -636,7 +661,6 @@ subroutine spawn_patches( currentSite, bc_in)
636661
currentCohort%n = currentCohort%n * (1._r8 - patch_site_areadis/currentPatch%area)
637662

638663
! No grass impact mortality imposed on the newly created patch
639-
nc%fmort = 0.0_r8
640664
nc%cmort = currentCohort%cmort
641665
nc%hmort = currentCohort%hmort
642666
nc%bmort = currentCohort%bmort

fire/SFMainMod.F90

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,15 @@ end subroutine fire_danger_index
158158
subroutine charecteristics_of_fuel ( currentSite )
159159
!*****************************************************************
160160

161-
use SFParamsMod, only : SF_val_alpha_FMC, SF_val_SAV, SF_val_FBD
161+
use SFParamsMod, only : SF_val_drying_ratio, SF_val_SAV, SF_val_FBD
162162

163163
type(ed_site_type), intent(in), target :: currentSite
164164

165165
type(ed_patch_type), pointer :: currentPatch
166166
type(ed_cohort_type), pointer :: currentCohort
167167

168-
real(r8) timeav_swc
168+
real(r8) timeav_swc
169+
real(r8) alpha_FMC(nfsc) ! Relative fuel moisture adjusted per drying ratio
169170
real(r8) fuel_moisture(nfsc) ! Scaled moisture content of small litter fuels.
170171
real(r8) MEF(nfsc) ! Moisture extinction factor of fuels integer n
171172

@@ -235,13 +236,15 @@ subroutine charecteristics_of_fuel ( currentSite )
235236
! Equation 6 in Thonicke et al. 2010. across leaves,twig, small branch, and large branch
236237
! dead leaves and twigs included in 1hr pool per Thonicke (2010)
237238
! Calculate fuel moisture for trunks to hold value for fuel consumption
238-
fuel_moisture(dl_sf:tr_sf) = exp(-1.0_r8 * SF_val_alpha_FMC(dl_sf:tr_sf) * currentSite%acc_NI)
239+
alpha_FMC(dl_sf:tr_sf) = SF_val_SAV(dl_sf:tr_sf)/SF_val_drying_ratio
240+
241+
fuel_moisture(dl_sf:tr_sf) = exp(-1.0_r8 * alpha_FMC(dl_sf:tr_sf) * currentSite%acc_NI)
239242

240243
if(write_SF == itrue)then
241244
if ( hlm_masterproc == itrue ) write(fates_log(),*) 'ff3 ',currentPatch%fuel_frac
242245
if ( hlm_masterproc == itrue ) write(fates_log(),*) 'fm ',fuel_moisture
243246
if ( hlm_masterproc == itrue ) write(fates_log(),*) 'csa ',currentSite%acc_NI
244-
if ( hlm_masterproc == itrue ) write(fates_log(),*) 'sfv ',SF_val_alpha_FMC
247+
if ( hlm_masterproc == itrue ) write(fates_log(),*) 'sfv ',alpha_FMC
245248
endif
246249
! FIX(RF,032414): needs refactoring.
247250
! average water content !is this the correct metric?

fire/SFParamsMod.F90

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ module SFParamsMod
2323
real(r8),protected :: SF_val_miner_damp
2424
real(r8),protected :: SF_val_max_durat
2525
real(r8),protected :: SF_val_durat_slope
26-
real(r8),protected :: SF_val_alpha_FMC(NFSC)
26+
real(r8),protected :: SF_val_drying_ratio
2727
real(r8),protected :: SF_val_CWD_frac(NCWD)
2828
real(r8),protected :: SF_val_max_decomp(NFSC)
2929
real(r8),protected :: SF_val_SAV(NFSC)
@@ -44,7 +44,7 @@ module SFParamsMod
4444
character(len=param_string_length),parameter :: SF_name_miner_damp = "fates_miner_damp"
4545
character(len=param_string_length),parameter :: SF_name_max_durat = "fates_max_durat"
4646
character(len=param_string_length),parameter :: SF_name_durat_slope = "fates_durat_slope"
47-
character(len=param_string_length),parameter :: SF_name_alpha_FMC = "fates_alpha_FMC"
47+
character(len=param_string_length),parameter :: SF_name_drying_ratio = "fates_drying_ratio"
4848
character(len=param_string_length),parameter :: SF_name_CWD_frac = "fates_CWD_frac"
4949
character(len=param_string_length),parameter :: SF_name_max_decomp = "fates_max_decomp"
5050
character(len=param_string_length),parameter :: SF_name_SAV = "fates_SAV"
@@ -88,10 +88,10 @@ subroutine SpitFireParamsInit()
8888
SF_val_miner_damp = nan
8989
SF_val_max_durat = nan
9090
SF_val_durat_slope = nan
91+
SF_val_drying_ratio = nan
9192

9293
SF_val_CWD_frac(:) = nan
9394

94-
SF_val_alpha_FMC(:) = nan
9595
SF_val_max_decomp(:) = nan
9696

9797
SF_val_SAV(:) = nan
@@ -174,6 +174,9 @@ subroutine SpitFireRegisterScalars(fates_params)
174174
call fates_params%RegisterParameter(name=SF_name_durat_slope, dimension_shape=dimension_shape_scalar, &
175175
dimension_names=dim_names_scalar)
176176

177+
call fates_params%RegisterParameter(name=SF_name_drying_ratio, dimension_shape=dimension_shape_scalar, &
178+
dimension_names=dim_names_scalar)
179+
177180
end subroutine SpitFireRegisterScalars
178181

179182
!-----------------------------------------------------------------------
@@ -212,6 +215,9 @@ subroutine SpitFireReceiveScalars(fates_params)
212215
call fates_params%RetreiveParameter(name=SF_name_durat_slope, &
213216
data=SF_val_durat_slope)
214217

218+
call fates_params%RetreiveParameter(name=SF_name_drying_ratio, &
219+
data=SF_val_drying_ratio)
220+
215221
end subroutine SpitFireReceiveScalars
216222

217223
!-----------------------------------------------------------------------
@@ -279,9 +285,6 @@ subroutine SpitFireRegisterNFSC(fates_params)
279285
call fates_params%RegisterParameter(name=SF_name_mid_moisture_Slope, dimension_shape=dimension_shape_1d, &
280286
dimension_names=dim_names)
281287

282-
call fates_params%RegisterParameter(name=SF_name_alpha_FMC, dimension_shape=dimension_shape_1d, &
283-
dimension_names=dim_names)
284-
285288
call fates_params%RegisterParameter(name=SF_name_max_decomp, dimension_shape=dimension_shape_1d, &
286289
dimension_names=dim_names)
287290

@@ -321,9 +324,6 @@ subroutine SpitFireReceiveNFSC(fates_params)
321324
call fates_params%RetreiveParameter(name=SF_name_mid_moisture_Slope, &
322325
data=SF_val_mid_moisture_Slope)
323326

324-
call fates_params%RetreiveParameter(name=SF_name_alpha_FMC, &
325-
data=SF_val_alpha_FMC)
326-
327327
call fates_params%RetreiveParameter(name=SF_name_max_decomp, &
328328
data=SF_val_max_decomp)
329329

main/EDInitMod.F90

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,17 @@ subroutine init_site_vars( site_in )
7070
! !LOCAL VARIABLES:
7171
!----------------------------------------------------------------------
7272
!
73-
allocate(site_in%terminated_nindivs(1:nlevsclass,1:numpft,2))
73+
allocate(site_in%term_nindivs_canopy(1:nlevsclass,1:numpft))
74+
allocate(site_in%term_nindivs_ustory(1:nlevsclass,1:numpft))
7475
allocate(site_in%demotion_rate(1:nlevsclass))
7576
allocate(site_in%promotion_rate(1:nlevsclass))
7677
allocate(site_in%imort_rate(1:nlevsclass,1:numpft))
78+
allocate(site_in%fmort_rate_canopy(1:nlevsclass,1:numpft))
79+
allocate(site_in%fmort_rate_ustory(1:nlevsclass,1:numpft))
80+
allocate(site_in%fmort_rate_cambial(1:nlevsclass,1:numpft))
81+
allocate(site_in%fmort_rate_crown(1:nlevsclass,1:numpft))
7782
allocate(site_in%growthflux_fusion(1:nlevsclass,1:numpft))
83+
7884
!
7985
end subroutine init_site_vars
8086

@@ -123,11 +129,19 @@ subroutine zero_site( site_in )
123129
site_in%fates_to_bgc_last_ts = 0.0_r8
124130

125131
! termination and recruitment info
126-
site_in%terminated_nindivs(:,:,:) = 0._r8
127-
site_in%termination_carbonflux(:) = 0._r8
132+
site_in%term_nindivs_canopy(:,:) = 0._r8
133+
site_in%term_nindivs_ustory(:,:) = 0._r8
134+
site_in%term_carbonflux_canopy = 0._r8
135+
site_in%term_carbonflux_ustory = 0._r8
128136
site_in%recruitment_rate(:) = 0._r8
129137
site_in%imort_rate(:,:) = 0._r8
130138
site_in%imort_carbonflux = 0._r8
139+
site_in%fmort_rate_canopy(:,:) = 0._r8
140+
site_in%fmort_rate_ustory(:,:) = 0._r8
141+
site_in%fmort_carbonflux_canopy = 0._r8
142+
site_in%fmort_carbonflux_ustory = 0._r8
143+
site_in%fmort_rate_cambial(:,:) = 0._r8
144+
site_in%fmort_rate_crown(:,:) = 0._r8
131145

132146
! fusoin-induced growth flux of individuals
133147
site_in%growthflux_fusion(:,:) = 0._r8

main/EDMainMod.F90

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,6 @@ subroutine bypass_dynamics(currentSite)
686686
currentCohort%bmort = 0.0_r8
687687
currentCohort%hmort = 0.0_r8
688688
currentCohort%cmort = 0.0_r8
689-
currentCohort%fmort = 0.0_r8
690689
currentCohort%frmort = 0.0_r8
691690

692691
currentCohort%dndt = 0.0_r8

0 commit comments

Comments
 (0)