@hestia-earth/guide 0.0.18 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/content/guide/aggregation-engine/content.json +1 -1
  3. package/dist/content/guide/data-explorer/what-is-it.json +1 -1
  4. package/dist/content/guide/data-validation/cycle.json +1 -1
  5. package/dist/content/guide/data-validation/impact-assessment.json +1 -1
  6. package/dist/content/guide/data-validation/organisation.json +1 -1
  7. package/dist/content/guide/data-validation/site.json +1 -1
  8. package/dist/content/guide/file-upload/examples/example-1.json +1 -1
  9. package/dist/content/guide/file-upload/examples/example-2.json +1 -1
  10. package/dist/content/guide/file-upload/examples/example-3.json +1 -1
  11. package/dist/content/guide/file-upload/examples/example-4.json +1 -1
  12. package/dist/content/guide/file-upload/getting-started.json +1 -1
  13. package/dist/content/guide/hestia-api/data-api.json +1 -1
  14. package/dist/content/guide/utils/content.json +1 -0
  15. package/dist/content/index.json +1 -1
  16. package/dist/content/models/applying-models/content.json +1 -0
  17. package/dist/content/models/applying-models/faq.json +1 -0
  18. package/dist/content/models/applying-models/introduction.json +1 -0
  19. package/dist/content/models/cycleEmissions/fuel/n2OToAirFuelCombustionIndirect/ipcc2019.json +1 -1
  20. package/dist/content/models/cycleEmissions/inputs/cycle-inputs-background-emissions/freeflow.json +1 -1
  21. package/dist/content/models/cycleEmissions/inputs/cycle-inputs-background-emissions/worldsteel.json +1 -0
  22. package/dist/content/models/cycleEmissions/landUseChange/co2ToAirAboveGroundBiomassStockChange/content.json +1 -1
  23. package/dist/content/models/cycleEmissions/landUseChange/co2ToAirAboveGroundBiomassStockChange/ipcc2019.json +1 -1
  24. package/dist/content/models/cycleEmissions/landUseChange/co2ToAirBelowGroundBiomassStockChange/content.json +1 -1
  25. package/dist/content/models/cycleEmissions/landUseChange/co2ToAirBelowGroundBiomassStockChange/ipcc2019.json +1 -1
  26. package/dist/content/models/cycleEmissions/organicSoil/ch4ToAirOrganicSoilCultivation/content.json +1 -1
  27. package/dist/content/models/cycleEmissions/organicSoil/ch4ToAirOrganicSoilCultivation/ipcc2019.json +1 -1
  28. package/dist/content/models/cycleEmissions/organicSoil/co2ToAirOrganicSoilCultivation/content.json +1 -1
  29. package/dist/content/models/cycleEmissions/organicSoil/co2ToAirOrganicSoilCultivation/ipcc2019.json +1 -1
  30. package/dist/content/models/cycleEmissions/other/co2ToAirLimeNeutralisation/ipcc2019.json +1 -0
  31. package/dist/content/models/cycleEmissions/other/nErosionSoilFlux/schererPfister2015.json +1 -1
  32. package/dist/content/models/cycleEmissions/other/pErosionSoilFlux/schererPfister2015.json +1 -1
  33. package/dist/content/models/cycleEmissions/soil/co2ToAirBiocharStockChange/content.json +1 -1
  34. package/dist/content/models/cycleEmissions/soil/co2ToAirBiocharStockChange/ipcc2019.json +1 -1
  35. package/dist/content/models/cycleEmissions/soil/co2ToAirSoilOrganicCarbonStockChange/content.json +1 -1
  36. package/dist/content/models/cycleEmissions/soil/co2ToAirSoilOrganicCarbonStockChange/ipcc2019.json +1 -1
  37. package/dist/content/models/cycleEmissions/soil/n2OToAirDiminishingSoilCarbonStocksDirect/content.json +1 -0
  38. package/dist/content/models/cycleEmissions/soil/n2OToAirDiminishingSoilCarbonStocksDirect/ipcc2019.json +1 -0
  39. package/dist/content/models/cycleGeneral/cycle-cycleDuration/content.json +1 -1
  40. package/dist/content/models/cycleGeneral/cycle-cycleDuration/cycle.json +1 -1
  41. package/dist/content/models/cycleGeneral/cycle-siteDuration/content.json +1 -1
  42. package/dist/content/models/cycleGeneral/cycle-siteDuration/cycle.json +1 -1
  43. package/dist/content/models/cycleGeneral/cycle-startDate/content.json +1 -1
  44. package/dist/content/models/cycleGeneral/cycle-startDate/cycle.json +1 -1
  45. package/dist/content/models/cycleInputs/hestia-materialAndSubstrate/hestia.json +1 -1
  46. package/dist/content/models/impactAssessmentResourceUse/inputs/impact-inputs-background-resource-use/content.json +1 -1
  47. package/dist/content/models/impactAssessmentResourceUse/inputs/impact-inputs-background-resource-use/worldsteel.json +1 -0
  48. package/dist/content/models/impactAssessmentResourceUse/inputs/impact-inputs-background-resourceUse/content.json +1 -1
  49. package/dist/content/models/impactAssessmentResourceUse/inputs/impact-inputs-background-resourceUse/freeflow.json +1 -1
  50. package/dist/content/models/siteInfrastructure/content.json +1 -0
  51. package/dist/content/models/siteInfrastructure/site-infrastructure/content.json +1 -0
  52. package/dist/content/models/siteInfrastructure/site-infrastructure/kanetal2020.json +1 -0
  53. package/dist/content/models/siteMeasurements/landUseChange/aboveGroundBiomass/content.json +1 -1
  54. package/dist/content/models/siteMeasurements/landUseChange/aboveGroundBiomass/ipcc2019.json +1 -1
  55. package/dist/content/models/siteMeasurements/landUseChange/belowGroundBiomass/content.json +1 -1
  56. package/dist/content/models/siteMeasurements/landUseChange/belowGroundBiomass/ipcc2019.json +1 -1
  57. package/dist/content/models/siteMeasurements/soil/clayContent/content.json +1 -1
  58. package/dist/content/models/siteMeasurements/soil/clayContent/geospatialDatabase.json +1 -1
  59. package/dist/content/models/siteMeasurements/soil/organicCarbonPerHa/content.json +1 -1
  60. package/dist/content/models/siteMeasurements/soil/organicCarbonPerHa/ipcc2019Tier1.json +1 -1
  61. package/dist/content/models/siteMeasurements/soil/organicCarbonPerHa/ipcc2019Tier2.json +1 -1
  62. package/dist/content/models/siteMeasurements/soil/sandContent/content.json +1 -1
  63. package/dist/content/models/siteMeasurements/soil/sandContent/geospatialDatabase.json +1 -1
  64. package/dist/content/models/siteMeasurements/soil/siltContent/content.json +1 -1
  65. package/dist/content/models/siteMeasurements/soil/siltContent/geospatialDatabase.json +1 -1
  66. package/dist/index.d.ts +5 -0
  67. package/dist/index.js +25 -7
  68. package/json_models/cycle/siteDuration.py.json +25 -1
  69. package/json_models/cycle/startDate.py.json +4 -2
  70. package/json_models/hestia/default_emissions.py.json +1 -1
  71. package/json_models/hestia/default_resourceUse.py.json +1 -1
  72. package/json_models/hestia/materialAndSubstrate.py.json +6 -7
  73. package/json_models/ipcc2019/n2OToAirDiminishingSoilCarbonStocksDirect.py.json +69 -0
  74. package/json_models/ipcc2019/n2OToAirFuelCombustionIndirect.py.json +25 -3
  75. package/json_models/kanEtAl2020/infrastructure.py.json +35 -0
  76. package/json_models/schererPfister2015/nErosionSoilFlux.py.json +8 -8
  77. package/json_models/schererPfister2015/pErosionSoilFlux.py.json +8 -8
  78. package/json_models/worldSteel/cycle.py.json +36 -0
  79. package/json_models/worldSteel/impact_assessment.py.json +38 -0
  80. package/package.json +1 -1
  81. package/dist/content/guide/applying-models/content.json +0 -1
  82. package/dist/content/guide/applying-models/faq.json +0 -1
  83. package/dist/content/guide/applying-models/file-validation.json +0 -1
  84. package/dist/content/guide/applying-models/introduction.json +0 -1
  85. package/dist/content/guide/applying-models/utils.json +0 -1
  86. package/dist/content/models/cycleEmissions/other/co2ToAirLimeHydrolysis/ipcc2019.json +0 -1
  87. /package/dist/content/{guide → models}/applying-models/contributing.json +0 -0
  88. /package/dist/content/{guide → models}/applying-models/logs.json +0 -0
  89. /package/dist/content/{guide → models}/applying-models/monte-carlo.json +0 -0
  90. /package/dist/content/models/cycleEmissions/other/{co2ToAirLimeHydrolysis → co2ToAirLimeNeutralisation}/content.json +0 -0
  91. /package/json_models/ipcc2019/{co2ToAirLimeHydrolysis.py.json → co2ToAirLimeNeutralisation.py.json} +0 -0
