#include <misc.h>
#include <preproc.h>
module CNFireMod 1,4
#ifdef CN
!-----------------------------------------------------------------------
!BOP
!
! !MODULE: CNFireMod
!
! !DESCRIPTION:
! Module holding routines fire mod
! nitrogen code.
!
! !USES:
use shr_kind_mod
, only: r8 => shr_kind_r8
use shr_const_mod
, only: SHR_CONST_PI,SHR_CONST_TKFRZ
use pft2colMod
, only: p2c
use clm_varctl
, only: iulog
implicit none
save
private
! !PUBLIC MEMBER FUNCTIONS:
public :: CNFireArea
public :: CNFireFluxes
!
! !REVISION HISTORY:
!
!EOP
!-----------------------------------------------------------------------
contains
!-----------------------------------------------------------------------
!BOP
!
! !IROUTINE: CNFireArea
!
! !INTERFACE:
subroutine CNFireArea (num_soilc, filter_soilc) 1,5
!
! !DESCRIPTION:
! Computes column-level area affected by fire in each timestep
! based on statistical fire model in Thonicke et al. 2001.
!
! !USES:
use clmtype
use clm_time_manager
, only: get_step_size, get_nstep
use clm_varpar
, only: max_pft_per_col
!
! !ARGUMENTS:
implicit none
integer, intent(in) :: num_soilc ! number of soil columns in filter
integer, intent(in) :: filter_soilc(:) ! filter for soil columns
!
! !CALLED FROM:
! subroutine CNEcosystemDyn in module CNEcosystemDynMod.F90
!
! !REVISION HISTORY:
! !LOCAL VARIABLES:
! local pointers to implicit in scalars
!
! pft-level
real(r8), pointer :: wtcol(:) ! pft weight on the column
integer , pointer :: ivt(:) ! vegetation type for this pft
real(r8), pointer :: woody(:) ! binary flag for woody lifeform (1=woody, 0=not woody)
! column-level
integer , pointer :: npfts(:) ! number of pfts on the column
integer , pointer :: pfti(:) ! pft index array
real(r8), pointer :: pwtgcell(:) ! weight of pft relative to corresponding gridcell
real(r8), pointer :: wf(:) ! soil water as frac. of whc for top 0.5 m
real(r8), pointer :: t_grnd(:) ! ground temperature (Kelvin)
real(r8), pointer :: totlitc(:) ! (gC/m2) total litter C (not including cwdc)
real(r8), pointer :: cwdc(:) ! (gC/m2) coarse woody debris C
! PET 5/20/08, test to increase fire area
real(r8), pointer :: totvegc(:) ! (gC/m2) total veg C (column-level mean)
! pointers for column averaging
!
! local pointers to implicit in/out scalars
!
! column-level
real(r8), pointer :: me(:) ! column-level moisture of extinction (proportion)
real(r8), pointer :: fire_prob(:) ! daily fire probability (0-1)
real(r8), pointer :: mean_fire_prob(:) ! e-folding mean of daily fire probability (0-1)
real(r8), pointer :: fireseasonl(:) ! annual fire season length (days, <= 365)
real(r8), pointer :: farea_burned(:) ! fractional area burned in this timestep (proportion)
real(r8), pointer :: ann_farea_burned(:) ! annual total fractional area burned (proportion)
!
! !OTHER LOCAL VARIABLES:
! real(r8), parameter:: minfuel = 200.0_r8 ! dead fuel threshold to carry a fire (gC/m2)
! PET, 5/30/08: changed from 200 to 100 gC/m2, since the original paper didn't specify
! the units as carbon, I am assuming that they were in dry biomass, so carbon would be ~50%
real(r8), parameter:: minfuel = 100.0_r8 ! dead fuel threshold to carry a fire (gC/m2)
real(r8), parameter:: me_woody = 0.3_r8 ! moisture of extinction for woody PFTs (proportion)
real(r8), parameter:: me_herb = 0.2_r8 ! moisture of extinction for herbaceous PFTs (proportion)
real(r8), parameter:: ef_time = 1.0_r8 ! e-folding time constant (years)
integer :: fc,c,pi,p ! index variables
real(r8):: dt ! time step variable (s)
real(r8):: fuelc ! temporary column-level litter + cwd C (gC/m2)
integer :: nef ! number of e-folding timesteps
real(r8):: ef_nsteps ! number of e-folding timesteps (real)
integer :: nstep ! current timestep number
real(r8):: m ! top-layer soil moisture (proportion)
real(r8):: mep ! pft-level moisture of extinction [proportion]
real(r8):: s2 ! (mean_fire_prob - 1.0)
!EOP
!-----------------------------------------------------------------------
! assign local pointers to derived type members (pft-level)
wtcol => clm3%g%l%c%p%wtcol
ivt => clm3%g%l%c%p%itype
pwtgcell => clm3%g%l%c%p%wtgcell
woody => pftcon%woody
! assign local pointers to derived type members (column-level)
npfts => clm3%g%l%c%npfts
pfti => clm3%g%l%c%pfti
wf => clm3%g%l%c%cps%wf
me => clm3%g%l%c%cps%me
fire_prob => clm3%g%l%c%cps%fire_prob
mean_fire_prob => clm3%g%l%c%cps%mean_fire_prob
fireseasonl => clm3%g%l%c%cps%fireseasonl
farea_burned => clm3%g%l%c%cps%farea_burned
ann_farea_burned => clm3%g%l%c%cps%ann_farea_burned
t_grnd => clm3%g%l%c%ces%t_grnd
totlitc => clm3%g%l%c%ccs%totlitc
cwdc => clm3%g%l%c%ccs%cwdc
! PET 5/20/08, test to increase fire area
totvegc => clm3%g%l%c%ccs%pcs_a%totvegc
! pft to column average for moisture of extinction
do fc = 1,num_soilc
c = filter_soilc(fc)
me(c) = 0._r8
end do
mep = me_woody
do pi = 1,max_pft_per_col
do fc = 1,num_soilc
c = filter_soilc(fc)
if (pi <= npfts(c)) then
p = pfti(c) + pi - 1
if (pwtgcell(p)>0._r8) then
if (woody(ivt(p)) == 1) then
mep = me_woody
else
mep = me_herb
end if
end if
me(c) = me(c) + mep*wtcol(p)
end if
end do
end do
! Get model step size
dt = real( get_step_size
(), r8 )
! Set the number of timesteps for e-folding.
! When the simulation has run fewer than this number of steps,
! re-scale the e-folding time to get a stable early estimate.
nstep = get_nstep
()
nef = (ef_time*365._r8*86400._r8)/dt
ef_nsteps = max(1,min(nstep,nef))
! test code, added 6/6/05, PET
! setting ef_nsteps to full count regardless of nstep, to see if this
! gets rid of transient in fire stats for initial run from spunup
! initial conditions
ef_nsteps = nef
! begin column loop to calculate fractional area affected by fire
do fc = 1, num_soilc
c = filter_soilc(fc)
! dead fuel C (total litter + CWD)
fuelc = totlitc(c) + cwdc(c)
! PET 5/20/08, test to increase fire area
! PET, 5/30/08. going back to original treatment using dead fuel only
! fuelc = fuelc + totvegc(c)
! m is the fractional soil mositure in the top layer (taken here
! as the top 0.5 m)
! PET 5/30/08 - note that this has been changed in Hydrology to use top 5 cm.
m = max(0._r8,wf(c))
! Calculate the probability of at least one fire in a day
! in the gridcell. minfuel is the limit for dead fuels below which
! fire is assumed unable to spread.
if (t_grnd(c)>SHR_CONST_TKFRZ .and. fuelc>minfuel .and. me(c)>0._r8 .and. m<=me(c)) then
fire_prob(c) = exp(-SHR_CONST_PI * (m/me(c))**2)
else
fire_prob(c) = 0._r8
end if
! Use e-folding to keep a running mean of daily fire probability,
! which is then used to calculate annual fractional area burned.
! mean_fire_prob corresponds to the variable s from Thonicke.
! fireseasonl corresponds to the variable N from Thonicke.
! ann_farea_burned corresponds to the variable A from Thonicke.
mean_fire_prob(c) = (mean_fire_prob(c)*(ef_nsteps-1._r8) + fire_prob(c))/ef_nsteps
fireseasonl(c) = mean_fire_prob(c) * 365._r8
s2 = mean_fire_prob(c)-1._r8
ann_farea_burned(c) = mean_fire_prob(c)*exp(s2/(0.45_r8*(s2**3) + 2.83_r8*(s2**2) + 2.96_r8*s2 + 1.04_r8))
! Estimate the fractional area of the column affected by fire in this time step.
! Over a year this should sum to a value near the annual
! fractional area burned from equations above.
if (fireseasonl(c) > 0._r8) then
farea_burned(c) = (fire_prob(c)/fireseasonl(c)) * ann_farea_burned(c) * (dt/86400._r8)
else
farea_burned(c) = 0._r8
end if
#if (defined NOFIRE)
! set the fire area 0 if NOFIRE flag is on
farea_burned(c) = 0._r8
#endif
end do ! end of column loop
end subroutine CNFireArea
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!BOP
!
! !IROUTINE: CNFireFluxes
!
! !INTERFACE:
subroutine CNFireFluxes (num_soilc, filter_soilc, num_soilp, filter_soilp) 1,7
!
! !DESCRIPTION:
! Fire effects routine for coupled carbon-nitrogen code (CN).
! Relies primarily on estimate of fractional area burned in this
! timestep, from CNFireArea().
!
! !USES:
use clmtype
use clm_time_manager
, only: get_step_size
!
! !ARGUMENTS:
implicit none
integer, intent(in) :: num_soilc ! number of soil columns in filter
integer, intent(in) :: filter_soilc(:) ! filter for soil columns
integer, intent(in) :: num_soilp ! number of soil pfts in filter
integer, intent(in) :: filter_soilp(:) ! filter for soil pfts
!
! !CALLED FROM:
! subroutine CNEcosystemDyn()
!
! !REVISION HISTORY:
! 7/23/04: Created by Peter Thornton
!
! !LOCAL VARIABLES:
! local pointers to implicit in scalars
!
#if (defined CNDV)
real(r8), pointer :: nind(:) ! number of individuals (#/m2)
#endif
integer , pointer :: ivt(:) ! pft vegetation type
real(r8), pointer :: woody(:) ! binary flag for woody lifeform (1=woody, 0=not woody)
real(r8), pointer :: resist(:) ! resistance to fire (no units)
integer , pointer :: pcolumn(:) ! pft's column index
real(r8), pointer :: farea_burned(:) ! timestep fractional area burned (proportion)
real(r8), pointer :: m_cwdc_to_fire(:)
real(r8), pointer :: m_deadcrootc_to_cwdc_fire(:)
real(r8), pointer :: m_deadstemc_to_cwdc_fire(:)
real(r8), pointer :: m_litr1c_to_fire(:)
real(r8), pointer :: m_litr2c_to_fire(:)
real(r8), pointer :: m_litr3c_to_fire(:)
real(r8), pointer :: cwdc(:) ! (gC/m2) coarse woody debris C
real(r8), pointer :: litr1c(:) ! (gC/m2) litter labile C
real(r8), pointer :: litr2c(:) ! (gC/m2) litter cellulose C
real(r8), pointer :: litr3c(:) ! (gC/m2) litter lignin C
real(r8), pointer :: m_cwdn_to_fire(:)
real(r8), pointer :: m_deadcrootn_to_cwdn_fire(:)
real(r8), pointer :: m_deadstemn_to_cwdn_fire(:)
real(r8), pointer :: m_litr1n_to_fire(:)
real(r8), pointer :: m_litr2n_to_fire(:)
real(r8), pointer :: m_litr3n_to_fire(:)
real(r8), pointer :: cwdn(:) ! (gN/m2) coarse woody debris N
real(r8), pointer :: litr1n(:) ! (gN/m2) litter labile N
real(r8), pointer :: litr2n(:) ! (gN/m2) litter cellulose N
real(r8), pointer :: litr3n(:) ! (gN/m2) litter lignin N
real(r8), pointer :: m_deadcrootc_storage_to_fire(:)
real(r8), pointer :: m_deadcrootc_to_fire(:)
real(r8), pointer :: m_deadcrootc_to_litter_fire(:)
real(r8), pointer :: m_deadcrootc_xfer_to_fire(:)
real(r8), pointer :: m_deadstemc_storage_to_fire(:)
real(r8), pointer :: m_deadstemc_to_fire(:)
real(r8), pointer :: m_deadstemc_to_litter_fire(:)
real(r8), pointer :: m_deadstemc_to_litter(:)
real(r8), pointer :: m_livestemc_to_litter(:)
real(r8), pointer :: m_deadcrootc_to_litter(:)
real(r8), pointer :: m_livecrootc_to_litter(:)
real(r8), pointer :: m_deadstemc_xfer_to_fire(:)
real(r8), pointer :: m_frootc_storage_to_fire(:)
real(r8), pointer :: m_frootc_to_fire(:)
real(r8), pointer :: m_frootc_xfer_to_fire(:)
real(r8), pointer :: m_gresp_storage_to_fire(:)
real(r8), pointer :: m_gresp_xfer_to_fire(:)
real(r8), pointer :: m_leafc_storage_to_fire(:)
real(r8), pointer :: m_leafc_to_fire(:)
real(r8), pointer :: m_leafc_xfer_to_fire(:)
real(r8), pointer :: m_livecrootc_storage_to_fire(:)
real(r8), pointer :: m_livecrootc_to_fire(:)
real(r8), pointer :: m_livecrootc_xfer_to_fire(:)
real(r8), pointer :: m_livestemc_storage_to_fire(:)
real(r8), pointer :: m_livestemc_to_fire(:)
real(r8), pointer :: m_livestemc_xfer_to_fire(:)
real(r8), pointer :: deadcrootc(:) ! (gC/m2) dead coarse root C
real(r8), pointer :: deadcrootc_storage(:) ! (gC/m2) dead coarse root C storage
real(r8), pointer :: deadcrootc_xfer(:) !(gC/m2) dead coarse root C transfer
real(r8), pointer :: deadstemc(:) ! (gC/m2) dead stem C
real(r8), pointer :: deadstemc_storage(:) ! (gC/m2) dead stem C storage
real(r8), pointer :: deadstemc_xfer(:) ! (gC/m2) dead stem C transfer
real(r8), pointer :: frootc(:) ! (gC/m2) fine root C
real(r8), pointer :: frootc_storage(:) ! (gC/m2) fine root C storage
real(r8), pointer :: frootc_xfer(:) ! (gC/m2) fine root C transfer
real(r8), pointer :: gresp_storage(:) ! (gC/m2) growth respiration storage
real(r8), pointer :: gresp_xfer(:) ! (gC/m2) growth respiration transfer
real(r8), pointer :: leafc(:) ! (gC/m2) leaf C
real(r8), pointer :: leafcmax(:) ! (gC/m2) ann max leaf C
real(r8), pointer :: leafc_storage(:) ! (gC/m2) leaf C storage
real(r8), pointer :: leafc_xfer(:) ! (gC/m2) leaf C transfer
real(r8), pointer :: livecrootc(:) ! (gC/m2) live coarse root C
real(r8), pointer :: livecrootc_storage(:) ! (gC/m2) live coarse root C storage
real(r8), pointer :: livecrootc_xfer(:) !(gC/m2) live coarse root C transfer
real(r8), pointer :: livestemc(:) ! (gC/m2) live stem C
real(r8), pointer :: livestemc_storage(:) ! (gC/m2) live stem C storage
real(r8), pointer :: livestemc_xfer(:) ! (gC/m2) live stem C transfer
real(r8), pointer :: m_deadcrootn_storage_to_fire(:)
real(r8), pointer :: m_deadcrootn_to_fire(:)
real(r8), pointer :: m_deadcrootn_to_litter_fire(:)
real(r8), pointer :: m_deadcrootn_xfer_to_fire(:)
real(r8), pointer :: m_deadstemn_storage_to_fire(:)
real(r8), pointer :: m_deadstemn_to_fire(:)
real(r8), pointer :: m_deadstemn_to_litter_fire(:)
real(r8), pointer :: m_deadstemn_xfer_to_fire(:)
real(r8), pointer :: m_frootn_storage_to_fire(:)
real(r8), pointer :: m_frootn_to_fire(:)
real(r8), pointer :: m_frootn_xfer_to_fire(:)
real(r8), pointer :: m_leafn_storage_to_fire(:)
real(r8), pointer :: m_leafn_to_fire(:)
real(r8), pointer :: m_leafn_xfer_to_fire(:)
real(r8), pointer :: m_livecrootn_storage_to_fire(:)
real(r8), pointer :: m_livecrootn_to_fire(:)
real(r8), pointer :: m_livecrootn_xfer_to_fire(:)
real(r8), pointer :: m_livestemn_storage_to_fire(:)
real(r8), pointer :: m_livestemn_to_fire(:)
real(r8), pointer :: m_livestemn_xfer_to_fire(:)
real(r8), pointer :: m_retransn_to_fire(:)
real(r8), pointer :: deadcrootn(:) ! (gN/m2) dead coarse root N
real(r8), pointer :: deadcrootn_storage(:) ! (gN/m2) dead coarse root N storage
real(r8), pointer :: deadcrootn_xfer(:) ! (gN/m2) dead coarse root N transfer
real(r8), pointer :: deadstemn(:) ! (gN/m2) dead stem N
real(r8), pointer :: deadstemn_storage(:) ! (gN/m2) dead stem N storage
real(r8), pointer :: deadstemn_xfer(:) ! (gN/m2) dead stem N transfer
real(r8), pointer :: frootn(:) ! (gN/m2) fine root N
real(r8), pointer :: frootn_storage(:) ! (gN/m2) fine root N storage
real(r8), pointer :: frootn_xfer(:) ! (gN/m2) fine root N transfer
real(r8), pointer :: leafn(:) ! (gN/m2) leaf N
real(r8), pointer :: leafn_storage(:) ! (gN/m2) leaf N storage
real(r8), pointer :: leafn_xfer(:) ! (gN/m2) leaf N transfer
real(r8), pointer :: livecrootn(:) ! (gN/m2) live coarse root N
real(r8), pointer :: livecrootn_storage(:) ! (gN/m2) live coarse root N storage
real(r8), pointer :: livecrootn_xfer(:) ! (gN/m2) live coarse root N transfer
real(r8), pointer :: livestemn(:) ! (gN/m2) live stem N
real(r8), pointer :: livestemn_storage(:) ! (gN/m2) live stem N storage
real(r8), pointer :: livestemn_xfer(:) ! (gN/m2) live stem N transfer
real(r8), pointer :: retransn(:) ! (gN/m2) plant pool of retranslocated N
!
! !OTHER LOCAL VARIABLES:
!real(r8), parameter:: wcf = 0.2_r8 ! wood combustion fraction
real(r8), parameter:: wcf = 0.4_r8 ! wood combustion fraction
integer :: c,p ! indices
integer :: fp,fc ! filter indices
real(r8):: f ! rate for fire effects (1/s)
real(r8):: dt ! time step variable (s)
!EOP
!-----------------------------------------------------------------------
! assign local pointers
#if (defined CNDV)
nind => clm3%g%l%c%p%pdgvs%nind
#endif
ivt => clm3%g%l%c%p%itype
pcolumn => clm3%g%l%c%p%column
woody => pftcon%woody
resist => pftcon%resist
farea_burned => clm3%g%l%c%cps%farea_burned
m_cwdc_to_fire => clm3%g%l%c%ccf%m_cwdc_to_fire
m_deadcrootc_to_cwdc_fire => clm3%g%l%c%ccf%m_deadcrootc_to_cwdc_fire
m_deadstemc_to_cwdc_fire => clm3%g%l%c%ccf%m_deadstemc_to_cwdc_fire
m_litr1c_to_fire => clm3%g%l%c%ccf%m_litr1c_to_fire
m_litr2c_to_fire => clm3%g%l%c%ccf%m_litr2c_to_fire
m_litr3c_to_fire => clm3%g%l%c%ccf%m_litr3c_to_fire
cwdc => clm3%g%l%c%ccs%cwdc
litr1c => clm3%g%l%c%ccs%litr1c
litr2c => clm3%g%l%c%ccs%litr2c
litr3c => clm3%g%l%c%ccs%litr3c
m_cwdn_to_fire => clm3%g%l%c%cnf%m_cwdn_to_fire
m_deadcrootn_to_cwdn_fire => clm3%g%l%c%cnf%m_deadcrootn_to_cwdn_fire
m_deadstemn_to_cwdn_fire => clm3%g%l%c%cnf%m_deadstemn_to_cwdn_fire
m_litr1n_to_fire => clm3%g%l%c%cnf%m_litr1n_to_fire
m_litr2n_to_fire => clm3%g%l%c%cnf%m_litr2n_to_fire
m_litr3n_to_fire => clm3%g%l%c%cnf%m_litr3n_to_fire
cwdn => clm3%g%l%c%cns%cwdn
litr1n => clm3%g%l%c%cns%litr1n
litr2n => clm3%g%l%c%cns%litr2n
litr3n => clm3%g%l%c%cns%litr3n
m_deadcrootc_storage_to_fire => clm3%g%l%c%p%pcf%m_deadcrootc_storage_to_fire
m_deadcrootc_to_fire => clm3%g%l%c%p%pcf%m_deadcrootc_to_fire
m_deadcrootc_to_litter_fire => clm3%g%l%c%p%pcf%m_deadcrootc_to_litter_fire
m_deadcrootc_xfer_to_fire => clm3%g%l%c%p%pcf%m_deadcrootc_xfer_to_fire
m_deadstemc_storage_to_fire => clm3%g%l%c%p%pcf%m_deadstemc_storage_to_fire
m_deadstemc_to_fire => clm3%g%l%c%p%pcf%m_deadstemc_to_fire
m_deadstemc_to_litter_fire => clm3%g%l%c%p%pcf%m_deadstemc_to_litter_fire
m_deadstemc_to_litter => clm3%g%l%c%p%pcf%m_deadstemc_to_litter
m_livestemc_to_litter => clm3%g%l%c%p%pcf%m_livestemc_to_litter
m_deadcrootc_to_litter => clm3%g%l%c%p%pcf%m_deadcrootc_to_litter
m_livecrootc_to_litter => clm3%g%l%c%p%pcf%m_livecrootc_to_litter
m_deadstemc_xfer_to_fire => clm3%g%l%c%p%pcf%m_deadstemc_xfer_to_fire
m_frootc_storage_to_fire => clm3%g%l%c%p%pcf%m_frootc_storage_to_fire
m_frootc_to_fire => clm3%g%l%c%p%pcf%m_frootc_to_fire
m_frootc_xfer_to_fire => clm3%g%l%c%p%pcf%m_frootc_xfer_to_fire
m_gresp_storage_to_fire => clm3%g%l%c%p%pcf%m_gresp_storage_to_fire
m_gresp_xfer_to_fire => clm3%g%l%c%p%pcf%m_gresp_xfer_to_fire
m_leafc_storage_to_fire => clm3%g%l%c%p%pcf%m_leafc_storage_to_fire
m_leafc_to_fire => clm3%g%l%c%p%pcf%m_leafc_to_fire
m_leafc_xfer_to_fire => clm3%g%l%c%p%pcf%m_leafc_xfer_to_fire
m_livecrootc_storage_to_fire => clm3%g%l%c%p%pcf%m_livecrootc_storage_to_fire
m_livecrootc_to_fire => clm3%g%l%c%p%pcf%m_livecrootc_to_fire
m_livecrootc_xfer_to_fire => clm3%g%l%c%p%pcf%m_livecrootc_xfer_to_fire
m_livestemc_storage_to_fire => clm3%g%l%c%p%pcf%m_livestemc_storage_to_fire
m_livestemc_to_fire => clm3%g%l%c%p%pcf%m_livestemc_to_fire
m_livestemc_xfer_to_fire => clm3%g%l%c%p%pcf%m_livestemc_xfer_to_fire
deadcrootc => clm3%g%l%c%p%pcs%deadcrootc
deadcrootc_storage => clm3%g%l%c%p%pcs%deadcrootc_storage
deadcrootc_xfer => clm3%g%l%c%p%pcs%deadcrootc_xfer
deadstemc => clm3%g%l%c%p%pcs%deadstemc
deadstemc_storage => clm3%g%l%c%p%pcs%deadstemc_storage
deadstemc_xfer => clm3%g%l%c%p%pcs%deadstemc_xfer
frootc => clm3%g%l%c%p%pcs%frootc
frootc_storage => clm3%g%l%c%p%pcs%frootc_storage
frootc_xfer => clm3%g%l%c%p%pcs%frootc_xfer
gresp_storage => clm3%g%l%c%p%pcs%gresp_storage
gresp_xfer => clm3%g%l%c%p%pcs%gresp_xfer
leafc => clm3%g%l%c%p%pcs%leafc
leafcmax => clm3%g%l%c%p%pcs%leafcmax
leafc_storage => clm3%g%l%c%p%pcs%leafc_storage
leafc_xfer => clm3%g%l%c%p%pcs%leafc_xfer
livecrootc => clm3%g%l%c%p%pcs%livecrootc
livecrootc_storage => clm3%g%l%c%p%pcs%livecrootc_storage
livecrootc_xfer => clm3%g%l%c%p%pcs%livecrootc_xfer
livestemc => clm3%g%l%c%p%pcs%livestemc
livestemc_storage => clm3%g%l%c%p%pcs%livestemc_storage
livestemc_xfer => clm3%g%l%c%p%pcs%livestemc_xfer
m_deadcrootn_storage_to_fire => clm3%g%l%c%p%pnf%m_deadcrootn_storage_to_fire
m_deadcrootn_to_fire => clm3%g%l%c%p%pnf%m_deadcrootn_to_fire
m_deadcrootn_to_litter_fire => clm3%g%l%c%p%pnf%m_deadcrootn_to_litter_fire
m_deadcrootn_xfer_to_fire => clm3%g%l%c%p%pnf%m_deadcrootn_xfer_to_fire
m_deadstemn_storage_to_fire => clm3%g%l%c%p%pnf%m_deadstemn_storage_to_fire
m_deadstemn_to_fire => clm3%g%l%c%p%pnf%m_deadstemn_to_fire
m_deadstemn_to_litter_fire => clm3%g%l%c%p%pnf%m_deadstemn_to_litter_fire
m_deadstemn_xfer_to_fire => clm3%g%l%c%p%pnf%m_deadstemn_xfer_to_fire
m_frootn_storage_to_fire => clm3%g%l%c%p%pnf%m_frootn_storage_to_fire
m_frootn_to_fire => clm3%g%l%c%p%pnf%m_frootn_to_fire
m_frootn_xfer_to_fire => clm3%g%l%c%p%pnf%m_frootn_xfer_to_fire
m_leafn_storage_to_fire => clm3%g%l%c%p%pnf%m_leafn_storage_to_fire
m_leafn_to_fire => clm3%g%l%c%p%pnf%m_leafn_to_fire
m_leafn_xfer_to_fire => clm3%g%l%c%p%pnf%m_leafn_xfer_to_fire
m_livecrootn_storage_to_fire => clm3%g%l%c%p%pnf%m_livecrootn_storage_to_fire
m_livecrootn_to_fire => clm3%g%l%c%p%pnf%m_livecrootn_to_fire
m_livecrootn_xfer_to_fire => clm3%g%l%c%p%pnf%m_livecrootn_xfer_to_fire
m_livestemn_storage_to_fire => clm3%g%l%c%p%pnf%m_livestemn_storage_to_fire
m_livestemn_to_fire => clm3%g%l%c%p%pnf%m_livestemn_to_fire
m_livestemn_xfer_to_fire => clm3%g%l%c%p%pnf%m_livestemn_xfer_to_fire
m_retransn_to_fire => clm3%g%l%c%p%pnf%m_retransn_to_fire
deadcrootn => clm3%g%l%c%p%pns%deadcrootn
deadcrootn_storage => clm3%g%l%c%p%pns%deadcrootn_storage
deadcrootn_xfer => clm3%g%l%c%p%pns%deadcrootn_xfer
deadstemn => clm3%g%l%c%p%pns%deadstemn
deadstemn_storage => clm3%g%l%c%p%pns%deadstemn_storage
deadstemn_xfer => clm3%g%l%c%p%pns%deadstemn_xfer
frootn => clm3%g%l%c%p%pns%frootn
frootn_storage => clm3%g%l%c%p%pns%frootn_storage
frootn_xfer => clm3%g%l%c%p%pns%frootn_xfer
leafn => clm3%g%l%c%p%pns%leafn
leafn_storage => clm3%g%l%c%p%pns%leafn_storage
leafn_xfer => clm3%g%l%c%p%pns%leafn_xfer
livecrootn => clm3%g%l%c%p%pns%livecrootn
livecrootn_storage => clm3%g%l%c%p%pns%livecrootn_storage
livecrootn_xfer => clm3%g%l%c%p%pns%livecrootn_xfer
livestemn => clm3%g%l%c%p%pns%livestemn
livestemn_storage => clm3%g%l%c%p%pns%livestemn_storage
livestemn_xfer => clm3%g%l%c%p%pns%livestemn_xfer
retransn => clm3%g%l%c%p%pns%retransn
! Get model step size
dt = real( get_step_size
(), r8 )
! pft loop
do fp = 1,num_soilp
p = filter_soilp(fp)
c = pcolumn(p)
! get the column-level fractional area burned for this timestep
! and convert to a rate per second, then scale by the pft-level
! fire resistance
f = (farea_burned(c) / dt) * (1._r8 - resist(ivt(p)))
! apply this rate to the pft state variables to get flux rates
! NOTE: the deadstem and deadcroot pools are only partly consumed
! by fire, and the remaining affected fraction goes to the column-level
! as litter (coarse woody debris). This is controlled by wcf, the woody
! combustion fraction.
! carbon fluxes
m_leafc_to_fire(p) = leafc(p) * f
m_leafc_storage_to_fire(p) = leafc_storage(p) * f
m_leafc_xfer_to_fire(p) = leafc_xfer(p) * f
m_frootc_to_fire(p) = frootc(p) * f
m_frootc_storage_to_fire(p) = frootc_storage(p) * f
m_frootc_xfer_to_fire(p) = frootc_xfer(p) * f
m_livestemc_to_fire(p) = livestemc(p) * f
m_livestemc_storage_to_fire(p) = livestemc_storage(p) * f
m_livestemc_xfer_to_fire(p) = livestemc_xfer(p) * f
m_deadstemc_to_fire(p) = deadstemc(p) * f*wcf
m_deadstemc_to_litter_fire(p) = deadstemc(p) * f*(1._r8 - wcf)
m_deadstemc_storage_to_fire(p) = deadstemc_storage(p) * f
m_deadstemc_xfer_to_fire(p) = deadstemc_xfer(p) * f
m_livecrootc_to_fire(p) = livecrootc(p) * f
m_livecrootc_storage_to_fire(p) = livecrootc_storage(p) * f
m_livecrootc_xfer_to_fire(p) = livecrootc_xfer(p) * f
m_deadcrootc_to_fire(p) = deadcrootc(p) * f*wcf
m_deadcrootc_to_litter_fire(p) = deadcrootc(p) * f*(1._r8 - wcf)
m_deadcrootc_storage_to_fire(p) = deadcrootc_storage(p) * f
m_deadcrootc_xfer_to_fire(p) = deadcrootc_xfer(p) * f
m_gresp_storage_to_fire(p) = gresp_storage(p) * f
m_gresp_xfer_to_fire(p) = gresp_xfer(p) * f
! nitrogen fluxes
m_leafn_to_fire(p) = leafn(p) * f
m_leafn_storage_to_fire(p) = leafn_storage(p) * f
m_leafn_xfer_to_fire(p) = leafn_xfer(p) * f
m_frootn_to_fire(p) = frootn(p) * f
m_frootn_storage_to_fire(p) = frootn_storage(p) * f
m_frootn_xfer_to_fire(p) = frootn_xfer(p) * f
m_livestemn_to_fire(p) = livestemn(p) * f
m_livestemn_storage_to_fire(p) = livestemn_storage(p) * f
m_livestemn_xfer_to_fire(p) = livestemn_xfer(p) * f
m_deadstemn_to_fire(p) = deadstemn(p) * f*wcf
m_deadstemn_to_litter_fire(p) = deadstemn(p) * f*(1._r8 - wcf)
m_deadstemn_storage_to_fire(p) = deadstemn_storage(p) * f
m_deadstemn_xfer_to_fire(p) = deadstemn_xfer(p) * f
m_livecrootn_to_fire(p) = livecrootn(p) * f
m_livecrootn_storage_to_fire(p) = livecrootn_storage(p) * f
m_livecrootn_xfer_to_fire(p) = livecrootn_xfer(p) * f
m_deadcrootn_to_fire(p) = deadcrootn(p) * f*wcf
m_deadcrootn_to_litter_fire(p) = deadcrootn(p) * f*(1._r8 - wcf)
m_deadcrootn_storage_to_fire(p) = deadcrootn_storage(p) * f
m_deadcrootn_xfer_to_fire(p) = deadcrootn_xfer(p) * f
m_retransn_to_fire(p) = retransn(p) * f
#if (defined CNDV)
! Carbon per individual (c) remains constant in gap mortality & fire
! but individuals are removed from the population P (#/m2 naturally
! vegetated area), so
!
! c = Cnew*FPC/Pnew = Cold*FPC/Pold
!
! where C = carbon/m2 pft area & FPC = pft area/naturally vegetated area.
! FPC does not change from mortality or fire. FPC changes from Light and
! Establishment at the end of the year. So...
!
! Pnew = Pold * Cnew / Cold
!
! where "new" refers to after mortality & fire, while "old" refers to
! before mortality & fire. For C I use total wood. (slevis)
!
! nind calculation placed here for convenience; nind could be updated
! once per year instead if we saved Cold for that calculation;
! as is, nind slowly decreases through the year, while fpcgrid remains
! unchanged; this affects the htop calculation in CNVegStructUpdate
if (woody(ivt(p)) == 1._r8) then
if (livestemc(p)+deadstemc(p)+m_livestemc_to_litter(p)*dt+ &
m_deadstemc_to_litter(p)*dt > 0._r8) then
nind(p) = nind(p) * (livestemc(p) + deadstemc(p) + &
livecrootc(p) + deadcrootc(p) - dt * &
(m_livestemc_to_fire(p) + &
m_livecrootc_to_fire(p) + &
m_deadstemc_to_fire(p) + &
m_deadcrootc_to_fire(p) + &
m_deadcrootc_to_litter_fire(p) + &
m_deadstemc_to_litter_fire(p))) / &
(livestemc(p) + deadstemc(p) + &
livecrootc(p) + deadcrootc(p) + dt * &
(m_livestemc_to_litter(p) + &
m_livecrootc_to_litter(p) + &
m_deadcrootc_to_litter(p) + &
m_deadstemc_to_litter(p)))
else
nind(p) = 0._r8
end if
end if
! annual dgvm calculations use lm_ind = leafcmax * fpcgrid / nind
! leafcmax is reset to 0 once per yr
! could calculate leafcmax in CSummary instead; if so, should remove
! subtraction of m_leafc_to_fire(p)*dt from the calculation (slevis)
leafcmax(p) = max(leafc(p)-m_leafc_to_fire(p)*dt, leafcmax(p))
if (ivt(p) == 0) leafcmax(p) = 0._r8
#endif
end do ! end of pfts loop
! send the fire affected but uncombusted woody fraction to the column-level cwd fluxes
! use p2c for weighted averaging from pft to column
call p2c
(num_soilc, filter_soilc, m_deadstemc_to_litter_fire, m_deadstemc_to_cwdc_fire)
call p2c
(num_soilc, filter_soilc, m_deadcrootc_to_litter_fire, m_deadcrootc_to_cwdc_fire)
call p2c
(num_soilc, filter_soilc, m_deadstemn_to_litter_fire, m_deadstemn_to_cwdn_fire)
call p2c
(num_soilc, filter_soilc, m_deadcrootn_to_litter_fire, m_deadcrootn_to_cwdn_fire)
! column loop
do fc = 1,num_soilc
c = filter_soilc(fc)
! get the column-level fractional area burned for this timestep
! and convert to a rate per second, then scale by the pft-level
! fire resistance
f = farea_burned(c) / dt
! apply this rate to the column state variables to get flux rates
! NOTE: the coarse woody debris pools are only partly consumed
! by fire. This is controlled by wcf, the woody
! combustion fraction. For now using the same fraction for standing
! wood (deadstem and deadcroot pools) and woody litter (cwd pools).
! May be a good idea later to modify this to use different fractions
! for different woody pools, or make the combustion fraction a dynamic
! variable.
! carbon fluxes
m_litr1c_to_fire(c) = litr1c(c) * f
m_litr2c_to_fire(c) = litr2c(c) * f
m_litr3c_to_fire(c) = litr3c(c) * f
m_cwdc_to_fire(c) = cwdc(c) * f*wcf
! nitrogen fluxes
m_litr1n_to_fire(c) = litr1n(c) * f
m_litr2n_to_fire(c) = litr2n(c) * f
m_litr3n_to_fire(c) = litr3n(c) * f
m_cwdn_to_fire(c) = cwdn(c) * f*wcf
end do ! end of column loop
end subroutine CNFireFluxes
!-----------------------------------------------------------------------
#endif
end module CNFireMod