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_PIARGUMENTS:
integer, intent(in) :: num_soilp ! number of soil pfts in filter integer, intent(in) :: filter_soilp(:) ! filter for soil pftsCALLED 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