How to calculate aboveground biomass (AGB) and aboveground net primary productivity (ANPP)?
Closed this issue · 6 comments
Hi everyone,
I guess that aboveground biomass (AGB) is the sum of BDEADA, BLEAF, BSAPWOODA, and BBARKA; belowground biomass (BGB) is the sum of BBARKB, BDEADB, BROOT, BSAPWOODB, BSTORAGE, and BTIMBER; is that right?
Then, how about aboveground net primary productivity (ANPP)? I find some polygon or cohort level variables in h5 output e.g., MMEAN_NPPBARK_PY (or CO), MMEAN_NPPCROOT_PY (or CO), MMEAN_NPPDAILY_PY (or CO), MMEAN_NPPFROOT_PY (or CO), MMEAN_NPPLEAF_PY (or CO), MMEAN_NPPSAPWOOD_PY (or CO), MMEAN_NPPSEEDS_PY (or CO), MMEAN_NPPWOOD_PY (or CO), MMEAN_NPP_PY (or CO). How to calculate ANPP?
I am also confused of the difference between MMEAN_NPPDAILY_PY (or CO) and MMEAN_NPP_PY (or CO).
Thank you!
Yu Zhu
@koxingazhu I would calculate AGB and BGB as follows:
AGB = BLEAF + BSAPWOODA + BDEADA + BBARKA + agf_bs(PFT) * BSTORAGE
BGB = BROOT + BSAPWOODB + BDEADB + BBARKB + (1-agf_bs(PFT)) * BSTORAGE
Do not include BTIMBER in any calculation of AGB or BGB. This is the harvestable biomass for logging, and it is a fraction of BDEADA + BSAPWOODA (including the main stem but excluding branches and twigs). There is also BSEEDS (which really is biomass of all reproductive tissues, so seeds, flowers, fruits, cones); we normally do not include them in the biomass accounting because they do not stay with the cohorts for long.
Regarding the NPP questions, I think the way to calculate ANPP would be:
ANPP = NPPLEAF + NPPSEEDS + agf_bs(PFT) * (NPPSAPWOOD + NPPBARK + NPPWOOD)
I am also confused with the difference between NPPDAILY and NPP, I'm tagging @LevineLab here because I think she was the one who included these variables and may confirm if ANPP is correct.
@mpaiao Thank you for your detailed reply. I look at the code (allometry.f90) and find ed_biomass function.
This subroutine finds the total above ground biomass (wood + leaves)
real function ed_biomass(cpatch,ico)
use ed_state_vars, only : patchtype ! ! Structure
implicit none
!----- Arguments --------------------------------------------------------------------!
type(patchtype), target :: cpatch
integer, intent(in) :: ico
!------------------------------------------------------------------------------------!
ed_biomass = cpatch%bleaf (ico) + cpatch%bsapwooda(ico) + cpatch%bbarka(ico) &
+ cpatch%bdeada(ico)
return
end function ed_biomass
AGB is the total of BLEAF, BSAPWOODA, BDEADA, and BBARKA, but exclude agf_bs(PFT) * BSTORAGE if I understand the source code correctly.
I also find the R code for allometry at R-utils/allometry.r and the AGB calculation is the same with the Fortran code.
ed.biomass <<- function(dbh,ipft,use.crit=TRUE){
if (length(ipft) == 1){
zpft = rep(ipft,times=length(dbh))
}else{
zpft = ipft
}#end if
hgt = dbh2h(dbh=dbh,ipft=zpft)
bleaf = size2bl(dbh=dbh,hgt=hgt,ipft=zpft,use.crit=use.crit)
bsapa = pft$agf.bs[zpft] * pft$qsw [zpft] * hgt * bleaf
bbarka = pft$agf.bs[zpft] * pft$qbark[zpft] * hgt * bleaf
bdeada = pft$agf.bs[zpft] * size2bd(dbh=dbh,hgt=hgt,ipft=zpft)
agb = bleaf + bsapa + bbarka + bdeada
return(agb)
}
I also compared the difference in total AGB calculations between with and without agf_bs(PFT) * BSTORAGE, and I found the difference was very small.
Maybe, agf_bs(PFT) * BSTORAGE can be negligible when calculate AGB?
Good point, I forgot that storage is not included in the AGB generated by ED2. Storage is indeed a small component of the biomass amongst large trees, but may be relatively more important for grasses and small cohorts. I guess the main uncertainty is where storage is located within the tree
I think we could and should include storage in the "official" AGB reporting, but curious to hear what others think.
@mpaiao The difference in AGB between with and without agf_bs(PFT) * BSTORAGE was small because I only calculated the trees with PFT=7 and DBH≥5 cm, no small cohorts and no grasses. Thanks again.
@LevineLab Thank you for your help!