diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 2baf1b322a..194f05fa19 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -920,7 +920,6 @@ subroutine phenology( currentSite, bc_in ) ! ! !LOCAL VARIABLES: - integer :: model_day_int ! integer model day 1 - inf integer :: ncolddays ! no days underneath the threshold for leaf drop integer :: i_tmem ! Loop counter for veg temp mem days integer :: ipft ! plant functional type index @@ -970,14 +969,13 @@ subroutine phenology( currentSite, bc_in ) logical :: last_flush_long_ago ! Has it been a very long time since last flushing? - ! This is the elapsed number of days since the very beginning of the simulation time - model_day_int = currentSite%phen_model_date - - !Parameters: defaults from Botta et al. 2000 GCB,6 709-725 !Parameters, default from from SDGVM model of senesence - ! Retrieve average canopy temperature of the current day + ! Retrieve average canopy temperature for the previous + ! 24 hours. The indices of vegtemp_memory represent + ! the previous 10 days, index 1 is the most recent day + temp_in_C = currentSite%vegtemp_memory(1) @@ -1032,19 +1030,19 @@ subroutine phenology( currentSite, bc_in ) !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> ndays_per_year)then !only do this after the first year to prevent odd behaviour + if(currentSite%phen_model_date> ndays_per_year)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 ! + if( currentSite%phen_model_date .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! + if(currentSite%phen_model_date .gt. currentSite%cleafoffdate.and.hlm_day_of_year.lt.gddstart) then! currentSite%grow_deg_days = 0._r8 endif endif @@ -1054,16 +1052,16 @@ subroutine phenology( currentSite, bc_in ) ! 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 - if (model_day_int < currentSite%cleafoffdate) then - currentSite%cndaysleafoff = model_day_int - (currentSite%cleafoffdate - ndays_per_year) + if (currentSite%phen_model_date < currentSite%cleafoffdate) then + currentSite%cndaysleafoff = currentSite%phen_model_date - (currentSite%cleafoffdate - ndays_per_year) else - currentSite%cndaysleafoff = model_day_int - currentSite%cleafoffdate + currentSite%cndaysleafoff = currentSite%phen_model_date - currentSite%cleafoffdate end if - if (model_day_int < currentSite%cleafondate) then - currentSite%cndaysleafon = model_day_int - (currentSite%cleafondate - ndays_per_year) + if (currentSite%phen_model_date < currentSite%cleafondate) then + currentSite%cndaysleafon = currentSite%phen_model_date - (currentSite%cleafondate - ndays_per_year) else - currentSite%cndaysleafon = model_day_int - currentSite%cleafondate + currentSite%cndaysleafon = currentSite%phen_model_date - currentSite%cleafondate end if @@ -1081,7 +1079,7 @@ subroutine phenology( currentSite, bc_in ) (currentSite%cndaysleafoff > 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 + currentSite%cleafondate = currentSite%phen_model_date currentSite%cndaysleafon = 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' @@ -1099,7 +1097,7 @@ subroutine phenology( currentSite, bc_in ) if ( (currentSite%cstatus == phen_cstat_notcold) .and. & - (model_day_int > num_vegtemp_mem) .and. & + (currentSite%phen_model_date > num_vegtemp_mem) .and. & (ncolddays > ED_val_phen_ncolddayslim) .and. & (currentSite%cndaysleafon > ED_val_phen_mindayson) )then @@ -1109,7 +1107,7 @@ subroutine phenology( currentSite, bc_in ) ! clear this value, it will cause ! leaves to flush later in the year currentSite%cstatus = phen_cstat_iscold ! alter status of site to 'leaves off' - currentSite%cleafoffdate = model_day_int ! record leaf off date + currentSite%cleafoffdate = currentSite%phen_model_date ! record leaf off date currentSite%cndaysleafoff = 0 if ( debug ) write(fates_log(),*) 'leaves off' @@ -1129,7 +1127,7 @@ subroutine phenology( currentSite, bc_in ) currentSite%cstatus = phen_cstat_nevercold ! alter status of site to imply that this ! site is never really cold enough ! for cold deciduous - currentSite%cleafoffdate = model_day_int ! record leaf off date + currentSite%cleafoffdate = currentSite%phen_model_date ! record leaf off date currentSite%cndaysleafoff = 0 if ( debug ) write(fates_log(),*) 'leaves off' @@ -1165,15 +1163,15 @@ subroutine phenology( currentSite, bc_in ) ! Calculate days since last flushing and shedding event, but make a provision ! for the first year of simulation, we have to assume leaf drop / leaf flush ! dates to start, so if that is in the future, set it to last year - if (model_day_int < currentSite%dleafoffdate(ipft)) then - currentSite%dndaysleafoff(ipft) = model_day_int - (currentSite%dleafoffdate(ipft)-ndays_per_year) + if (currentSite%phen_model_date < currentSite%dleafoffdate(ipft)) then + currentSite%dndaysleafoff(ipft) = currentSite%phen_model_date - (currentSite%dleafoffdate(ipft)-ndays_per_year) else - currentSite%dndaysleafoff(ipft) = model_day_int - currentSite%dleafoffdate(ipft) + currentSite%dndaysleafoff(ipft) = currentSite%phen_model_date - currentSite%dleafoffdate(ipft) end if - if (model_day_int < currentSite%dleafondate(ipft)) then - currentSite%dndaysleafon(ipft) = model_day_int - (currentSite%dleafondate(ipft)-ndays_per_year) + if (currentSite%phen_model_date < currentSite%dleafondate(ipft)) then + currentSite%dndaysleafon(ipft) = currentSite%phen_model_date - (currentSite%dleafondate(ipft)-ndays_per_year) else - currentSite%dndaysleafon(ipft) = model_day_int - currentSite%dleafondate(ipft) + currentSite%dndaysleafon(ipft) = currentSite%phen_model_date - currentSite%dleafondate(ipft) end if @@ -1254,7 +1252,7 @@ subroutine phenology( currentSite, bc_in ) ! up to one change occurs at any given time. Also, prevent changes until the ! soil moisture memory is populated (the outer if check). !---~--- - past_spinup_ifelse: if (model_day_int > numWaterMem) then + past_spinup_ifelse: if (currentSite%phen_model_date > numWaterMem) then drought_smoist_ifelse: if ( prolonged_off_period .and. & ( .not. smoist_below_threshold ) ) then ! LEAF ON: DROUGHT DECIDUOUS WETNESS @@ -1265,7 +1263,7 @@ subroutine phenology( currentSite, bc_in ) ! b) Has there also been at least a nominaly short amount of "leaf-off"? ! c) Is the soil moisture sufficiently high? currentSite%dstatus(ipft) = phen_dstat_moiston ! set status to leaf-on - currentSite%dleafondate(ipft) = model_day_int ! save the model day we start flushing + currentSite%dleafondate(ipft) = currentSite%phen_model_date ! save the model day we start flushing currentSite%dndaysleafon(ipft) = 0 currentSite%elong_factor(ipft) = 1. @@ -1279,7 +1277,7 @@ subroutine phenology( currentSite, bc_in ) ! last year's bud-burst. If this is imposed, then we set the new ! status to indicate bud-burst was forced by timing currentSite%dstatus(ipft) = phen_dstat_timeon ! force budburst! - currentSite%dleafondate(ipft) = model_day_int ! record leaf on date + currentSite%dleafondate(ipft) = currentSite%phen_model_date ! record leaf on date currentSite%dndaysleafon(ipft) = 0 currentSite%elong_factor(ipft) = 1. @@ -1289,7 +1287,7 @@ subroutine phenology( currentSite, bc_in ) ! flush again as soon as they exceed a minimum off time ! This typically occurs in a perennially wet system. currentSite%dstatus(ipft) = phen_dstat_timeon ! force budburst! - currentSite%dleafondate(ipft) = model_day_int ! record leaf on date + currentSite%dleafondate(ipft) = currentSite%phen_model_date ! record leaf on date currentSite%dndaysleafon(ipft) = 0 currentSite%elong_factor(ipft) = 1. @@ -1298,7 +1296,7 @@ subroutine phenology( currentSite, bc_in ) ! Are the leaves rouhgly at the end of their lives? If so, shed leaves ! even if it is not dry. currentSite%dstatus(ipft) = phen_dstat_timeoff !alter status of site to 'leaves off' - currentSite%dleafoffdate(ipft) = model_day_int !record leaf on date + currentSite%dleafoffdate(ipft) = currentSite%phen_model_date !record leaf on date currentSite%dndaysleafoff(ipft) = 0 currentSite%elong_factor(ipft) = 0. @@ -1306,7 +1304,7 @@ subroutine phenology( currentSite, bc_in ) ! LEAF OFF: DROUGHT DECIDUOUS DRYNESS - if the soil gets too dry, ! and the leaves have already been on a while... currentSite%dstatus(ipft) = phen_dstat_moistoff ! alter status of site to 'leaves off' - currentSite%dleafoffdate(ipft) = model_day_int ! record leaf on date + currentSite%dleafoffdate(ipft) = currentSite%phen_model_date ! record leaf on date currentSite%dndaysleafoff(ipft) = 0 currentSite%elong_factor(ipft) = 0. end if drought_smoist_ifelse @@ -1360,7 +1358,7 @@ subroutine phenology( currentSite, bc_in ) ! Make sure elongation factor is bounded and check for special cases. - drought_gradual_ifelse: if ( model_day_int <= numWaterMem ) then + drought_gradual_ifelse: if ( currentSite%phen_model_date <= numWaterMem ) then ! Too early in the simulation, keep the same elongation factor as the day before. currentSite%elong_factor(ipft) = elongf_prev @@ -1368,14 +1366,14 @@ subroutine phenology( currentSite, bc_in ) ! Leaves have been on for too long and exceeded leaf lifespan. Force abscission currentSite%elong_factor(ipft) = 0.0_r8 ! Force full budburst currentSite%dstatus(ipft) = phen_dstat_timeoff ! Flag that this has been forced - currentSite%dleafoffdate(ipft) = model_day_int ! Record leaf off date + currentSite%dleafoffdate(ipft) = currentSite%phen_model_date ! Record leaf off date currentSite%dndaysleafoff(ipft) = 0 ! Reset clock elseif ( last_flush_long_ago ) then ! Plant has not flushed at all for a very long time. Force flushing currentSite%elong_factor(ipft) = elongf_min ! Force minimum budburst currentSite%dstatus(ipft) = phen_dstat_timeon ! Flag that this has been forced - currentSite%dleafondate(ipft) = model_day_int ! Record leaf on date + currentSite%dleafondate(ipft) = currentSite%phen_model_date ! Record leaf on date currentSite%dndaysleafon(ipft) = 0 ! Reset clock elseif ( recent_flush .and. elongf_1st < elongf_prev ) then @@ -1395,7 +1393,7 @@ subroutine phenology( currentSite, bc_in ) if (elongf_prev >= elongf_min ) then ! This is the first day moisture fell below minimum. Flag change of status. currentSite%dstatus(ipft) = phen_dstat_moistoff ! Flag that this has not been forced - currentSite%dleafoffdate(ipft) = model_day_int ! Record leaf off date + currentSite%dleafoffdate(ipft) = currentSite%phen_model_date ! Record leaf off date currentSite%dndaysleafoff(ipft) = 0 ! Reset clock end if @@ -1407,7 +1405,7 @@ subroutine phenology( currentSite, bc_in ) if (elongf_prev < elongf_min ) then ! This is the first day moisture allows leaves to exist. Flag change of status. currentSite%dstatus(ipft) = phen_dstat_moiston ! Flag that this has not been forced - currentSite%dleafondate(ipft) = model_day_int ! Record leaf on date + currentSite%dleafondate(ipft) = currentSite%phen_model_date ! Record leaf on date currentSite%dndaysleafon(ipft) = 0 ! Reset clock elseif (elongf_1st < elongf_prev) then currentSite%dstatus(ipft) = phen_dstat_pshed ! Flag partial shedding, diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 7a2527e9ee..ee8cc1ed3c 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -55,7 +55,7 @@ module FatesHistoryInterfaceMod use FatesInterfaceTypesMod , only : hlm_freq_day use FatesInterfaceTypesMod , only : hlm_parteh_mode use FatesInterfaceTypesMod , only : hlm_use_sp - use EDParamsMod , only : ED_val_comp_excln + use EDParamsMod , only : comp_excln_exp use EDParamsMod , only : ED_val_phen_coldtemp use EDParamsMod , only : nlevleaf use EDParamsMod , only : ED_val_history_height_bin_edges @@ -68,7 +68,7 @@ module FatesHistoryInterfaceMod use FatesInterfaceTypesMod , only : nlevcoage use FatesInterfaceTypesMod , only : hlm_use_nocomp use FatesInterfaceTypesMod , only : hlm_use_fixed_biogeog - use FatesRadiationMemMod , only : ivis,inir + use FatesRadiationMemMod , only : ivis,inir,ipar use FatesInterfaceTypesMod , only : hlm_hist_level_hifrq,hlm_hist_level_dynam use FatesIOVariableKindMod, only : site_r8, site_soil_r8, site_size_pft_r8 use FatesIOVariableKindMod, only : site_size_r8, site_pft_r8, site_age_r8 @@ -430,7 +430,6 @@ module FatesHistoryInterfaceMod integer :: ih_froot_mr_si integer :: ih_livestem_mr_si integer :: ih_livecroot_mr_si - integer :: ih_woodproduct_si integer :: ih_h2oveg_si integer :: ih_h2oveg_dead_si integer :: ih_h2oveg_recruit_si @@ -450,16 +449,26 @@ module FatesHistoryInterfaceMod integer :: ih_fire_nignitions_si integer :: ih_fire_fdi_si integer :: ih_fire_intensity_fracarea_product_si + integer :: ih_nonrx_intensity_fracarea_product_si + integer :: ih_rx_intensity_fracarea_product_si integer :: ih_spitfire_ros_si integer :: ih_effect_wspeed_si integer :: ih_tfc_ros_si integer :: ih_fire_intensity_si + integer :: ih_nonrx_intensity_si integer :: ih_fire_fracarea_si + integer :: ih_nonrx_fracarea_si integer :: ih_fire_fuel_bulkd_si integer :: ih_fire_fuel_eff_moist_si integer :: ih_fire_fuel_sav_si integer :: ih_fire_fuel_mef_si integer :: ih_sum_fuel_si + integer :: ih_rx_burn_window_si + integer :: ih_rx_intensity_si + integer :: ih_rx_fracarea_si + integer :: ih_rx_fracarea_fuel_si + integer :: ih_rx_fracarea_fi_si + integer :: ih_rx_fracarea_final_si integer :: ih_fragmentation_scaler_sl integer :: ih_nplant_si_scpf @@ -504,9 +513,12 @@ module FatesHistoryInterfaceMod integer :: ih_m9_si_scpf integer :: ih_m10_si_scpf integer :: ih_m11_si_scpf + integer :: ih_m12_si_scpf - integer :: ih_crownfiremort_si_scpf - integer :: ih_cambialfiremort_si_scpf + integer :: ih_nonrx_crown_mort_si_scpf + integer :: ih_nonrx_cambial_mort_si_scpf + integer :: ih_rx_crown_mort_si_scpf + integer :: ih_rx_cambial_mort_si_scpf integer :: ih_abg_mortality_cflux_si_scpf integer :: ih_abg_productivity_cflux_si_scpf @@ -561,6 +573,7 @@ module FatesHistoryInterfaceMod integer :: ih_m8_si_scls integer :: ih_m9_si_scls integer :: ih_m10_si_scls + integer :: ih_m12_si_scls integer :: ih_m10_si_cacls integer :: ih_nplant_si_cacls @@ -664,14 +677,21 @@ module FatesHistoryInterfaceMod integer :: ih_c_lblayer_si_age integer :: ih_agesince_anthrodist_si integer :: ih_agesince_anthrodist_si_age + integer :: ih_secondarylands_area_si_age + integer :: ih_primarylands_area_si_age + integer :: ih_area_burnt_si_age integer :: ih_primarylands_fracarea_si integer :: ih_secondarylands_fracarea_si integer :: ih_secondarylands_fracarea_si_age integer :: ih_primarylands_fracarea_si_age integer :: ih_fracarea_burnt_si_age + integer :: ih_rx_fracarea_burnt_si_age + integer :: ih_nonrx_fracarea_burnt_si_age ! integer :: ih_fire_rate_of_spread_front_si_age integer :: ih_fire_intensity_si_age integer :: ih_fire_sum_fuel_si_age + integer :: ih_rx_intensity_si_age + integer :: ih_nonrx_intensity_si_age ! indices to (site x height) variables integer :: ih_canopy_height_dist_si_height @@ -2344,10 +2364,10 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) if (hlm_use_ed_st3.eq.itrue) return if(hlm_hist_level_dynam>0) then - call update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) + call update_history_dyn_sitelevel(this,nc,nsites,sites) if(hlm_hist_level_dynam>1) then call update_history_dyn_subsite(this,nc,nsites,sites,bc_in) - call update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) + call update_history_dyn_subsite_ageclass(this,nc,nsites,sites) call reset_history_dyn_subsite(this, nsites, sites) end if end if @@ -2359,7 +2379,7 @@ end subroutine update_history_dyn ! ========================================================================= - subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) + subroutine update_history_dyn_sitelevel(this,nc,nsites,sites) ! --------------------------------------------------------------------------------- ! This subroutine is intended to update all history variables with upfreq == @@ -2373,7 +2393,6 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) integer , intent(in) :: nc ! clump index integer , intent(in) :: nsites type(ed_site_type) , intent(inout), target :: sites(nsites) - type(bc_in_type) , intent(in) :: bc_in(nsites) type(fates_cohort_type), pointer :: ccohort type(fates_patch_type), pointer :: cpatch @@ -2423,6 +2442,7 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) hio_ca_weighted_height_si => this%hvars(ih_ca_weighted_height_si)%r81d, & hio_canopy_spread_si => this%hvars(ih_canopy_spread_si)%r81d, & hio_nesterov_fire_danger_si => this%hvars(ih_nesterov_fire_danger_si)%r81d, & + hio_rx_burn_window_si => this%hvars(ih_rx_burn_window_si)%r81d, & hio_fire_nignitions_si => this%hvars(ih_fire_nignitions_si)%r81d, & hio_fire_fdi_si => this%hvars(ih_fire_fdi_si)%r81d, & hio_spitfire_ros_si => this%hvars(ih_spitfire_ros_si)%r81d, & @@ -2436,6 +2456,15 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) hio_fire_fuel_sav_si => this%hvars(ih_fire_fuel_sav_si)%r81d, & hio_fire_fuel_mef_si => this%hvars(ih_fire_fuel_mef_si)%r81d, & hio_sum_fuel_si => this%hvars(ih_sum_fuel_si)%r81d, & + hio_nonrx_intensity_si => this%hvars(ih_nonrx_intensity_si)%r81d, & + hio_nonrx_intensity_fracarea_product_si => this%hvars(ih_nonrx_intensity_fracarea_product_si)%r81d, & + hio_nonrx_fracarea_si => this%hvars(ih_nonrx_fracarea_si)%r81d, & + hio_rx_intensity_si => this%hvars(ih_rx_intensity_si)%r81d, & + hio_rx_intensity_fracarea_product_si => this%hvars(ih_rx_intensity_fracarea_product_si)%r81d, & + hio_rx_fracarea_si => this%hvars(ih_rx_fracarea_si)%r81d, & + hio_rx_fracarea_fuel_si => this%hvars(ih_rx_fracarea_fuel_si)%r81d, & + hio_rx_fracarea_fi_si => this%hvars(ih_rx_fracarea_fi_si)%r81d, & + hio_rx_fracarea_final_si => this%hvars(ih_rx_fracarea_final_si)%r81d, & hio_litter_in_si => this%hvars(ih_litter_in_si)%r81d, & hio_litter_out_si => this%hvars(ih_litter_out_si)%r81d, & hio_npp_si => this%hvars(ih_npp_si)%r81d, & @@ -2471,7 +2500,6 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) hio_promotion_carbonflux_si => this%hvars(ih_promotion_carbonflux_si)%r81d, & hio_canopy_mortality_carbonflux_si => this%hvars(ih_canopy_mortality_carbonflux_si)%r81d, & hio_ustory_mortality_carbonflux_si => this%hvars(ih_understory_mortality_carbonflux_si)%r81d, & - hio_woodproduct_si => this%hvars(ih_woodproduct_si)%r81d, & hio_gdd_si => this%hvars(ih_gdd_si)%r81d, & hio_site_ncolddays_si => this%hvars(ih_site_ncolddays_si)%r81d, & hio_site_nchilldays_si => this%hvars(ih_site_nchilldays_si)%r81d, & @@ -2545,10 +2573,6 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) hio_cleafoff_si(io_si) = real(sites(s)%phen_model_date - sites(s)%cleafoffdate,r8) hio_cleafon_si(io_si) = real(sites(s)%phen_model_date - sites(s)%cleafondate,r8) - ! track total wood product accumulation at the site level - hio_woodproduct_si(io_si) = sites(s)%resources_management%trunk_product_site & - * AREA_INV - ! site-level fire variables: ! Nesterov index (unitless) @@ -2556,6 +2580,9 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) hio_effect_wspeed_si(io_si) = sites(s)%fireWeather%effective_windspeed/sec_per_min + ! Prescribed fire burn window + hio_rx_burn_window_si(io_si) = hio_rx_burn_window_si(io_si) + sites(s)%fireWeather%rx_flag + ! number of ignitions [#/km2/day -> #/m2/s] hio_fire_nignitions_si(io_si) = sites(s)%NF_successful / m2_per_km2 / & sec_per_day @@ -2563,6 +2590,15 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) ! Fire danger index (FDI) (0-1) hio_fire_fdi_si(io_si) = sites(s)%FDI + ! total rx burnable fraction when fuel condition met + hio_rx_fracarea_fuel_si(io_si) = sites(s)%rxfire_area_fuel * AREA_INV + + ! total rx burnable fraction when fuel and FI conditions met + hio_rx_fracarea_fi_si(io_si) = sites(s)%rxfire_area_fi * AREA_INV + + ! total rx burnable fraction when all conditions met + hio_rx_fracarea_final_si(io_si) = sites(s)%rxfire_area_final * AREA_INV + ! If hydraulics are turned on, track the error terms associated with ! dynamics [kg/m2] if(hlm_use_planthydro.eq.itrue)then @@ -2657,7 +2693,7 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) hio_ncl_si(io_si) = hio_ncl_si(io_si) + cpatch%ncl_p * cpatch%area * AREA_INV ! only valid when "strict ppa" enabled - if ( ED_val_comp_excln .lt. 0._r8 ) then + if ( comp_excln_exp .lt. 0._r8 ) then hio_zstar_si(io_si) = hio_zstar_si(io_si) & + cpatch%zstar * cpatch%area * AREA_INV end if @@ -2692,12 +2728,22 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) hio_tfc_ros_si(io_si) = hio_tfc_ros_si(io_si) + cpatch%TFC_ROS * cpatch%area * AREA_INV hio_fire_intensity_si(io_si) = hio_fire_intensity_si(io_si) + cpatch%FI * cpatch%area * AREA_INV * J_per_kJ hio_fire_fracarea_si(io_si) = hio_fire_fracarea_si(io_si) + cpatch%frac_burnt * cpatch%area * AREA_INV / sec_per_day + hio_nonrx_intensity_si(io_si) = hio_nonrx_intensity_si(io_si) + cpatch%nonrx_FI * cpatch%area * AREA_INV * J_per_kJ + hio_nonrx_fracarea_si(io_si) = hio_nonrx_fracarea_si(io_si) + cpatch%nonrx_frac_burnt * cpatch%area * AREA_INV / sec_per_day + hio_rx_intensity_si(io_si) = hio_rx_intensity_si(io_si) + cpatch%rx_FI * cpatch%area * AREA_INV * J_per_kJ + hio_rx_fracarea_si(io_si) = hio_rx_fracarea_si(io_si) + cpatch%rx_frac_burnt * cpatch%area * AREA_INV / sec_per_day hio_fire_fuel_bulkd_si(io_si) = hio_fire_fuel_bulkd_si(io_si) + cpatch%fuel%bulk_density_notrunks * cpatch%area * AREA_INV hio_fire_fuel_eff_moist_si(io_si) = hio_fire_fuel_eff_moist_si(io_si) + cpatch%fuel%average_moisture_notrunks * cpatch%area * AREA_INV hio_fire_fuel_sav_si(io_si) = hio_fire_fuel_sav_si(io_si) + cpatch%fuel%SAV_notrunks * cpatch%area * AREA_INV / m_per_cm hio_fire_fuel_mef_si(io_si) = hio_fire_fuel_mef_si(io_si) + cpatch%fuel%MEF_notrunks * cpatch%area * AREA_INV hio_sum_fuel_si(io_si) = hio_sum_fuel_si(io_si) + cpatch%fuel%non_trunk_loading * cpatch%area * AREA_INV + hio_nonrx_intensity_fracarea_product_si(io_si) = hio_nonrx_intensity_fracarea_product_si(io_si) + & + cpatch%nonrx_FI * cpatch%nonrx_frac_burnt * cpatch%area * AREA_INV * J_per_kJ + + hio_rx_intensity_fracarea_product_si(io_si) = hio_rx_intensity_fracarea_product_si(io_si) + & + cpatch%rx_FI * cpatch%rx_frac_burnt * cpatch%area * AREA_INV * J_per_kJ + hio_fire_intensity_fracarea_product_si(io_si) = hio_fire_intensity_fracarea_product_si(io_si) + & cpatch%FI * cpatch%frac_burnt * cpatch%area * AREA_INV * J_per_kJ @@ -2854,11 +2900,15 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) end if end do elloop - ! FLUXES --- + ! Carbon FLUXES --- ! Flux Variables (cohorts must had experienced a day before any of these values ! have any meaning, otherwise they are just inialization values - notnew: if( .not.(ccohort%isnew) ) then + call ccohort%prt%GetBiomass(carbon12_element , & + sapw_m, struct_m, leaf_m, fnrt_m, store_m, repro_m, alive_m, total_m) + + notnew: if( .not.(ccohort%isnew) ) then + hio_npp_si(io_si) = hio_npp_si(io_si) + & ccohort%npp_acc_hold * n_perm2 / days_per_year / sec_per_day @@ -2918,16 +2968,16 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) end if - ! THIS NEEDS TO BE NORMALIZED (RGK) + ! THIS NEEDS TO BE NORMALIZED hio_ca_weighted_height_si(io_si) = hio_ca_weighted_height_si(io_si) + & ccohort%height * ccohort%c_area / m2_per_ha site_ca = site_ca + ccohort%c_area / m2_per_ha - ! RGK - CANOPY/USTORY BIOMASS IS NOT A FLUX, NEED NOT BE CONDITIONED BY isnew + + ! Mortality Carbon Flux by layer ! ---------------------------------------------------------------------------------- if (ccohort%canopy_layer .eq. 1) then - hio_canopy_biomass_si(io_si) = hio_canopy_biomass_si(io_si) + n_perm2 * total_m hio_canopy_mortality_carbonflux_si(io_si) = hio_canopy_mortality_carbonflux_si(io_si) + & ccohort%SumMortForHistory(per_year = .false.) * total_m * ccohort%n * ha_per_m2 @@ -2936,7 +2986,6 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) ccohort%SumMortForHistory(per_year = .true.) * ccohort%c_area else - hio_ustory_biomass_si(io_si) = hio_ustory_biomass_si(io_si) + n_perm2 * total_m hio_ustory_mortality_carbonflux_si(io_si) = hio_ustory_mortality_carbonflux_si(io_si) + & ccohort%SumMortForHistory(per_year = .false.) * total_m * ccohort%n * ha_per_m2 @@ -2945,9 +2994,15 @@ subroutine update_history_dyn_sitelevel(this,nc,nsites,sites,bc_in) ccohort%SumMortForHistory(per_year = .true.) * ccohort%c_area end if - + end if notnew + if (ccohort%canopy_layer .eq. 1) then + hio_canopy_biomass_si(io_si) = hio_canopy_biomass_si(io_si) + n_perm2 * total_m + else + hio_ustory_biomass_si(io_si) = hio_ustory_biomass_si(io_si) + n_perm2 * total_m + end if + ccohort => ccohort%taller enddo cohortloop ! cohort loop @@ -3079,6 +3134,8 @@ subroutine update_history_dyn_subsite(this,nc,nsites,sites,bc_in) real(r8) :: storep_understory_scpf(numpft*nlevsclass) real(r8) :: storec_canopy_scpf(numpft*nlevsclass) real(r8) :: storec_understory_scpf(numpft*nlevsclass) + real(r8) :: a_sapw ! sapwood area [m^2] + real(r8) :: c_sapw ! sapwood biomass [kgC] integer :: i_dist, j_dist @@ -3165,9 +3222,12 @@ subroutine update_history_dyn_subsite(this,nc,nsites,sites,bc_in) hio_m8_si_scpf => this%hvars(ih_m8_si_scpf)%r82d, & hio_m9_si_scpf => this%hvars(ih_m9_si_scpf)%r82d, & hio_m10_si_scpf => this%hvars(ih_m10_si_scpf)%r82d, & + hio_m12_si_scpf => this%hvars(ih_m12_si_scpf)%r82d, & hio_m10_si_capf => this%hvars(ih_m10_si_capf)%r82d, & - hio_crownfiremort_si_scpf => this%hvars(ih_crownfiremort_si_scpf)%r82d, & - hio_cambialfiremort_si_scpf => this%hvars(ih_cambialfiremort_si_scpf)%r82d, & + hio_nonrx_crown_mort_si_scpf => this%hvars(ih_nonrx_crown_mort_si_scpf)%r82d, & + hio_nonrx_cambial_mort_si_scpf => this%hvars(ih_nonrx_cambial_mort_si_scpf)%r82d, & + hio_rx_crown_mort_si_scpf => this%hvars(ih_rx_crown_mort_si_scpf)%r82d, & + hio_rx_cambial_mort_si_scpf => this%hvars(ih_rx_cambial_mort_si_scpf)%r82d, & hio_abg_mortality_cflux_si_scpf => this%hvars(ih_abg_mortality_cflux_si_scpf)%r82d, & hio_abg_productivity_cflux_si_scpf => this%hvars(ih_abg_productivity_cflux_si_scpf)%r82d, & hio_burn_flux_elem => this%hvars(ih_burn_flux_elem)%r82d, & @@ -3181,7 +3241,8 @@ subroutine update_history_dyn_subsite(this,nc,nsites,sites,bc_in) hio_m8_si_scls => this%hvars(ih_m8_si_scls)%r82d, & hio_m9_si_scls => this%hvars(ih_m9_si_scls)%r82d, & hio_m10_si_scls => this%hvars(ih_m10_si_scls)%r82d, & - hio_m10_si_cacls => this%hvars(ih_m10_si_cacls)%r82d) + hio_m10_si_cacls => this%hvars(ih_m10_si_cacls)%r82d, & + hio_m12_si_scls => this%hvars(ih_m12_si_scls)%r82d) ! Break up associates for NAG compilers associate(hio_c13disc_si_scpf => this%hvars(ih_c13disc_si_scpf)%r82d, & @@ -4266,15 +4327,24 @@ subroutine update_history_dyn_subsite(this,nc,nsites,sites,bc_in) sites(s)%imort_rate(i_scls, ft) / m2_per_ha ! - ! fire mortality from the site-level diagnostic rates - hio_m5_si_scpf(io_si,i_scpf) = (sites(s)%fmort_rate_canopy(i_scls, ft) + & - sites(s)%fmort_rate_ustory(i_scls, ft)) / m2_per_ha + ! wildfire mortality from the site-level diagnostic rates + hio_m5_si_scpf(io_si,i_scpf) = (sites(s)%nonrx_fmort_rate_canopy(i_scls, ft) + & + sites(s)%nonrx_fmort_rate_ustory(i_scls, ft)) / m2_per_ha hio_m5_si_scls(io_si,i_scls) = hio_m5_si_scls(io_si,i_scls) + & - (sites(s)%fmort_rate_canopy(i_scls, ft) + & - sites(s)%fmort_rate_ustory(i_scls, ft)) / m2_per_ha - ! - hio_crownfiremort_si_scpf(io_si,i_scpf) = sites(s)%fmort_rate_crown(i_scls, ft) / m2_per_ha - hio_cambialfiremort_si_scpf(io_si,i_scpf) = sites(s)%fmort_rate_cambial(i_scls, ft) / m2_per_ha + (sites(s)%nonrx_fmort_rate_canopy(i_scls, ft) + & + sites(s)%nonrx_fmort_rate_ustory(i_scls, ft)) / m2_per_ha + ! prescribed fire mortality + hio_m12_si_scpf(io_si,i_scpf) = (sites(s)%rx_fmort_rate_canopy(i_scls,ft) + & + sites(s)%rx_fmort_rate_ustory(i_scls, ft)) / m2_per_ha + hio_m12_si_scls(io_si,i_scls) = hio_m12_si_scls(io_si,i_scls) + & + (sites(s)%rx_fmort_rate_canopy(i_scls, ft) + & + sites(s)%rx_fmort_rate_ustory(i_scls, ft)) / m2_per_ha + ! wildfire crown and cambial mort + hio_nonrx_crown_mort_si_scpf(io_si,i_scpf) = sites(s)%nonrx_fmort_rate_crown(i_scls, ft) / m2_per_ha + hio_nonrx_cambial_mort_si_scpf(io_si,i_scpf) = sites(s)%nonrx_fmort_rate_cambial(i_scls, ft) / m2_per_ha + ! prescribed fire crown and cambial mort + hio_rx_crown_mort_si_scpf(io_si,i_scpf) = sites(s)%rx_fmort_rate_crown(i_scls, ft) / m2_per_ha + hio_rx_cambial_mort_si_scpf(io_si,i_scpf) = sites(s)%rx_fmort_rate_cambial(i_scls, ft) / m2_per_ha ! ! fire components of overall canopy and understory mortality hio_mortality_canopy_si_scpf(io_si,i_scpf) = hio_mortality_canopy_si_scpf(io_si,i_scpf) + & @@ -4302,7 +4372,7 @@ subroutine update_history_dyn_subsite(this,nc,nsites,sites,bc_in) do ft = 1, numpft hio_mortality_carbonflux_si_pft(io_si,ft) = hio_mortality_carbonflux_si_pft(io_si,ft) + & (sites(s)%fmort_carbonflux_canopy(ft) + & - sites(s)%fmort_carbonflux_ustory(ft) ) / g_per_kg + & + sites(s)%fmort_carbonflux_ustory(ft)) / g_per_kg + & sites(s)%imort_carbonflux(ft) + & sum(sites(s)%term_carbonflux_ustory(:,ft)) * days_per_sec * ha_per_m2 + & sum(sites(s)%term_carbonflux_canopy(:,ft)) * days_per_sec * ha_per_m2 @@ -4339,18 +4409,18 @@ subroutine update_history_dyn_subsite(this,nc,nsites,sites,bc_in) (sites(s)%term_nindivs_ustory_damage(icdam, i_scls, ft) * days_per_year) + & sites(s)%imort_rate_damage(icdam, i_scls, ft) + & sites(s)%fmort_rate_canopy_damage(icdam, i_scls, ft) + & - sites(s)%fmort_rate_ustory_damage(icdam, i_scls, ft) ) / m2_per_ha + sites(s)%fmort_rate_ustory_damage(icdam, i_scls, ft)) / m2_per_ha this%hvars(ih_mortality_canopy_si_cdpf)%r82d(io_si,icdpf) = & this%hvars(ih_mortality_canopy_si_cdpf)%r82d(io_si,icdpf) + & ( sites(s)%term_nindivs_canopy_damage(icdam,i_scls,ft) * days_per_year + & - sites(s)%fmort_rate_canopy_damage(icdam, i_scls, ft) )/ m2_per_ha + sites(s)%fmort_rate_canopy_damage(icdam, i_scls, ft))/ m2_per_ha this%hvars(ih_mortality_understory_si_cdpf)%r82d(io_si,icdpf) = & this%hvars(ih_mortality_understory_si_cdpf)%r82d(io_si,icdpf) + & ( sites(s)%term_nindivs_ustory_damage(icdam, i_scls,ft) * days_per_year + & sites(s)%imort_rate_damage(icdam, i_scls, ft) + & - sites(s)%fmort_rate_ustory_damage(icdam, i_scls, ft) )/ m2_per_ha + sites(s)%fmort_rate_ustory_damage(icdam, i_scls, ft))/ m2_per_ha end do end do @@ -4383,7 +4453,8 @@ subroutine update_history_dyn_subsite(this,nc,nsites,sites,bc_in) hio_m7_si_scpf(io_si,i_scpf) + & hio_m8_si_scpf(io_si,i_scpf) + & hio_m9_si_scpf(io_si,i_scpf) + & - hio_m10_si_scpf(io_si,i_scpf) + hio_m10_si_scpf(io_si,i_scpf) + & + hio_m12_si_scpf(io_si,i_scpf) if(hlm_use_tree_damage .eq. itrue) then hio_mortality_si_pft(io_si, ft) = hio_mortality_si_pft(io_si,ft) + & @@ -4676,7 +4747,7 @@ end subroutine update_history_dyn_subsite ! ========================================================================================= - subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) + subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites) ! --------------------------------------------------------------------------------- ! This subroutine is intended to update all history variables with upfreq == @@ -4690,7 +4761,6 @@ subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) integer , intent(in) :: nc ! clump index integer , intent(in) :: nsites type(ed_site_type) , intent(inout), target :: sites(nsites) - type(bc_in_type) , intent(in) :: bc_in(nsites) type(fates_cohort_type), pointer :: ccohort type(fates_patch_type), pointer :: cpatch @@ -4716,6 +4786,8 @@ subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) hio_scorch_height_si_agepft => this%hvars(ih_scorch_height_si_agepft)%r82d, & hio_zstar_si_age => this%hvars(ih_zstar_si_age)%r82d, & hio_fracarea_burnt_si_age => this%hvars(ih_fracarea_burnt_si_age)%r82d, & + hio_rx_fracarea_burnt_si_age => this%hvars(ih_rx_fracarea_burnt_si_age)%r82d, & + hio_nonrx_fracarea_burnt_si_age => this%hvars(ih_nonrx_fracarea_burnt_si_age)%r82d, & hio_fire_sum_fuel_si_age => this%hvars(ih_fire_sum_fuel_si_age)%r82d, & hio_fuel_amount_si_agfc => this%hvars(ih_fuel_amount_si_agfc)%r82d, & ! hio_fire_rate_of_spread_front_si_age => this%hvars(ih_fire_rate_of_spread_front_si_age)%r82d, & @@ -4726,7 +4798,9 @@ subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) hio_npp_si_age => this%hvars(ih_npp_si_age)%r82d, & hio_npp_si_agepft => this%hvars(ih_npp_si_agepft)%r82d, & hio_ddbh_canopy_si_scag => this%hvars(ih_ddbh_canopy_si_scag)%r82d, & - hio_fire_intensity_si_age => this%hvars(ih_fire_intensity_si_age)%r82d, & + hio_fire_intensity_si_age => this%hvars(ih_fire_intensity_si_age)%r82d, & + hio_rx_intensity_si_age => this%hvars(ih_rx_intensity_si_age)%r82d, & + hio_nonrx_intensity_si_age => this%hvars(ih_nonrx_intensity_si_age)%r82d, & hio_npatches_si_age => this%hvars(ih_npatches_si_age)%r82d, & hio_canopy_fracarea_si_age => this%hvars(ih_canopy_fracarea_si_age)%r82d, & hio_nplant_si_scag => this%hvars(ih_nplant_si_scag)%r82d, & @@ -4769,6 +4843,15 @@ subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) hio_fracarea_burnt_si_age(io_si,cpatch%age_class) = hio_fracarea_burnt_si_age(io_si,cpatch%age_class) + & cpatch%frac_burnt / sec_per_day & ! [frac/day] -> [frac/sec] * patch_area_div_site_area + + hio_rx_fracarea_burnt_si_age(io_si,cpatch%age_class) = hio_rx_fracarea_burnt_si_age(io_si,cpatch%age_class) + & + cpatch%rx_frac_burnt / sec_per_day & ! [frac/day] -> [frac/sec] + * patch_area_div_site_area + + hio_nonrx_fracarea_burnt_si_age(io_si,cpatch%age_class) = hio_nonrx_fracarea_burnt_si_age(io_si,cpatch%age_class) + & + cpatch%nonrx_frac_burnt / sec_per_day & ! [frac/day] -> [frac/sec] + * patch_area_div_site_area + hio_fire_sum_fuel_si_age(io_si, cpatch%age_class) = hio_fire_sum_fuel_si_age(io_si, cpatch%age_class) + & cpatch%fuel%non_trunk_loading * patch_area_div_site_area do i_fuel = 1,num_fuel_classes @@ -4778,7 +4861,7 @@ subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) end do ! only valid when "strict ppa" enabled - if ( ED_val_comp_excln .lt. 0._r8 ) then + if ( comp_excln_exp .lt. 0._r8 ) then hio_zstar_si_age(io_si,cpatch%age_class) = hio_zstar_si_age(io_si,cpatch%age_class) & + cpatch%zstar * patch_area_div_site_area end if @@ -4820,6 +4903,14 @@ subroutine update_history_dyn_subsite_ageclass(this,nc,nsites,sites,bc_in) ! hio_fire_rate_of_spread_front_si_age(io_si, cpatch%age_class) = hio_fire_rate_of_spread_si_age(io_si, cpatch%age_class) + & ! cpatch%ros_front * cpatch*frac_burnt * patch_area_div_site_area + hio_rx_intensity_si_age(io_si, cpatch%age_class) = hio_rx_intensity_si_age(io_si, cpatch%age_class) + & + cpatch%rx_FI * J_per_kJ & ! [kJ/m/s] -> [J/m/s] + * cpatch%rx_frac_burnt * patch_area_div_site_area + + hio_nonrx_intensity_si_age(io_si, cpatch%age_class) = hio_nonrx_intensity_si_age(io_si, cpatch%age_class) + & + cpatch%nonrx_FI * J_per_kJ & ! [kJ/m/s] -> [J/m/s] + * cpatch%nonrx_frac_burnt * patch_area_div_site_area + ! Weighted by cohort canopy area relative to site area ccohort => cpatch%shortest cohortloop: do while(associated(ccohort)) @@ -4965,6 +5056,22 @@ subroutine reset_history_dyn_subsite(this, nsites, sites) sites(s)%fmort_carbonflux_ustory(:) = 0._r8 sites(s)%fmort_rate_cambial(:,:) = 0._r8 sites(s)%fmort_rate_crown(:,:) = 0._r8 + + sites(s)%nonrx_fmort_rate_canopy(:,:) = 0._r8 + sites(s)%nonrx_fmort_rate_ustory(:,:) = 0._r8 + sites(s)%nonrx_fmort_carbonflux_canopy(:) = 0._r8 + sites(s)%nonrx_fmort_carbonflux_ustory(:) = 0._r8 + sites(s)%nonrx_fmort_rate_cambial(:,:) = 0._r8 + sites(s)%nonrx_fmort_rate_crown(:,:) = 0._r8 + sites(s)%nonrx_fmort_abg_flux(:,:) = 0._r8 + sites(s)%rx_fmort_rate_canopy(:,:) = 0._r8 + sites(s)%rx_fmort_rate_ustory(:,:) = 0._r8 + sites(s)%rx_fmort_carbonflux_canopy(:) = 0._r8 + sites(s)%rx_fmort_carbonflux_ustory(:) = 0._r8 + sites(s)%rx_fmort_rate_cambial(:,:) = 0._r8 + sites(s)%rx_fmort_rate_crown(:,:) = 0._r8 + sites(s)%rx_fmort_abg_flux(:,:) = 0._r8 + sites(s)%growthflux_fusion(:,:) = 0._r8 sites(s)%fmort_abg_flux(:,:) = 0._r8 sites(s)%imort_abg_flux(:,:) = 0._r8 @@ -4980,6 +5087,16 @@ subroutine reset_history_dyn_subsite(this, nsites, sites) sites(s)%fmort_rate_ustory_damage(:,:,:) = 0._r8 sites(s)%fmort_cflux_canopy_damage(:,:) = 0._r8 sites(s)%fmort_cflux_ustory_damage(:,:) = 0._r8 + + sites(s)%nonrx_fmort_rate_canopy_damage(:,:,:) = 0._r8 + sites(s)%nonrx_fmort_rate_ustory_damage(:,:,:) = 0._r8 + sites(s)%nonrx_fmort_cflux_canopy_damage(:,:) = 0._r8 + sites(s)%nonrx_fmort_cflux_ustory_damage(:,:) = 0._r8 + sites(s)%rx_fmort_rate_canopy_damage(:,:,:) = 0._r8 + sites(s)%rx_fmort_rate_ustory_damage(:,:,:) = 0._r8 + sites(s)%rx_fmort_cflux_canopy_damage(:,:) = 0._r8 + sites(s)%rx_fmort_cflux_ustory_damage(:,:) = 0._r8 + end do siteloop end subroutine reset_history_dyn_subsite @@ -5004,9 +5121,9 @@ subroutine update_history_hifrq(this,nc,nsites,sites,bc_in,bc_out,dt_tstep) real(r8) , intent(in) :: dt_tstep if(hlm_hist_level_hifrq>0) then - call update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,bc_out,dt_tstep) + call update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,dt_tstep) if(hlm_hist_level_hifrq>1) then - call update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,bc_out,dt_tstep) + call update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,dt_tstep) call update_history_hifrq_subsite_ageclass(this,nsites,sites,dt_tstep) end if end if @@ -5015,7 +5132,7 @@ subroutine update_history_hifrq(this,nc,nsites,sites,bc_in,bc_out,dt_tstep) return end subroutine update_history_hifrq - subroutine update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,bc_out,dt_tstep) + subroutine update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,dt_tstep) ! --------------------------------------------------------------------------------- ! This subroutine is intended to update all history variables with upfreq == @@ -5030,7 +5147,6 @@ subroutine update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,bc_out,dt_t integer , intent(in) :: nsites type(ed_site_type) , intent(inout), target :: sites(nsites) type(bc_in_type) , intent(in) :: bc_in(nsites) - type(bc_out_type) , intent(in) :: bc_out(nsites) real(r8) , intent(in) :: dt_tstep ! Locals @@ -5093,6 +5209,11 @@ subroutine update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,bc_out,dt_t ! We do not call the radiation solver if ! a) there is no vegetation ! b) there is no light! (ie cos(zenith) ~= 0) + ! c) the "do albedo" flag is true...but, this + ! may be false in coupled runs on alternate time-steps + ! and it is ok to carry over the previous errors + ! and diagnostics between these steps + age_area_rad(:) = 0._r8 cpatch => sites(s)%oldest_patch do while(associated(cpatch)) @@ -5101,7 +5222,7 @@ subroutine update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,bc_out,dt_t ! solver was called. The solver will be called for NIR ! if VIS is called, and likewise the same for conservation ! error. So the check on VIS solve error will catch all. - if( abs(cpatch%rad_error(ivis))>nearzero ) then + if( abs(cpatch%rad_error(ivis)-hlm_hio_ignore_val)>nearzero ) then age_class = get_age_class_index(cpatch%age) age_area_rad(age_class) = age_area_rad(age_class) + cpatch%total_canopy_area end if @@ -5110,23 +5231,22 @@ subroutine update_history_hifrq_sitelevel(this,nc,nsites,sites,bc_in,bc_out,dt_t sum_area_rad = sum(age_area_rad(:)) - if_anyrad: if(sum_area_rad sites(s)%oldest_patch do while(associated(cpatch)) - if( abs(cpatch%rad_error(ivis))>nearzero ) then + if( abs(cpatch%rad_error(ivis)-hlm_hio_ignore_val)>nearzero ) then hio_vis_rad_err_si(io_si) = hio_vis_rad_err_si(io_si) + & cpatch%rad_error(ivis)*cpatch%total_canopy_area/sum_area_rad hio_nir_rad_err_si(io_si) = hio_nir_rad_err_si(io_si) + & cpatch%rad_error(inir)*cpatch%total_canopy_area/sum_area_rad - + end if cpatch => cpatch%younger end do @@ -5238,7 +5358,7 @@ end subroutine update_history_hifrq_sitelevel ! =============================================================================================== - subroutine update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,bc_out,dt_tstep) + subroutine update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,dt_tstep) ! --------------------------------------------------------------------------------- ! This subroutine is intended to update all history variables with upfreq == @@ -5253,9 +5373,8 @@ subroutine update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,bc_out,dt_tst class(fates_history_interface_type) :: this integer , intent(in) :: nc ! clump index integer , intent(in) :: nsites - type(ed_site_type) , intent(inout), target :: sites(nsites) + type(ed_site_type) , intent(inout) :: sites(nsites) type(bc_in_type) , intent(in) :: bc_in(nsites) - type(bc_out_type) , intent(in) :: bc_out(nsites) real(r8) , intent(in) :: dt_tstep ! Locals @@ -5272,7 +5391,8 @@ subroutine update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,bc_out,dt_tst real(r8) :: clllpf_area ! area footprint (m2) for the current cl x ll x pft bin real(r8) :: clll_area ! area footprint (m2) for the cl x ll bin (ie adds up pfts in parallel) real(r8) :: cl_area ! total weight of all ll x pft bins in the canopy layer - + real(r8) :: parprof_pft_dir_z,parprof_pft_dif_z ! PAR intensity for dir/diff for pft/canopy/leaf layer (w/m2) + type(fates_patch_type),pointer :: cpatch type(fates_cohort_type),pointer :: ccohort real(r8) :: dt_tstep_inv ! Time step in frequency units (/s) @@ -5342,8 +5462,10 @@ subroutine update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,bc_out,dt_tst io_si = sites(s)%h_gid cpatch => sites(s)%oldest_patch - do while(associated(cpatch)) - + patch_loop1: do while(associated(cpatch)) + + nocomp_bare: if(cpatch%nocomp_pft_label.ne.nocomp_bareground)then + ccohort => cpatch%shortest do while(associated(ccohort)) @@ -5424,8 +5546,8 @@ subroutine update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,bc_out,dt_tst endif end associate endif + ! canopy leaf carbon balance - !!! canopy leaf carbon balance ican = ccohort%canopy_layer do ileaf=1,ccohort%nv cnlf_indx = ileaf + (ican-1) * nlevleaf @@ -5437,186 +5559,194 @@ subroutine update_history_hifrq_subsite(this,nc,nsites,sites,bc_in,bc_out,dt_tst enddo ! cohort loop - ! summarize radiation profiles through the canopy - ! -------------------------------------------------------------------- + ! Radiation diagnostics + ! Only process diagnostics if the sun is out + if_zenith1: if( sites(s)%coszen>0._r8 ) then - do_pft1: do ipft=1,numpft - do_canlev1: do ican=1,cpatch%ncl_p - do_leaflev1: do ileaf=1,cpatch%nleaf(ican,ipft) + do_pft1: do ipft=1,numpft + do_canlev1: do ican=1,cpatch%ncl_p + do_leaflev1: do ileaf=1,cpatch%nrad(ican,ipft) - ! calculate where we are on multiplexed dimensions - clllpf_indx = ileaf + (ican-1) * nlevleaf + (ipft-1) * nlevleaf * nclmax - cnlf_indx = ileaf + (ican-1) * nlevleaf + ! calculate where we are on multiplexed dimensions + clllpf_indx = ileaf + (ican-1) * nlevleaf + (ipft-1) * nlevleaf * nclmax + cnlf_indx = ileaf + (ican-1) * nlevleaf - ! canopy_area_profile is the fraction of the total canopy area that - ! is occupied by this bin. If you add up the top leaf layer bins in the - ! top canopy layers, for all pfts, that should equal to 1 + ! canopy_area_profile is the fraction of the total canopy area that + ! is occupied by this bin. If you add up the top leaf layer bins in the + ! top canopy layers, for all pfts, that should equal to 1 - clllpf_area = cpatch%canopy_area_profile(ican,ipft,ileaf)*cpatch%total_canopy_area + clllpf_area = cpatch%canopy_area_profile(ican,ipft,ileaf)*cpatch%total_canopy_area - ! Canopy by leaf by pft level diagnostics - ! ------------------------------------------------------------------- - hio_parsun_z_si_cnlfpft(io_si,clllpf_indx) = hio_parsun_z_si_cnlfpft(io_si,clllpf_indx) + & - cpatch%ed_parsun_z(ican,ipft,ileaf) * clllpf_area + ! Canopy by leaf by pft level diagnostics + ! ------------------------------------------------------------------- + hio_parsun_z_si_cnlfpft(io_si,clllpf_indx) = hio_parsun_z_si_cnlfpft(io_si,clllpf_indx) + & + cpatch%ed_parsun_z(ican,ipft,ileaf) * clllpf_area - hio_parsha_z_si_cnlfpft(io_si,clllpf_indx) = hio_parsha_z_si_cnlfpft(io_si,clllpf_indx) + & - cpatch%ed_parsha_z(ican,ipft,ileaf) * clllpf_area + hio_parsha_z_si_cnlfpft(io_si,clllpf_indx) = hio_parsha_z_si_cnlfpft(io_si,clllpf_indx) + & + cpatch%ed_parsha_z(ican,ipft,ileaf) * clllpf_area - ! elai_profile is the m2 of leaf inside the m2 of bin. + ! elai_profile is the m2 of leaf inside the m2 of bin. - hio_laisun_clllpf(io_si, clllpf_indx) = hio_laisun_clllpf(io_si, clllpf_indx) + & - cpatch%elai_profile(ican,ipft,ileaf)*cpatch%f_sun(ican,ipft,ileaf)*clllpf_area + hio_laisun_clllpf(io_si, clllpf_indx) = hio_laisun_clllpf(io_si, clllpf_indx) + & + cpatch%elai_profile(ican,ipft,ileaf)*cpatch%f_sun(ican,ipft,ileaf)*clllpf_area - hio_laisha_clllpf(io_si,clllpf_indx) = hio_laisha_clllpf(io_si,clllpf_indx) + & - cpatch%elai_profile(ican,ipft,ileaf)*(1._r8-cpatch%f_sun(ican,ipft,ileaf))*clllpf_area + hio_laisha_clllpf(io_si,clllpf_indx) = hio_laisha_clllpf(io_si,clllpf_indx) + & + cpatch%elai_profile(ican,ipft,ileaf)*(1._r8-cpatch%f_sun(ican,ipft,ileaf))*clllpf_area - hio_parprof_dir_si_cnlfpft(io_si,clllpf_indx) = hio_parprof_dir_si_cnlfpft(io_si,clllpf_indx) + & - cpatch%parprof_pft_dir_z(ican,ipft,ileaf) * clllpf_area + parprof_pft_dir_z = bc_in(s)%solad_parb(cpatch%patchno,ipar) * & + cpatch%nrmlzd_parprof_pft_dir_z(ican,ipft,ileaf) - hio_parprof_dif_si_cnlfpft(io_si,clllpf_indx) = hio_parprof_dif_si_cnlfpft(io_si,clllpf_indx) + & - cpatch%parprof_pft_dif_z(ican,ipft,ileaf) * clllpf_area + parprof_pft_dif_z = bc_in(s)%solai_parb(cpatch%patchno,ipar) * & + cpatch%nrmlzd_parprof_pft_dif_z(ican,ipft,ileaf) - ! The fractional area of Canopy layer and PFTs can be used - ! do upscale the CLLLPF properties - hio_crownfrac_clllpf(io_si,clllpf_indx) = hio_crownfrac_clllpf(io_si,clllpf_indx) + & - clllpf_area + hio_parprof_dir_si_cnlfpft(io_si,clllpf_indx) = hio_parprof_dir_si_cnlfpft(io_si,clllpf_indx) + & + parprof_pft_dir_z * clllpf_area + hio_parprof_dif_si_cnlfpft(io_si,clllpf_indx) = hio_parprof_dif_si_cnlfpft(io_si,clllpf_indx) + & + parprof_pft_dif_z * clllpf_area - ! Canopy by leaf layer (mean across pfts) level diagnostics - ! ---------------------------------------------------------------------------- - hio_parprof_dir_si_cnlf(io_si,cnlf_indx) = hio_parprof_dir_si_cnlf(io_si,cnlf_indx) + & - cpatch%parprof_pft_dir_z(ican,ipft,ileaf) * clllpf_area - - hio_parprof_dif_si_cnlf(io_si,cnlf_indx) = hio_parprof_dif_si_cnlf(io_si,cnlf_indx) + & - cpatch%parprof_pft_dif_z(ican,ipft,ileaf) * clllpf_area + ! The fractional area of Canopy layer and PFTs can be used + ! do upscale the CLLLPF properties + hio_crownfrac_clllpf(io_si,clllpf_indx) = hio_crownfrac_clllpf(io_si,clllpf_indx) + & + clllpf_area + + + ! Canopy by leaf layer (mean across pfts) level diagnostics + ! ---------------------------------------------------------------------------- + hio_parprof_dir_si_cnlf(io_si,cnlf_indx) = hio_parprof_dir_si_cnlf(io_si,cnlf_indx) + & + parprof_pft_dir_z * clllpf_area - hio_parsun_z_si_cnlf(io_si,cnlf_indx) = hio_parsun_z_si_cnlf(io_si,cnlf_indx) + & - cpatch%ed_parsun_z(ican,ipft,ileaf) * clllpf_area + hio_parprof_dif_si_cnlf(io_si,cnlf_indx) = hio_parprof_dif_si_cnlf(io_si,cnlf_indx) + & + parprof_pft_dif_z * clllpf_area - hio_parsha_z_si_cnlf(io_si,cnlf_indx) = hio_parsha_z_si_cnlf(io_si,cnlf_indx) + & - cpatch%ed_parsha_z(ican,ipft,ileaf) * clllpf_area + hio_parsun_z_si_cnlf(io_si,cnlf_indx) = hio_parsun_z_si_cnlf(io_si,cnlf_indx) + & + cpatch%ed_parsun_z(ican,ipft,ileaf) * clllpf_area - hio_laisun_z_si_cnlf(io_si,cnlf_indx) = hio_laisun_z_si_cnlf(io_si,cnlf_indx) + & - cpatch%f_sun(ican,ipft,ileaf)*clllpf_area + hio_parsha_z_si_cnlf(io_si,cnlf_indx) = hio_parsha_z_si_cnlf(io_si,cnlf_indx) + & + cpatch%ed_parsha_z(ican,ipft,ileaf) * clllpf_area - hio_laisha_z_si_cnlf(io_si,cnlf_indx) = hio_laisha_z_si_cnlf(io_si,cnlf_indx) + & - (1._r8-cpatch%f_sun(ican,ipft,ileaf))*clllpf_area + hio_laisun_z_si_cnlf(io_si,cnlf_indx) = hio_laisun_z_si_cnlf(io_si,cnlf_indx) + & + cpatch%f_sun(ican,ipft,ileaf)*clllpf_area - ! Canopy mean diagnostics - ! -------------------------------------------------------------- + hio_laisha_z_si_cnlf(io_si,cnlf_indx) = hio_laisha_z_si_cnlf(io_si,cnlf_indx) + & + (1._r8-cpatch%f_sun(ican,ipft,ileaf))*clllpf_area - hio_parsun_si_can(io_si,ican) = hio_parsun_si_can(io_si,ican) + & - cpatch%ed_parsun_z(ican,ipft,ileaf) * clllpf_area - hio_parsha_si_can(io_si,ican) = hio_parsha_si_can(io_si,ican) + & - cpatch%ed_parsha_z(ican,ipft,ileaf) * clllpf_area + ! Canopy mean diagnostics + ! -------------------------------------------------------------- - hio_laisun_si_can(io_si,ican) = hio_laisun_si_can(io_si,ican) + & - cpatch%f_sun(ican,ipft,ileaf)*cpatch%elai_profile(ican,ipft,ileaf) * clllpf_area - hio_laisha_si_can(io_si,ican) = hio_laisha_si_can(io_si,ican) + & - (1._r8-cpatch%f_sun(ican,ipft,ileaf))*cpatch%elai_profile(ican,ipft,ileaf) * clllpf_area + hio_parsun_si_can(io_si,ican) = hio_parsun_si_can(io_si,ican) + & + cpatch%ed_parsun_z(ican,ipft,ileaf) * clllpf_area + hio_parsha_si_can(io_si,ican) = hio_parsha_si_can(io_si,ican) + & + cpatch%ed_parsha_z(ican,ipft,ileaf) * clllpf_area + hio_laisun_si_can(io_si,ican) = hio_laisun_si_can(io_si,ican) + & + cpatch%f_sun(ican,ipft,ileaf)*cpatch%elai_profile(ican,ipft,ileaf) * clllpf_area + hio_laisha_si_can(io_si,ican) = hio_laisha_si_can(io_si,ican) + & + (1._r8-cpatch%f_sun(ican,ipft,ileaf))*cpatch%elai_profile(ican,ipft,ileaf) * clllpf_area - end do do_leaflev1 - end do do_canlev1 - end do do_pft1 + end do do_leaflev1 + end do do_canlev1 + end do do_pft1 + end if if_zenith1 + end if nocomp_bare cpatch => cpatch%younger - end do !patch loop + end do patch_loop1 !patch loop ! Normalize the radiation multiplexed diagnostics ! Set values that dont have canopy elements to ignore ! ---------------------------------------------------------------------------- - - do_ican2: do ican = 1,nclmax - - cl_area = 0._r8 - do_ileaf2: do ileaf = 1,nlevleaf - - clll_area = 0._r8 - do_ipft2: do ipft = 1,numpft - - clllpf_indx = ileaf + (ican-1) * nlevleaf + (ipft-1) * nlevleaf * nclmax - if( hio_crownfrac_clllpf(io_si,clllpf_indx)0._r8 ) then + do_ican2: do ican = 1,nclmax + + cl_area = 0._r8 + do_ileaf2: do ileaf = 1,nlevleaf + + clll_area = 0._r8 + do_ipft2: do ipft = 1,numpft + + clllpf_indx = ileaf + (ican-1) * nlevleaf + (ipft-1) * nlevleaf * nclmax + if( hio_crownfrac_clllpf(io_si,clllpf_indx)1) then call this%set_history_var(vname='FATES_NPP_LU', units='kg m-2 s-1', & @@ -6961,7 +7166,7 @@ subroutine define_history_vars(this, initialize_variables) call this%set_history_var(vname='FATES_RECRUITMENT_CFLUX_PF', units='kg m-2 yr-1', & long='total PFT-level biomass of new recruits in kg of carbon per land area', & use_default='active', avgflag='A', vtype=site_pft_r8, hlms='CLM:ALM', & - upfreq=1, ivar=ivar, initialize=initialize_variables, & + upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index=ih_recruitment_cflux_si_pft) call this%set_history_var(vname='FATES_LEAFC_PF', units='kg m-2', & @@ -7127,18 +7332,12 @@ subroutine define_history_vars(this, initialize_variables) call this%set_history_var(vname='FATES_CANOPYAREA', units='m2 m-2', & long='canopy area per m2 land area', use_default='inactive', & - avgflag='A', vtype=site_r8, hlms='CLM:ALM', upfreq=group_dyna_simple, ivar=ivar, & + avgflag='A', vtype=site_r8, hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & initialize=initialize_variables, index=ih_canopy_fracarea_si) - call this%set_history_var(vname='FATES_NCL', units='', & - long='number of canopy levels', & - use_default='inactive', avgflag='A', vtype=site_r8, & - hlms='CLM:ALM', upfreq=group_dyna_simple, ivar=ivar, initialize=initialize_variables, & - index=ih_ncl_si) - call this%set_history_var(vname='FATES_PATCHAREA', units='m2 m-2', & long='patch area per m2 land area', use_default='inactive', & - avgflag='A', vtype=site_r8, hlms='CLM:ALM', upfreq=group_dyna_simple, ivar=ivar, & + avgflag='A', vtype=site_r8, hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & initialize=initialize_variables, index=ih_fracarea_si) ! patch age class variables @@ -7175,7 +7374,7 @@ subroutine define_history_vars(this, initialize_variables) upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index=ih_npatches_si_age) - if ( ED_val_comp_excln .lt. 0._r8 ) then ! only valid when "strict ppa" enabled + if ( comp_excln_exp .lt. 0._r8 ) then ! only valid when "strict ppa" enabled tempstring = 'active' else tempstring = 'inactive' @@ -7187,12 +7386,6 @@ subroutine define_history_vars(this, initialize_variables) hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index=ih_zstar_si_age) - call this%set_history_var(vname='FATES_ZSTAR', units='m', & - long='product of zstar and patch area', & - use_default='inactive', avgflag='A', vtype=site_r8, & - hlms='CLM:ALM', upfreq=group_dyna_simple, ivar=ivar, initialize=initialize_variables, & - index=ih_zstar_si) - call this%set_history_var(vname='FATES_CANOPYAREA_HT', units='m2 m-2', & long='canopy area height distribution', & use_default='active', avgflag='A', vtype=site_height_r8, & @@ -7222,14 +7415,14 @@ subroutine define_history_vars(this, initialize_variables) units='m2 m-2', & long='secondary forest patch area since anthropgenic disturbance', & use_default='inactive', avgflag='A', vtype=site_r8, & - hlms='CLM:ALM', upfreq=group_dyna_simple, ivar=ivar, initialize=initialize_variables, & + hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index=ih_agesince_anthrodist_si) call this%set_history_var(vname='FATES_SECONDARY_AREA', & units='m2 m-2', & long='secondary forest patch area since any kind of disturbance', & use_default='inactive', avgflag='A', vtype=site_r8, & - hlms='CLM:ALM', upfreq=group_dyna_simple, ivar=ivar, initialize=initialize_variables, & + hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index=ih_secondarylands_fracarea_si) call this%set_history_var(vname='FATES_SECONDARY_AREA_AP', & @@ -7243,7 +7436,7 @@ subroutine define_history_vars(this, initialize_variables) units='m2 m-2', & long='primary forest patch area since any kind of disturbance', & use_default='inactive', avgflag='A', vtype=site_r8, & - hlms='CLM:ALM', upfreq=group_dyna_simple, ivar=ivar, initialize=initialize_variables, & + hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index=ih_primarylands_fracarea_si) call this%set_history_var(vname='FATES_PRIMARY_AREA_AP', & @@ -7278,18 +7471,44 @@ subroutine define_history_vars(this, initialize_variables) index = ih_fuel_amount_si_agfc) call this%set_history_var(vname='FATES_BURNFRAC_AP', units='s-1', & - long='spitfire fraction area burnt (per second) by patch age', & + long='spitfire fraction area burnt (per second) by patch age, sum of rx and wildfire', & use_default='active', avgflag='A', vtype=site_age_r8, hlms='CLM:ALM', & upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index = ih_fracarea_burnt_si_age) call this%set_history_var(vname='FATES_FIRE_INTENSITY_BURNFRAC_AP', & units='J m-1 s-1', & - long='product of fire intensity and burned fraction, resolved by patch age (so divide by FATES_BURNFRAC_AP to get burned-area-weighted-average intensity)', & + long='product of fire intensity and burned fraction, sum of rx and wildfire, resolved by patch age (so divide by FATES_BURNFRAC_AP to get area-weighted mean intensity)', & use_default='active', avgflag='A', vtype=site_age_r8, hlms='CLM:ALM', & - upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & + upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & index = ih_fire_intensity_si_age) + call this%set_history_var(vname='FATES_WILDFIRE_BURNFRAC_AP', units='s-1', & + long='spitfire fraction area burnt due to wildfire by patch age', & + use_default='active', avgflag='A', vtype=site_age_r8, hlms='CLM:ALM', & + upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & + index = ih_nonrx_fracarea_burnt_si_age) + + call this%set_history_var(vname='FATES_WILDFIRE_INTENSITY_BURNFRAC_AP', & + units='J m-1 s-1', & + long='product of wildfire intensity and burned fraction, resolved by patch age, divide by FATES_WILDFIRE_BURNFRAC_AP to get area-weighted mean intensity)', & + use_default='active', avgflag='A', vtype=site_age_r8, hlms='CLM:ALM', & + upfreq=group_dyna_complx, ivar=ivar, initialize=initialize_variables, & + index = ih_nonrx_intensity_si_age) + + call this%set_history_var(vname='FATES_RXFIRE_BURNFRAC_AP', units='s-1', & + long='spitfire fraction area burnt due to prescribed fire by patch age', & + use_default='active', avgflag='A', vtype=site_age_r8, hlms='CLM:ALM', & + upfreq=1, ivar=ivar, initialize=initialize_variables, & + index= ih_rx_fracarea_burnt_si_age) + + call this%set_history_var(vname='FATES_RXFIRE_INTENSITY_BURNFRAC_AP', & + units='J m-1 s-1', & + long='product of prescribed fire intensity and burned fraction by patch age, to be devided by FATES_RXFIRE_BURNFRAC_AP to get area-weighted mean intensity)', & + use_default='active', avgflag='A', vtype=site_age_r8, hlms='CLM:ALM', & + upfreq=1, ivar=ivar, initialize=initialize_variables, & + index = ih_rx_intensity_si_age) + call this%set_history_var(vname='FATES_FUEL_AMOUNT_AP', units='kg m-2', & long='spitfire ground fuel (kg carbon per m2) related to FATES_ROS (omits 1000hr fuels) within each patch age bin (divide by FATES_PATCHAREA_AP to get fuel per unit area of that-age patch)', & use_default='active', avgflag='A', vtype=site_age_r8, hlms='CLM:ALM', & @@ -7881,26 +8100,47 @@ subroutine define_history_vars(this, initialize_variables) hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & initialize=initialize_variables, index = ih_m4_si_scpf) - call this%set_history_var(vname='FATES_MORTALITY_FIRE_SZPF', & + call this%set_history_var(vname='FATES_MORTALITY_WILDFIRE_SZPF', & units = 'm-2 yr-1', & - long='fire mortality by pft/size in number of plants per m2 per year', & + long='wildfire mortality by pft/size in number of plants per m2 per year', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, & - hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & + hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & initialize=initialize_variables, index = ih_m5_si_scpf) - call this%set_history_var(vname='FATES_MORTALITY_CROWNSCORCH_SZPF', & + call this%set_history_var(vname='FATES_MORTALITY_WILDFIRE_CROWN_SZPF', & units = 'm-2 yr-1', & - long='fire mortality from crown scorch by pft/size in number of plants per m2 per year', & + long='wildfire mortality from crown scorch by pft/size in number of plants per m2 per year', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, & - hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & - initialize=initialize_variables, index = ih_crownfiremort_si_scpf) + hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & + initialize=initialize_variables, index = ih_nonrx_crown_mort_si_scpf) - call this%set_history_var(vname='FATES_MORTALITY_CAMBIALBURN_SZPF', & + call this%set_history_var(vname='FATES_MORTALITY_WILDFIRE_CAMBIAL_SZPF', & units = 'm-2 yr-1', & - long='fire mortality from cambial burn by pft/size in number of plants per m2 per year', & + long='wildfire mortality from cambial burn by pft/size in number of plants per m2 per year', & use_default='inactive', avgflag='A', vtype=site_size_pft_r8, & - hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & - initialize=initialize_variables, index = ih_cambialfiremort_si_scpf) + hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & + initialize=initialize_variables, index = ih_nonrx_cambial_mort_si_scpf) + + call this%set_history_var(vname='FATES_MORTALITY_RXFIRE_SZPF', & + units = 'm-2 yr-1', & + long='prescribed fire mortality by pft/size in number of 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_m12_si_scpf) + + call this%set_history_var(vname='FATES_MORTALITY_RXCROWN_SZPF', & + units = 'm-2 yr-1', & + long='fire mortality from crown scorch due to prescribed fire by pft/size in number of 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_rx_crown_mort_si_scpf) + + call this%set_history_var(vname='FATES_MORTALITY_RXCAMBIAL_SZPF', & + units = 'm-2 yr-1', & + long='fire mortality from cambial kill due to prescribed fire by pft/size in number of 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_rx_cambial_mort_si_scpf) call this%set_history_var(vname='FATES_MORTALITY_TERMINATION_SZPF', & units = 'm-2 yr-1', & @@ -8267,6 +8507,13 @@ subroutine define_history_vars(this, initialize_variables) hlms='CLM:ALM', upfreq=group_dyna_complx, ivar=ivar, & initialize=initialize_variables, index = ih_m5_si_scls) + call this%set_history_var(vname='FATES_MORTALITY_RXFIRE_SZ', & + units = 'm-2 yr-1', & + long='prescribed fire mortality 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_m12_si_scls) + call this%set_history_var(vname='FATES_MORTALITY_TERMINATION_SZ', & units = 'm-2 yr-1', & long='termination mortality (excluding C-starvation) by size in number of plants per m2 per year', & @@ -8715,8 +8962,6 @@ subroutine define_history_vars(this, initialize_variables) end if if_dyn1 end if if_dyn0 - !HERE - if_hifrq0: if(hlm_hist_level_hifrq>0) then @@ -8893,13 +9138,6 @@ subroutine define_history_vars(this, initialize_variables) ! over the short timestep. We turn off these variables when we want ! to save time (and some space) - call this%set_history_var(vname='FATES_NPP_AP', units='kg m-2 s-1', & - long='net primary productivity by age bin in kg carbon per m2 per second'// & - this%per_ageclass_norm_info('FATES_PATCHAREA/FATES_PATCHAREA_AP'), & - use_default='inactive', avgflag='A', vtype=site_age_r8, & - hlms='CLM:ALM', upfreq=group_hifr_complx, ivar=ivar, initialize=initialize_variables, & - index = ih_npp_si_age) - call this%set_history_var(vname='FATES_GPP_AP', units='kg m-2 s-1', & long='gross primary productivity by age bin in kg carbon per m2 per second'// & this%per_ageclass_norm_info('FATES_PATCHAREA/FATES_PATCHAREA_AP'), &