next up previous contents index
Next: Module DGVMEcosystemDynMod (File: DGVMEcosystemDynMod.F90) Up: Module DGVMAllocationMod (File: DGVMAllocationMod.F90) Previous: Module DGVMAllocationMod (File: DGVMAllocationMod.F90)   Contents   Index


Allocation


INTERFACE:

   subroutine Allocation (lbp, ubp, num_natvegp, filter_natvegp)
DESCRIPTION:

   Performs yearly allocation calculation
   Allocation of this year's biomass increment (bm_inc_ind) to the
   three living carbon pools, such that the basic allometric
   relationships (A-C below) are always satisfied.
   -------------------------------------------------------------------
   TREE ALLOCATION
   (A) (leaf area) = latosa * (sapwood xs area)
         (Pipe Model, Shinozaki et al. 1964a,b; Waring et al 1982)
   (B) (leaf mass) = lmtorm * (root mass)
   (C) height = allom2 * (stem diameter)**allom3 (source?)
   (D) (crown area) = min (allom1 * (stem diameter)**reinickerp, crownarea_max
   Mathematical derivation:
     (1) bm_inc_ind = lminc_ind + sminc_ind + rminc_ind
     (2) leaf_area_new = latosa * sap_xsa_new   [from (A)]
     (3) leaf_area_new = (lm_ind + lminc_ind) * sla
   from (2) & (3),
     (4) (lm_ind + lminc_ind) * sla = latosa * sap_xsa_new
   from (4),
     (5) sap_xsa_new = (lm_ind + lminc_ind) * sla / latosa
     (6) (lm_ind + lminc_ind) = lmtorm * (rm_ind + rminc_ind) [from (B)]
     (7) height_new = allom2 * stemdiam_new**allom3  [from (C)]
   from (1),
     (8) sminc_ind = bm_inc_ind - lminc_ind - rminc_ind
   from (6),
     (9) rminc_ind=((lm_ind + lminc_ind) / lmtorm) - rm_ind
   from (8) & (9),
    (10) sminc_ind = bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind)  / lmtorm) + rm_ind
    (11) wooddens = (sm_ind + sminc_ind + hm_ind) / stemvolume_new
    (12) stemvolume_new = height_new * pi * stemdiam_new**2 / 4
   from (10), (11) & (12)
    (13) stemdiam_new = [ ((sm_ind + bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind) / lmtorm) + rm_ind + hm_ind)
           / wooddens) / (height_new * pi / 4) ]**(1/2)
   combining (7) and (13),
    (14) height_new = allom2 * [ ((sm_ind + bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind) / lmtorm) + rm_ind + hm_ind)
           / wooddens) / (height_new * pi / 4) ]**(1/2 * allom3)
   from (14),
    (15) height_new**(1 + 2 / allom3) = allom2**(2 / allom3)
           * ((sm_ind + bm_inc_ind - lminc_ind - ((lm_ind + lminc_ind)
           / lmtorm) + rm_ind + hm_ind) / wooddens) / (pi / 4)
    (16) wooddens = (sm_ind + sminc_ind) / sapvolume_new
   from (10) and (16),
    (17) wooddens = (sm_ind + bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind) / lmtorm) + rm_ind) / sapvolume_new
    (18) sapvolume_new = height_new * sap_xsa_new
   from (17) and (18),
    (19) sap_xsa_new = (sm_ind + bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind) / lmtorm) + rm_ind)
           / (height_new * wooddens)
   from (19),
    (20) height_new = (sm_ind + bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind) / lmtorm) + rm_ind )
           / (sap_xsa_new * wooddens)
   from (5) and (20),
    (21) height_new**(1 + 2 / allom3) = [ (sm_ind + bm_inc_ind
           - lminc_ind - ((lm_ind + lminc_ind) / lmtorm) + rm_ind )
           / ((lm_ind + lminc_ind) * sla * wooddens / latosa) ]
           **(1 + 2 / allom3)
   -------------------------------------------------------------------
    (15) and (21) are two alternative expressions for
         height_new**(1 + 2 / allom3). Combining these,
 
    (22) allom2**(2 / allom3) * ((sm_ind + bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind) / lmtorm) + rm_ind + hm_ind)
           / wooddens) / (pi / 4) - [ (sm_ind + bm_inc_ind - lminc_ind
           - ((lm_ind + lminc_ind) / lmtorm) + rm_ind )
           / ((lm_ind + lminc_ind) * sla * wooddens / latosa) ]
           **(1 + 2 / allom3)
           = 0
   Equation (22) can be expressed in the form f(lminc_ind)=0.
   Numerical methods are used to solve the equation for the
   unknown lminc_ind.
   -------------------------------------------------------------------
   Work out minimum leaf production to maintain current sapmass
    (23) sap_xsa = sm_ind / wooddens / height
   from (A) and (23),
    (24) leaf_mass * sla = latosa * sap_mass / wooddens / height
   from (24),
    (25) leaf_mass = latosa * sap_mass / (wooddens * height * sla)
   from (25), assuming sminc_ind=0,
    (26) lm_ind + lminc_ind_min = latosa * sm_ind
           / (wooddens * height * sla)
   from (26),
    (27) lminc_ind_min = latosa * sm_ind / (wooddens * height * sla)
           - lm_ind
   Work out minimum root production to support this leaf mass
   (i.e. lm_ind + lminc_ind_min)
   May be negative following a reduction in soil water limitation
   (increase in lmtorm) relative to last year.
 
   from (B) and (25),
    (28) root_mass = latosa * sap_mass / (wooddens * height * sla)
           / lmtorm
   from (28), assuming sminc_ind=0,
    (29) rm_ind + rminc_ind_min = latosa * sm_ind
           / (wooddens * height * sla * lmtorm)
   from (29),
    (30) rminc_ind_min = latosa * sm_ind
           / (wooddens * height * sla * lmtorm) - rm_ind
   -------------------------------------------------------------------
   Attempt to distribute this year's production among leaves and roots only
    (31) bm_inc_ind = lminc_ind + rminc_ind
   from (31) and (9),
    (32) bm_inc_ind = lminc_ind + ((lm_ind + lminc_ind) / lmtorm)
           - rm_ind
   from (32)
    (33) lminc_ind = (bm_inc_ind - lm_ind / lmtorm + rm_ind) /
           (1 + 1 / lmtorm)
   -------------------------------------------------------------------
   from (25),
    (34) lm_ind + lminc_ind = latosa * (sm_ind + sminc_ind)
           / (wooddens * height * sla)
   from (34),
    (35) sminc_ind = (lm_ind + lminc_ind) * wooddens * height * sla
           / latosa - sm_ind
   -------------------------------------------------------------------