@@ -1 +1 @@
1
- {"tags":{"author":["Florian Payen"],"group":["Cycle: Emissions"],"subgroup":["Soil"],"tab":["IPCC (2019)"],"citation":["Payen, F. (2025) Soil organic carbon stock modelling on HESTIA."],"tag":["soc modelling"]},"content":"# CO2, to air, soil organic carbon stock change\n\nCarbon dioxide emissions to air, from soil organic carbon stock change. Soil organic carbon is defined as soil organic matter that is smaller than 2 mm in size.\n\n## Overview\n\nThis model calculates the annual emissions from soil organic carbon (SOC) stock changes and assigns them to Cycles that take place during those years. It can allocate these emissions to two HESTIA terms:\n\n1. [`co2ToAirSoilOrganicCarbonStockChangeLandUseChange`](/term/co2ToAirSoilOrganicCarbonStockChangeLandUseChange) - stock change emissions that occur in the 20 years after a land-use change event\n2. [`co2ToAirSoilOrganicCarbonStockChangeManagementChange`](/term/co2ToAirSoilOrganicCarbonStockChangeManagementChange) - stock change emissions that occur more than 20 years after a land-use change event\n\nThe model is run as a Monte Carlo simulation with 10,000 iterations. Model result values are the row-wise `mean` of simulation results. See our guide on [Monte Carlo simulation](/guide/applying-models-monte-carlo) for more information\n\n## How the model works\n\n### Step 1. Build an annual inventory of SOC measurements\n\nAn annual inventory of `organicCarbonPerHa` [Measurement](/schema/Measurement) values is created. These values represent the amount of organic carbon stored in the soil at the **end of each inventory year**.\n\n[Measurements](/schema/Measurement) are grouped by `methodClassification`. It is critical that different methods are **never mixed** when calculating changes in carbon stock, as this could lead to large and misleading differences. Instead, the model processes each `methodClassification` separately, and includes only the emissions calculated using the **strongest available method** in the final output.\n\nOnly [Measurements](/schema/Measurement) with specific `methodClassification` values are included. All others are ignored. The valid classifications, listed from strongest to weakest, are:\n\n- `on-site physical measurement`\n- `modelled using other measurements`\n- `tier 3 model`\n- `tier 2 model`\n- `tier 1 model`\n\nEach carbon stock value must correspond to the timestamp `YYYY-12-31T23:59:59` — the end of the inventory year. If no [Measurement](/schema/Measurement) exists for this exact time, the value is estimated using linear interpolation between the closest available measurements before and after the target date.\n\n| Year | `on-site physical measurement`<sup>\\*</sup> | `tier 1 model`<sup>\\*</sup> |\n| ---- | ------------------------------------------- | --------------------------- |\n| 2002 | 48000 | - |\n| 2003 | 47000 | - |\n| 2004 | 45000 | 52350 |\n| 2005 | 44500 | 51125 |\n| 2006 | 44000 | 49900 |\n| 2007 | 43500 | - |\n\n<sup>\\*</sup>SOC stock (kg C ha<sup>-1</sup>)\n\nIn this scenario, the values of the `on-site physical measurement` column will be retained because it is the stronger `methodClassification`. The values of the `tier 1 model` will be discarded.\n\n### Step 2. Resample stock values for Monte Carlo simulation\n\nTo run the model as a Monte Carlo simulation, we need to generate an array of random samples for the `organicCarbonPerHa` stock in each inventory year. These samples are drawn from a normal distribution defined by the `value` (mean) and `sd` of each year.\n\nIdeally, we would re-use the full set of iteration results from the [`ipcc2019.organicCarbonPerHa`](./organicCarbonPerHa) model's Monto Carlo simulation. However, HESTIA nodes can only store row-wise summaries of Monte Carlo simulation results. This means the full iteration-level data is not available for use in downstream models, so we lose the correlation between years in each simulation run.\n\nTo maintain realistic, coherent simulation behaviour:\n\n- Within each simulation run (column): Values across years (rows) should be correlated. If year 0 is a high value, we expect subsequent years to also be relatively high\n- Across simulation runs (columns): Values should be independent from one another\n\nFor this, we need to generate our new random samples with correlation by treating the inventory as a time series, where:\n\n- Rows = time steps (years)\n- Columns = independent Monte Carlo runs\n\nTo model the correlation between years, we assume that similarity in stock values decreases with time. Closer years are more correlated than years further apart. This is modelled using exponential decay, with a half-life of 20 years (based on the IPCC's default transition period for carbon stock equilibrium).\n\nUsing this correlation structure, we generate samples from a multivariate normal distribution, ensuring temporal correlation within runs and independence between runs.\n\nSee the [Scipy Cookbook on Correlated Random Samples](https://scipy-cookbook.readthedocs.io/items/CorrelatedRandomSamples.html) for more information.\n\nCarbon stock values without a corresponding `sd` are given a nominal error of 75% ($2*{sd}$ as a percentage of the mean).\n\n### Step 3. Calculate the annual CO<sub>2</sub> emission (or removal) due to SOC stock change\n\nNext, the carbon stock change and the associated CO<sub>2</sub> change can be calculated for each inventory year:\n\n$\\Delta CO_2 = -1 * (C_y - C\\_{y-1}) * \\frac{44.01}{12.012}$\n\nWhere:\n\n- $\\Delta CO_2$ = the CO<sub>2</sub> emission due to carbon stock change for year $y$, kg CO<sub>2</sub> ha<sup>-1</sup>.\n- $C_y$ = the carbon stock in year $y$, kg C ha<sup>-1</sup>.\n- $C_{y-1}$ = the carbon stock in year $y-1$x, kg C ha<sup>-1</sup>.\n- $\\frac{44.01}{12.012}$ = the ratio of the atomic mass of CO<sub>$2$</sub> to C.\n\n_n.b._, the value is multiplied by $-1$ as a reduction in carbon stock is associated with an emission of CO<sub>2</sub> and vice versa.\n\n| Year | C stock (kg C ha<sup>-1</sup>) | C stock change (kg C ha<sup>-1</sup>) | CO<sub>2</sub> emission (kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---- | ------------------------------ | ------------------------------------- | ----------------------------------------------------------- |\n| 2002 | 48000 | n/a | n/a |\n| 2003 | 47000 | -1000 | 3664 |\n| 2004 | 45000 | -2000 | 7328 |\n| 2005 | 44500 | -500 | 1832 |\n| 2006 | 44000 | -500 | 1832 |\n| 2007 | 43500 | -500 | 1832 |\n\n### Step 4. Allocate the CO<sub>2</sub> emission to overlapping Cycles\n\n[Measurements](/schema/Measurement), such as `organicCarbonPerHa`, are attached to [Site](/schema/Site) nodes. In the HESTIA schema, a single [Site](/schema/Site) can be linked to multiple [Cycle](/schema/Cycle) nodes. However, emission models are run **per [Cycle](/schema/Cycle)**.\n\nTo ensure emissions are correctly allocated, the `ipcc2019.co2ToAirSoilOrganicCarbonStockChange` model gathers data from all [Cycles](/schema/Cycle) associated with the same [Site](/schema/Site).\n\nEmissions from changes in carbon stock should only be assigned to a [Cycle](/schema/Cycle) if that Cycle meaningfully overlaps with the inventory year in which the stock change occurred.\n\nIf multiple [Cycles](/schema/Cycle) overlap the same inventory year, the emission for that year is **shared proportionally** based on the number of overlapping days. For example:\n\n- `cycle-y` overlaps by 200 days\n- `cycle-z` overlaps by 100 days\n\nThen:\n\n- `cycle-y` receives **66.6%** of the emission\n- `cycle-z` receives **33.3%**\n\n_n.b._, The total share of emissions across all overlapping [Cycles](/schema/Cycle) **must always sum to 100%** to avoid under- or over-reporting.\n\n#### Emissions across multiple years\n\nIf a [Cycle](/schema/Cycle) overlaps with **multiple inventory years**, it should be assigned the **sum of its proportional shares** from each of those years.\n\n<div class=\"table-container is-responsive\">\n <table class=\"table is-fullwidth is-hoverable is-striped\">\n <tr>\n <th>Year</th>\n <th>\n Total emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n <th>Cycle ID</th>\n <th>Share of emission (%)</th>\n <th>\n Cycle emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n </tr>\n <tr>\n <td>2003</td>\n <td>3664</td>\n <td>\n cycle-a0\n </td>\n <td>100</td>\n <td>3664</td>\n </tr>\n <tr>\n <td rowspan=\"2\">2004</td>\n <td rowspan=\"2\">7328</td>\n <td>\n cycle-a1\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>\n cycle-a2\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>2005</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2006</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2007</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n </table>\n</div>\n\n| Cycle ID | `co2ToAirSoilOrganicCarbonStockChangeManagementChange`(kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---------- | ----------------------------------------------------------------------------------------- |\n| `cycle-a0` | 3664 |\n| `cycle-a1` | 3664 |\n| `cycle-a2` | 3664 |\n| `cycle-a3` | 5496 |\n\n### Step 5. Assign an emission tier\n\nThe `methodTier` assigned to the emission node on each [Cycle](/schema/Cycle) reflects the **weakest** measurement method used in its calculation.\n\nFor example, if a [Cycle](/schema/Cycle)'s final emission is calculated by summing together the emissions of two inventory years, where:\n\n- One year uses [Measurements](/schema/Measurement) with `methodClassification = tier 1 model`\n- The other year uses `methodClassification = tier 2 model`\n\nThe resulting `methodTier` will be `tier 1`, since it is the **weakest** method involved.\n\nThe mapping between Measurement `methodClassification` and Emission `methodTier` is:\n\n| Measurement `methodClassification` | Emission `methodTier` |\n| ----------------------------------- | --------------------- |\n| `on-site physical measurement` | `measured` |\n| `modelled using other measurements` | `measured` |\n| `tier 3 model` | `tier 3` |\n| `tier 2 model` | `tier 2` |\n| `tier 1 model` | `tier 1` |\n\n### Step 6. Allocate the CO<sub>2</sub> emission to land-use change or management change\n\nIn line with reporting requirements, CO<sub>2</sub> emissions from stock changes must be classified as either:\n\n- due to land-use change (LUC), or\n- due to management change.\n\nIn HESTIA, the presence or absence of a blank node matters: returning no node is not the same as returning a node with 0 emissions. To ensure consistency, the model should always return two blank nodes (one for each category) if enough data is available.\n\n**Allocation rules**\n\nIf it is known whether the emission is due to LUC or management:\n\n- Return two blank nodes:\n 1. One node with the emission and the correct term.@id\n 2. One node with 0 emissions and the other term.@id\n\nIf it is unknown:\n\n- Return one blank node, allocating the full emission to management change\n\n**Decision criteria**\n\nAllocation is based on two factors:\n\n1. **Completeness of land-use data:**\n\n - No land-use data\n - Fewer than 20 years of data\n - At least 20 years of data\n\n2. **Presence of a land-use change event:**\n - No land-use change (LUC) event detected\n - LUC event detected\n\n| | No land use data (1) | < 20 years' land use data (2) | >= 20 years' land use data (3) |\n| ----------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **No LUC event detected (a)** | allocate all emissions to management change (a1) | allocate all emissions to management change (a2) | allocate all emissions to management change **AND** add a land use change emission with value 0 (a3) |\n| **LUC event detected (b)** | n/a (b1) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b2) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b3) |\n\n## Example\n\nIn this example, we follow the SOC stock of an olive orchard, which has not changed in land-use for over 50 years. Therefore, all emissions should be allocated to management changes and a corresponding `0` emission should be allocated to land-use change.\n\nFor simplicity, the uncertainty of model inputs and outputs have been excluded.\n\n### Input\n\n#### Site\n\n```json\n{\n \"@id\": \"site-a\",\n \"@type\": \"Site\",\n \"siteType\": \"cropland\",\n \"management\": [\n {\n \"@type\": \"Management\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"oliveTree\"\n },\n \"value\": [100],\n \"startDate\": \"1960\",\n \"endDate\": \"2006\"\n }\n ],\n \"measurements\": [\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [43000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2003-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [44333.333],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2004-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [45666.666],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2005-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [47000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2006-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n }\n ]\n}\n```\n\n#### Cycle\n\n```json\n{\n \"@id\": \"cycle-a-04-06\",\n \"@type\": \"Cycle\",\n \"startDate\": \"2004\",\n \"endDate\": \"2006\",\n \"site\": {\n \"@id\": \"site-a\",\n \"@type\": \"Site\"\n },\n \"functionalUnit\": \"1 ha\"\n}\n```\n\n### Output\n\n```json\n[\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeLandUseChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [0],\n \"methodTier\": \"tier 1\"\n },\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeManagementChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [-14655.344655],\n \"methodTier\": \"tier 1\"\n }\n]\n```\n\n## Cases in which the model can run without SOC stock Measurements\n\nBecause emissions are allocated to either land-use change or management change (depending on whether a land-use change has been detected in the Site's `landCover` history), in some cases it is possible for this model to return partial results when there are no SOC stock Measurements.\n\nIf a land-use change is detected during the 20 years prior to a Cycle, all emissions should be allocated to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`). Therefore, we can allocate `0` emissions to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`) even whem we can't calculate a value for the land-use change emission. To be certain that a land-use change has occurred, we require up to 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nThe inverse is also true for when a land-use change is **not** detected in the 20 years prior to a Cycle. In this case, all emissions should be allocated to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`). Therefore, we can allocate `0` emissions to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`) even when we can't calculate a value for the management change emission. To be certain that a land-use change has **not** occurred, we require a minimum of 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nIf there is insufficient `landCover` data to determine whether a land-use change has occurred, the model will be unable to return partial results.\n\n\n\n\n\n\n"}
1
+ {"tags":{"author":["Florian Payen"],"group":["Cycle: Emissions"],"subgroup":["Soil"],"tab":["IPCC (2019)"],"citation":["Payen, F. (2025) Soil organic carbon stock modelling on HESTIA."],"tag":["soc modelling"]},"content":"# CO2, to air, soil organic carbon stock change\n\nCarbon dioxide emissions to air, from soil organic carbon stock change. Soil organic carbon is defined as soil organic matter that is smaller than 2 mm in size.\n\n## Overview\n\nThis model calculates the annual emissions from soil organic carbon (SOC) stock changes and assigns them to Cycles that take place during those years. It can allocate these emissions to two HESTIA terms:\n\n1. [`co2ToAirSoilOrganicCarbonStockChangeLandUseChange`](/term/co2ToAirSoilOrganicCarbonStockChangeLandUseChange) - stock change emissions that occur in the 20 years after a land-use change event\n2. [`co2ToAirSoilOrganicCarbonStockChangeManagementChange`](/term/co2ToAirSoilOrganicCarbonStockChangeManagementChange) - stock change emissions that occur more than 20 years after a land-use change event\n\nThe model is run as a Monte Carlo simulation with 10,000 iterations. Model result values are the row-wise `mean` of simulation results. See our guide on [Monte Carlo simulation](/guide/models-applying-models-monte-carlo) for more information\n\n## How the model works\n\n### Step 1. Build an annual inventory of SOC measurements\n\nAn annual inventory of `organicCarbonPerHa` [Measurement](/schema/Measurement) values is created. These values represent the amount of organic carbon stored in the soil at the **end of each inventory year**.\n\n[Measurements](/schema/Measurement) are grouped by `methodClassification`. It is critical that different methods are **never mixed** when calculating changes in carbon stock, as this could lead to large and misleading differences. Instead, the model processes each `methodClassification` separately, and includes only the emissions calculated using the **strongest available method** in the final output.\n\nOnly [Measurements](/schema/Measurement) with specific `methodClassification` values are included. All others are ignored. The valid classifications, listed from strongest to weakest, are:\n\n- `on-site physical measurement`\n- `modelled using other measurements`\n- `tier 3 model`\n- `tier 2 model`\n- `tier 1 model`\n\nEach carbon stock value must correspond to the timestamp `YYYY-12-31T23:59:59` — the end of the inventory year. If no [Measurement](/schema/Measurement) exists for this exact time, the value is estimated using linear interpolation between the closest available measurements before and after the target date.\n\n| Year | `on-site physical measurement`<sup>\\*</sup> | `tier 1 model`<sup>\\*</sup> |\n| ---- | ------------------------------------------- | --------------------------- |\n| 2002 | 48000 | - |\n| 2003 | 47000 | - |\n| 2004 | 45000 | 52350 |\n| 2005 | 44500 | 51125 |\n| 2006 | 44000 | 49900 |\n| 2007 | 43500 | - |\n\n<sup>\\*</sup>SOC stock (kg C ha<sup>-1</sup>)\n\nIn this scenario, the values of the `on-site physical measurement` column will be retained because it is the stronger `methodClassification`. The values of the `tier 1 model` will be discarded.\n\n### Step 2. Resample stock values for Monte Carlo simulation\n\nTo run the model as a Monte Carlo simulation, we need to generate an array of random samples for the `organicCarbonPerHa` stock in each inventory year. These samples are drawn from a normal distribution defined by the `value` (mean) and `sd` of each year.\n\nIdeally, we would re-use the full set of iteration results from the [`ipcc2019.organicCarbonPerHa`](./organicCarbonPerHa) model's Monto Carlo simulation. However, HESTIA nodes can only store row-wise summaries of Monte Carlo simulation results. This means the full iteration-level data is not available for use in downstream models, so we lose the correlation between years in each simulation run.\n\nTo maintain realistic, coherent simulation behaviour:\n\n- Within each simulation run (column): Values across years (rows) should be correlated. If year 0 is a high value, we expect subsequent years to also be relatively high\n- Across simulation runs (columns): Values should be independent from one another\n\nFor this, we need to generate our new random samples with correlation by treating the inventory as a time series, where:\n\n- Rows = time steps (years)\n- Columns = independent Monte Carlo runs\n\nTo model the correlation between years, we assume that similarity in stock values decreases with time. Closer years are more correlated than years further apart. This is modelled using exponential decay, with a half-life of 20 years (based on the IPCC's default transition period for carbon stock equilibrium).\n\nUsing this correlation structure, we generate samples from a multivariate normal distribution, ensuring temporal correlation within runs and independence between runs.\n\nSee the [Scipy Cookbook on Correlated Random Samples](https://scipy-cookbook.readthedocs.io/items/CorrelatedRandomSamples.html) for more information.\n\nCarbon stock values without a corresponding `sd` are given a nominal error of 75% ($2*{sd}$ as a percentage of the mean).\n\n### Step 3. Calculate the annual CO<sub>2</sub> emission (or removal) due to SOC stock change\n\nNext, the carbon stock change and the associated CO<sub>2</sub> change can be calculated for each inventory year:\n\n$\\Delta CO_2 = -1 * (C_y - C\\_{y-1}) * \\frac{44.01}{12.012}$\n\nWhere:\n\n- $\\Delta CO_2$ = the CO<sub>2</sub> emission due to carbon stock change for year $y$, kg CO<sub>2</sub> ha<sup>-1</sup>.\n- $C_y$ = the carbon stock in year $y$, kg C ha<sup>-1</sup>.\n- $C_{y-1}$ = the carbon stock in year $y-1$x, kg C ha<sup>-1</sup>.\n- $\\frac{44.01}{12.012}$ = the ratio of the atomic mass of CO<sub>$2$</sub> to C.\n\n_n.b._, the value is multiplied by $-1$ as a reduction in carbon stock is associated with an emission of CO<sub>2</sub> and vice versa.\n\n| Year | C stock (kg C ha<sup>-1</sup>) | C stock change (kg C ha<sup>-1</sup>) | CO<sub>2</sub> emission (kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---- | ------------------------------ | ------------------------------------- | ----------------------------------------------------------- |\n| 2002 | 48000 | n/a | n/a |\n| 2003 | 47000 | -1000 | 3664 |\n| 2004 | 45000 | -2000 | 7328 |\n| 2005 | 44500 | -500 | 1832 |\n| 2006 | 44000 | -500 | 1832 |\n| 2007 | 43500 | -500 | 1832 |\n\n### Step 4. Allocate the CO<sub>2</sub> emission to overlapping Cycles\n\n[Measurements](/schema/Measurement), such as `organicCarbonPerHa`, are attached to [Site](/schema/Site) nodes. In the HESTIA schema, a single [Site](/schema/Site) can be linked to multiple [Cycle](/schema/Cycle) nodes. However, emission models are run **per [Cycle](/schema/Cycle)**.\n\nTo ensure emissions are correctly allocated, the `ipcc2019.co2ToAirSoilOrganicCarbonStockChange` model gathers data from all [Cycles](/schema/Cycle) associated with the same [Site](/schema/Site).\n\nEmissions from changes in carbon stock should only be assigned to a [Cycle](/schema/Cycle) if that Cycle meaningfully overlaps with the inventory year in which the stock change occurred.\n\nIf multiple [Cycles](/schema/Cycle) overlap the same inventory year, the emission for that year is **shared proportionally** based on the number of overlapping days. For example:\n\n- `cycle-y` overlaps by 200 days\n- `cycle-z` overlaps by 100 days\n\nThen:\n\n- `cycle-y` receives **66.6%** of the emission\n- `cycle-z` receives **33.3%**\n\n_n.b._, The total share of emissions across all overlapping [Cycles](/schema/Cycle) **must always sum to 100%** to avoid under- or over-reporting.\n\n#### Emissions across multiple years\n\nIf a [Cycle](/schema/Cycle) overlaps with **multiple inventory years**, it should be assigned the **sum of its proportional shares** from each of those years.\n\n<div class=\"table-container is-responsive\">\n <table class=\"table is-fullwidth is-hoverable is-striped\">\n <tr>\n <th>Year</th>\n <th>\n Total emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n <th>Cycle ID</th>\n <th>Share of emission (%)</th>\n <th>\n Cycle emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n </tr>\n <tr>\n <td>2003</td>\n <td>3664</td>\n <td>\n cycle-a0\n </td>\n <td>100</td>\n <td>3664</td>\n </tr>\n <tr>\n <td rowspan=\"2\">2004</td>\n <td rowspan=\"2\">7328</td>\n <td>\n cycle-a1\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>\n cycle-a2\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>2005</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2006</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2007</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n </table>\n</div>\n\n| Cycle ID | `co2ToAirSoilOrganicCarbonStockChangeManagementChange`(kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---------- | ----------------------------------------------------------------------------------------- |\n| `cycle-a0` | 3664 |\n| `cycle-a1` | 3664 |\n| `cycle-a2` | 3664 |\n| `cycle-a3` | 5496 |\n\n### Step 5. Assign an emission tier\n\nThe `methodTier` assigned to the emission node on each [Cycle](/schema/Cycle) reflects the **weakest** measurement method used in its calculation.\n\nFor example, if a [Cycle](/schema/Cycle)'s final emission is calculated by summing together the emissions of two inventory years, where:\n\n- One year uses [Measurements](/schema/Measurement) with `methodClassification = tier 1 model`\n- The other year uses `methodClassification = tier 2 model`\n\nThe resulting `methodTier` will be `tier 1`, since it is the **weakest** method involved.\n\nThe mapping between Measurement `methodClassification` and Emission `methodTier` is:\n\n| Measurement `methodClassification` | Emission `methodTier` |\n| ----------------------------------- | --------------------- |\n| `on-site physical measurement` | `measured` |\n| `modelled using other measurements` | `measured` |\n| `tier 3 model` | `tier 3` |\n| `tier 2 model` | `tier 2` |\n| `tier 1 model` | `tier 1` |\n\n### Step 6. Allocate the CO<sub>2</sub> emission to land-use change or management change\n\nIn line with reporting requirements, CO<sub>2</sub> emissions from stock changes must be classified as either:\n\n- due to land-use change (LUC), or\n- due to management change.\n\nIn HESTIA, the presence or absence of a blank node matters: returning no node is not the same as returning a node with 0 emissions. To ensure consistency, the model should always return two blank nodes (one for each category) if enough data is available.\n\n**Allocation rules**\n\nIf it is known whether the emission is due to LUC or management:\n\n- Return two blank nodes:\n 1. One node with the emission and the correct term.@id\n 2. One node with 0 emissions and the other term.@id\n\nIf it is unknown:\n\n- Return one blank node, allocating the full emission to management change\n\n**Decision criteria**\n\nAllocation is based on two factors:\n\n1. **Completeness of land-use data:**\n\n - No land-use data\n - Fewer than 20 years of data\n - At least 20 years of data\n\n2. **Presence of a land-use change event:**\n - No land-use change (LUC) event detected\n - LUC event detected\n\n| | No land use data (1) | < 20 years' land use data (2) | >= 20 years' land use data (3) |\n| ----------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **No LUC event detected (a)** | allocate all emissions to management change (a1) | allocate all emissions to management change (a2) | allocate all emissions to management change **AND** add a land use change emission with value 0 (a3) |\n| **LUC event detected (b)** | n/a (b1) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b2) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b3) |\n\n## Example\n\nIn this example, we follow the SOC stock of an olive orchard, which has not changed in land-use for over 50 years. Therefore, all emissions should be allocated to management changes and a corresponding `0` emission should be allocated to land-use change.\n\nFor simplicity, the uncertainty of model inputs and outputs have been excluded.\n\n### Input\n\n#### Site\n\n```json\n{\n \"@id\": \"site-a\",\n \"@type\": \"Site\",\n \"siteType\": \"cropland\",\n \"management\": [\n {\n \"@type\": \"Management\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"oliveTree\"\n },\n \"value\": [100],\n \"startDate\": \"1960\",\n \"endDate\": \"2006\"\n }\n ],\n \"measurements\": [\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [43000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2003-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [44333.333],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2004-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [45666.666],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2005-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [47000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2006-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n }\n ]\n}\n```\n\n#### Cycle\n\n```json\n{\n \"@id\": \"cycle-a-04-06\",\n \"@type\": \"Cycle\",\n \"startDate\": \"2004\",\n \"endDate\": \"2006\",\n \"site\": {\n \"@id\": \"site-a\",\n \"@type\": \"Site\"\n },\n \"functionalUnit\": \"1 ha\"\n}\n```\n\n### Output\n\n```json\n[\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeLandUseChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [0],\n \"methodTier\": \"tier 1\"\n },\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeManagementChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [-14655.344655],\n \"methodTier\": \"tier 1\"\n }\n]\n```\n\n## Cases in which the model can run without SOC stock Measurements\n\nBecause emissions are allocated to either land-use change or management change (depending on whether a land-use change has been detected in the Site's `landCover` history), in some cases it is possible for this model to return partial results when there are no SOC stock Measurements.\n\nIf a land-use change is detected during the 20 years prior to a Cycle, all emissions should be allocated to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`). Therefore, we can allocate `0` emissions to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`) even whem we can't calculate a value for the land-use change emission. To be certain that a land-use change has occurred, we require up to 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nThe inverse is also true for when a land-use change is **not** detected in the 20 years prior to a Cycle. In this case, all emissions should be allocated to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`). Therefore, we can allocate `0` emissions to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`) even when we can't calculate a value for the management change emission. To be certain that a land-use change has **not** occurred, we require a minimum of 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nIf there is insufficient `landCover` data to determine whether a land-use change has occurred, the model will be unable to return partial results.\n\n\n\n\n\n\n"}
@@ -1 +1 @@
1
- {"tags":{"author":["Florian Payen"],"group":["Cycle: Emissions"],"subgroup":["Soil"],"tab":["IPCC (2019)"],"citation":["Payen, F. (2025) Soil organic carbon stock modelling on HESTIA."],"tag":["soc modelling"],"modelId":["co2ToAirSoilOrganicCarbonStockChangeLandUseChange","co2ToAirSoilOrganicCarbonStockChangeManagementChange"],"modelRequires":["organicCarbonPerHa"]},"content":"# CO2, to air, soil organic carbon stock change\n\nCarbon dioxide emissions to air, from soil organic carbon stock change. Soil organic carbon is defined as soil organic matter that is smaller than 2 mm in size.\n\n## Overview\n\nThis model calculates the annual emissions from soil organic carbon (SOC) stock changes and assigns them to Cycles that take place during those years. It can allocate these emissions to two HESTIA terms:\n\n1. [`co2ToAirSoilOrganicCarbonStockChangeLandUseChange`](/term/co2ToAirSoilOrganicCarbonStockChangeLandUseChange) - stock change emissions that occur in the 20 years after a land-use change event\n2. [`co2ToAirSoilOrganicCarbonStockChangeManagementChange`](/term/co2ToAirSoilOrganicCarbonStockChangeManagementChange) - stock change emissions that occur more than 20 years after a land-use change event\n\nThe model is run as a Monte Carlo simulation with 10,000 iterations. Model result values are the row-wise `mean` of simulation results. See our guide on [Monte Carlo simulation](/guide/applying-models-monte-carlo) for more information\n\n## How the model works\n\n### Step 1. Build an annual inventory of SOC measurements\n\nAn annual inventory of `organicCarbonPerHa` [Measurement](/schema/Measurement) values is created. These values represent the amount of organic carbon stored in the soil at the **end of each inventory year**.\n\n[Measurements](/schema/Measurement) are grouped by `methodClassification`. It is critical that different methods are **never mixed** when calculating changes in carbon stock, as this could lead to large and misleading differences. Instead, the model processes each `methodClassification` separately, and includes only the emissions calculated using the **strongest available method** in the final output.\n\nOnly [Measurements](/schema/Measurement) with specific `methodClassification` values are included. All others are ignored. The valid classifications, listed from strongest to weakest, are:\n\n- `on-site physical measurement`\n- `modelled using other measurements`\n- `tier 3 model`\n- `tier 2 model`\n- `tier 1 model`\n\nEach carbon stock value must correspond to the timestamp `YYYY-12-31T23:59:59` — the end of the inventory year. If no [Measurement](/schema/Measurement) exists for this exact time, the value is estimated using linear interpolation between the closest available measurements before and after the target date.\n\n| Year | `on-site physical measurement`<sup>\\*</sup> | `tier 1 model`<sup>\\*</sup> |\n| ---- | ------------------------------------------- | --------------------------- |\n| 2002 | 48000 | - |\n| 2003 | 47000 | - |\n| 2004 | 45000 | 52350 |\n| 2005 | 44500 | 51125 |\n| 2006 | 44000 | 49900 |\n| 2007 | 43500 | - |\n\n<sup>\\*</sup>SOC stock (kg C ha<sup>-1</sup>)\n\nIn this scenario, the values of the `on-site physical measurement` column will be retained because it is the stronger `methodClassification`. The values of the `tier 1 model` will be discarded.\n\n### Step 2. Resample stock values for Monte Carlo simulation\n\nTo run the model as a Monte Carlo simulation, we need to generate an array of random samples for the `organicCarbonPerHa` stock in each inventory year. These samples are drawn from a normal distribution defined by the `value` (mean) and `sd` of each year.\n\nIdeally, we would re-use the full set of iteration results from the [`ipcc2019.organicCarbonPerHa`](./organicCarbonPerHa) model's Monto Carlo simulation. However, HESTIA nodes can only store row-wise summaries of Monte Carlo simulation results. This means the full iteration-level data is not available for use in downstream models, so we lose the correlation between years in each simulation run.\n\nTo maintain realistic, coherent simulation behaviour:\n\n- Within each simulation run (column): Values across years (rows) should be correlated. If year 0 is a high value, we expect subsequent years to also be relatively high\n- Across simulation runs (columns): Values should be independent from one another\n\nFor this, we need to generate our new random samples with correlation by treating the inventory as a time series, where:\n\n- Rows = time steps (years)\n- Columns = independent Monte Carlo runs\n\nTo model the correlation between years, we assume that similarity in stock values decreases with time. Closer years are more correlated than years further apart. This is modelled using exponential decay, with a half-life of 20 years (based on the IPCC's default transition period for carbon stock equilibrium).\n\nUsing this correlation structure, we generate samples from a multivariate normal distribution, ensuring temporal correlation within runs and independence between runs.\n\nSee the [Scipy Cookbook on Correlated Random Samples](https://scipy-cookbook.readthedocs.io/items/CorrelatedRandomSamples.html) for more information.\n\nCarbon stock values without a corresponding `sd` are given a nominal error of 75% ($2*{sd}$ as a percentage of the mean).\n\n### Step 3. Calculate the annual CO<sub>2</sub> emission (or removal) due to SOC stock change\n\nNext, the carbon stock change and the associated CO<sub>2</sub> change can be calculated for each inventory year:\n\n$\\Delta CO_2 = -1 * (C_y - C\\_{y-1}) * \\frac{44.01}{12.012}$\n\nWhere:\n\n- $\\Delta CO_2$ = the CO<sub>2</sub> emission due to carbon stock change for year $y$, kg CO<sub>2</sub> ha<sup>-1</sup>.\n- $C_y$ = the carbon stock in year $y$, kg C ha<sup>-1</sup>.\n- $C_{y-1}$ = the carbon stock in year $y-1$x, kg C ha<sup>-1</sup>.\n- $\\frac{44.01}{12.012}$ = the ratio of the atomic mass of CO<sub>$2$</sub> to C.\n\n_n.b._, the value is multiplied by $-1$ as a reduction in carbon stock is associated with an emission of CO<sub>2</sub> and vice versa.\n\n| Year | C stock (kg C ha<sup>-1</sup>) | C stock change (kg C ha<sup>-1</sup>) | CO<sub>2</sub> emission (kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---- | ------------------------------ | ------------------------------------- | ----------------------------------------------------------- |\n| 2002 | 48000 | n/a | n/a |\n| 2003 | 47000 | -1000 | 3664 |\n| 2004 | 45000 | -2000 | 7328 |\n| 2005 | 44500 | -500 | 1832 |\n| 2006 | 44000 | -500 | 1832 |\n| 2007 | 43500 | -500 | 1832 |\n\n### Step 4. Allocate the CO<sub>2</sub> emission to overlapping Cycles\n\n[Measurements](/schema/Measurement), such as `organicCarbonPerHa`, are attached to [Site](/schema/Site) nodes. In the HESTIA schema, a single [Site](/schema/Site) can be linked to multiple [Cycle](/schema/Cycle) nodes. However, emission models are run **per [Cycle](/schema/Cycle)**.\n\nTo ensure emissions are correctly allocated, the `ipcc2019.co2ToAirSoilOrganicCarbonStockChange` model gathers data from all [Cycles](/schema/Cycle) associated with the same [Site](/schema/Site).\n\nEmissions from changes in carbon stock should only be assigned to a [Cycle](/schema/Cycle) if that Cycle meaningfully overlaps with the inventory year in which the stock change occurred.\n\nIf multiple [Cycles](/schema/Cycle) overlap the same inventory year, the emission for that year is **shared proportionally** based on the number of overlapping days. For example:\n\n- `cycle-y` overlaps by 200 days\n- `cycle-z` overlaps by 100 days\n\nThen:\n\n- `cycle-y` receives **66.6%** of the emission\n- `cycle-z` receives **33.3%**\n\n_n.b._, The total share of emissions across all overlapping [Cycles](/schema/Cycle) **must always sum to 100%** to avoid under- or over-reporting.\n\n#### Emissions across multiple years\n\nIf a [Cycle](/schema/Cycle) overlaps with **multiple inventory years**, it should be assigned the **sum of its proportional shares** from each of those years.\n\n<div class=\"table-container is-responsive\">\n <table class=\"table is-fullwidth is-hoverable is-striped\">\n <tr>\n <th>Year</th>\n <th>\n Total emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n <th>Cycle ID</th>\n <th>Share of emission (%)</th>\n <th>\n Cycle emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n </tr>\n <tr>\n <td>2003</td>\n <td>3664</td>\n <td>\n cycle-a0\n </td>\n <td>100</td>\n <td>3664</td>\n </tr>\n <tr>\n <td rowspan=\"2\">2004</td>\n <td rowspan=\"2\">7328</td>\n <td>\n cycle-a1\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>\n cycle-a2\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>2005</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2006</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2007</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n </table>\n</div>\n\n| Cycle ID | `co2ToAirSoilOrganicCarbonStockChangeManagementChange`(kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---------- | ----------------------------------------------------------------------------------------- |\n| `cycle-a0` | 3664 |\n| `cycle-a1` | 3664 |\n| `cycle-a2` | 3664 |\n| `cycle-a3` | 5496 |\n\n### Step 5. Assign an emission tier\n\nThe `methodTier` assigned to the emission node on each [Cycle](/schema/Cycle) reflects the **weakest** measurement method used in its calculation.\n\nFor example, if a [Cycle](/schema/Cycle)'s final emission is calculated by summing together the emissions of two inventory years, where:\n\n- One year uses [Measurements](/schema/Measurement) with `methodClassification = tier 1 model`\n- The other year uses `methodClassification = tier 2 model`\n\nThe resulting `methodTier` will be `tier 1`, since it is the **weakest** method involved.\n\nThe mapping between Measurement `methodClassification` and Emission `methodTier` is:\n\n| Measurement `methodClassification` | Emission `methodTier` |\n| ----------------------------------- | --------------------- |\n| `on-site physical measurement` | `measured` |\n| `modelled using other measurements` | `measured` |\n| `tier 3 model` | `tier 3` |\n| `tier 2 model` | `tier 2` |\n| `tier 1 model` | `tier 1` |\n\n### Step 6. Allocate the CO<sub>2</sub> emission to land-use change or management change\n\nIn line with reporting requirements, CO<sub>2</sub> emissions from stock changes must be classified as either:\n\n- due to land-use change (LUC), or\n- due to management change.\n\nIn HESTIA, the presence or absence of a blank node matters: returning no node is not the same as returning a node with 0 emissions. To ensure consistency, the model should always return two blank nodes (one for each category) if enough data is available.\n\n**Allocation rules**\n\nIf it is known whether the emission is due to LUC or management:\n\n- Return two blank nodes:\n 1. One node with the emission and the correct term.@id\n 2. One node with 0 emissions and the other term.@id\n\nIf it is unknown:\n\n- Return one blank node, allocating the full emission to management change\n\n**Decision criteria**\n\nAllocation is based on two factors:\n\n1. **Completeness of land-use data:**\n\n - No land-use data\n - Fewer than 20 years of data\n - At least 20 years of data\n\n2. **Presence of a land-use change event:**\n - No land-use change (LUC) event detected\n - LUC event detected\n\n| | No land use data (1) | < 20 years' land use data (2) | >= 20 years' land use data (3) |\n| ----------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **No LUC event detected (a)** | allocate all emissions to management change (a1) | allocate all emissions to management change (a2) | allocate all emissions to management change **AND** add a land use change emission with value 0 (a3) |\n| **LUC event detected (b)** | n/a (b1) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b2) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b3) |\n\n## Example\n\nIn this example, we follow the SOC stock of an olive orchard, which has not changed in land-use for over 50 years. Therefore, all emissions should be allocated to management changes and a corresponding `0` emission should be allocated to land-use change.\n\nFor simplicity, the uncertainty of model inputs and outputs have been excluded.\n\n### Input\n\n#### Site\n\n```json\n{\n \"@id\": \"site-a\",\n \"@type\": \"Site\",\n \"siteType\": \"cropland\",\n \"management\": [\n {\n \"@type\": \"Management\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"oliveTree\"\n },\n \"value\": [100],\n \"startDate\": \"1960\",\n \"endDate\": \"2006\"\n }\n ],\n \"measurements\": [\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [43000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2003-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [44333.333],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2004-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [45666.666],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2005-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [47000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2006-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n }\n ]\n}\n```\n\n#### Cycle\n\n```json\n{\n \"@id\": \"cycle-a-04-06\",\n \"@type\": \"Cycle\",\n \"startDate\": \"2004\",\n \"endDate\": \"2006\",\n \"site\": {\n \"@id\": \"site-a\",\n \"@type\": \"Site\"\n },\n \"functionalUnit\": \"1 ha\"\n}\n```\n\n### Output\n\n```json\n[\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeLandUseChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [0],\n \"methodTier\": \"tier 1\"\n },\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeManagementChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [-14655.344655],\n \"methodTier\": \"tier 1\"\n }\n]\n```\n\n## Cases in which the model can run without SOC stock Measurements\n\nBecause emissions are allocated to either land-use change or management change (depending on whether a land-use change has been detected in the Site's `landCover` history), in some cases it is possible for this model to return partial results when there are no SOC stock Measurements.\n\nIf a land-use change is detected during the 20 years prior to a Cycle, all emissions should be allocated to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`). Therefore, we can allocate `0` emissions to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`) even whem we can't calculate a value for the land-use change emission. To be certain that a land-use change has occurred, we require up to 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nThe inverse is also true for when a land-use change is **not** detected in the 20 years prior to a Cycle. In this case, all emissions should be allocated to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`). Therefore, we can allocate `0` emissions to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`) even when we can't calculate a value for the management change emission. To be certain that a land-use change has **not** occurred, we require a minimum of 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nIf there is insufficient `landCover` data to determine whether a land-use change has occurred, the model will be unable to return partial results.\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Emission\">Emissions</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Emission#term\">term</a> with <a href=\"https://hestia.earth/term/co2ToAirSoilOrganicCarbonStockChangeLandUseChange\">co2ToAirSoilOrganicCarbonStockChangeLandUseChange</a> <strong>or</strong> <a href=\"https://hestia.earth/term/co2ToAirSoilOrganicCarbonStockChangeManagementChange\">co2ToAirSoilOrganicCarbonStockChangeManagementChange</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#methodModel\">methodModel</a> with <a href=\"https://hestia.earth/term/ipcc2019\">ipcc2019</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#sd\">sd</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#min\">min</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#max\">max</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#statsDefinition\">statsDefinition</a> with <code>simulated</code></li>\n<li><a href=\"https://hestia.earth/schema/Emission#observations\">observations</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#methodTier\">methodTier</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#depth\">depth</a> with <code>30</code></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li>a <a href=\"https://hestia.earth/schema/Cycle#site\">site</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Site#siteType\">siteType</a> with <code>forest</code> <strong>or</strong> <code>other natural vegetation</code> <strong>or</strong> <code>cropland</code> <strong>or</strong> <code>glass or high accessible cover</code> <strong>or</strong> <code>permanent pasture</code> and a list of <a href=\"https://hestia.earth/schema/Site#measurements\">measurements</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Measurement#value\">value</a> and <a href=\"https://hestia.earth/schema/Measurement#dates\">dates</a> and <a href=\"https://hestia.earth/schema/Measurement#depthUpper\">depthUpper</a> with <code>0</code> and <a href=\"https://hestia.earth/schema/Measurement#depthLower\">depthLower</a> with <code>30</code> and <a href=\"https://hestia.earth/schema/Measurement#term\">term</a> with <a href=\"https://hestia.earth/term/organicCarbonPerHa\">organicCarbonPerHa</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"https://hestia.earth/schema/Cycle#functionalUnit\">functionalUnit</a> with <code>1 ha</code></li>\n<li><a href=\"https://hestia.earth/schema/Cycle#endDate\">endDate</a></li>\n<li>optional:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDate\">startDate</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/emission.csv\">emission.csv</a> -&gt; <code>siteTypesAllowed</code>; <code>typesAllowed</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
1
+ {"tags":{"author":["Florian Payen"],"group":["Cycle: Emissions"],"subgroup":["Soil"],"tab":["IPCC (2019)"],"citation":["Payen, F. (2025) Soil organic carbon stock modelling on HESTIA."],"tag":["soc modelling"],"modelId":["co2ToAirSoilOrganicCarbonStockChangeLandUseChange","co2ToAirSoilOrganicCarbonStockChangeManagementChange"],"modelRequires":["organicCarbonPerHa"]},"content":"# CO2, to air, soil organic carbon stock change\n\nCarbon dioxide emissions to air, from soil organic carbon stock change. Soil organic carbon is defined as soil organic matter that is smaller than 2 mm in size.\n\n## Overview\n\nThis model calculates the annual emissions from soil organic carbon (SOC) stock changes and assigns them to Cycles that take place during those years. It can allocate these emissions to two HESTIA terms:\n\n1. [`co2ToAirSoilOrganicCarbonStockChangeLandUseChange`](/term/co2ToAirSoilOrganicCarbonStockChangeLandUseChange) - stock change emissions that occur in the 20 years after a land-use change event\n2. [`co2ToAirSoilOrganicCarbonStockChangeManagementChange`](/term/co2ToAirSoilOrganicCarbonStockChangeManagementChange) - stock change emissions that occur more than 20 years after a land-use change event\n\nThe model is run as a Monte Carlo simulation with 10,000 iterations. Model result values are the row-wise `mean` of simulation results. See our guide on [Monte Carlo simulation](/guide/models-applying-models-monte-carlo) for more information\n\n## How the model works\n\n### Step 1. Build an annual inventory of SOC measurements\n\nAn annual inventory of `organicCarbonPerHa` [Measurement](/schema/Measurement) values is created. These values represent the amount of organic carbon stored in the soil at the **end of each inventory year**.\n\n[Measurements](/schema/Measurement) are grouped by `methodClassification`. It is critical that different methods are **never mixed** when calculating changes in carbon stock, as this could lead to large and misleading differences. Instead, the model processes each `methodClassification` separately, and includes only the emissions calculated using the **strongest available method** in the final output.\n\nOnly [Measurements](/schema/Measurement) with specific `methodClassification` values are included. All others are ignored. The valid classifications, listed from strongest to weakest, are:\n\n- `on-site physical measurement`\n- `modelled using other measurements`\n- `tier 3 model`\n- `tier 2 model`\n- `tier 1 model`\n\nEach carbon stock value must correspond to the timestamp `YYYY-12-31T23:59:59` — the end of the inventory year. If no [Measurement](/schema/Measurement) exists for this exact time, the value is estimated using linear interpolation between the closest available measurements before and after the target date.\n\n| Year | `on-site physical measurement`<sup>\\*</sup> | `tier 1 model`<sup>\\*</sup> |\n| ---- | ------------------------------------------- | --------------------------- |\n| 2002 | 48000 | - |\n| 2003 | 47000 | - |\n| 2004 | 45000 | 52350 |\n| 2005 | 44500 | 51125 |\n| 2006 | 44000 | 49900 |\n| 2007 | 43500 | - |\n\n<sup>\\*</sup>SOC stock (kg C ha<sup>-1</sup>)\n\nIn this scenario, the values of the `on-site physical measurement` column will be retained because it is the stronger `methodClassification`. The values of the `tier 1 model` will be discarded.\n\n### Step 2. Resample stock values for Monte Carlo simulation\n\nTo run the model as a Monte Carlo simulation, we need to generate an array of random samples for the `organicCarbonPerHa` stock in each inventory year. These samples are drawn from a normal distribution defined by the `value` (mean) and `sd` of each year.\n\nIdeally, we would re-use the full set of iteration results from the [`ipcc2019.organicCarbonPerHa`](./organicCarbonPerHa) model's Monto Carlo simulation. However, HESTIA nodes can only store row-wise summaries of Monte Carlo simulation results. This means the full iteration-level data is not available for use in downstream models, so we lose the correlation between years in each simulation run.\n\nTo maintain realistic, coherent simulation behaviour:\n\n- Within each simulation run (column): Values across years (rows) should be correlated. If year 0 is a high value, we expect subsequent years to also be relatively high\n- Across simulation runs (columns): Values should be independent from one another\n\nFor this, we need to generate our new random samples with correlation by treating the inventory as a time series, where:\n\n- Rows = time steps (years)\n- Columns = independent Monte Carlo runs\n\nTo model the correlation between years, we assume that similarity in stock values decreases with time. Closer years are more correlated than years further apart. This is modelled using exponential decay, with a half-life of 20 years (based on the IPCC's default transition period for carbon stock equilibrium).\n\nUsing this correlation structure, we generate samples from a multivariate normal distribution, ensuring temporal correlation within runs and independence between runs.\n\nSee the [Scipy Cookbook on Correlated Random Samples](https://scipy-cookbook.readthedocs.io/items/CorrelatedRandomSamples.html) for more information.\n\nCarbon stock values without a corresponding `sd` are given a nominal error of 75% ($2*{sd}$ as a percentage of the mean).\n\n### Step 3. Calculate the annual CO<sub>2</sub> emission (or removal) due to SOC stock change\n\nNext, the carbon stock change and the associated CO<sub>2</sub> change can be calculated for each inventory year:\n\n$\\Delta CO_2 = -1 * (C_y - C\\_{y-1}) * \\frac{44.01}{12.012}$\n\nWhere:\n\n- $\\Delta CO_2$ = the CO<sub>2</sub> emission due to carbon stock change for year $y$, kg CO<sub>2</sub> ha<sup>-1</sup>.\n- $C_y$ = the carbon stock in year $y$, kg C ha<sup>-1</sup>.\n- $C_{y-1}$ = the carbon stock in year $y-1$x, kg C ha<sup>-1</sup>.\n- $\\frac{44.01}{12.012}$ = the ratio of the atomic mass of CO<sub>$2$</sub> to C.\n\n_n.b._, the value is multiplied by $-1$ as a reduction in carbon stock is associated with an emission of CO<sub>2</sub> and vice versa.\n\n| Year | C stock (kg C ha<sup>-1</sup>) | C stock change (kg C ha<sup>-1</sup>) | CO<sub>2</sub> emission (kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---- | ------------------------------ | ------------------------------------- | ----------------------------------------------------------- |\n| 2002 | 48000 | n/a | n/a |\n| 2003 | 47000 | -1000 | 3664 |\n| 2004 | 45000 | -2000 | 7328 |\n| 2005 | 44500 | -500 | 1832 |\n| 2006 | 44000 | -500 | 1832 |\n| 2007 | 43500 | -500 | 1832 |\n\n### Step 4. Allocate the CO<sub>2</sub> emission to overlapping Cycles\n\n[Measurements](/schema/Measurement), such as `organicCarbonPerHa`, are attached to [Site](/schema/Site) nodes. In the HESTIA schema, a single [Site](/schema/Site) can be linked to multiple [Cycle](/schema/Cycle) nodes. However, emission models are run **per [Cycle](/schema/Cycle)**.\n\nTo ensure emissions are correctly allocated, the `ipcc2019.co2ToAirSoilOrganicCarbonStockChange` model gathers data from all [Cycles](/schema/Cycle) associated with the same [Site](/schema/Site).\n\nEmissions from changes in carbon stock should only be assigned to a [Cycle](/schema/Cycle) if that Cycle meaningfully overlaps with the inventory year in which the stock change occurred.\n\nIf multiple [Cycles](/schema/Cycle) overlap the same inventory year, the emission for that year is **shared proportionally** based on the number of overlapping days. For example:\n\n- `cycle-y` overlaps by 200 days\n- `cycle-z` overlaps by 100 days\n\nThen:\n\n- `cycle-y` receives **66.6%** of the emission\n- `cycle-z` receives **33.3%**\n\n_n.b._, The total share of emissions across all overlapping [Cycles](/schema/Cycle) **must always sum to 100%** to avoid under- or over-reporting.\n\n#### Emissions across multiple years\n\nIf a [Cycle](/schema/Cycle) overlaps with **multiple inventory years**, it should be assigned the **sum of its proportional shares** from each of those years.\n\n<div class=\"table-container is-responsive\">\n <table class=\"table is-fullwidth is-hoverable is-striped\">\n <tr>\n <th>Year</th>\n <th>\n Total emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n <th>Cycle ID</th>\n <th>Share of emission (%)</th>\n <th>\n Cycle emission(kg CO<sub>2</sub> ha<sup>-1</sup>)\n </th>\n </tr>\n <tr>\n <td>2003</td>\n <td>3664</td>\n <td>\n cycle-a0\n </td>\n <td>100</td>\n <td>3664</td>\n </tr>\n <tr>\n <td rowspan=\"2\">2004</td>\n <td rowspan=\"2\">7328</td>\n <td>\n cycle-a1\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>\n cycle-a2\n </td>\n <td>50</td>\n <td>3664</td>\n </tr>\n <tr>\n <td>2005</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2006</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n <tr>\n <td>2007</td>\n <td>1832</td>\n <td>\n cycle-a3\n </td>\n <td>100</td>\n <td>1832</td>\n </tr>\n </table>\n</div>\n\n| Cycle ID | `co2ToAirSoilOrganicCarbonStockChangeManagementChange`(kg CO<sub>2</sub> ha<sup>-1</sup>) |\n| ---------- | ----------------------------------------------------------------------------------------- |\n| `cycle-a0` | 3664 |\n| `cycle-a1` | 3664 |\n| `cycle-a2` | 3664 |\n| `cycle-a3` | 5496 |\n\n### Step 5. Assign an emission tier\n\nThe `methodTier` assigned to the emission node on each [Cycle](/schema/Cycle) reflects the **weakest** measurement method used in its calculation.\n\nFor example, if a [Cycle](/schema/Cycle)'s final emission is calculated by summing together the emissions of two inventory years, where:\n\n- One year uses [Measurements](/schema/Measurement) with `methodClassification = tier 1 model`\n- The other year uses `methodClassification = tier 2 model`\n\nThe resulting `methodTier` will be `tier 1`, since it is the **weakest** method involved.\n\nThe mapping between Measurement `methodClassification` and Emission `methodTier` is:\n\n| Measurement `methodClassification` | Emission `methodTier` |\n| ----------------------------------- | --------------------- |\n| `on-site physical measurement` | `measured` |\n| `modelled using other measurements` | `measured` |\n| `tier 3 model` | `tier 3` |\n| `tier 2 model` | `tier 2` |\n| `tier 1 model` | `tier 1` |\n\n### Step 6. Allocate the CO<sub>2</sub> emission to land-use change or management change\n\nIn line with reporting requirements, CO<sub>2</sub> emissions from stock changes must be classified as either:\n\n- due to land-use change (LUC), or\n- due to management change.\n\nIn HESTIA, the presence or absence of a blank node matters: returning no node is not the same as returning a node with 0 emissions. To ensure consistency, the model should always return two blank nodes (one for each category) if enough data is available.\n\n**Allocation rules**\n\nIf it is known whether the emission is due to LUC or management:\n\n- Return two blank nodes:\n 1. One node with the emission and the correct term.@id\n 2. One node with 0 emissions and the other term.@id\n\nIf it is unknown:\n\n- Return one blank node, allocating the full emission to management change\n\n**Decision criteria**\n\nAllocation is based on two factors:\n\n1. **Completeness of land-use data:**\n\n - No land-use data\n - Fewer than 20 years of data\n - At least 20 years of data\n\n2. **Presence of a land-use change event:**\n - No land-use change (LUC) event detected\n - LUC event detected\n\n| | No land use data (1) | < 20 years' land use data (2) | >= 20 years' land use data (3) |\n| ----------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **No LUC event detected (a)** | allocate all emissions to management change (a1) | allocate all emissions to management change (a2) | allocate all emissions to management change **AND** add a land use change emission with value 0 (a3) |\n| **LUC event detected (b)** | n/a (b1) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b2) | allocate all emissions to land use change **AND** add a management change emission with value 0 (b3) |\n\n## Example\n\nIn this example, we follow the SOC stock of an olive orchard, which has not changed in land-use for over 50 years. Therefore, all emissions should be allocated to management changes and a corresponding `0` emission should be allocated to land-use change.\n\nFor simplicity, the uncertainty of model inputs and outputs have been excluded.\n\n### Input\n\n#### Site\n\n```json\n{\n \"@id\": \"site-a\",\n \"@type\": \"Site\",\n \"siteType\": \"cropland\",\n \"management\": [\n {\n \"@type\": \"Management\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"oliveTree\"\n },\n \"value\": [100],\n \"startDate\": \"1960\",\n \"endDate\": \"2006\"\n }\n ],\n \"measurements\": [\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [43000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2003-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [44333.333],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2004-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [45666.666],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2005-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n },\n {\n \"@type\": \"Measurement\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"organicCarbonPerHa\"\n },\n \"value\": [47000],\n \"method\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depthUpper\": 0,\n \"depthLower\": 30,\n \"dates\": [\"2006-12-31\"],\n \"methodClassification\": \"tier 1 model\"\n }\n ]\n}\n```\n\n#### Cycle\n\n```json\n{\n \"@id\": \"cycle-a-04-06\",\n \"@type\": \"Cycle\",\n \"startDate\": \"2004\",\n \"endDate\": \"2006\",\n \"site\": {\n \"@id\": \"site-a\",\n \"@type\": \"Site\"\n },\n \"functionalUnit\": \"1 ha\"\n}\n```\n\n### Output\n\n```json\n[\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeLandUseChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [0],\n \"methodTier\": \"tier 1\"\n },\n {\n \"@type\": \"Emission\",\n \"term\": {\n \"@type\": \"Term\",\n \"@id\": \"co2ToAirSoilCarbonStockChangeManagementChange\"\n },\n \"methodModel\": {\n \"@type\": \"Term\",\n \"@id\": \"ipcc2019\"\n },\n \"depth\": 30,\n \"value\": [-14655.344655],\n \"methodTier\": \"tier 1\"\n }\n]\n```\n\n## Cases in which the model can run without SOC stock Measurements\n\nBecause emissions are allocated to either land-use change or management change (depending on whether a land-use change has been detected in the Site's `landCover` history), in some cases it is possible for this model to return partial results when there are no SOC stock Measurements.\n\nIf a land-use change is detected during the 20 years prior to a Cycle, all emissions should be allocated to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`). Therefore, we can allocate `0` emissions to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`) even whem we can't calculate a value for the land-use change emission. To be certain that a land-use change has occurred, we require up to 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nThe inverse is also true for when a land-use change is **not** detected in the 20 years prior to a Cycle. In this case, all emissions should be allocated to the management change emission term (`co2ToAirSoilCarbonStockChangeManagementChange`). Therefore, we can allocate `0` emissions to the land-use change emission term (`co2ToAirSoilCarbonStockChangeLandUseChange`) even when we can't calculate a value for the management change emission. To be certain that a land-use change has **not** occurred, we require a minimum of 20 year's `landCover` data prior to the Cycle's `startDate`.\n\nIf there is insufficient `landCover` data to determine whether a land-use change has occurred, the model will be unable to return partial results.\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Emission\">Emissions</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Emission#term\">term</a> with <a href=\"https://hestia.earth/term/co2ToAirSoilOrganicCarbonStockChangeLandUseChange\">co2ToAirSoilOrganicCarbonStockChangeLandUseChange</a> <strong>or</strong> <a href=\"https://hestia.earth/term/co2ToAirSoilOrganicCarbonStockChangeManagementChange\">co2ToAirSoilOrganicCarbonStockChangeManagementChange</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#methodModel\">methodModel</a> with <a href=\"https://hestia.earth/term/ipcc2019\">ipcc2019</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#sd\">sd</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#min\">min</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#max\">max</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#statsDefinition\">statsDefinition</a> with <code>simulated</code></li>\n<li><a href=\"https://hestia.earth/schema/Emission#observations\">observations</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#methodTier\">methodTier</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#depth\">depth</a> with <code>30</code></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li>a <a href=\"https://hestia.earth/schema/Cycle#site\">site</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Site#siteType\">siteType</a> with <code>forest</code> <strong>or</strong> <code>other natural vegetation</code> <strong>or</strong> <code>cropland</code> <strong>or</strong> <code>glass or high accessible cover</code> <strong>or</strong> <code>permanent pasture</code> and a list of <a href=\"https://hestia.earth/schema/Site#measurements\">measurements</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Measurement#value\">value</a> and <a href=\"https://hestia.earth/schema/Measurement#dates\">dates</a> and <a href=\"https://hestia.earth/schema/Measurement#depthUpper\">depthUpper</a> with <code>0</code> and <a href=\"https://hestia.earth/schema/Measurement#depthLower\">depthLower</a> with <code>30</code> and <a href=\"https://hestia.earth/schema/Measurement#term\">term</a> with <a href=\"https://hestia.earth/term/organicCarbonPerHa\">organicCarbonPerHa</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"https://hestia.earth/schema/Cycle#functionalUnit\">functionalUnit</a> with <code>1 ha</code></li>\n<li><a href=\"https://hestia.earth/schema/Cycle#endDate\">endDate</a></li>\n<li>optional:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDate\">startDate</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/emission.csv\">emission.csv</a> -&gt; <code>siteTypesAllowed</code>; <code>typesAllowed</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
@@ -0,0 +1 @@
1
+ {"tags":{"author":["Florian Payen"],"group":["Cycle: Emissions"],"subgroup":["Soil"],"tab":["IPCC (2019)"],"tag":["soc modelling"]},"content":"# N2O, to air, diminishing soil carbon stocks, direct\n\nThis model returns the amounts of N<sub>2</sub>O emitted due to diminishing soil carbon stocks according to the [IPCC (2019), volume 4, chapter 11](https://www.ipcc-nggip.iges.or.jp/public/2019rf/pdf/4_Volume4/19R_V4_Ch11_Soils_N2O_CO2.pdf) guidelines:\n\n1. [N<sub>2</sub>O, to air, diminishing soil carbon stocks, land use change, direct](/term/n2OToAirDiminishingSoilCarbonStocksLandUseChangeDirect) - Nitrous oxide emissions to air, released from soils with diminishing soil organic C stocks, caused by land use change (e.g., a change from forest land to cropland)\n2. [N<sub>2</sub>O, to air, diminishing soil carbon stocks, management change, direct](/term/n2OToAirDiminishingSoilCarbonStocksManagementChangeDirect) - Nitrous oxide emissions to air, released from soils with diminishing soil organic C stocks, caused by changes in Site management\n\nCurrently, this model can only calculate emissions from croplands, because the IPCC does not provide model factors for other land uses.\n\n## Description\n\nWhere soil C is lost through oxidation as a result of land-use or management change, this loss will be accompanied by a simultaneous mineralisation of N. This N is regarded as an additional source of N available for conversion to N<sub>2</sub>O. The same default emission factor is applied to mineralised N from soil organic matter loss as for direct emissions from fertiliser and organic N inputs to agricultural land.\n\nBecause this model represents N<sub>2</sub>O from diminishing SOC stocks, only CO<sub>2</sub> emissions (i.e., emissions with a positive value) should be considered, and not CO<sub>2</sub> removals (i.e., emissions with a negative value). CO<sub>2</sub> removals from increasing SOC stocks should be allocated a `0` emission for N<sub>2</sub>O.\n\n### Equation 11.8 - N mineralised in mineral soils as a result of loss of soil C through change in land use or management\n\n$F_{SOM} = \\sum\\limits_{LU} [(\\Delta C_{\\text{Mineral, LU}} \\cdot \\frac{1}{R}) \\cdot 10000]$\n\n| Variable | Description |\n| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| $F_{SOM}$ | The net annual amount of N mineralised in mineral soils as a result of loss of soil carbon through change in land use or management, kg N |\n| $\\Delta C_{\\text{Mineral, LU}}$ | Average annual loss of soil carbon for each land-use type $LU$, tonnes C |\n| $R$ | C:N ratio of the soil organic matter, unitless |\n\nBecause N<sub>2</sub>O emission factors and C:N ratios are available with associated uncertainty data, the model can be run as a Monte Carlo simulation with 1000 iterations to propagate uncertainty to results.\n\n### Default C:N ratios\n\n| Forest Land or Grassland -> Cropland | Cropland Remaining Cropland |\n| ------------------------------------ | --------------------------- |\n| 15 (10 - 30) | 10 (8 - 15) |\n\n## How the model works\n\n1. Retrieve the Cycle's `co2ToAirSoilOrganicCarbonStockChangeLandUseChange` and `co2ToAirSoilOrganicCarbonStockChangeManagementChange` nodes, and extract their values.\n\n2. Retrieve the N<sub>2</sub>O emission factor:\n\n - If the Cycle's primary product is flooded rice, retrieve the emission factor from the water regime lookup\n - Else, retrieve the emission factor using the Cycle's eco-climate zone\n\n3. Retrieve the relevant C:N ratios ( $R$ ):\n\n - For `co2ToAirSoilOrganicCarbonStockChangeLandUseChange`, use a ratio of 15 (10 - 30)\n - For `co2ToAirSoilOrganicCarbonStockChangeManagementChange`, use a ratio of 10 (8 - 15)\n\n4. Generate 1000 randomised samples for the emission factor and C:N ratios, using the `value` (mean), `sd`, `min` and `max` provided. Missing standard deviations can be estimated via `(min - max) / 4`, which is consistent with other N<sub>2</sub>O models across HESTIA.\n\n5. Convert CO<sub>2</sub> emissions to N<sub>2</sub>O emissions by multiplying the emission by:\n\n - The atomic mass ratio of CO<sub>2</sub>:C\n - The reciprocal of the C:N ratio ( $\\frac{1}{R}$ )\n - The N<sub>2</sub>O emission factor\n - and the atomic mass ratio of N:N<sub>2</sub>O\n\n6. If the calculated N<sub>2</sub>O emission is less than zero, set it to zero.\n\n7. Calculate descriptive statistics (`value` (mean), `sd`, `min` and `max`) for each emission and return them:\n\n - Emissions calculated from `co2ToAirSoilOrganicCarbonStockChangeLandUseChange` should be assigned to `n2OToAirDiminishingSoilCarbonStocksLandUseChangeDirect`\n - Emissions calculated from `co2ToAirSoilOrganicCarbonStockChangeManagementChange` should be assigned to `n2OToAirDiminishingSoilCarbonStocksManagementChangeDirect`\n\n\n\n\n\n"}
@@ -0,0 +1 @@
1
+ {"tags":{"author":["Florian Payen"],"group":["Cycle: Emissions"],"subgroup":["Soil"],"tab":["IPCC (2019)"],"tag":["soc modelling"],"modelId":["n2OToAirDiminishingSoilCarbonStocksLandUseChangeDirect","n2OToAirDiminishingSoilCarbonStocksManagementChangeDirect"],"modelRequires":["co2ToAirSoilOrganicCarbonStockChangeLandUseChange","co2ToAirSoilOrganicCarbonStockChangeManagementChange","ecoClimateZone","riceGrainInHuskFlooded"]},"content":"# N2O, to air, diminishing soil carbon stocks, direct\n\nThis model returns the amounts of N<sub>2</sub>O emitted due to diminishing soil carbon stocks according to the [IPCC (2019), volume 4, chapter 11](https://www.ipcc-nggip.iges.or.jp/public/2019rf/pdf/4_Volume4/19R_V4_Ch11_Soils_N2O_CO2.pdf) guidelines:\n\n1. [N<sub>2</sub>O, to air, diminishing soil carbon stocks, land use change, direct](/term/n2OToAirDiminishingSoilCarbonStocksLandUseChangeDirect) - Nitrous oxide emissions to air, released from soils with diminishing soil organic C stocks, caused by land use change (e.g., a change from forest land to cropland)\n2. [N<sub>2</sub>O, to air, diminishing soil carbon stocks, management change, direct](/term/n2OToAirDiminishingSoilCarbonStocksManagementChangeDirect) - Nitrous oxide emissions to air, released from soils with diminishing soil organic C stocks, caused by changes in Site management\n\nCurrently, this model can only calculate emissions from croplands, because the IPCC does not provide model factors for other land uses.\n\n## Description\n\nWhere soil C is lost through oxidation as a result of land-use or management change, this loss will be accompanied by a simultaneous mineralisation of N. This N is regarded as an additional source of N available for conversion to N<sub>2</sub>O. The same default emission factor is applied to mineralised N from soil organic matter loss as for direct emissions from fertiliser and organic N inputs to agricultural land.\n\nBecause this model represents N<sub>2</sub>O from diminishing SOC stocks, only CO<sub>2</sub> emissions (i.e., emissions with a positive value) should be considered, and not CO<sub>2</sub> removals (i.e., emissions with a negative value). CO<sub>2</sub> removals from increasing SOC stocks should be allocated a `0` emission for N<sub>2</sub>O.\n\n### Equation 11.8 - N mineralised in mineral soils as a result of loss of soil C through change in land use or management\n\n$F_{SOM} = \\sum\\limits_{LU} [(\\Delta C_{\\text{Mineral, LU}} \\cdot \\frac{1}{R}) \\cdot 10000]$\n\n| Variable | Description |\n| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| $F_{SOM}$ | The net annual amount of N mineralised in mineral soils as a result of loss of soil carbon through change in land use or management, kg N |\n| $\\Delta C_{\\text{Mineral, LU}}$ | Average annual loss of soil carbon for each land-use type $LU$, tonnes C |\n| $R$ | C:N ratio of the soil organic matter, unitless |\n\nBecause N<sub>2</sub>O emission factors and C:N ratios are available with associated uncertainty data, the model can be run as a Monte Carlo simulation with 1000 iterations to propagate uncertainty to results.\n\n### Default C:N ratios\n\n| Forest Land or Grassland -> Cropland | Cropland Remaining Cropland |\n| ------------------------------------ | --------------------------- |\n| 15 (10 - 30) | 10 (8 - 15) |\n\n## How the model works\n\n1. Retrieve the Cycle's `co2ToAirSoilOrganicCarbonStockChangeLandUseChange` and `co2ToAirSoilOrganicCarbonStockChangeManagementChange` nodes, and extract their values.\n\n2. Retrieve the N<sub>2</sub>O emission factor:\n\n - If the Cycle's primary product is flooded rice, retrieve the emission factor from the water regime lookup\n - Else, retrieve the emission factor using the Cycle's eco-climate zone\n\n3. Retrieve the relevant C:N ratios ( $R$ ):\n\n - For `co2ToAirSoilOrganicCarbonStockChangeLandUseChange`, use a ratio of 15 (10 - 30)\n - For `co2ToAirSoilOrganicCarbonStockChangeManagementChange`, use a ratio of 10 (8 - 15)\n\n4. Generate 1000 randomised samples for the emission factor and C:N ratios, using the `value` (mean), `sd`, `min` and `max` provided. Missing standard deviations can be estimated via `(min - max) / 4`, which is consistent with other N<sub>2</sub>O models across HESTIA.\n\n5. Convert CO<sub>2</sub> emissions to N<sub>2</sub>O emissions by multiplying the emission by:\n\n - The atomic mass ratio of CO<sub>2</sub>:C\n - The reciprocal of the C:N ratio ( $\\frac{1}{R}$ )\n - The N<sub>2</sub>O emission factor\n - and the atomic mass ratio of N:N<sub>2</sub>O\n\n6. If the calculated N<sub>2</sub>O emission is less than zero, set it to zero.\n\n7. Calculate descriptive statistics (`value` (mean), `sd`, `min` and `max`) for each emission and return them:\n\n - Emissions calculated from `co2ToAirSoilOrganicCarbonStockChangeLandUseChange` should be assigned to `n2OToAirDiminishingSoilCarbonStocksLandUseChangeDirect`\n - Emissions calculated from `co2ToAirSoilOrganicCarbonStockChangeManagementChange` should be assigned to `n2OToAirDiminishingSoilCarbonStocksManagementChangeDirect`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Emission\">Emissions</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Emission#term\">term</a> with <a href=\"https://hestia.earth/term/n2OToAirDiminishingSoilCarbonStocksLandUseChangeDirect\">n2OToAirDiminishingSoilCarbonStocksLandUseChangeDirect</a> <strong>or</strong> <a href=\"https://hestia.earth/term/n2OToAirDiminishingSoilCarbonStocksManagementChangeDirect\">n2OToAirDiminishingSoilCarbonStocksManagementChangeDirect</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#methodModel\">methodModel</a> with <a href=\"https://hestia.earth/term/ipcc2019\">ipcc2019</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#min\">min</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#max\">max</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#sd\">sd</a></li>\n<li><a href=\"https://hestia.earth/schema/Emission#methodTier\">methodTier</a> with <code>tier 1</code></li>\n<li><a href=\"https://hestia.earth/schema/Emission#statsDefinition\">statsDefinition</a> with <code>simulated</code></li>\n<li><a href=\"https://hestia.earth/schema/Emission#methodModelDescription\">methodModelDescription</a> with <code>Aggregated version</code> <strong>or</strong> <code>Disaggregated version</code></li>\n<li><a href=\"https://hestia.earth/schema/Emission#depth\">depth</a> with <code>30</code></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li>a <a href=\"https://hestia.earth/schema/Cycle#site\">site</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Site#siteType\">siteType</a> with <code>forest</code> <strong>or</strong> <code>other natural vegetation</code> <strong>or</strong> <code>cropland</code> <strong>or</strong> <code>glass or high accessible cover</code> <strong>or</strong> <code>permanent pasture</code></li>\n</ul>\n</li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#emissions\">emissions</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Emission#value\">value</a> and <a href=\"https://hestia.earth/schema/Emission#term\">term</a> with <a href=\"https://hestia.earth/term/co2ToAirSoilOrganicCarbonStockChangeLandUseChange\">co2ToAirSoilOrganicCarbonStockChangeLandUseChange</a> and <a href=\"https://hestia.earth/schema/Emission#depth\">depth</a> with <code>30</code></li>\n<li><a href=\"https://hestia.earth/schema/Emission#value\">value</a> and <a href=\"https://hestia.earth/schema/Emission#term\">term</a> with <a href=\"https://hestia.earth/term/co2ToAirSoilOrganicCarbonStockChangeManagementChange\">co2ToAirSoilOrganicCarbonStockChangeManagementChange</a> and <a href=\"https://hestia.earth/schema/Emission#depth\">depth</a> with <code>30</code></li>\n</ul>\n</li>\n<li>optional:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#endDate\">endDate</a></li>\n<li>a <a href=\"https://hestia.earth/schema/Cycle#site\">site</a> with:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Site#measurements\">measurements</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Measurement#value\">value</a> and <a href=\"https://hestia.earth/schema/Measurement#term\">term</a> with <a href=\"https://hestia.earth/term/ecoClimateZone\">ecoClimateZone</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#products\">products</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Product#term\">term</a> with <a href=\"https://hestia.earth/term/riceGrainInHuskFlooded\">riceGrainInHuskFlooded</a></li>\n</ul>\n</li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#practices\">practices</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Practice#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=waterRegime\">waterRegime</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/waterRegime.csv\">waterRegime.csv</a> -&gt; <code>IPCC_2019_N2O_rice</code>; <code>IPCC_2019_N2O_rice-min</code>; <code>IPCC_2019_N2O_rice-max</code></li>\n<li><a href=\"https://hestia.earth/glossary/lookups/emission.csv\">emission.csv</a> -&gt; <code>siteTypesAllowed</code>; <code>typesAllowed</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
@@ -1 +1 @@
1
- {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"]},"content":"# Cycle Duration\n\nThis model calculates the cycle duration using:\n* the `endDate` and the `startDate` if both are provided with a day precision;\n* for temporary crops, using the `croppingIntensity` if provided;\n* for permanent crops, the duration is set to `365`.\n\n\n\n"}
1
+ {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"]},"content":"# Cycle Duration\n\nThis model calculates the cycle duration using:\n* the `endDate` and the `startDate` if both are provided with a day precision;\n* for temporary crops, using the `croppingIntensity` if provided;\n* for permanent crops, the duration is set to `365`.\n\nCycles are understood to take place from the start of the `startDate` (i.e., 00:00:00) to the end of the `endDate` (i.e., 23:59:59). `cycleDuration` is **inclusive** of a Cycle's `endDate`; therefore a Cycle with `startDate` = `2001-01-01` and `endDate` = `2001-12-31` will have a `cycleDuration` = `365`.\n\n\n\n"}
@@ -1 +1 @@
1
- {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"],"modelId":["cycleDuration"],"modelRequires":["croppingIntensity"]},"content":"# Cycle Duration\n\nThis model calculates the cycle duration using:\n* the `endDate` and the `startDate` if both are provided with a day precision;\n* for temporary crops, using the `croppingIntensity` if provided;\n* for permanent crops, the duration is set to `365`.\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>a <code>number</code> or <code>None</code> if requirements are not met</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#endDate\">endDate</a></li>\n<li>optional:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDate\">startDate</a></li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#products\">products</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Product#primary\">primary</a> = <code>True</code> and <a href=\"https://hestia.earth/schema/Product#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=crop\">crop</a></li>\n</ul>\n</li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#practices\">practices</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Practice#value\">value</a> and <a href=\"https://hestia.earth/schema/Practice#term\">term</a> with <a href=\"https://hestia.earth/term/croppingIntensity\">croppingIntensity</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/crop.csv\">crop.csv</a> -&gt; <code>cropGroupingFAO</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
1
+ {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"],"modelId":["cycleDuration"],"modelRequires":["croppingIntensity"]},"content":"# Cycle Duration\n\nThis model calculates the cycle duration using:\n* the `endDate` and the `startDate` if both are provided with a day precision;\n* for temporary crops, using the `croppingIntensity` if provided;\n* for permanent crops, the duration is set to `365`.\n\nCycles are understood to take place from the start of the `startDate` (i.e., 00:00:00) to the end of the `endDate` (i.e., 23:59:59). `cycleDuration` is **inclusive** of a Cycle's `endDate`; therefore a Cycle with `startDate` = `2001-01-01` and `endDate` = `2001-12-31` will have a `cycleDuration` = `365`.\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>a <code>number</code> or <code>None</code> if requirements are not met</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#endDate\">endDate</a></li>\n<li>optional:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDate\">startDate</a></li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#products\">products</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Product#primary\">primary</a> = <code>True</code> and <a href=\"https://hestia.earth/schema/Product#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=crop\">crop</a></li>\n</ul>\n</li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#practices\">practices</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Practice#value\">value</a> and <a href=\"https://hestia.earth/schema/Practice#term\">term</a> with <a href=\"https://hestia.earth/term/croppingIntensity\">croppingIntensity</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/crop.csv\">crop.csv</a> -&gt; <code>cropGroupingFAO</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
@@ -1 +1 @@
1
- {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"]},"content":"# Cycle Site Duration\n\nThis model calculates the `siteDuration` on the `Cycle` to the same value as `cycleDuration` when only a single `Site` is present.\n\nNote: on `crop` production cycles:\n* For temporary crops, gap fill only when `startDateDefinition` = `harvest of previous crop`.\n* For permanent crops, no restriction applies.\n\n\n\n"}
1
+ {"tags":{"author":["Guillaume Royer","Florian Payen"],"group":["Cycle: General"],"tab":["Cycle"]},"content":"# Cycle Site Duration\n\nThis model calculates the `siteDuration` on the `Cycle` to the same value as `cycleDuration` when only a single `Site` is present.\n\nNote: on `crop` production cycles:\n* For temporary crops:\n * If `startDateDefinition` = `harvest of previous crop`, the `siteDuration` will be equal to the `cycleDuration`.\n * If `startDateDefinition` = `soil preparation date`, `sowing date` or `transplanting date`, the `siteDuration` will be equal to the `cycleDuration` + `shortFallowDuration`. If the `shortFallowDuration` is not specified in the Cycle's `practices`, the model will not run.\n * If `startDateDefinition` = `start of year` or `one year prior`, the model will not run.\n* For permanent crops, no restriction applies.\n\n\n\n\n"}
@@ -1 +1 @@
1
- {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"],"modelId":["siteDuration"]},"content":"# Cycle Site Duration\n\nThis model calculates the `siteDuration` on the `Cycle` to the same value as `cycleDuration` when only a single `Site` is present.\n\nNote: on `crop` production cycles:\n* For temporary crops, gap fill only when `startDateDefinition` = `harvest of previous crop`.\n* For permanent crops, no restriction applies.\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>the duration as a <code>number</code></li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#cycleDuration\">cycleDuration</a> <code>&gt; 0</code></li>\n<li>none of:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#otherSites\">otherSites</a></li>\n</ul>\n</li>\n<li>optional:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#products\">products</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Product#primary\">primary</a> = <code>True</code> and <a href=\"https://hestia.earth/schema/Product#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=crop\">crop</a></li>\n</ul>\n</li>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDateDefinition\">startDateDefinition</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n \n \n</div>"}
1
+ {"tags":{"author":["Guillaume Royer","Florian Payen"],"group":["Cycle: General"],"tab":["Cycle"],"modelId":["siteDuration"],"modelRequires":["shortFallowDuration"]},"content":"# Cycle Site Duration\n\nThis model calculates the `siteDuration` on the `Cycle` to the same value as `cycleDuration` when only a single `Site` is present.\n\nNote: on `crop` production cycles:\n* For temporary crops:\n * If `startDateDefinition` = `harvest of previous crop`, the `siteDuration` will be equal to the `cycleDuration`.\n * If `startDateDefinition` = `soil preparation date`, `sowing date` or `transplanting date`, the `siteDuration` will be equal to the `cycleDuration` + `shortFallowDuration`. If the `shortFallowDuration` is not specified in the Cycle's `practices`, the model will not run.\n * If `startDateDefinition` = `start of year` or `one year prior`, the model will not run.\n* For permanent crops, no restriction applies.\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>the duration as a <code>number</code></li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#cycleDuration\">cycleDuration</a> <code>&gt; 0</code></li>\n<li>none of:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#otherSites\">otherSites</a></li>\n</ul>\n</li>\n<li>optional:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#products\">products</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Product#primary\">primary</a> = <code>True</code> and <a href=\"https://hestia.earth/schema/Product#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=crop\">crop</a></li>\n</ul>\n</li>\n<li>either:<ul>\n<li>if startDateDefinition is <code>harvest of previous crop</code>, no further properties are required:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDateDefinition\">startDateDefinition</a> with <code>harvest of previous crop</code></li>\n</ul>\n</li>\n<li>if startDateDefinition is <code>soil preparation date</code>, <code>sowing date</code> or <code>transplanting date</code>, further properties are required:<ul>\n<li>a <a href=\"https://hestia.earth/schema/Cycle#startDateDefinition\">startDateDefinition</a> = <code>soil preparation date</code> <strong>or</strong> <code>sowing date</code> <strong>or</strong> <code>transplanting date</code></li>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#practices\">practices</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Practice#term\">term</a> with <a href=\"https://hestia.earth/term/shortFallowDuration\">shortFallowDuration</a> and <a href=\"https://hestia.earth/schema/Practice#value\">value</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/crop.csv\">crop.csv</a> -&gt; <code>cropGroupingFAO</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
@@ -1 +1 @@
1
- {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"]},"content":"# Cycle Start Date\n\nThis model sets the [Cycle startDate](/schema/Cycle#startDate) based on:\n* the `cycleDuration` and the `endDate` if it has been provided to a day precision (e.g., `2000-01-01`);\n* if no `cycleDuration` is provided, and the `startDate` is set to month precision (e.g., `2000-01`), assumed it started on the 15th of the month.\n\n\n\n"}
1
+ {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"]},"content":"# Cycle Start Date\n\nThis model sets the [Cycle startDate](/schema/Cycle#startDate) based on:\n* the `cycleDuration` and the `endDate` if it has been provided to a day precision (e.g., `2000-01-01`);\n* if no `cycleDuration` is provided, and the `startDate` is set to month precision (e.g., `2000-01`), assumed it started on the 15th of the month.\n\nCycles are understood to take place from the start of the `startDate` (i.e., 00:00:00) to the end of the `endDate` (i.e., 23:59:59). `cycleDuration` is **inclusive** of a Cycle's `endDate`; therefore a Cycle with `endDate` = `2001-12-31` and `cycleDuration` = `365` will have a `startDate` = `2001-01-01`.\n\n\n\n"}
@@ -1 +1 @@
1
- {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"],"modelId":["startDate"]},"content":"# Cycle Start Date\n\nThis model sets the [Cycle startDate](/schema/Cycle#startDate) based on:\n* the `cycleDuration` and the `endDate` if it has been provided to a day precision (e.g., `2000-01-01`);\n* if no `cycleDuration` is provided, and the `startDate` is set to month precision (e.g., `2000-01`), assumed it started on the 15th of the month.\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>The startDate as a string</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li>optional:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDate\">startDate</a> with <code>month precision</code></li>\n<li><a href=\"https://hestia.earth/schema/Cycle#endDate\">endDate</a> with <code>day precision</code></li>\n<li><a href=\"https://hestia.earth/schema/Cycle#cycleDuration\">cycleDuration</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n \n \n</div>"}
1
+ {"tags":{"author":["Guillaume Royer"],"group":["Cycle: General"],"tab":["Cycle"],"modelId":["startDate"]},"content":"# Cycle Start Date\n\nThis model sets the [Cycle startDate](/schema/Cycle#startDate) based on:\n* the `cycleDuration` and the `endDate` if it has been provided to a day precision (e.g., `2000-01-01`);\n* if no `cycleDuration` is provided, and the `startDate` is set to month precision (e.g., `2000-01`), assumed it started on the 15th of the month.\n\nCycles are understood to take place from the start of the `startDate` (i.e., 00:00:00) to the end of the `endDate` (i.e., 23:59:59). `cycleDuration` is **inclusive** of a Cycle's `endDate`; therefore a Cycle with `endDate` = `2001-12-31` and `cycleDuration` = `365` will have a `startDate` = `2001-01-01`.\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>The startDate as a string</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li>none of:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#startDate\">startDate</a> with <code>in day precision</code></li>\n</ul>\n</li>\n<li>optional:<ul>\n<li><a href=\"https://hestia.earth/schema/Cycle#endDate\">endDate</a> with <code>in day precision</code></li>\n<li><a href=\"https://hestia.earth/schema/Cycle#cycleDuration\">cycleDuration</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n \n \n</div>"}
@@ -1 +1 @@
1
- {"tags":{"author":["Guillaume Royer"],"contributor":["James Bradbury"],"group":["Cycle: Inputs"],"tab":["HESTIA"],"modelId":["materialAndSubstrate"],"modelRequires":["material"]},"content":"# Material and Substrate\n\nThis model gap-fills depreciated amount per Cycle from Site Infrastructure node.\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Input\">Inputs</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#model\">model</a> with <a href=\"https://hestia.earth/term/hestia\">hestia</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#min\">min</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#max\">max</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#sd\">sd</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#statsDefinition\">statsDefinition</a></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li>Data completeness assessment for material: <a href=\"https://hestia.earth/schema/Completeness#material\">completeness.material</a> must be <code>False</code></li>\n<li><a href=\"https://hestia.earth/schema/Cycle#cycleDuration\">cycleDuration</a></li>\n<li>a <a href=\"https://hestia.earth/schema/Cycle#site\">site</a> with:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Site#infrastructure\">infrastructures</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Infrastructure#defaultLifespan\">defaultLifespan</a> and a list of <a href=\"https://hestia.earth/schema/Infrastructure#inputs\">inputs</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=material\">material</a> <strong>or</strong> <a href=\"https://hestia.earth/glossary?termType=substrate\">substrate</a> and <a href=\"https://hestia.earth/schema/Input#value\">value</a> and <a href=\"https://hestia.earth/schema/Input#lifespan\">lifespan</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/material.csv\">material.csv</a></li>\n</ul>\n</div>\n </div>\n \n</div>"}
1
+ {"tags":{"author":["Guillaume Royer"],"contributor":["James Bradbury"],"group":["Cycle: Inputs"],"tab":["HESTIA"],"modelId":["materialAndSubstrate"],"modelRequires":["material"]},"content":"# Material and Substrate\n\nThis model gap-fills depreciated amount per Cycle from Site Infrastructure node.\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Input\">Inputs</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#model\">model</a> with <a href=\"https://hestia.earth/term/hestia\">hestia</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#min\">min</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#max\">max</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#sd\">sd</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#statsDefinition\">statsDefinition</a></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Cycle\">Cycle</a> with:<ul>\n<li>Data completeness assessment for material: <a href=\"https://hestia.earth/schema/Completeness#material\">completeness.material</a> must be <code>False</code></li>\n<li><a href=\"https://hestia.earth/schema/Cycle#cycleDuration\">cycleDuration</a></li>\n<li>a <a href=\"https://hestia.earth/schema/Cycle#site\">site</a> with:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Site#infrastructure\">infrastructures</a> with:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Infrastructure#inputs\">inputs</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=material\">material</a> <strong>or</strong> <a href=\"https://hestia.earth/glossary?termType=substrate\">substrate</a> and <a href=\"https://hestia.earth/schema/Input#value\">value</a> <code>&gt; 0</code> and <a href=\"https://hestia.earth/schema/Input#lifespan\">lifespan</a> <code>&gt; 0</code> and optional:</li>\n<li><a href=\"https://hestia.earth/schema/Infrastructure#defaultLifespan\">defaultLifespan</a> <code>&gt; 0</code></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n \n \n</div>"}
@@ -1 +1 @@
1
- {"tags":{"author":["Lloyd Ashby","Joseph Poore","Guillaume Royer"],"group":["Impact Assessment: Resource Use"],"subgroup":["Inputs"],"modelId":["impact-inputs-background-resource-use"],"tab":["ECOALIM v9"]},"content":"# ECOALIM v9\n\nThis model calculates background environmental impact data related to the production of feed ingredients from the [ECOALIM database](https://ecoalim.hub.inrae.fr/), version 9 (publ. Dec 2024).\nECOALIM v9 is part of Agribalyse v3.2.\n\n\n\n\n\n\n\n"}
1
+ {"tags":{},"content":""}
@@ -0,0 +1 @@
1
+ {"tags":{"author":["Lloyd Ashby"],"contributor":["Guillaume Royer"],"group":["Impact Assessment: Resource Use"],"subgroup":["Inputs"],"modelId":["impact-inputs-background-resource-use","impact_assessment"],"tab":["World steel"]},"content":"# World steel\n\nThis model calculates background environmental impact data related to the production of steel materials using the [World steel 2022 database](https://nexus.openlca.org/database/worldsteel).\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Indicator\">Indicators</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Indicator#methodModel\">methodModel</a> with <a href=\"https://hestia.earth/term/worldSteel\">worldSteel</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#term\">term</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#methodTier\">methodTier</a> with <code>background</code></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#inputs\">inputs</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#operation\">operation</a></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/ImpactAssessment\">ImpactAssessment</a> with:<ul>\n<li>a <a href=\"https://hestia.earth/schema/ImpactAssessment#cycle\">cycle</a> with:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#inputs\">inputs</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#value\">value</a> <code>&gt; 0</code> and none of:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#fromCycle\">fromCycle</a> with <code>True</code></li>\n<li><a href=\"https://hestia.earth/schema/Input#producedInCycle\">producedInCycle</a> with <code>True</code> and <a href=\"https://hestia.earth/schema/Input#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=material\">material</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/worldSteel-resourceUse.csv\">worldSteel-resourceUse.csv</a> -&gt; <code>resourceUse-</code></li>\n<li><a href=\"https://hestia.earth/glossary/lookups/emission.csv\">emission.csv</a> -&gt; <code>inputProductionGroupId</code></li>\n<li><a href=\"https://hestia.earth/glossary/lookups/material.csv\">material.csv</a> -&gt; <code>worldsteelMapping</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
@@ -1 +1 @@
1
- {"tags":{"author":["Joseph Poore","Guillaume Royer"],"group":["Impact Assessment: Resource Use"],"subgroup":["Inputs"],"modelId":["impact-inputs-background-resourceUse"],"tab":["Free flow"]},"content":"# Background Emissions\n\nManure and some other organic fertilisers are considered free flows in LCA. This model will add `0` values for background resourceUse on those inputs.\n\nNote: `Land transformation` resource use are excluded from this model, as they require a previous land cover.\n\n\n\n\n\n\n"}
1
+ {"tags":{"author":["Joseph Poore","Guillaume Royer"],"group":["Impact Assessment: Resource Use"],"subgroup":["Inputs"],"modelId":["impact-inputs-background-resourceUse"],"tab":["Free flow"]},"content":"# Background Resource Use\n\nThis model will add resource uses with `0` value on Inputs where:\n- The input is manure and some other organic fertilisers, because they are considered free flows in LCA.\n- The input value is `0`.\n\nNote: `Land transformation` resource use are excluded from this model, as they require a previous land cover.\n\n\n\n\n\n\n"}
@@ -1 +1 @@
1
- {"tags":{"author":["Joseph Poore","Guillaume Royer"],"group":["Impact Assessment: Resource Use"],"subgroup":["Inputs"],"modelId":["impact-inputs-background-resourceUse","default_resourceUse"],"tab":["Free flow"]},"content":"# Background Emissions\n\nManure and some other organic fertilisers are considered free flows in LCA. This model will add `0` values for background resourceUse on those inputs.\n\nNote: `Land transformation` resource use are excluded from this model, as they require a previous land cover.\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Indicator\">Indicators</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Indicator#methodModel\">methodModel</a> with <a href=\"https://hestia.earth/term/hestia\">hestia</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#inputs\">inputs</a></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/ImpactAssessment\">ImpactAssessment</a> with:<ul>\n<li>a <a href=\"https://hestia.earth/schema/ImpactAssessment#cycle\">cycle</a> with:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#inputs\">inputs</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#value\">value</a> <code>&gt; 0</code> and none of:<ul>\n<li>a <a href=\"https://hestia.earth/schema/Input#impactAssessment\">impactAssessment</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#fromCycle\">fromCycle</a> with <code>True</code></li>\n<li><a href=\"https://hestia.earth/schema/Input#producedInCycle\">producedInCycle</a> with <code>True</code></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/resourceUse.csv\">resourceUse.csv</a> -&gt; <code>inHestiaDefaultSystemBoundary</code></li>\n<li><a href=\"https://hestia.earth/glossary/lookups/organicFertiliser.csv\">organicFertiliser.csv</a> -&gt; <code>backgroundEmissionsResourceUseDefaultValue</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
1
+ {"tags":{"author":["Joseph Poore","Guillaume Royer"],"group":["Impact Assessment: Resource Use"],"subgroup":["Inputs"],"modelId":["impact-inputs-background-resourceUse","default_resourceUse"],"tab":["Free flow"]},"content":"# Background Resource Use\n\nThis model will add resource uses with `0` value on Inputs where:\n- The input is manure and some other organic fertilisers, because they are considered free flows in LCA.\n- The input value is `0`.\n\nNote: `Land transformation` resource use are excluded from this model, as they require a previous land cover.\n\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Indicator\">Indicators</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Indicator#methodModel\">methodModel</a> with <a href=\"https://hestia.earth/term/hestia\">hestia</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#value\">value</a></li>\n<li><a href=\"https://hestia.earth/schema/Indicator#inputs\">inputs</a></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/ImpactAssessment\">ImpactAssessment</a> with:<ul>\n<li>a <a href=\"https://hestia.earth/schema/ImpactAssessment#cycle\">cycle</a> with:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Cycle#inputs\">inputs</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Input#value\">value</a> <code>&gt;= 0</code> and none of:<ul>\n<li>a <a href=\"https://hestia.earth/schema/Input#impactAssessment\">impactAssessment</a></li>\n<li><a href=\"https://hestia.earth/schema/Input#fromCycle\">fromCycle</a> with <code>True</code></li>\n<li><a href=\"https://hestia.earth/schema/Input#producedInCycle\">producedInCycle</a> with <code>True</code></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/resourceUse.csv\">resourceUse.csv</a> -&gt; <code>inHestiaDefaultSystemBoundary</code></li>\n<li><a href=\"https://hestia.earth/glossary/lookups/organicFertiliser.csv\">organicFertiliser.csv</a> -&gt; <code>backgroundEmissionsResourceUseDefaultValue</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
@@ -0,0 +1 @@
1
+ {"tags":{},"content":"# Site: Infrastructure"}
@@ -0,0 +1 @@
1
+ {"tags":{"author":["Lucy Walker","Guillaume Royer"],"group":["Site: Infrastructure"],"tab":["Kan et al (2020)"],"modelId":["site-infrastructure"]},"content":"# Infrastructure\n\nA model to gap-fill `site.infrastructure` with `defaultLifespan` and infrastructure with `inputs` and `value`.\n\nMany horticultural cycles, such as those producing tomatoes, do not include the inputs related to the greenhouse infrastructure. This constitutes a substantial part of the environmental impact and should be accounted for.\n\n\n\n\n\n"}
@@ -0,0 +1 @@
1
+ {"tags":{"author":["Lucy Walker","Guillaume Royer"],"group":["Site: Infrastructure"],"tab":["Kan et al (2020)"],"modelId":["site-infrastructure","infrastructure"]},"content":"# Infrastructure\n\nA model to gap-fill `site.infrastructure` with `defaultLifespan` and infrastructure with `inputs` and `value`.\n\nMany horticultural cycles, such as those producing tomatoes, do not include the inputs related to the greenhouse infrastructure. This constitutes a substantial part of the environmental impact and should be accounted for.\n\n\n\n\n\n\n\n\n<div class=\"collapsibles\">\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Returns</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A list of <a href=\"https://hestia.earth/schema/Infrastructure\">Infrastructures</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Infrastructure#methodModel\">methodModel</a> with <a href=\"https://hestia.earth/term/kanEtAl2020\">kanEtAl2020</a></li>\n<li><a href=\"https://hestia.earth/schema/Infrastructure#defaultLifespan\">defaultLifespan</a></li>\n<li><a href=\"https://hestia.earth/schema/Infrastructure#inputs\">inputs</a></li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Requirements</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li>A <a href=\"https://hestia.earth/schema/Site\">Site</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Site#siteType\">siteType</a> with <code>glass or high accessible cover</code></li>\n<li>a list of <a href=\"https://hestia.earth/schema/Site#infrastructure\">infrastructures</a> with:<ul>\n<li><a href=\"https://hestia.earth/schema/Infrastructure#term\">term</a> of <a href=\"https://hestia.earth/schema/Term#termType\">termType</a> = <a href=\"https://hestia.earth/glossary?termType=building\">building</a> and none of:<ul>\n<li>a list of <a href=\"https://hestia.earth/schema/Infrastructure#inputs\">inputs</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n </div>\n <div class=\"collapsible-group\">\n <div class=\"collapsible-header\">\n <span>Lookups used</span>\n </div>\n <div class=\"collapsible-content\"><ul>\n<li><a href=\"https://hestia.earth/glossary/lookups/building.csv\">building.csv</a> -&gt; <code>defaultLifespan</code>; <code>materialTermIds</code>; <code>substrateTermIds</code></li>\n</ul>\n</div>\n </div>\n \n</div>"}
@@ -1 +1 @@
1
- {"tags":{"author":["Florian Payen"],"contributor":["Guillaume Royer"],"group":["Site: Measurements"],"subgroup":["Land Use Change"],"tab":["IPCC (2019)"],"citation":["Payen, F. (2025) Above ground biomass modelling on HESTIA."]},"content":"# Above ground biomass\n\n## Overview\n\nThis model estimates the above ground biomass stocks (kg C ha<sup>-1</sup>) based on changes in land cover over time.\n\nThe IPCC Tier 1 methodology is suitable for modelling changes in above ground biomass for woody perennial crops and forests only. Land covers are assigned a `BiomassCategory`, which have an associated above ground biomass stock equilibrium (kg C ha<sup>-1</sup>). This equilibrium represents the stock of carbon stored in above ground biomass per hectare of mature vegetation.\n\nIt is assumed that above ground biomass does not accumulate on annual croplands and grasslands. These `BiomassCategory`s are assigned an above ground biomass stock equilibrium of 0 kg C ha<sup>-1</sup>. It is important to note that biomass does expand on these areas - otherwise, grasslands would not have grass and croplands would not have crops! - but it is not considered stable enough to meaningfully remove CO<sub>2</sub> from the atmosphere. This biomass is accounted for in the crop/forage yield and crop residues. Crop residues left on field become an input for the Tier 2 `organicCarbonPerHa` model, where they act as a carbon source for changes in soil organic carbon stocks.\n\nLand cover changes can he attributed to:\n\n- land-use change (changing from one land-use category to another, _e.g._, from perennial crops to pasture),\n- or management change (changing type of land cover within the same land-use category, _e.g._, from peach trees to grapevines, which are both perennial crops).\n\nDuring a land-cover change, it is assumed that 100% of the above ground biomass is lost. Then, the biomass of the new land cover gradually expands (based on the growth rate of the species) until it reaches the new equilibrium. This is the basis for the gain-loss method. However, we use the stock-difference method to account for above ground biomass stock changes. This approach amortises stock changes by transitioning linearly between above ground biomass stock equilibriums over a fixed transition period of 20 years. More information about these methods can be found below.\n\nThe model is run as a Monte Carlo simulation with 10,000 iterations. Model result values are the row-wise `mean` of simulation results. See our guide on [Monte Carlo simulation](/guide/applying-models-monte-carlo) for more information.\n\n## How the model works\n\nThe model works by constructing an annual inventory of land cover change. Following a land cover change event, the [Site](/schema/Site) begins a 20-year transition from an initial above ground biomass stock to a new above ground biomass stock. If another land cover change event occurs during or after the 20-year transition period, a new transition begins.\n\n**Illustration of gain-loss vs. stock-difference methods**\n\n![Comparison of gain-loss vs. stock-difference methods](/assets/biomass-methodComparison.jpg)\n\nThe Tier 1 approach considers that CO<sub>2</sub> emissions due to biomass stock changes following a land use change (_i.e._, a change in value in the `IPCC_LAND_USE_CATEGORY` lookup) should be categorised as such for 20 years, after which they become emissions due to management change (for as long as there is no subsequent land use changes). This is illustrated in the graphic above.\n\nThe gain-loss method assumes that upon a land use change the biomass of the previous land cover is lost (and emitted as CO<sub>2</sub>) on 1st January of the year of conversion. Then the biomass stock progressively increases until it reaches the biomass equilibrium of the new land cover. This is when the crop reaches maturity. The basic timeline for this is 20 years (like for SOC stock modelling), but the IPCC does suggest different maturity rates for different types of perennials and forests.\n\nThe stock-difference method ammortises the loss or gain of biomass stocks throughout the following 20 years by linearly interpolating between the biomass equilibriums of the start and end land covers. There is no specific \"loss\" event where the stock drops to zero before rebuilding, rather a gradual transition between equilibriums.\n\nAfter 20 years of stable land cover, both methods resolve to the same biomass stocks and biomass stock change emissions.\n\nFor V1, the HESTIA team have chosen to implement the stock-difference method. It ensures that [Cycles](/schema/Cycle) following a land use change \"share\" the environmental impacts of land-use changes rather than just the first [Cycle](/schema/Cycle), and it aligns methods with the `ipcc2019.organicCarbonPerHa` (Tier 1) model, making the modelling approach more consistent between the two models.\n\n### Step 1. Detecting land-cover change events\n\nAn annual inventory of land cover is constructed by grouping the [Site](/schema/Site)'s `landCover` [Management](/schema/Management) nodes. `landCover` nodes with cover crop [Properties](/schema/Property) (`coverCrop`, `catchCrop`, `shortfallowCrop` and `coverCrop`) are excluded.\n\nFor each year in the inventory, a land cover summary is calculated by aggregating `landCover` node values with the same `term.@id`. Each year's summary is compared with that of the year prior to determine whether a land-cover change event has occurred. A gain or loss of 1 m<sup>2</sup> ha<sup>-1</sup> by any `landCover` is considered a land cover change event.\n\n1. If a land-use change has occurred, a new 20-year transition period starts.\n2. If no land-use change has occurred, the current transition period continues or, if it is finished, the stock remains at equilibrium.\n\nThe number of years elapsed since the most recent land cover change event are calculated for each calendar year - this value will be used as the blend value for linear interpolation later.\n\nMissing years in the inventory are back-filled with data from the next inventory year. In practice, this means that if there is any ambiguity about when exactly a land-cover change event occurred (_e.g._, if the `landCover` data is in 5-year intervals), we assume it happened at the earliest possible point in time. This aligns with the IPCC (2019) example calculations.\n\n### Step 2. Calculating above ground biomass equilibriums\n\nFor each year in the inventory, a biomass category summary is calculated by aggregating `landCover` node values by IPCC `BiomassCategory`. This summary is used to estimate the above ground biomass equilibrium, which describes the stable amount of woody biomass the [Site](/schema/Site) would have if the `landCover` remained consistent for 20 years.\n\n| Eco-climate Zone | Annual crops | Coconut | Forest | Grassland | Jatropha | Jojoba | Natural forest | Oil pal | Olive | Orchard | Plantation forest | Rubber | Short rotation coppice | Tea | Vine | Woody perennials | Other |\n| -------------------- | ------------ | ----------- | ------------ | --------- | ----------- | ---------- | -------------- | ----------- | ----------- | ----------- | ----------------- | ----------- | ---------------------- | ----------- | ----------- | ---------------- | ----- |\n| Warm temperate moist | 0 | 75000 ± 75% | 130767 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 150322 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 111212 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Warm temperate dry | 0 | 75000 ± 75% | 80080 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 76100 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 84059 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Cool temperate moist | 0 | 75000 ± 75% | 161742 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 181739 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 141745 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Cool temperate dry | 0 | 75000 ± 75% | 129532 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 145952 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 113112 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Boreal moist | 0 | 75000 ± 75% | 52468 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 62900 ± 90% | 0 | 0 | 0 | 42036 ± 90% | 0 | 0 | 20700 ± 50% | 0 | 0 | 0 |\n| Boreal dry | 0 | 75000 ± 75% | 60235 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 83950 ± 90% | 0 | 0 | 0 | 36519 ± 90% | 0 | 0 | 20700 ± 50% | 0 | 0 | 0 |\n| Tropical montane | 0 | 75000 ± 75% | 141509 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 200540 ± 90% | 60000 ± 41% | 26666 ± 75% | 26666 ± 75% | 82478 ± 90% | 80200 ± 15% | 26666 ± 75% | 20700 ± 50% | 26666 ± 75% | 26666 ± 75% | 0 |\n| Tropical wet | 0 | 75000 ± 75% | 248616 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 266030 ± 90% | 60000 ± 41% | 50000 ± 75% | 50000 ± 75% | 231201 ± 90% | 80200 ± 15% | 50000 ± 75% | 20700 ± 50% | 50000 ± 75% | 50000 ± 75% | 0 |\n| Tropical moist | 0 | 75000 ± 75% | 166465 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 138889 ± 90% | 60000 ± 41% | 21000 ± 75% | 21000 ± 75% | 194040 ± 90% | 80200 ± 15% | 21000 ± 75% | 20700 ± 50% | 21000 ± 75% | 21000 ± 75% | 0 |\n| Tropical dry | 0 | 75000 ± 75% | 67316 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 76139 ± 90% | 60000 ± 41% | 9000 ± 75% | 9000 ± 75% | 58493 ± 90% | 80200 ± 15% | 9000 ± 75% | 20700 ± 50% | 9000 ± 75% | 9000 ± 75% | 0 |\n\nUsing the % area covered by each `BiomassCategory`, a weighted average of the above model factors is used to calculate the equilibrium for the [Site](/schema/Site).\n\n### Step 3. Interpolating between above ground biomass equilibriums\n\nStarting from the earliest year in the inventory, we can then interpolate linearly between above ground biomass equilibrium values following changes in land cover:\n\n$AGB_{0+T} = AGB_{0} + \\frac{min(T, 20)}{20}(AGB_{eq} - AGB_{0})$\n\nWhere:\n\n- $AGB_{0+T}$ = the above ground biomass stock $T$ years after the most recent land-cover change, kg C ha<sup>-1</sup>.\n- $AGB_{0}$ = the above ground biomass stock when the land-cover change occurred, kg C ha<sup>-1</sup>.\n- $AGB_{eq}$ = the above ground biomass equilibrium for the [Site](/schema/Site) under the most recent land cover regime, kg C ha<sup>-1</sup>.\n- $T$ = the number of years since the most recent land-cover change event, yr.\n\nIf $T>20$, it is capped to twenty as annual above ground biomass stock changes are assumed to be negligible after the $AGB_{eq}$ has been reached for as long as land cover remains consistent.\n\nRow-wise means (and other descriptive statistics) are calculated to provide the final results of the model.\n\n## Re-calculation of model factors\n\nAbove ground biomass carbon stock equilibriums for specific crops and crop group/geographic region pairings are provided in the IPCC (2006) report, the IPCC (2019) report and the European Commission (2010) guidelines.\n\nThe values provided by the European Commission guidelines do not provide descriptive statistics nor sources; therefore, these values should be used with caution. Nominal error estimates of 75% have been added to EC emission factors in line with the IPCC emission factors.\n\nForest equilibrium factors have been recalculated per eco-climate zone using a weighted average of land area under each climate zone. A nominal error estimate of 90% has been added to these recalculated factors, in line with the IPCC recommendations.\n\n\n\n\n\n\n"}
1
+ {"tags":{"author":["Florian Payen"],"contributor":["Guillaume Royer"],"group":["Site: Measurements"],"subgroup":["Land Use Change"],"tab":["IPCC (2019)"],"citation":["Payen, F. (2025) Above ground biomass modelling on HESTIA."]},"content":"# Above ground biomass\n\n## Overview\n\nThis model estimates the above ground biomass stocks (kg C ha<sup>-1</sup>) based on changes in land cover over time.\n\nThe IPCC Tier 1 methodology is suitable for modelling changes in above ground biomass for woody perennial crops and forests only. Land covers are assigned a `BiomassCategory`, which have an associated above ground biomass stock equilibrium (kg C ha<sup>-1</sup>). This equilibrium represents the stock of carbon stored in above ground biomass per hectare of mature vegetation.\n\nIt is assumed that above ground biomass does not accumulate on annual croplands and grasslands. These `BiomassCategory`s are assigned an above ground biomass stock equilibrium of 0 kg C ha<sup>-1</sup>. It is important to note that biomass does expand on these areas - otherwise, grasslands would not have grass and croplands would not have crops! - but it is not considered stable enough to meaningfully remove CO<sub>2</sub> from the atmosphere. This biomass is accounted for in the crop/forage yield and crop residues. Crop residues left on field become an input for the Tier 2 `organicCarbonPerHa` model, where they act as a carbon source for changes in soil organic carbon stocks.\n\nLand cover changes can he attributed to:\n\n- land-use change (changing from one land-use category to another, _e.g._, from perennial crops to pasture),\n- or management change (changing type of land cover within the same land-use category, _e.g._, from peach trees to grapevines, which are both perennial crops).\n\nDuring a land-cover change, it is assumed that 100% of the above ground biomass is lost. Then, the biomass of the new land cover gradually expands (based on the growth rate of the species) until it reaches the new equilibrium. This is the basis for the gain-loss method. However, we use the stock-difference method to account for above ground biomass stock changes. This approach amortises stock changes by transitioning linearly between above ground biomass stock equilibriums over a fixed transition period of 20 years. More information about these methods can be found below.\n\nThe model is run as a Monte Carlo simulation with 10,000 iterations. Model result values are the row-wise `mean` of simulation results. See our guide on [Monte Carlo simulation](/guide/models-applying-models-monte-carlo) for more information.\n\n## How the model works\n\nThe model works by constructing an annual inventory of land cover change. Following a land cover change event, the [Site](/schema/Site) begins a 20-year transition from an initial above ground biomass stock to a new above ground biomass stock. If another land cover change event occurs during or after the 20-year transition period, a new transition begins.\n\n**Illustration of gain-loss vs. stock-difference methods**\n\n![Comparison of gain-loss vs. stock-difference methods](/assets/biomass-methodComparison.jpg)\n\nThe Tier 1 approach considers that CO<sub>2</sub> emissions due to biomass stock changes following a land use change (_i.e._, a change in value in the `IPCC_LAND_USE_CATEGORY` lookup) should be categorised as such for 20 years, after which they become emissions due to management change (for as long as there is no subsequent land use changes). This is illustrated in the graphic above.\n\nThe gain-loss method assumes that upon a land use change the biomass of the previous land cover is lost (and emitted as CO<sub>2</sub>) on 1st January of the year of conversion. Then the biomass stock progressively increases until it reaches the biomass equilibrium of the new land cover. This is when the crop reaches maturity. The basic timeline for this is 20 years (like for SOC stock modelling), but the IPCC does suggest different maturity rates for different types of perennials and forests.\n\nThe stock-difference method ammortises the loss or gain of biomass stocks throughout the following 20 years by linearly interpolating between the biomass equilibriums of the start and end land covers. There is no specific \"loss\" event where the stock drops to zero before rebuilding, rather a gradual transition between equilibriums.\n\nAfter 20 years of stable land cover, both methods resolve to the same biomass stocks and biomass stock change emissions.\n\nFor V1, the HESTIA team have chosen to implement the stock-difference method. It ensures that [Cycles](/schema/Cycle) following a land use change \"share\" the environmental impacts of land-use changes rather than just the first [Cycle](/schema/Cycle), and it aligns methods with the `ipcc2019.organicCarbonPerHa` (Tier 1) model, making the modelling approach more consistent between the two models.\n\n### Step 1. Detecting land-cover change events\n\nAn annual inventory of land cover is constructed by grouping the [Site](/schema/Site)'s `landCover` [Management](/schema/Management) nodes. `landCover` nodes with cover crop [Properties](/schema/Property) (`coverCrop`, `catchCrop`, `shortfallowCrop` and `coverCrop`) are excluded.\n\nFor each year in the inventory, a land cover summary is calculated by aggregating `landCover` node values with the same `term.@id`. Each year's summary is compared with that of the year prior to determine whether a land-cover change event has occurred. A gain or loss of 1 m<sup>2</sup> ha<sup>-1</sup> by any `landCover` is considered a land cover change event.\n\n1. If a land-use change has occurred, a new 20-year transition period starts.\n2. If no land-use change has occurred, the current transition period continues or, if it is finished, the stock remains at equilibrium.\n\nThe number of years elapsed since the most recent land cover change event are calculated for each calendar year - this value will be used as the blend value for linear interpolation later.\n\nMissing years in the inventory are back-filled with data from the next inventory year. In practice, this means that if there is any ambiguity about when exactly a land-cover change event occurred (_e.g._, if the `landCover` data is in 5-year intervals), we assume it happened at the earliest possible point in time. This aligns with the IPCC (2019) example calculations.\n\n### Step 2. Calculating above ground biomass equilibriums\n\nFor each year in the inventory, a biomass category summary is calculated by aggregating `landCover` node values by IPCC `BiomassCategory`. This summary is used to estimate the above ground biomass equilibrium, which describes the stable amount of woody biomass the [Site](/schema/Site) would have if the `landCover` remained consistent for 20 years.\n\n| Eco-climate Zone | Annual crops | Coconut | Forest | Grassland | Jatropha | Jojoba | Natural forest | Oil pal | Olive | Orchard | Plantation forest | Rubber | Short rotation coppice | Tea | Vine | Woody perennials | Other |\n| -------------------- | ------------ | ----------- | ------------ | --------- | ----------- | ---------- | -------------- | ----------- | ----------- | ----------- | ----------------- | ----------- | ---------------------- | ----------- | ----------- | ---------------- | ----- |\n| Warm temperate moist | 0 | 75000 ± 75% | 130767 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 150322 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 111212 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Warm temperate dry | 0 | 75000 ± 75% | 80080 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 76100 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 84059 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Cool temperate moist | 0 | 75000 ± 75% | 161742 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 181739 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 141745 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Cool temperate dry | 0 | 75000 ± 75% | 129532 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 145952 ± 90% | 60000 ± 75% | 9100 ± 15% | 8500 ± 19% | 113112 ± 90% | 63000 ± 75% | 12690 ± 40% | 20700 ± 50% | 5500 ± 18% | 63000 ± 75% | 0 |\n| Boreal moist | 0 | 75000 ± 75% | 52468 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 62900 ± 90% | 0 | 0 | 0 | 42036 ± 90% | 0 | 0 | 20700 ± 50% | 0 | 0 | 0 |\n| Boreal dry | 0 | 75000 ± 75% | 60235 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 83950 ± 90% | 0 | 0 | 0 | 36519 ± 90% | 0 | 0 | 20700 ± 50% | 0 | 0 | 0 |\n| Tropical montane | 0 | 75000 ± 75% | 141509 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 200540 ± 90% | 60000 ± 41% | 26666 ± 75% | 26666 ± 75% | 82478 ± 90% | 80200 ± 15% | 26666 ± 75% | 20700 ± 50% | 26666 ± 75% | 26666 ± 75% | 0 |\n| Tropical wet | 0 | 75000 ± 75% | 248616 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 266030 ± 90% | 60000 ± 41% | 50000 ± 75% | 50000 ± 75% | 231201 ± 90% | 80200 ± 15% | 50000 ± 75% | 20700 ± 50% | 50000 ± 75% | 50000 ± 75% | 0 |\n| Tropical moist | 0 | 75000 ± 75% | 166465 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 138889 ± 90% | 60000 ± 41% | 21000 ± 75% | 21000 ± 75% | 194040 ± 90% | 80200 ± 15% | 21000 ± 75% | 20700 ± 50% | 21000 ± 75% | 21000 ± 75% | 0 |\n| Tropical dry | 0 | 75000 ± 75% | 67316 ± 90% | 0 | 17500 ± 75% | 2400 ± 75% | 76139 ± 90% | 60000 ± 41% | 9000 ± 75% | 9000 ± 75% | 58493 ± 90% | 80200 ± 15% | 9000 ± 75% | 20700 ± 50% | 9000 ± 75% | 9000 ± 75% | 0 |\n\nUsing the % area covered by each `BiomassCategory`, a weighted average of the above model factors is used to calculate the equilibrium for the [Site](/schema/Site).\n\n### Step 3. Interpolating between above ground biomass equilibriums\n\nStarting from the earliest year in the inventory, we can then interpolate linearly between above ground biomass equilibrium values following changes in land cover:\n\n$AGB_{0+T} = AGB_{0} + \\frac{min(T, 20)}{20}(AGB_{eq} - AGB_{0})$\n\nWhere:\n\n- $AGB_{0+T}$ = the above ground biomass stock $T$ years after the most recent land-cover change, kg C ha<sup>-1</sup>.\n- $AGB_{0}$ = the above ground biomass stock when the land-cover change occurred, kg C ha<sup>-1</sup>.\n- $AGB_{eq}$ = the above ground biomass equilibrium for the [Site](/schema/Site) under the most recent land cover regime, kg C ha<sup>-1</sup>.\n- $T$ = the number of years since the most recent land-cover change event, yr.\n\nIf $T>20$, it is capped to twenty as annual above ground biomass stock changes are assumed to be negligible after the $AGB_{eq}$ has been reached for as long as land cover remains consistent.\n\nRow-wise means (and other descriptive statistics) are calculated to provide the final results of the model.\n\n## Re-calculation of model factors\n\nAbove ground biomass carbon stock equilibriums for specific crops and crop group/geographic region pairings are provided in the IPCC (2006) report, the IPCC (2019) report and the European Commission (2010) guidelines.\n\nThe values provided by the European Commission guidelines do not provide descriptive statistics nor sources; therefore, these values should be used with caution. Nominal error estimates of 75% have been added to EC emission factors in line with the IPCC emission factors.\n\nForest equilibrium factors have been recalculated per eco-climate zone using a weighted average of land area under each climate zone. A nominal error estimate of 90% has been added to these recalculated factors, in line with the IPCC recommendations.\n\n\n\n\n\n\n"}