-
Notifications
You must be signed in to change notification settings - Fork 32
SIP287 Add C Saturation #301
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
b6463c9
54c071a
ebcffcb
8e174fc
baae4f2
443ccb0
cf727e2
68b472c
3630bc7
43d72a0
243c275
7ff3732
0d77da0
3055e64
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -309,6 +309,13 @@ F^C_\text{fert,org} | |
| Where $K_{\text{plant},i}$ is the turnover rate of plant pool $i$ that controls the rate at which plant biomass is | ||
| transferred to litter. | ||
|
|
||
| If soil carbon saturation is enabled, the litter carbon pool has an additional input of carbon that was not stabilized for long-term storage by the soil. This functionality is described in more detail below in the Soil Carbon section \eqref{eq:soil_carbon_saturation}. | ||
|
|
||
| \begin{equation} | ||
| \frac{dC_\text{litter}}{dt} = F^C_\text{litter} + F^C_{\text{soil}} \cdot \frac{C_{\text{soil}}}{f_{\text{C,soil,saturation}}} - F^C_{\text{decomp}} - F^C_{\text{CH}_4\text{,litter}} | ||
| \label{eq:soil_carbon_to_litter} | ||
| \end{equation} | ||
|
|
||
| $F^C_{\text{decomp}}$ represents the rate at which litter carbon is processed by microbial activity. Litter | ||
| decomposition | ||
| is modeled as a first-order process proportional to litter carbon content and modified by temperature and moisture: | ||
|
|
@@ -370,6 +377,15 @@ F^C_{\text{soil}} = F^C_{\text{soil,litter}} + F^C_{\text{soil,roots}} | |
| \label{eq:soil_carbon_flux} | ||
| \end{equation} | ||
|
|
||
| If soil carbon saturation is enabled, only a fraction of the total carbon input will be added to the soil. The amount added to the soil carbon pool is a function of the proximity of the pool to the soil carbon saturation limit. As the soil carbon pool aqcuires more carbon and approaches its saturation limit, the amount of carbon stored in the pool decreases. This represents the physical and chemical constraints of the mineralogical surfaces of soil to stabilize carbon for long-term storage. The remaining carbon that is not stabilized in the soil carbon pool due to saturation constraints will be returned to the litter carbon pool to act as fast-turnover carbon \eqref{eq:soil_carbon_to_litter}. | ||
|
|
||
| \begin{equation} | ||
| \frac{dC_\text{soil}}{dt} = F^C_{\text{soil}} \cdot (1 - \frac{C_{\text{soil}}}{f_{\text{C,soil,saturation}}}) - R_{\text{soil}} - F^C_{\text{CH}_4\text{,soil}} | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. F^C_{\text{soil}} it is used earlier to represent “total carbon input to soil pool,” not as an unstabilized return flux, please confirm that it is the correct quantity to use here. |
||
| \label{eq:soil_carbon_saturation} | ||
| \end{equation} | ||
|
|
||
| where $f_{\text{C,soil,saturation}}$ is the soil carbon saturation limit entered as an input paramter. | ||
|
|
||
| Soil heterotrophic respiration is modeled as a first-order process proportional | ||
| to soil organic carbon content and modified by environmental and management factors: | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -197,6 +197,7 @@ Run-time parameters can change from one run to the next, or when the model is st | |
| | $Q_{10s}$ | soilRespQ10 | Soil respiration Q10 | unitless | scalar determining effect of temp on soil respiration | | ||
| | $D_{\text{moisture}}$ | soilRespMoistEffect | scalar determining effect of moisture on soil resp. | unitless | | | ||
| | $f_{\text{till}}$ | tillageEff | Effect of tillage on decomposition that exponentially decays over time | fraction | Documented in model structure; event-level term in `events.in` | | ||
| | $f_{\text{C,soil,saturation}}$ | soilCSaturation | Maximum amount of carbon that can be stabilized in the soil determined by soil texture | $\text{g C} \cdot \text{m}^{-2} \text{ ground area}$ | | | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Something like C_soil,sat, or C^*_soil |
||
|
|
||
| ### Nitrogen Cycle Parameters | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -32,6 +32,7 @@ static struct option long_options[] = { // NOLINT | |
| DECLARE_FLAG(nitrogen-cycle), | ||
| DECLARE_FLAG(anaerobic), | ||
| DECLARE_FLAG(flooding), | ||
| DECLARE_FLAG(carbon-saturation), | ||
|
|
||
| DECLARE_FLAG(do-main-output), | ||
| DECLARE_FLAG(do-single-outputs), | ||
|
|
@@ -65,7 +66,7 @@ char *argNameMap[] = { | |
| DECLARE_ARG_FOR_MAP(litterPool), DECLARE_ARG_FOR_MAP(snow), | ||
| DECLARE_ARG_FOR_MAP(soilPhenol), DECLARE_ARG_FOR_MAP(waterHResp), | ||
| DECLARE_ARG_FOR_MAP(nitrogenCycle), DECLARE_ARG_FOR_MAP(anaerobic), | ||
| DECLARE_ARG_FOR_MAP(flooding), | ||
| DECLARE_ARG_FOR_MAP(flooding), DECLARE_ARG_FOR_MAP(carbonSaturation), | ||
|
|
||
| // I/O | ||
| DECLARE_ARG_FOR_MAP(doMainOutput), DECLARE_ARG_FOR_MAP(doSingleOutputs), | ||
|
|
@@ -98,6 +99,7 @@ void usage(char *progName) { | |
| printf(" --snow Keep track of snowpack, rather than assuming all precipitation is liquid (1)\n"); | ||
| printf(" --soil-phenol Use soil temperature to determine leaf growth (0)\n"); | ||
| printf(" --water-hresp Whether soil moisture affects heterotrophic respiration (1)\n"); | ||
| printf(" --carbon-saturation Enable maximum storage limit of soil organic carbon (0)\n"); | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated documentation in all listed files |
||
| printf("\n"); | ||
| printf("Output flags: (prepend flag with 'no-' to force off, eg '--no-print-header')\n"); | ||
| printf(" --do-main-output Print time series of all output variables to <file-prefix>.out (1)\n"); | ||
|
|
@@ -121,6 +123,7 @@ void usage(char *progName) { | |
| printf(" --soil-phenol and --gdd may not both be turned on\n"); | ||
| printf(" --anaerobic requires --water-hresp\n"); | ||
| printf(" --nitrogen-cycle requires both --litter-pool and --anaerobic\n"); | ||
| printf(" --carbon-saturation requires --litter-pool\n"); | ||
| // clang-format on | ||
| } | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -392,6 +392,9 @@ void readParamData(ModelParams **modelParamsPtr, const char *paramFile) { | |
| // Water drainage | ||
| initializeOneModelParam(modelParams, "waterDrainFrac", &(params.waterDrainFrac), ctx.flooding); | ||
|
|
||
| // Soil carbon saturation | ||
| initializeOneModelParam(modelParams, "soilCSaturation", &(params.soilCSaturation), ctx.carbonSaturation); | ||
|
|
||
| // NOLINTEND | ||
| // clang-format on | ||
|
|
||
|
|
@@ -1647,16 +1650,30 @@ void updateMainPools(void) { | |
| */ | ||
| void updatePoolsForSoil(void) { | ||
| if (ctx.litterPool) { | ||
| // :: from [2], litter model description | ||
| envi.litterC += | ||
| (fluxes.woodLitter + fluxes.leafLitter - fluxes.litterToSoil - | ||
| fluxes.rLitter - fluxes.litterMethane) * | ||
| climate->length; | ||
| if (ctx.carbonSaturation) { | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should make sure this is covered in #278
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Alomir If parameter validation is happening in another PR, do I need to do anything with it here?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
| double saturationFraction = envi.soilC / params.soilCSaturation; | ||
| double soilInputs = | ||
| fluxes.coarseRootLoss + fluxes.fineRootLoss + fluxes.litterToSoil; | ||
|
|
||
| envi.litterC += (fluxes.woodLitter + fluxes.leafLitter + | ||
| (soilInputs * saturationFraction) - fluxes.litterToSoil - | ||
| fluxes.rLitter - fluxes.litterMethane) * | ||
| climate->length; | ||
|
|
||
| // from [2] and [3], litter and root terms respectively | ||
| envi.soilC += (fluxes.coarseRootLoss + fluxes.fineRootLoss + | ||
| fluxes.litterToSoil - fluxes.rSoil - fluxes.soilMethane) * | ||
| climate->length; | ||
| envi.soilC += (soilInputs * (1 - saturationFraction) - fluxes.rSoil - | ||
| fluxes.soilMethane) * | ||
| climate->length; | ||
|
Comment on lines
+1654
to
+1665
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This sounds like something to address
Comment on lines
+1653
to
+1665
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this definitely needs to be addressed |
||
| } else { | ||
| // :: from [2], litter model description | ||
| envi.litterC += | ||
| (fluxes.woodLitter + fluxes.leafLitter - fluxes.litterToSoil - | ||
| fluxes.rLitter - fluxes.litterMethane) * | ||
| climate->length; | ||
| // from [2] and [3], litter and root terms respectively | ||
| envi.soilC += (fluxes.coarseRootLoss + fluxes.fineRootLoss + | ||
| fluxes.litterToSoil - fluxes.rSoil - fluxes.soilMethane) * | ||
| climate->length; | ||
| } | ||
| } else { | ||
| // Normal pool (single pool, no microbes) | ||
| // :: from [1] (and others, TBD), eq (A3), where: | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This paragraph could be tightened for clarity and precision.
In particular , the explanation beginning with “This represents the physical and chemical constraints…” is more mechanistic than the implementation. This would be useful context in a manuscript introduction or discussion, but IMHO is TMI here. At the same time, it would be useful to cite one or more papers if they provide the formulation implemented here.
Possible revision:
[?]I'm not sure if diverted is correct here. But 'returned' also seems incorrect- if the total flux to soil comes from litter + roots
Goal is to align docs with the implemented structure. More detailed explanation, if included, should clarify something like 'this formula represents [mechanism] described in [citation].'
And if equations do come from another source then the source should be cited.