Problem
SIPNET can generate negative values of biomass. When biomass <0, plants should die.
In the current code, impossible negative states biomass pools are repaired after they are updated by clamping stocks to zero rather than handling plant carbon-deficit failure explicitly.
However, when plantWoodCStorageDelta term added to the wood update, it is possible for aboveground biomass to be negative at the end of the time step (and thus, in the sipnet.out).
Related but out of scope:
If the clamping is > tolerance, the ensureNonNegative function warns but still clamps to 0. It seems this could introduce phantom mass.
Proposed change
Implement a mortality rule:
- do not allow live structural biomass pools (wood, leaf, fine root, root) to go negative (current clamping behavior)
- do not let negative wood storage make wood-based fluxes or biomass outputs negative
- trigger mortality before stock clamping if a timestep would drive any live structural biomass pool negative
- on mortality, set
plantWoodC, plantLeafC, fineRootC, coarseRootC, and plantWoodCStorageDelta to zero in the same timestep
- transfer the biomass of the dead plants as currently implemented:
- roots --> soil
- leaves and wood --> litter if litter-pool=on, otherwise --> soil
- if
plantWoodCStorageDelta is negative at death, remove that from the amount transferred to litter / soil
- do not rely on
clampedC / clampedN in the mortality path
Acceptance criteria
- No live structural biomass pool < -eps [eps = small tolerance].
- Carbon-deficit triggers explicit mortality instead of clamp-based repair.
- Mortality conserves mass and uses current aboveground/belowground routing conventions.
- If wood storage is negative at death, mortality routing does not create phantom carbon. I can't think of anything simpler than mass balance is maintained by taking from other pools either evenly or in order: wood, root, [leaf + fine root])
Alternatives
After looking into this, I realized how complex it is to represent mortality! In croplands especially, mortality is not a high priority. If it is simpler to throw an error, lets tag this issue 'on hold' and just do that.
Related
Problem
SIPNET can generate negative values of biomass. When biomass <0, plants should die.
In the current code, impossible negative states biomass pools are repaired after they are updated by clamping stocks to zero rather than handling plant carbon-deficit failure explicitly.
However, when plantWoodCStorageDelta term added to the wood update, it is possible for aboveground biomass to be negative at the end of the time step (and thus, in the sipnet.out).
Related but out of scope:
If the clamping is > tolerance, the
ensureNonNegativefunction warns but still clamps to 0. It seems this could introduce phantom mass.Proposed change
Implement a mortality rule:
plantWoodC,plantLeafC,fineRootC,coarseRootC, andplantWoodCStorageDeltato zero in the same timestepplantWoodCStorageDeltais negative at death, remove that from the amount transferred to litter / soilclampedC/clampedNin the mortality pathAcceptance criteria
Alternatives
After looking into this, I realized how complex it is to represent mortality! In croplands especially, mortality is not a high priority. If it is simpler to throw an error, lets tag this issue 'on hold' and just do that.
Related