Skip to content

Commit

Permalink
Add rhizomes to all plants including graminoids
Browse files Browse the repository at this point in the history
  • Loading branch information
bsulman authored and fmyuan committed Jul 30, 2024
1 parent 1503cd6 commit 358d5b0
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 117 deletions.
19 changes: 17 additions & 2 deletions components/elm/src/biogeochem/AllocationMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -844,9 +844,12 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
(f3*(1._r8-f4)*(1._r8+f2))/cpdw

else
c_allometry(p) = 1._r8+g1+f1+f1*g1
c_allometry(p) = (1._r8+g1)*(1._r8+f1+f3) ! B Sulman: Let graminoids allocate rhizomes (all livecroot) using stem_leaf parameter
n_allometry(p) = 1._r8/cnl + f1/cnfr
if(cnlw>0) n_allometry(p) = n_allometry(p) + f3/cnlw ! Rhizomes
p_allometry(p) = 1._r8/cpl + f1/cpfr
if(cplw>0) p_allometry(p) = p_allometry(p) + f3/cplw ! Rhizomes

end if
plant_ndemand(p) = availc(p)*(n_allometry(p)/c_allometry(p))
plant_pdemand(p) = availc(p)*(p_allometry(p)/c_allometry(p))
Expand Down Expand Up @@ -2601,6 +2604,10 @@ subroutine Allocation3_PlantCNPAlloc (bounds , &
cpool_to_livecrootc_storage(p) = nlc * f2 * f3 * f4 * (1._r8 - fcur)
cpool_to_deadcrootc(p) = nlc * f2 * f3 * (1._r8 - f4) * fcur
cpool_to_deadcrootc_storage(p) = nlc * f2 * f3 * (1._r8 - f4) * (1._r8 - fcur)
else
! Assume "stem" allocation in graminoids goes to rhizomes which are all live wood (B Sulman)
cpool_to_livecrootc(p) = nlc * f3 * fcur
cpool_to_livecrootc_storage(p) = nlc * f3 * (1._r8 - fcur)
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
cpool_to_livestemc(p) = nlc * f3 * f4 * fcur
Expand Down Expand Up @@ -2654,6 +2661,10 @@ subroutine Allocation3_PlantCNPAlloc (bounds , &
npool_to_livecrootn_storage(p) = (nlc * f2 * f3 * f4 / cnlw) * (1._r8 - fcur)
npool_to_deadcrootn(p) = (nlc * f2 * f3 * (1._r8 - f4) / cndw) * fcur
npool_to_deadcrootn_storage(p) = (nlc * f2 * f3 * (1._r8 - f4) / cndw) * (1._r8 - fcur)
elseif (cnlw > 0.0_r8) then
! Assume "stem" allocation in graminoids goes to rhizomes which are all live wood (B Sulman)
npool_to_livecrootn(p) = (nlc * f3 / cnlw ) * fcur
npool_to_livecrootn_storage(p) = (nlc * f3 / cnlw ) * (1._r8 - fcur)
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
cng = graincn(ivt(p))
Expand Down Expand Up @@ -2698,6 +2709,10 @@ subroutine Allocation3_PlantCNPAlloc (bounds , &
ppool_to_livecrootp_storage(p) = (nlc * f2 * f3 * f4 / cplw) * (1._r8 -fcur)
ppool_to_deadcrootp(p) = (nlc * f2 * f3 * (1._r8 - f4) / cpdw)* fcur
ppool_to_deadcrootp_storage(p) = (nlc * f2 * f3 * (1._r8 - f4) / cpdw)* (1._r8 - fcur)
elseif (cplw > 0.0_r8) then
! Assume "stem" allocation in graminoids goes to rhizomes which are all live wood (B Sulman)
ppool_to_livecrootp(p) = (nlc * f3 / cplw ) * fcur
ppool_to_livecrootp_storage(p) = (nlc * f3 / cplw ) * (1._r8 - fcur)
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
cpg = graincp(ivt(p))
Expand All @@ -2723,10 +2738,10 @@ subroutine Allocation3_PlantCNPAlloc (bounds , &
! growth is assigned here.

gresp_storage = cpool_to_leafc_storage(p) + cpool_to_frootc_storage(p)
gresp_storage = gresp_storage + cpool_to_livecrootc_storage(p) !Graminoid rhizomes (B Sulman)
if (woody(ivt(p)) == 1._r8) then
gresp_storage = gresp_storage + cpool_to_livestemc_storage(p)
gresp_storage = gresp_storage + cpool_to_deadstemc_storage(p)
gresp_storage = gresp_storage + cpool_to_livecrootc_storage(p)
gresp_storage = gresp_storage + cpool_to_deadcrootc_storage(p)
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
Expand Down
26 changes: 13 additions & 13 deletions components/elm/src/biogeochem/CarbonStateUpdate1Mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -274,13 +274,13 @@ subroutine CarbonStateUpdate1(bounds, &
veg_cs%leafc_xfer(p) = veg_cs%leafc_xfer(p) - veg_cf%leafc_xfer_to_leafc(p)*dt
veg_cs%frootc(p) = veg_cs%frootc(p) + veg_cf%frootc_xfer_to_frootc(p)*dt
veg_cs%frootc_xfer(p) = veg_cs%frootc_xfer(p) - veg_cf%frootc_xfer_to_frootc(p)*dt
veg_cs%livecrootc(p) = veg_cs%livecrootc(p) + veg_cf%livecrootc_xfer_to_livecrootc(p)*dt
veg_cs%livecrootc_xfer(p) = veg_cs%livecrootc_xfer(p) - veg_cf%livecrootc_xfer_to_livecrootc(p)*dt
if (woody(ivt(p)) == 1._r8) then
veg_cs%livestemc(p) = veg_cs%livestemc(p) + veg_cf%livestemc_xfer_to_livestemc(p)*dt
veg_cs%livestemc_xfer(p) = veg_cs%livestemc_xfer(p) - veg_cf%livestemc_xfer_to_livestemc(p)*dt
veg_cs%deadstemc(p) = veg_cs%deadstemc(p) + veg_cf%deadstemc_xfer_to_deadstemc(p)*dt
veg_cs%deadstemc_xfer(p) = veg_cs%deadstemc_xfer(p) - veg_cf%deadstemc_xfer_to_deadstemc(p)*dt
veg_cs%livecrootc(p) = veg_cs%livecrootc(p) + veg_cf%livecrootc_xfer_to_livecrootc(p)*dt
veg_cs%livecrootc_xfer(p) = veg_cs%livecrootc_xfer(p) - veg_cf%livecrootc_xfer_to_livecrootc(p)*dt
veg_cs%deadcrootc(p) = veg_cs%deadcrootc(p) + veg_cf%deadcrootc_xfer_to_deadcrootc(p)*dt
veg_cs%deadcrootc_xfer(p) = veg_cs%deadcrootc_xfer(p) - veg_cf%deadcrootc_xfer_to_deadcrootc(p)*dt
end if
Expand Down Expand Up @@ -315,9 +315,9 @@ subroutine CarbonStateUpdate1(bounds, &
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_xsmrpool(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%leaf_curmr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%froot_curmr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%livecroot_curmr(p)*dt
if (woody(ivt(p)) == 1._r8) then
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%livestem_curmr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%livecroot_curmr(p)*dt
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%livestem_curmr(p)*dt
Expand All @@ -330,12 +330,12 @@ subroutine CarbonStateUpdate1(bounds, &
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) + veg_cf%cpool_to_xsmrpool(p)*dt
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) - veg_cf%leaf_xsmr(p)*dt
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) - veg_cf%froot_xsmr(p)*dt
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) - veg_cf%livecroot_xsmr(p)*dt
if (nu_com .ne. 'RD') then
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) - veg_cf%xsmrpool_turnover(p)*dt
end if
if (woody(ivt(p)) == 1._r8) then
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) - veg_cf%livestem_xsmr(p)*dt
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) - veg_cf%livecroot_xsmr(p)*dt
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
veg_cs%xsmrpool(p) = veg_cs%xsmrpool(p) - veg_cf%livestem_xsmr(p)*dt
Expand All @@ -355,6 +355,10 @@ subroutine CarbonStateUpdate1(bounds, &
veg_cs%frootc(p) = veg_cs%frootc(p) + veg_cf%cpool_to_frootc(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_frootc_storage(p)*dt
veg_cs%frootc_storage(p) = veg_cs%frootc_storage(p) + veg_cf%cpool_to_frootc_storage(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_livecrootc(p)*dt
veg_cs%livecrootc(p) = veg_cs%livecrootc(p) + veg_cf%cpool_to_livecrootc(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_livecrootc_storage(p)*dt
veg_cs%livecrootc_storage(p) = veg_cs%livecrootc_storage(p) + veg_cf%cpool_to_livecrootc_storage(p)*dt
if (woody(ivt(p)) == 1._r8) then
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_livestemc(p)*dt
veg_cs%livestemc(p) = veg_cs%livestemc(p) + veg_cf%cpool_to_livestemc(p)*dt
Expand All @@ -364,10 +368,6 @@ subroutine CarbonStateUpdate1(bounds, &
veg_cs%deadstemc(p) = veg_cs%deadstemc(p) + veg_cf%cpool_to_deadstemc(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_deadstemc_storage(p)*dt
veg_cs%deadstemc_storage(p) = veg_cs%deadstemc_storage(p) + veg_cf%cpool_to_deadstemc_storage(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_livecrootc(p)*dt
veg_cs%livecrootc(p) = veg_cs%livecrootc(p) + veg_cf%cpool_to_livecrootc(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_livecrootc_storage(p)*dt
veg_cs%livecrootc_storage(p) = veg_cs%livecrootc_storage(p) + veg_cf%cpool_to_livecrootc_storage(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_deadcrootc(p)*dt
veg_cs%deadcrootc(p) = veg_cs%deadcrootc(p) + veg_cf%cpool_to_deadcrootc(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_to_deadcrootc_storage(p)*dt
Expand All @@ -387,10 +387,10 @@ subroutine CarbonStateUpdate1(bounds, &
! growth respiration fluxes for current growth
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_leaf_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_froot_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_livecroot_gr(p)*dt
if (woody(ivt(p)) == 1._r8) then
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_livestem_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_deadstem_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_livecroot_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_deadcroot_gr(p)*dt
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
Expand All @@ -401,10 +401,10 @@ subroutine CarbonStateUpdate1(bounds, &
! growth respiration for transfer growth
veg_cs%gresp_xfer(p) = veg_cs%gresp_xfer(p) - veg_cf%transfer_leaf_gr(p)*dt
veg_cs%gresp_xfer(p) = veg_cs%gresp_xfer(p) - veg_cf%transfer_froot_gr(p)*dt
veg_cs%gresp_xfer(p) = veg_cs%gresp_xfer(p) - veg_cf%transfer_livecroot_gr(p)*dt
if (woody(ivt(p)) == 1._r8) then
veg_cs%gresp_xfer(p) = veg_cs%gresp_xfer(p) - veg_cf%transfer_livestem_gr(p)*dt
veg_cs%gresp_xfer(p) = veg_cs%gresp_xfer(p) - veg_cf%transfer_deadstem_gr(p)*dt
veg_cs%gresp_xfer(p) = veg_cs%gresp_xfer(p) - veg_cf%transfer_livecroot_gr(p)*dt
veg_cs%gresp_xfer(p) = veg_cs%gresp_xfer(p) - veg_cf%transfer_deadcroot_gr(p)*dt
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
Expand All @@ -415,10 +415,10 @@ subroutine CarbonStateUpdate1(bounds, &
! growth respiration at time of storage
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_leaf_storage_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_froot_storage_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_livecroot_storage_gr(p)*dt
if (woody(ivt(p)) == 1._r8) then
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_livestem_storage_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_deadstem_storage_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_livecroot_storage_gr(p)*dt
veg_cs%cpool(p) = veg_cs%cpool(p) - veg_cf%cpool_deadcroot_storage_gr(p)*dt
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
Expand All @@ -435,13 +435,13 @@ subroutine CarbonStateUpdate1(bounds, &
veg_cs%leafc_xfer(p) = veg_cs%leafc_xfer(p) + veg_cf%leafc_storage_to_xfer(p)*dt
veg_cs%frootc_storage(p) = veg_cs%frootc_storage(p) - veg_cf%frootc_storage_to_xfer(p)*dt
veg_cs%frootc_xfer(p) = veg_cs%frootc_xfer(p) + veg_cf%frootc_storage_to_xfer(p)*dt
veg_cs%livecrootc_storage(p) = veg_cs%livecrootc_storage(p)- veg_cf%livecrootc_storage_to_xfer(p)*dt
veg_cs%livecrootc_xfer(p) = veg_cs%livecrootc_xfer(p) + veg_cf%livecrootc_storage_to_xfer(p)*dt
if (woody(ivt(p)) == 1._r8) then
veg_cs%livestemc_storage(p) = veg_cs%livestemc_storage(p) - veg_cf%livestemc_storage_to_xfer(p)*dt
veg_cs%livestemc_xfer(p) = veg_cs%livestemc_xfer(p) + veg_cf%livestemc_storage_to_xfer(p)*dt
veg_cs%deadstemc_storage(p) = veg_cs%deadstemc_storage(p) - veg_cf%deadstemc_storage_to_xfer(p)*dt
veg_cs%deadstemc_xfer(p) = veg_cs%deadstemc_xfer(p) + veg_cf%deadstemc_storage_to_xfer(p)*dt
veg_cs%livecrootc_storage(p) = veg_cs%livecrootc_storage(p)- veg_cf%livecrootc_storage_to_xfer(p)*dt
veg_cs%livecrootc_xfer(p) = veg_cs%livecrootc_xfer(p) + veg_cf%livecrootc_storage_to_xfer(p)*dt
veg_cs%deadcrootc_storage(p) = veg_cs%deadcrootc_storage(p)- veg_cf%deadcrootc_storage_to_xfer(p)*dt
veg_cs%deadcrootc_xfer(p) = veg_cs%deadcrootc_xfer(p) + veg_cf%deadcrootc_storage_to_xfer(p)*dt
veg_cs%gresp_storage(p) = veg_cs%gresp_storage(p) - veg_cf%gresp_storage_to_xfer(p)*dt
Expand Down
11 changes: 6 additions & 5 deletions components/elm/src/biogeochem/GrowthRespMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,12 @@ subroutine GrowthResp(num_soilp, filter_soilp)
transfer_froot_gr(p) = frootc_xfer_to_frootc(p) * grperc(ivt(p)) * &
(1._r8 - grpnow(ivt(p)))

! B. Sulman: Moved out of woody to allow graminoid rhizomes
cpool_livecroot_gr(p) = cpool_to_livecrootc(p) * grperc(ivt(p))
cpool_livecroot_storage_gr(p) = cpool_to_livecrootc_storage(p) * &
grperc(ivt(p)) * grpnow(ivt(p))
transfer_livecroot_gr(p) = livecrootc_xfer_to_livecrootc(p) * &
grperc(ivt(p)) * (1._r8 - grpnow(ivt(p)))
if (woody(ivt(p)) == 1._r8) then
cpool_livestem_gr(p) = cpool_to_livestemc(p) * grperc(ivt(p))
cpool_livestem_storage_gr(p) = cpool_to_livestemc_storage(p) * &
Expand All @@ -144,11 +150,6 @@ subroutine GrowthResp(num_soilp, filter_soilp)
grperc(ivt(p)) * grpnow(ivt(p))
transfer_deadstem_gr(p) = deadstemc_xfer_to_deadstemc(p) * &
grperc(ivt(p)) * (1._r8 - grpnow(ivt(p)))
cpool_livecroot_gr(p) = cpool_to_livecrootc(p) * grperc(ivt(p))
cpool_livecroot_storage_gr(p) = cpool_to_livecrootc_storage(p) * &
grperc(ivt(p)) * grpnow(ivt(p))
transfer_livecroot_gr(p) = livecrootc_xfer_to_livecrootc(p) * &
grperc(ivt(p)) * (1._r8 - grpnow(ivt(p)))
cpool_deadcroot_gr(p) = cpool_to_deadcrootc(p) * grperc(ivt(p))
cpool_deadcroot_storage_gr(p) = cpool_to_deadcrootc_storage(p) * &
grperc(ivt(p)) * grpnow(ivt(p))
Expand Down
2 changes: 2 additions & 0 deletions components/elm/src/biogeochem/MaintenanceRespMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,8 @@ subroutine MaintenanceResp(bounds, &
else if (ivt(p) >= npcropmin .and. livestemn(p) .gt. 0._r8) then
livestem_mr(p) = livestemn(p)*br_mr*tc
grain_mr(p) = grainn(p)*br_mr*tc
else ! Graminoid rhizomes
livecroot_mr(p) = livecrootn(p)*br_mr*tc
end if
if (br_xr(ivt(p)) .gt. 1e-9_r8) then
!xr(p) = cpool(p) * br_xr(ivt(p)) * tc
Expand Down
Loading

0 comments on commit 358d5b0

Please sign in to comment.