Skip to content

Commit 1afb393

Browse files
authored
Merge pull request #1444 from glemieux/api40.1-super-pr
API 41 parameter file merge
2 parents 49cd7d0 + 2e1553d commit 1afb393

20 files changed

+3186
-115
lines changed

biogeochem/EDCohortDynamicsMod.F90

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,12 @@ subroutine fuse_cohorts(currentSite, currentPatch, bc_in)
10201020

10211021
currentCohort%fire_mort = (currentCohort%n*currentCohort%fire_mort + &
10221022
nextc%n*nextc%fire_mort)/newn
1023+
1024+
currentCohort%nonrx_fire_mort = (currentCohort%n*currentCohort%nonrx_fire_mort + &
1025+
nextc%n*nextc%nonrx_fire_mort)/newn
1026+
1027+
currentCohort%rx_fire_mort = (currentCohort%n*currentCohort%rx_fire_mort + &
1028+
nextc%n*nextc%rx_fire_mort)/newn
10231029

10241030
! mortality diagnostics
10251031
currentCohort%cmort = (currentCohort%n*currentCohort%cmort + nextc%n*nextc%cmort)/newn

biogeochem/EDPatchDynamicsMod.F90

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ subroutine disturbance_rates( site_in, bc_in)
431431
endif
432432

433433
! Fire Disturbance Rate
434-
currentPatch%disturbance_rates(dtype_ifire) = currentPatch%frac_burnt
434+
currentPatch%disturbance_rates(dtype_ifire) = currentPatch%frac_burnt
435435

436436

437437
! Fires can't burn the whole patch, as this causes /0 errors.
@@ -971,23 +971,61 @@ subroutine spawn_patches( currentSite, bc_in )
971971
! due to fire, as well as from each fire mortality term
972972
currentSite%fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) = &
973973
currentSite%fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) + &
974-
nc%n * currentCohort%fire_mort / hlm_freq_day
974+
nc%n * currentCohort%fire_mort / hlm_freq_day ! total
975+
976+
currentSite%rx_fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) = &
977+
currentSite%rx_fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) + &
978+
nc%n * currentCohort%rx_fire_mort / hlm_freq_day ! for prescribed fire
979+
980+
currentSite%nonrx_fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) = &
981+
currentSite%nonrx_fmort_rate_canopy(currentCohort%size_class, currentCohort%pft) + &
982+
nc%n * currentCohort%nonrx_fire_mort / hlm_freq_day ! for wildfire fire
975983

976984
currentSite%fmort_carbonflux_canopy(currentCohort%pft) = &
977985
currentSite%fmort_carbonflux_canopy(currentCohort%pft) + &
978986
(nc%n * currentCohort%fire_mort) * &
979987
total_c * g_per_kg * days_per_sec * ha_per_m2
980988

989+
currentSite%rx_fmort_carbonflux_canopy(currentCohort%pft) = &
990+
currentSite%rx_fmort_carbonflux_canopy(currentCohort%pft) + &
991+
(nc%n * currentCohort%rx_fire_mort) * &
992+
total_c * g_per_kg * days_per_sec * ha_per_m2
993+
994+
currentSite%nonrx_fmort_carbonflux_canopy(currentCohort%pft) = &
995+
currentSite%nonrx_fmort_carbonflux_canopy(currentCohort%pft) + &
996+
(nc%n * currentCohort%nonrx_fire_mort) * &
997+
total_c * g_per_kg * days_per_sec * ha_per_m2
998+
981999
else
9821000
! understory
9831001
currentSite%fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) = &
9841002
currentSite%fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) + &
9851003
nc%n * currentCohort%fire_mort / hlm_freq_day
1004+
1005+
currentSite%rx_fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) = &
1006+
currentSite%rx_fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) + &
1007+
nc%n * currentCohort%rx_fire_mort / hlm_freq_day
1008+
1009+
currentSite%nonrx_fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) = &
1010+
currentSite%nonrx_fmort_rate_ustory(currentCohort%size_class, currentCohort%pft) + &
1011+
nc%n * currentCohort%nonrx_fire_mort / hlm_freq_day
9861012

9871013
currentSite%fmort_carbonflux_ustory(currentCohort%pft) = &
9881014
currentSite%fmort_carbonflux_ustory(currentCohort%pft) + &
9891015
(nc%n * currentCohort%fire_mort) * &
9901016
total_c * g_per_kg * days_per_sec * ha_per_m2
1017+
1018+
currentSite%rx_fmort_carbonflux_ustory(currentCohort%pft) = &
1019+
currentSite%rx_fmort_carbonflux_ustory(currentCohort%pft) + &
1020+
(nc%n * currentCohort%rx_fire_mort) * &
1021+
total_c * g_per_kg * days_per_sec * ha_per_m2
1022+
1023+
currentSite%nonrx_fmort_carbonflux_ustory(currentCohort%pft) = &
1024+
currentSite%nonrx_fmort_carbonflux_ustory(currentCohort%pft) + &
1025+
(nc%n * currentCohort%nonrx_fire_mort) * &
1026+
total_c * g_per_kg * days_per_sec * ha_per_m2
1027+
1028+
9911029
end if
9921030

