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 DGVMModREVISION 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