@@ -108,6 +108,7 @@ module AllocationMod
108108 real (r8 ) :: dayscrecover ! number of days to recover negative cpool
109109 real (r8 ), allocatable :: arepr(:) ! reproduction allocation coefficient
110110 real (r8 ), allocatable :: aroot(:) ! root allocation coefficient
111+ real (r8 ), allocatable :: aerial(:) ! aboveground allocation coefficient
111112
112113 ! $acc declare create(bdnr )
113114 ! $acc declare create(dayscrecover )
@@ -247,6 +248,7 @@ subroutine AllocationInit ( bounds, elm_fates)
247248 if ( crop_prog )then
248249 allocate (arepr(bounds% begp:bounds% endp)); arepr(bounds% begp : bounds% endp) = nan
249250 allocate (aroot(bounds% begp:bounds% endp)); aroot(bounds% begp : bounds% endp) = nan
251+ allocate (aerial(bounds% begp:bounds% endp)); aerial(bounds% begp : bounds% endp) = nan
250252 end if
251253
252254 ! Allocate scratch space for ECA and FATES/ECA
@@ -476,7 +478,7 @@ subroutine TotalNPDemand(num_soilp,filter_soilp, photosyns_vars, &
476478 canopystate_vars , crop_vars , cnstate_vars , dt )
477479 ! ! Assess the total plant N demand and P demand
478480 use pftvarcon , only: npcropmin, declfact, bfact, aleaff, arootf, astemf, noveg
479- use pftvarcon , only: iscft, percrop, nwcereal, nwcerealirrig
481+ use pftvarcon , only: iscft, percrop, nwcereal, nwcerealirrig, nsugarcane, nsugarcaneirrig
480482 use pftvarcon , only: arooti, fleafi, allconsl, allconss, grperc, grpnow, nsoybean
481483 use elm_varpar , only: nlevdecomp
482484 use elm_varcon , only: nitrif_n2o_loss_frac, secspday
@@ -504,7 +506,21 @@ subroutine TotalNPDemand(num_soilp,filter_soilp, photosyns_vars, &
504506 integer , parameter :: cphase_gf = 3 ! Crop phenology phase grain fill
505507 integer , parameter :: max_lai = 1 ! Maximum allowed lai
506508 integer :: ivt, fp, p
507- !- ----------------------------------------------------------------------
509+
510+ ! LOCAL VARAIBLES for sugarcane allocation based on Colmanetti et al., 2024 10.1016/j.eja.2023.127061
511+ real (r8 ), parameter :: rootd = 0.3_r8 ! root decline parameter
512+ real (r8 ), parameter :: sf1 = 0.02_r8 ! parameters for linear carbon allocation to the stalk
513+ real (r8 ), parameter :: ipf1 = 1.0_r8 ! parameters for linear carbon allocation to the stalk
514+ real (r8 ), parameter :: ecf2 = 0.065_r8 ! parameters for logarithmic carbon allocation to the stalk
515+ real (r8 ), parameter :: ipf2 = 10.0_r8 ! parameters for logarithmic carbon allocation to the stalk
516+ real (r8 ), parameter :: sf3 = 0.006_r8 ! parameters for linear carbon allocation to the stalk-sucrose
517+ real (r8 ), parameter :: ipf3 = 5.0_r8 ! parameters for linear carbon allocation to the stalk-sucrose
518+ real (r8 ), parameter :: ecf4 = 0.017_r8 ! parameters for logarithmic carbon allocation to the stalk-sucrose
519+ real (r8 ), parameter :: ipf4 = 10.0_r8 ! parameters for logarithmic carbon allocation to the stalk-sucrose
520+ real (r8 ) :: rmat, af1, af2, af3, af4, sipf3, sipf4
521+
522+ !- ----------------------------------------------------------------------
523+
508524 associate( &
509525 woody = > veg_vp% woody , & ! Input: [real(r8) (:) ] woody lifeform flag (0 = non-woody, 1 = tree, 2 = shrub)
510526 froot_leaf = > veg_vp% froot_leaf , & ! Input: [real(r8) (:) ] allocation parameter: new fine root C per new leaf C (gC/gC)
@@ -548,6 +564,8 @@ subroutine TotalNPDemand(num_soilp,filter_soilp, photosyns_vars, &
548564 huileaf = > cnstate_vars% huileaf_patch , & ! Input: [real(r8) (:) ] heat unit index needed from planting to leaf emergence
549565 huigrain = > cnstate_vars% huigrain_patch , & ! Input: [real(r8) (:) ] same to reach vegetative maturity
550566 croplive = > crop_vars% croplive_patch , & ! Input: [logical (:) ] flag, true if planted, not harvested
567+ nyrs_crop_active = > crop_vars% nyrs_crop_active_patch , & ! Input: [integer (:) ] number of years this crop patch has been active
568+ onset_gdd = > cnstate_vars% onset_gdd_patch , & ! Output: [real(r8) (:) ] onset growing degree days
551569 peaklai = > cnstate_vars% peaklai_patch , & ! Input: [integer (:) ] 1: max allowed lai; 0: not at max
552570 ! lgsf => cnstate_vars%lgsf_patch , & ! Input: [real(r8) (:) ] long growing season factor [0-1]
553571 aleafi = > cnstate_vars% aleafi_patch , & ! Output: [real(r8) (:) ] saved allocation coefficient from phase 2
@@ -879,15 +897,60 @@ subroutine TotalNPDemand(num_soilp,filter_soilp, photosyns_vars, &
879897 g1 = 0.25_r8
880898
881899 else if (croplive(p) .and. percrop(ivt) == 1.0_r8 ) then
882- arepr(p) = 0._r8
883- aroot(p) = max (0._r8 , min (1._r8 , arooti(ivt) - &
884- (arooti(ivt) - arootf(ivt)) * &
885- min (1._r8 , hui(p)/ gddmaturity(p))))
886- fleaf = fleafi(ivt) * (exp (- bfact(ivt)) - &
887- exp (- bfact(ivt)* hui(p)/ gddmaturity(p))) / & ! replacing huigrain with gddmaturity since huigrain does not exist for perennial crops
888- (exp (- bfact(ivt))- 1 ) ! fraction alloc to leaf (from J Norman alloc curve)
889- aleaf(p) = max (1.e-5_r8 , (1._r8 - aroot(p)) * fleaf)
890- astem(p) = 1._r8 - arepr(p) - aleaf(p) - aroot(p)
900+ if (ivt== nsugarcane .or. ivt== nsugarcaneirrig) then
901+
902+ rmat = 100.0_r8 * (onset_gdd(p)/ gddmaturity(p))
903+
904+ ! Aerial(p) ranges from 0 to 1 and is the allocation
905+ ! coefficient for aboveground carbon components, including
906+ ! stems and leaves
907+
908+ ! Aboveground sugarcane plant growth decreases by 0.6 in the
909+ ! year when sugarcane is planted and by 1 in the following years
910+ if (nyrs_crop_active(p) == 0 ) then ! Year 1
911+ aerial(p) = (1.0_r8 - arootf(ivt)) * min (1.0_r8 , (1 - exp (- (rootd * 0.6 * rmat))))
912+ else
913+ aerial(p) = (1.0_r8 - arootf(ivt)) * min (1.0_r8 , (1 - exp (- (rootd * rmat))))
914+ end if
915+
916+ aroot(p) = 1.0_r8 - aerial(p)
917+
918+ ! Carbon allocation to stems is nearly linear at the start of
919+ ! the sugarcane growth cycle and then follows a logarithmic
920+ ! pattern until the cycle's end
921+ ! af1 - fraction of the aboveground carbon initially allocated to the stem
922+ ! af2 - fraction of the aboveground carbon allocated to the
923+ ! stem over most of the plant's lifespan
924+ af1 = max (0._r8 , (rmat * sf1) - (ipf1 * sf1))
925+ af2 = max (0._r8 , (1.0_r8 - exp (- ((rmat * ecf2) - (ipf2 * ecf2)))) )
926+
927+ ! Allocation coeff for aboveground carbon is split between stem and leaves
928+ astem(p) = min ( (1.0_r8 - aleaff(ivt) - arootf(ivt)), (aerial(p) * max (af1, af2)) )
929+ aleaf(p) = max (1.e-5_r8 , (aerial(p) - astem(p)))
930+
931+
932+ sipf3 = ipf1 + (100.0_r8 - ipf1) * (ipf3 / 100.0_r8 )
933+ sipf4 = ipf2 + (100.0_r8 - ipf2) * (ipf4 / 100.0_r8 )
934+
935+ af3 = max (0._r8 , (rmat * sf3) - (sipf3 * sf3))
936+ af4 = max (0._r8 , (1.0_r8 - exp (- ((rmat * ecf4) - (sipf4 * ecf4)))) )
937+
938+ ! Carbon allocated to the stem is then divided between
939+ ! stem sucrose or reporductive part and stem structural components
940+ arepr(p) = astem(p) * max (0._r8 , af3, af4)
941+ astem(p) = astem(p) - arepr(p)
942+
943+ else ! if perennial but not sugarcane
944+ arepr(p) = 0._r8
945+ aroot(p) = max (0._r8 , min (1._r8 , arooti(ivt) - &
946+ (arooti(ivt) - arootf(ivt)) * &
947+ min (1._r8 , hui(p)/ gddmaturity(p))))
948+ fleaf = fleafi(ivt) * (exp (- bfact(ivt)) - &
949+ exp (- bfact(ivt)* hui(p)/ gddmaturity(p))) / & ! replacing huigrain with gddmaturity since huigrain does not exist for perennial crops
950+ (exp (- bfact(ivt))- 1 ) ! fraction alloc to leaf (from J Norman alloc curve)
951+ aleaf(p) = max (1.e-5_r8 , (1._r8 - aroot(p)) * fleaf)
952+ astem(p) = 1._r8 - arepr(p) - aleaf(p) - aroot(p)
953+ end if
891954
892955 f1 = aroot(p) / aleaf(p)
893956 f3 = astem(p) / aleaf(p)
0 commit comments