9931031
currentSite%fmort_abg_flux(currentCohort%size_class, currentCohort%pft) = &
@@ -996,6 +1034,19 @@ subroutine spawn_patches( currentSite, bc_in )
9961034
( (sapw_c + struct_c + store_c) * prt_params%allom_agb_frac(currentCohort%pft) + &
9971035
leaf_c ) * &
9981036
g_per_kg * days_per_sec * ha_per_m2
1037+
1038+
currentSite%rx_fmort_abg_flux(currentCohort%size_class, currentCohort%pft) = &
1039+
currentSite%rx_fmort_abg_flux(currentCohort%size_class, currentCohort%pft) + &
1040+
(nc%n * currentCohort%rx_fire_mort) * &
1041+
( (sapw_c + struct_c + store_c) * prt_params%allom_agb_frac(currentCohort%pft) + &
1042+
leaf_c ) * &
1043+
g_per_kg * days_per_sec * ha_per_m2
1044+
1045+
currentSite%nonrx_fmort_abg_flux(currentCohort%size_class, currentCohort%pft) = &
1046+
currentSite%nonrx_fmort_abg_flux(currentCohort%size_class, currentCohort%pft) + &
1047+
(nc%n * currentCohort%nonrx_fire_mort) * &
1048+
((sapw_c + struct_c + store_c) * prt_params%allom_agb_frac(currentCohort%pft) + &
1049+
leaf_c) * g_per_kg * days_per_sec * ha_per_m2
9991050

10001051

10011052
currentSite%fmort_rate_cambial(currentCohort%size_class, currentCohort%pft) = &
@@ -1005,6 +1056,20 @@ subroutine spawn_patches( currentSite, bc_in )
10051056
currentSite%fmort_rate_crown(currentCohort%size_class, currentCohort%pft) + &
10061057
nc%n * currentCohort%crownfire_mort / hlm_freq_day
10071058

1059+
currentSite%rx_fmort_rate_cambial(currentCohort%size_class, currentCohort%pft) = &
1060+
currentSite%rx_fmort_rate_cambial(currentCohort%size_class, currentCohort%pft) + &
1061+
nc%n * currentCohort%rx_cambial_mort / hlm_freq_day
1062+
currentSite%rx_fmort_rate_crown(currentCohort%size_class, currentCohort%pft) = &
1063+
currentSite%rx_fmort_rate_crown(currentCohort%size_class, currentCohort%pft) + &
1064+
nc%n * currentCohort%rx_crown_mort / hlm_freq_day
1065+
1066+
currentSite%nonrx_fmort_rate_cambial(currentCohort%size_class, currentCohort%pft) = &
1067+
currentSite%nonrx_fmort_rate_cambial(currentCohort%size_class, currentCohort%pft) + &
1068+
nc%n * currentCohort%nonrx_cambial_mort / hlm_freq_day
1069+
currentSite%nonrx_fmort_rate_crown(currentCohort%size_class, currentCohort%pft) = &
1070+
currentSite%nonrx_fmort_rate_crown(currentCohort%size_class, currentCohort%pft) + &
1071+
nc%n * currentCohort%nonrx_crown_mort / hlm_freq_day
1072+
10081073
! loss of individual from fire in new patch.
10091074
nc%n = nc%n * (1.0_r8 - currentCohort%fire_mort)
10101075

@@ -1038,12 +1103,18 @@ subroutine spawn_patches( currentSite, bc_in )
10381103

10391104
if( (leaf_burn_frac < 0._r8) .or. &
10401105
(leaf_burn_frac > 1._r8) .or. &
1041-
(currentCohort%fire_mort < 0._r8) .or. &
1042-
(currentCohort%fire_mort > 1._r8)) then
1106+
(currentCohort%fire_mort < 0._r8) .or. &
1107+
(currentCohort%fire_mort > 1._r8) .or. &
1108+
(currentCohort%rx_fire_mort < 0._r8) .or. &
1109+
(currentCohort%rx_fire_mort > 1._r8) .or. &
1110+
(currentCohort%nonrx_fire_mort < 0._r8) .or. &
1111+
(currentCohort%nonrx_fire_mort > 1._r8) ) then
10431112
write(fates_log(),*) 'unexpected fire fractions'
10441113
write(fates_log(),*) prt_params%woody(currentCohort%pft)
10451114
write(fates_log(),*) leaf_burn_frac
10461115
write(fates_log(),*) currentCohort%fire_mort
1116+
write(fates_log(),*) currentCohort%rx_fire_mort
1117+
write(fates_log(),*) currentCohort%nonrx_fire_mort
10471118
call endrun(msg=errMsg(sourcefile, __LINE__))
10481119
end if
10491120

