@@ -31,6 +31,10 @@ module EDPatchDynamicsMod
3131 use EDLoggingMortalityMod, only : logging_litter_fluxes
3232 use EDLoggingMortalityMod, only : logging_time
3333 use EDParamsMod , only : fates_mortality_disturbance_fraction
34+ use FatesConstantsMod , only : g_per_kg
35+ use FatesConstantsMod , only : ha_per_m2
36+ use FatesConstantsMod , only : days_per_sec
37+ use FatesConstantsMod , only : years_per_day
3438
3539
3640 ! CIME globals
@@ -117,7 +121,6 @@ subroutine disturbance_rates( site_in)
117121 currentCohort% cmort = cmort
118122 currentCohort% bmort = bmort
119123 currentCohort% hmort = hmort
120- currentCohort% imort = 0.0_r8 ! Impact mortality is always zero except in new patches
121124 currentCohort% fmort = 0.0_r8 ! Fire mortality is initialized as zero, but may be changed
122125
123126 call LoggingMortality_frac(currentCohort% pft, currentCohort% dbh, &
@@ -199,7 +202,6 @@ subroutine disturbance_rates( site_in)
199202 currentCohort% hmort = currentCohort% hmort* (1.0_r8 - fates_mortality_disturbance_fraction)
200203 currentCohort% bmort = currentCohort% bmort* (1.0_r8 - fates_mortality_disturbance_fraction)
201204 currentCohort% dmort = currentCohort% dmort* (1.0_r8 - fates_mortality_disturbance_fraction)
202- ! currentCohort%imort will likely exist with logging
203205 end if
204206 currentCohort = > currentCohort% taller
205207 enddo ! currentCohort
@@ -399,7 +401,6 @@ subroutine spawn_patches( currentSite, bc_in)
399401 nc% hmort = nan
400402 nc% bmort = nan
401403 nc% fmort = nan
402- nc% imort = nan
403404 nc% lmort_logging = nan
404405 nc% lmort_collateral = nan
405406 nc% lmort_infra = nan
@@ -414,7 +415,18 @@ subroutine spawn_patches( currentSite, bc_in)
414415 ! The number density per square are doesn't change, but since the patch is smaller
415416 ! and cohort counts are absolute, reduce this number.
416417 nc% n = currentCohort% n * patch_site_areadis/ currentPatch% area
417-
418+
419+ ! because the mortality rate due to impact for the cohorts which had been in the understory and are now in the newly-
420+ ! disturbed patch is very high, passing the imort directly to history results in large numerical errors, on account
421+ ! of the sharply reduced number densities. so instead pass this info via a site-level diagnostic variable before reducing
422+ ! the number density.
423+ currentSite% imort_rate(currentCohort% size_class, currentCohort% pft) = &
424+ currentSite% imort_rate(currentCohort% size_class, currentCohort% pft) + &
425+ nc% n * ED_val_understorey_death / hlm_freq_day
426+ currentSite% imort_carbonflux = currentSite% imort_carbonflux + &
427+ (nc% n * ED_val_understorey_death / hlm_freq_day ) * &
428+ currentCohort% b * g_per_kg * days_per_sec * years_per_day * ha_per_m2
429+
418430 ! Step 2: Apply survivor ship function based on the understory death fraction
419431 ! remaining of understory plants of those that are knocked over by the overstorey trees dying...
420432 nc% n = nc% n * (1.0_r8 - ED_val_understorey_death)
@@ -428,7 +440,6 @@ subroutine spawn_patches( currentSite, bc_in)
428440 ! so with the number density must come the effective mortality rates.
429441
430442 nc% fmort = 0.0_r8 ! Should had also been zero in the donor
431- nc% imort = ED_val_understorey_death/ hlm_freq_day ! This was zero in the donor
432443 nc% cmort = currentCohort% cmort
433444 nc% hmort = currentCohort% hmort
434445 nc% bmort = currentCohort% bmort
@@ -443,6 +454,7 @@ subroutine spawn_patches( currentSite, bc_in)
443454 ! Besides, the current and newly created patch sum to unity
444455
445456 currentCohort% n = currentCohort% n * (1._r8 - patch_site_areadis/ currentPatch% area)
457+
446458 else
447459 ! grass is not killed by mortality disturbance events. Just move it into the new patch area.
448460 ! Just split the grass into the existing and new patch structures
@@ -452,7 +464,6 @@ subroutine spawn_patches( currentSite, bc_in)
452464 currentCohort% n = currentCohort% n * (1._r8 - patch_site_areadis/ currentPatch% area)
453465
454466 nc% fmort = 0.0_r8
455- nc% imort = 0.0_r8
456467 nc% cmort = currentCohort% cmort
457468 nc% hmort = currentCohort% hmort
458469 nc% bmort = currentCohort% bmort
@@ -478,7 +489,6 @@ subroutine spawn_patches( currentSite, bc_in)
478489 nc% n = nc% n * (1.0_r8 - currentCohort% fire_mort)
479490
480491 nc% fmort = currentCohort% fire_mort/ hlm_freq_day
481- nc% imort = 0.0_r8
482492
483493 nc% cmort = currentCohort% cmort
484494 nc% hmort = currentCohort% hmort
@@ -508,7 +518,6 @@ subroutine spawn_patches( currentSite, bc_in)
508518 nc% hmort = nan
509519 nc% bmort = nan
510520 nc% fmort = nan
511- nc% imort = nan
512521 nc% lmort_logging = nan
513522 nc% lmort_collateral = nan
514523 nc% lmort_infra = nan
@@ -526,6 +535,17 @@ subroutine spawn_patches( currentSite, bc_in)
526535 ! The number density per square are doesn't change, but since the patch is smaller
527536 ! and cohort counts are absolute, reduce this number.
528537 nc% n = currentCohort% n * patch_site_areadis/ currentPatch% area
538+
539+ ! because the mortality rate due to impact for the cohorts which had been in the understory and are now in the newly-
540+ ! disturbed patch is very high, passing the imort directly to history results in large numerical errors, on account
541+ ! of the sharply reduced number densities. so instead pass this info via a site-level diagnostic variable before reducing
542+ ! the number density.
543+ currentSite% imort_rate(currentCohort% size_class, currentCohort% pft) = &
544+ currentSite% imort_rate(currentCohort% size_class, currentCohort% pft) + &
545+ nc% n * ED_val_understorey_death / hlm_freq_day
546+ currentSite% imort_carbonflux = currentSite% imort_carbonflux + &
547+ (nc% n * ED_val_understorey_death / hlm_freq_day ) * &
548+ currentCohort% b * g_per_kg * days_per_sec * years_per_day * ha_per_m2
529549
530550 ! Step 2: Apply survivor ship function based on the understory death fraction
531551
@@ -540,7 +560,6 @@ subroutine spawn_patches( currentSite, bc_in)
540560
541561
542562 nc% fmort = 0.0_r8
543- nc% imort = ED_val_understorey_death/ hlm_freq_day
544563 nc% cmort = currentCohort% cmort
545564 nc% hmort = currentCohort% hmort
546565 nc% bmort = currentCohort% bmort
@@ -560,7 +579,6 @@ subroutine spawn_patches( currentSite, bc_in)
560579
561580 ! No grass impact mortality imposed on the newly created patch
562581 nc% fmort = 0.0_r8
563- nc% imort = 0.0_r8
564582 nc% cmort = currentCohort% cmort
565583 nc% hmort = currentCohort% hmort
566584 nc% bmort = currentCohort% bmort
@@ -992,7 +1010,7 @@ subroutine mortality_litter_fluxes(currentSite, cp_target, new_patch_target, pat
9921010 ! currentCohort%dmort = mortality_rates(currentCohort)
9931011 ! the disturbance calculations are done with the previous n, c_area and d_mort. So it's probably &
9941012 ! not right to recalcualte dmort here.
995- canopy_dead = currentCohort% n * min (1.0_r8 ,currentCohort% dmort * hlm_freq_day)
1013+ canopy_dead = currentCohort% n * min (1.0_r8 ,currentCohort% dmort * hlm_freq_day * fates_mortality_disturbance_fraction )
9961014
9971015 canopy_mortality_woody_litter = canopy_mortality_woody_litter + &
9981016 canopy_dead* (currentCohort% bdead+ currentCohort% bsw)
0 commit comments