USES:
     use clmtype
     use shr_const_mod, ONLY: SHR_CONST_PI
ARGUMENTS:
     implicit none
     integer, intent(in) :: lbp, ubp                  ! pft bounds
     integer, intent(in) :: num_natvegp               ! number of naturally-ve
     integer, intent(in) :: filter_natvegp(ubp-lbp+1) ! pft filter for natural
CALLED FROM:
   subroutine lpj in module DGVMMod
REVISION HISTORY:
   Author: Sam Levis (adapted from Stephen Sitch's LPJ subr. allocation)
LOCAL VARIABLES:
   local pointers to implicit in arguments
     integer , pointer :: ivt(:)             ! pft vegetation type
     real(r8), pointer :: sla(:)             ! ecophys const - specific leaf a
     logical , pointer :: tree(:)            ! ecophys const - whether this pf
     real(r8), pointer :: allom1(:)          ! ecophys const - parameter in al
     real(r8), pointer :: allom2(:)          ! ecophys const - parameter in al
     real(r8), pointer :: allom3(:)          ! ecophys const - parameter in al
     real(r8), pointer :: latosa(:)          ! ecophys const - ratio of leaf a
     real(r8), pointer :: wooddens(:)        ! ecophys const - wood density (g
     real(r8), pointer :: reinickerp(:)      ! ecophys const - parameter in al
     real(r8), pointer :: crownarea_max(:)   ! ecophys const - tree maximum cr
     real(r8), pointer :: init_lmtorm(:)     ! ecophys const - leaf:root ratio
     real(r8), pointer :: bm_inc(:)          ! biomass increment
     real(r8), pointer :: nind(:)            ! number of individuals (#/m**2)
     real(r8), pointer :: annpsn(:)          ! annual photosynthesis (umol CO2
     real(r8), pointer :: annpsnpot(:)       ! annual potential photosynthesis
   local pointers to implicit inout arguments
     real(r8), pointer :: fpc_grid(:)         ! foliar projective cover on gri
     real(r8), pointer :: crownarea(:)        ! area that each individual tree
     real(r8), pointer :: height(:)           ! canopy top (m)
     real(r8), pointer :: lm_ind(:)           ! individual leaf mass
     real(r8), pointer :: sm_ind(:)           ! individual sapwood mass
     real(r8), pointer :: hm_ind(:)           ! individual heartwood mass
     real(r8), pointer :: rm_ind(:)           ! individual root mass
     real(r8), pointer :: litter_ag(:)        ! above ground litter
     real(r8), pointer :: litter_bg(:)        ! below ground litter
   local pointers to implicit out arguments
     real(r8), pointer :: lai_ind(:)          ! LAI per individual
     real(r8), pointer :: fpc_inc(:)          ! foliar projective cover increm



Mariana Vertenstein 2004-06-21