@@ -2208,8 +2279,8 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, &
22082279

22092280

22102281
! Absolute number of dead trees being transfered in with the donated area
2211-
num_dead_trees = (currentCohort%fire_mort*currentCohort%n * &
2212-
patch_site_areadis/currentPatch%area)
2282+
num_dead_trees = (currentCohort%fire_mort * &
2283+
currentCohort%n * patch_site_areadis/currentPatch%area)
22132284

22142285
! Contribution of dead trees to leaf litter
22152286
donatable_mass = num_dead_trees * (leaf_m+repro_m) * &
@@ -3185,10 +3256,14 @@ subroutine fuse_2_patches(csite, dp, rp)
31853256
rp%tau_l = (dp%tau_l*dp%area + rp%tau_l*rp%area) * inv_sum_area
31863257
rp%tfc_ros = (dp%tfc_ros*dp%area + rp%tfc_ros*rp%area) * inv_sum_area
31873258
rp%fi = (dp%fi*dp%area + rp%fi*rp%area) * inv_sum_area
3259+
rp%nonrx_fi = (dp%nonrx_fi*dp%area + rp%nonrx_fi*rp%area) * inv_sum_area
3260+
rp%rx_fi = (dp%rx_fi*dp%area + rp%rx_fi*rp%area) * inv_sum_area
31883261
rp%fd = (dp%fd*dp%area + rp%fd*rp%area) * inv_sum_area
31893262
rp%ros_back = (dp%ros_back*dp%area + rp%ros_back*rp%area) * inv_sum_area
31903263
rp%scorch_ht(:) = (dp%scorch_ht(:)*dp%area + rp%scorch_ht(:)*rp%area) * inv_sum_area
31913264
rp%frac_burnt = (dp%frac_burnt*dp%area + rp%frac_burnt*rp%area) * inv_sum_area
3265+
rp%rx_frac_burnt = (dp%rx_frac_burnt*dp%area + rp%rx_frac_burnt*rp%area) * inv_sum_area
3266+
rp%nonrx_frac_burnt = (dp%nonrx_frac_burnt*dp%area + rp%nonrx_frac_burnt*rp%area) * inv_sum_area
31923267
rp%btran_ft(:) = (dp%btran_ft(:)*dp%area + rp%btran_ft(:)*rp%area) * inv_sum_area
31933268
rp%zstar = (dp%zstar*dp%area + rp%zstar*rp%area) * inv_sum_area
31943269
rp%c_stomata = (dp%c_stomata*dp%area + rp%c_stomata*rp%area) * inv_sum_area

biogeochem/FatesCohortMod.F90

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,12 @@ module FatesCohortMod
273273
real(r8) :: crownfire_mort ! probability of tree post-fire mortality from crown scorch [0-1]
274274
! (conditional on the tree being subjected to the fire)
275275
real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent [0-1]
276+
real(r8) :: nonrx_cambial_mort ! cambial kill mortality due to wildfire
277+
real(r8) :: nonrx_crown_mort ! crown fire mortality due to wildfire
278+
real(r8) :: nonrx_fire_mort ! post-fire mortality due to wildfire
279+
real(r8) :: rx_cambial_mort ! cambial kill mortality due to prescribed fire
280+
real(r8) :: rx_crown_mort ! crown fire mortality due to prescribed fire
281+
real(r8) :: rx_fire_mort ! post-fire mortality due to prescribed fire
276282

277283
!---------------------------------------------------------------------------
278284

@@ -452,7 +458,13 @@ subroutine NanValues(this)
452458
this%cambial_mort = nan
453459
this%crownfire_mort = nan
454460
this%fire_mort = nan
455-
461+
this%nonrx_cambial_mort = nan
462+
this%nonrx_crown_mort = nan
463+
this%nonrx_fire_mort = nan
464+
this%rx_cambial_mort = nan
465+
this%rx_crown_mort = nan
466+
this%rx_fire_mort = nan
467+
456468
end subroutine NanValues
457469

458470
!===========================================================================
@@ -538,6 +550,12 @@ subroutine ZeroValues(this)
538550
this%cambial_mort = 0._r8
539551
this%crownfire_mort = 0._r8
540552
this%fire_mort = 0._r8
553+
this%nonrx_cambial_mort = 0._r8
554+
this%nonrx_crown_mort = 0._r8
555+
this%nonrx_fire_mort = 0._r8
556+
this%rx_cambial_mort = 0._r8
557+
this%rx_crown_mort = 0._r8
558+
this%rx_fire_mort = 0._r8
541559

