INTERFACE:
subroutine CNStressDecidPhenology (num_soilp, filter_soilp)DESCRIPTION:
This routine handles phenology for vegetation types, such as grasses and tropical drought deciduous trees, that respond to cold and drought stress signals and that can have multiple growing seasons in a given year. This routine allows for the possibility that leaves might persist year-round in the absence of a suitable stress trigger, by switching to an essentially evergreen habit, but maintaining a deciduous leaf longevity, while waiting for the next stress trigger. This is in contrast to the seasonal deciduous algorithm (for temperate deciduous trees) that forces a single growing season per year.
USES:
use clm_time_manager, only: get_days_per_year
use clm_varcon , only: secspday
use shr_const_mod , only: SHR_CONST_TKFRZ, SHR_CONST_PI
ARGUMENTS:
integer, intent(in) :: num_soilp ! number of soil pfts in filter
integer, intent(in) :: filter_soilp(:) ! filter for soil pfts
CALLED FROM:
subroutine CNPhenologyREVISION HISTORY:
10/27/03: Created by Peter Thornton
01/29/04: Made onset_gdd critical sum a function of temperature, as in
seasonal deciduous algorithm.
LOCAL VARIABLES:
local pointers to implicit in scalars
integer , pointer :: ivt(:) ! pft vegetation type
integer , pointer :: pcolumn(:) ! pft's column index
integer , pointer :: pgridcell(:) ! pft's gridcell index
real(r8), pointer :: latdeg(:) ! latitude (radians)
real(r8), pointer :: decl(:) ! solar declination (radians)
real(r8), pointer :: leafc_storage(:) ! (gC/m2) leaf C storage
real(r8), pointer :: frootc_storage(:) ! (gC/m2) fine root C storage
real(r8), pointer :: livestemc_storage(:) ! (gC/m2) live stem C storage
real(r8), pointer :: deadstemc_storage(:) ! (gC/m2) dead stem C storage
real(r8), pointer :: livecrootc_storage(:) ! (gC/m2) live coarse root C storage
real(r8), pointer :: deadcrootc_storage(:) ! (gC/m2) dead coarse root C storage
real(r8), pointer :: gresp_storage(:) ! (gC/m2) growth respiration storage
real(r8), pointer :: leafn_storage(:) ! (gN/m2) leaf N storage
real(r8), pointer :: frootn_storage(:) ! (gN/m2) fine root N storage
real(r8), pointer :: livestemn_storage(:) ! (gN/m2) live stem N storage
real(r8), pointer :: deadstemn_storage(:) ! (gN/m2) dead stem N storage
real(r8), pointer :: livecrootn_storage(:) ! (gN/m2) live coarse root N storage
real(r8), pointer :: deadcrootn_storage(:) ! (gN/m2) dead coarse root N storage
real(r8), pointer :: t_soisno(:,:) ! soil temperature (Kelvin) (-nlevsno+1:nlevgrnd)
real(r8), pointer :: soilpsi(:,:) ! soil water potential in each soil layer (MPa)
real(r8), pointer :: leaf_long(:) ! leaf longevity (yrs)
real(r8), pointer :: stress_decid(:) ! binary flag for stress-deciduous leaf habit (0 or 1)
real(r8), pointer :: woody(:) ! binary flag for woody lifeform (1=woody, 0=not woody)
local pointers to implicit in/out scalars
real(r8), pointer :: dormant_flag(:) ! dormancy flag
real(r8), pointer :: days_active(:) ! number of days since last dormancy
real(r8), pointer :: onset_flag(:) ! onset flag
real(r8), pointer :: onset_counter(:) ! onset counter (seconds)
real(r8), pointer :: onset_gddflag(:) ! onset freeze flag
real(r8), pointer :: onset_fdd(:) ! onset freezing degree days counter
real(r8), pointer :: onset_gdd(:) ! onset growing degree days
real(r8), pointer :: onset_swi(:) ! onset soil water index
real(r8), pointer :: offset_flag(:) ! offset flag
real(r8), pointer :: offset_counter(:) ! offset counter (seconds)
real(r8), pointer :: dayl(:) ! daylength (seconds)
real(r8), pointer :: offset_fdd(:) ! offset freezing degree days counter
real(r8), pointer :: offset_swi(:) ! offset soil water index
real(r8), pointer :: annavg_t2m(:) ! annual average 2m air temperature (K)
real(r8), pointer :: lgsf(:) ! long growing season factor [0-1]
real(r8), pointer :: bglfr(:) ! background litterfall rate (1/s)
real(r8), pointer :: bgtr(:) ! background transfer growth rate (1/s)
real(r8), pointer :: prev_leafc_to_litter(:) ! previous timestep leaf C litterfall flux (gC/m2/s)
real(r8), pointer :: prev_frootc_to_litter(:) ! previous timestep froot C litterfall flux (gC/m2/s)
real(r8), pointer :: leafc_xfer_to_leafc(:)
real(r8), pointer :: frootc_xfer_to_frootc(:)
real(r8), pointer :: livestemc_xfer_to_livestemc(:)
real(r8), pointer :: deadstemc_xfer_to_deadstemc(:)
real(r8), pointer :: livecrootc_xfer_to_livecrootc(:)
real(r8), pointer :: deadcrootc_xfer_to_deadcrootc(:)
real(r8), pointer :: leafn_xfer_to_leafn(:)
real(r8), pointer :: frootn_xfer_to_frootn(:)
real(r8), pointer :: livestemn_xfer_to_livestemn(:)
real(r8), pointer :: deadstemn_xfer_to_deadstemn(:)
real(r8), pointer :: livecrootn_xfer_to_livecrootn(:)
real(r8), pointer :: deadcrootn_xfer_to_deadcrootn(:)
real(r8), pointer :: leafc_xfer(:) ! (gC/m2) leaf C transfer
real(r8), pointer :: frootc_xfer(:) ! (gC/m2) fine root C transfer
real(r8), pointer :: livestemc_xfer(:) ! (gC/m2) live stem C transfer
real(r8), pointer :: deadstemc_xfer(:) ! (gC/m2) dead stem C transfer
real(r8), pointer :: livecrootc_xfer(:) ! (gC/m2) live coarse root C transfer
real(r8), pointer :: deadcrootc_xfer(:) ! (gC/m2) dead coarse root C transfer
real(r8), pointer :: leafn_xfer(:) ! (gN/m2) leaf N transfer
real(r8), pointer :: frootn_xfer(:) ! (gN/m2) fine root N transfer
real(r8), pointer :: livestemn_xfer(:) ! (gN/m2) live stem N transfer
real(r8), pointer :: deadstemn_xfer(:) ! (gN/m2) dead stem N transfer
real(r8), pointer :: livecrootn_xfer(:) ! (gN/m2) live coarse root N transfer
real(r8), pointer :: deadcrootn_xfer(:) ! (gN/m2) dead coarse root N transfer
real(r8), pointer :: leafc_storage_to_xfer(:)
real(r8), pointer :: frootc_storage_to_xfer(:)
real(r8), pointer :: livestemc_storage_to_xfer(:)
real(r8), pointer :: deadstemc_storage_to_xfer(:)
real(r8), pointer :: livecrootc_storage_to_xfer(:)
real(r8), pointer :: deadcrootc_storage_to_xfer(:)
real(r8), pointer :: gresp_storage_to_xfer(:)
real(r8), pointer :: leafn_storage_to_xfer(:)
real(r8), pointer :: frootn_storage_to_xfer(:)
real(r8), pointer :: livestemn_storage_to_xfer(:)
real(r8), pointer :: deadstemn_storage_to_xfer(:)
real(r8), pointer :: livecrootn_storage_to_xfer(:)
real(r8), pointer :: deadcrootn_storage_to_xfer(:)
local pointers to implicit out scalars
!OTHER LOCAL VARIABLES:
real(r8),parameter :: secspqtrday = secspday / 4 ! seconds per quarter day
integer :: c,p ! indices
integer :: fp ! lake filter pft index
real(r8):: dayspyr ! days per year
real(r8):: crit_onset_gdd ! degree days for onset trigger
real(r8):: soilt ! temperature of top soil layer
real(r8):: psi ! water stress of top soil layer
real(r8):: lat !latitude (radians)
real(r8):: temp !temporary variable for daylength calculation