INTERFACE:
subroutine CNSeasonDecidPhenology (num_soilp, filter_soilp)DESCRIPTION:
For coupled carbon-nitrogen code (CN). This routine handles the seasonal deciduous phenology code (temperate deciduous vegetation that has only one growing season per year).
USES:
use shr_const_mod , only: SHR_CONST_TKFRZ, SHR_CONST_PI
use clm_varcon , only: secspday
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/6/03: Created by Peter Thornton 10/24/03, Peter Thornton: migrated to vector data structuresLOCAL 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 :: t_soisno(:,:) ! soil temperature (Kelvin) (-nlevsno+1:nlevgrnd)
real(r8), pointer :: soilpsi(:,:) ! soil water potential in each soil layer (MPa)
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
! ecophysiological constants
real(r8), pointer :: season_decid(:) ! binary flag for seasonal-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_gdd(:) ! onset growing degree days
real(r8), pointer :: offset_flag(:) ! offset flag
real(r8), pointer :: offset_counter(:) ! offset counter (seconds)
real(r8), pointer :: dayl(:) ! daylength (seconds)
real(r8), pointer :: prev_dayl(:) ! daylength from previous albedo timestep (seconds)
real(r8), pointer :: annavg_t2m(:) ! annual average 2m air temperature (K)
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 :: 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 :: 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(:)
#if (defined CNDV)
logical , pointer :: pftmayexist(:) ! exclude seasonal decid pfts from tropics
#endif
local pointers to implicit out scalars
!OTHER LOCAL VARIABLES:
integer :: c,p !indices
integer :: fp !lake filter pft index
real(r8):: ws_flag !winter-summer solstice flag (0 or 1)
real(r8):: crit_onset_gdd !critical onset growing degree-day sum
real(r8):: soilt
real(r8):: lat !latitude (radians)
real(r8):: temp !temporary variable for daylength calculation