542560
end subroutine ZeroValues
543561

@@ -783,6 +801,12 @@ subroutine Copy(this, copyCohort)
783801
copyCohort%cambial_mort = this%cambial_mort
784802
copyCohort%crownfire_mort = this%crownfire_mort
785803
copyCohort%fire_mort = this%fire_mort
804+
copyCohort%nonrx_cambial_mort = this%nonrx_cambial_mort
805+
copyCohort%nonrx_crown_mort = this%nonrx_crown_mort
806+
copyCohort%nonrx_fire_mort = this%nonrx_fire_mort
807+
copyCohort%rx_cambial_mort = this%rx_cambial_mort
808+
copyCohort%rx_crown_mort = this%rx_crown_mort
809+
copyCohort%rx_fire_mort = this%rx_fire_mort
786810

787811
! HYDRAULICS
788812
if (hlm_use_planthydro .eq. itrue) then
@@ -1121,6 +1145,12 @@ subroutine Dump(this)
11211145
write(fates_log(),*) 'cohort%fire_mort = ', this%fire_mort
11221146
write(fates_log(),*) 'cohort%crownfire_mort = ', this%crownfire_mort
11231147
write(fates_log(),*) 'cohort%cambial_mort = ', this%cambial_mort
1148+
write(fates_log(),*) 'cohort%nonrx_cambial_mort = ', this%nonrx_cambial_mort
1149+
write(fates_log(),*) 'cohort%nonrx_crown_mort = ', this%nonrx_crown_mort
1150+
write(fates_log(),*) 'cohort%nonrx_fire_mort = ', this%nonrx_fire_mort
1151+
write(fates_log(),*) 'cohort%rx_crown_mort = ', this%rx_crown_mort
1152+
write(fates_log(),*) 'cohort%rx_cambial_mort = ', this%rx_cambial_mort
1153+
write(fates_log(),*) 'cohort%rx_fire_mort = ', this%rx_fire_mort
11241154
write(fates_log(),*) 'cohort%size_class = ', this%size_class
11251155
write(fates_log(),*) 'cohort%size_by_pft_class = ', this%size_by_pft_class
11261156

biogeochem/FatesPatchMod.F90

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,19 @@ module FatesPatchMod
209209
real(r8) :: ros_back ! rate of backward spread of fire [m/min]
210210
real(r8) :: tau_l ! duration of lethal heating [min]
211211
real(r8) :: fi ! average fire intensity of flaming front [kJ/m/s] or [kW/m]
212-
integer :: fire ! is there a fire? [1=yes; 0=no]
212+
integer :: fire ! is there a fire (rx + nonrx)? [1=yes; 0=no]
213213
real(r8) :: fd ! fire duration [min]
214-
real(r8) :: frac_burnt ! fraction of patch burnt by fire
214+
real(r8) :: frac_burnt ! total fraction of patch burnt by fire (rx + nonrx)
215+
216+
! wildfire
217+
real(r8) :: nonrx_fire ! is there a wildfire [1=yes; 0=no]
218+
real(r8) :: nonrx_fi ! average fire intensity of wildfire flaming front
219+
real(r8) :: nonrx_frac_burnt ! fraction burnt by wildfire
220+
221+
! prescribed fire
222+
integer :: rx_fire ! is there a prescribed fire? [1=yes; 0=no]
223+
real(r8) :: rx_fi ! average fire intensity of prescribed fire flaming front
224+
real(r8) :: rx_frac_burnt ! fraction burnt by prescribed fire, it's user defined at patch level per fire event
215225

216226
! fire effects
217227
real(r8) :: scorch_ht(maxpft) ! scorch height [m]
@@ -503,6 +513,12 @@ subroutine NanValues(this)
503513
this%tau_l = nan
504514
this%fi = nan
505515
this%fire = fates_unset_int
516+
this%nonrx_fire = fates_unset_int
517+
this%rx_fire = fates_unset_int
518+
this%nonrx_fi = nan
519+
this%nonrx_frac_burnt = nan
520+
this%rx_fi = nan
521+
this%rx_frac_burnt = nan
506522
this%fd = nan
507523
this%scorch_ht(:) = nan
508524
this%tfc_ros = nan
@@ -593,6 +609,10 @@ subroutine ZeroValues(this)
593609
this%scorch_ht(:) = 0.0_r8
594610
this%tfc_ros = 0.0_r8
595611
this%frac_burnt = 0.0_r8
612+
this%nonrx_fi = 0.0_r8
613+
this%nonrx_frac_burnt = 0.0_r8
614+
this%rx_fi = 0.0_r8
615+
this%rx_frac_burnt = 0.0_r8
596616

597617
end subroutine ZeroValues
598618

0 commit comments

Comments
 (0)