Environmental Impacts¶
Overview¶
The environmental module accounts for greenhouse gas emissions and land use change from food production. These impacts are monetized and included in the objective function via configurable prices/penalties. Land-use change accounting distinguishes between existing cropland and newly converted area so that only new conversions bear LUC costs, while existing cropland can generate regrowth credits when spared.
This is currently a work in progress and not all relevant environmental impacts are implemented and monetized yet.
Greenhouse Gas Emissions¶
The model tracks three major greenhouse gases using 100-year global warming potentials (GWP100):
CO₂ (GWP = 1): From land use change
CH₄ (GWP = 27 by default): From enteric fermentation (ruminants), rice paddies, manure
N₂O (GWP = 273 by default): From nitrogen fertilizer application, manure, crop residue incorporation
All emissions are aggregated to CO₂-equivalent (internally tracked in MtCO₂-eq; the configured price still applies per tonne) for carbon pricing.
Implementation notes (buses, stores, links)¶
The optimisation model represents environmental flows with three PyPSA components that are worth keeping in mind:
Buses act as balance sheets. Process components report raw emissions to the
co2andch4buses, while a dedicatedghgbus tracks the combined CO₂-equivalent balance.Links move quantities between buses, applying efficiencies that encode global warming potentials.
convert_co2_to_ghghas efficiency 1.0, andconvert_ch4_to_ghguses the configuredemissions.ch4_to_co2_factor; similar for N₂O. Every megatonne of CH₄ and N₂O (after scaling from tonnes) therefore appears on theghgbus weighted by its 100-year GWP.Stores accumulate quantities over the horizon. The extendable
ghgstore sits on the combined bus and is priced atemissions.ghg_price. Because neither theco2,ch4norn2obuses have stores, their flows must pass through the conversion links before the objective is charged.
With this structure the linear program keeps separate ledgers for each greenhouse gas while charging the objective using a single priced stock of CO₂-equivalent. Scenario files can tighten or relax climate policy simply by changing the configuration values—no code modifications are required.
Land representation in the network¶
Land is represented with a dual-pool structure per (region, resource class):
land:cropland:*buses hold the usable cropland area that crop production links consume (per region/class/water).land:pasture:*buses hold the pasture area that grassland production links consume (per region/class, water-agnostic).land:existing_cropland:*buses supply the baseline cropland area (fromprocessing/{name}/cropland_baseline_by_class.csv) via fixed-capacity generators and links into both pools.land:new:*buses supply expansion land up to the configured regional limit; conversion links route this expansion into either pool and emit CO₂ according to the relevant LEFs.land:existing_grassland_convertible:*buses supply current grassland on cropland-suitable land (GAEZ suitable).land:existing_grassland_marginal:*buses supply current grazing-only grassland on land not suitable for crops.
Crop production links draw from land:cropland:*; grassland production links draw from land:pasture:*. LUC emissions are carried on the conversion links, not on production links. When validation fixes harvested areas, optional slack generators attach to both pool types.
Sources of Emissions¶
- Crop Production:
N₂O from synthetic fertilizer application (direct and indirect)
CH₄ from flooded rice cultivation
N₂O from crop residues incorporated into soil
- Livestock:
CH₄ from enteric fermentation (ruminants) - see Enteric Fermentation (CH₄)
CH₄ and N₂O from manure management (all animals) - see Manure Management (CH₄)
CO₂ from feed production (indirect)
- Land Use Change:
CO₂ from converting non-agricultural land to new cropland (charged on
convert_new_land_*links)Soil carbon losses embodied in the cropland LEFs; spared land on existing cropland can generate regrowth credits
Direct N₂O emission factors¶
The model uses the 2019 Refinement to the IPCC Guidelines for National Greenhouse Gas Inventories to parameterise direct N₂O emissions from managed soils. Table 11.1 (updated) is reproduced below to make the default emission factors and their uncertainty ranges readily accessible when configuring fertilizer-related pathways.
Emission factor |
Aggregated default value |
Aggregated uncertainty range |
Disaggregation |
Default value |
Uncertainty range |
|---|---|---|---|---|---|
EF1 for N additions from synthetic fertilisers, organic amendments and crop residues, and N mineralised from mineral soil as a result of loss of soil carbon [kg N₂O-N (kg N)-1] |
0.010 |
0.002 – 0.018 |
Synthetic fertiliser inputs in wet climates Other N inputs in wet climates All N inputs in dry climates |
0.016 (wet synthetic) 0.006 (wet other) 0.005 (dry) |
0.013 – 0.019 0.001 – 0.011 0.000 – 0.011 |
EF1FR for flooded rice fields [kg N₂O-N (kg N)-1] |
0.004 |
0.000 – 0.029 |
Continuous flooding Single and multiple drainage |
0.003 0.005 |
0.000 – 0.010 0.000 – 0.016 |
EF3PRP,CPP for cattle (dairy, non-dairy and buffalo), poultry and pigs [kg N₂O-N (kg N)-1] |
0.004 |
0.000 – 0.014 |
Wet climates Dry climates |
0.006 0.002 |
0.000 – 0.027 0.000 – 0.007 |
EF3PRP,SO for sheep and “other animals” [kg N₂O-N (kg N)-1] |
0.003 |
0.000 – 0.010 |
– |
– |
– |
Crop Residue Incorporation (N₂O)¶
Crop residues left on the field and incorporated into the soil contribute to direct N₂O emissions. The model applies the IPCC EF1 emission factor to residue nitrogen content to calculate these emissions.
Methodology¶
N₂O emissions from incorporated crop residues are calculated as:
- where:
ResidueDM is the dry matter of crop residues incorporated into soil (tonnes DM)
Ncontent is the nitrogen content of the residue (kg N per kg DM)
EF1 is the IPCC direct emission factor for N inputs (kg N₂O-N per kg N input) = 0.010 (aggregated default)
44/28 converts N₂O-N to N₂O mass
Residue Management Constraints¶
To ensure soil health and prevent degradation, the model limits the fraction of crop residues that can be removed for animal feed. The remainder must be left on the field and incorporated into the soil.
Maximum removal for feed: 30% of generated residues (configurable via
residues.max_feed_fraction; override per ISO3 country or M49 region/sub-region viaresidues.max_feed_fraction_by_regionwith country > sub-region > region)Minimum soil incorporation: 70% of generated residues
This constraint is implemented as:
The constraint ensures that residue removal for feed does not compromise soil organic matter maintenance and nutrient cycling.
Data Sources¶
Residue N content:
processing/{name}/ruminant_feed_categories.csv, columnN_g_per_kg_DM, derived from GLEAM 3.0 [2] Supplement S1, Table S.3.3Emission factor: IPCC 2019 Refinement, Table 11.1 (EF1 aggregated default = 0.010)
Removal limits: Model assumption based on sustainable residue management practices
Rice Cultivation (CH₄)¶
Flooded rice paddies are a major source of methane emissions due to anaerobic decomposition of organic matter in the soil.
Methodology¶
The model applies a per-hectare emission factor to wetland rice production, distinguishing between irrigated and rainfed water regimes:
- where:
Area is the harvested area of wetland rice (hectares) by water supply
EFbase is the baseline methane emission factor for continuously flooded fields (kg CH₄ per hectare per crop cycle)
SFrainfed is the scaling factor for the rainfed water regime (dimensionless)
Configuration¶
The emission parameters are configured via emissions.rice:
methane_emission_factor_kg_per_ha: Baseline factor for continuously flooded fields (~134.5 kg CH₄/ha/crop). Based on the IPCC 2019 Tier 1 global default daily emission factor (1.19 kg CH₄/ha/day) and cultivation period (113 days).
rainfed_wetland_rice_ch4_scaling_factor: Scaling factor for “Regular rainfed” fields (0.54). Reduces emissions to account for non-continuous flooding.
Dryland (upland) rice is assumed to have zero methane emissions.
Reference¶
IPCC 2019 Refinement to the 2006 IPCC Guidelines for National Greenhouse Gas Inventories, Volume 4, Chapter 5.5, Tables 5.11, 5.11A, and 5.12.
Enteric Fermentation (CH₄)¶
Ruminant livestock (cattle, sheep, goats, buffalo) produce methane during digestion through microbial fermentation in the rumen. The model calculates enteric CH₄ emissions using IPCC Tier 2 methodology based on feed-specific methane yields.
Methodology¶
Enteric methane emissions are calculated as:
- where:
DMI is dry matter intake (kg feed/day or t feed/year)
MYenteric is the enteric methane yield (g CH₄ per kg DMI)
The methane yield depends primarily on feed digestibility and fiber content. Higher-quality feeds (grains, concentrates) produce less CH₄ per unit intake than low-quality forages because they ferment more efficiently with less methane as a byproduct.
IPCC Conversion Factors¶
The model uses methane yields from the 2019 Refinement to the 2006 IPCC Guidelines for National Greenhouse Gas Inventories [1], Volume 4, Chapter 10, Table 10.12 (Methane Conversion Factors for Cattle and Buffalo).
Feed categories are mapped to IPCC dietary classes:
Roughage (23.3 g CH₄/kg DMI): High-forage diets >75% forage, digestible energy (DE) ≤ 62%, typical of extensive grazing systems
Forage (21.0 g CH₄/kg DMI): Mixed rations 15-75% forage with grain/silage, DE 62-71%, typical of semi-intensive dairy and beef
Grain (13.6 g CH₄/kg DMI): Concentrate-based feedlot diets 0-15% forage, DE ≥ 72%, typical of intensive finishing systems
Protein (13.6 g CH₄/kg DMI): High-protein concentrates, same as grain category
Monogastric animals (pigs, poultry) produce negligible enteric methane and are not included in this calculation.
Data Sources¶
IPCC values:
data/curated/ipcc_enteric_methane_yields.csvmaps feed categories to MY values from IPCC (2019) Table 10.12Feed properties:
processing/{name}/ruminant_feed_categories.csvgenerated from GLEAM 3.0 [2] Supplement S1, Table S.3.3 (Ruminant Nutrition Parameters)Feed mapping:
data/curated/gleam_feed_mapping.csvlinks model feed items to GLEAM feed categories
Implementation¶
Enteric emissions are calculated in workflow/scripts/build_model.py within the add_feed_to_animal_product_links() function:
Feed items are categorized by digestibility into roughage/forage/grain/protein pools (
workflow/scripts/categorize_feeds.py)Each category is assigned an MY value from
data/curated/ipcc_enteric_methane_yields.csvFor each animal production link, CH₄ emissions per tonne of feed intake are calculated and attached to
bus2(methane bus)Emissions scale linearly with feed consumption in the optimization
Manure Management (CH₄)¶
Livestock in confined systems produce methane emissions from manure storage, handling, and treatment. Unlike enteric fermentation, manure CH₄ affects both ruminants and monogastrics (pigs, poultry), with emissions varying significantly by management system. All feed categories, including forage from grassland, include manure CH₄ based on the Mixed LPS manure management system distributions.
Methodology¶
Manure methane emissions follow IPCC Tier 2 methodology based on volatile solids excretion and system-specific methane conversion factors:
- where:
VS is volatile solids excretion (kg VS per kg feed DM intake)
B0 is maximum methane producing capacity (m³ CH₄ per kg VS)
MCF is the methane conversion factor (fraction 0-1, varies by management system and climate)
0.67 converts m³ CH₄ to kg CH₄
Volatile Solids Calculation¶
Volatile solids represent the organic fraction of manure available for anaerobic decomposition. The model calculates VS using an adapted version of IPCC Equation 10.24:
- where:
Digestibility is the fraction of feed digested by the animal (from GLEAM feed properties)
UE is urinary energy excretion as a fraction of gross energy intake:
0.04 for ruminants (cattle, sheep, goats)
0.02 for pigs
0.00 for poultry (minimal urinary losses)
Ash is the ash content of feed (% dry matter, from
data/curated/feed_ash_content.csvbased on feedtables.com)
- The formula accounts for:
Undigested feed (1 - digestibility)
Urinary excretion (UE)
Mineral content that doesn’t decompose (ash fraction)
Maximum Methane Producing Capacity (B₀)¶
B₀ represents the theoretical maximum CH₄ yield from complete anaerobic digestion of manure volatile solids. Values are animal-specific:
Animal Product |
B₀ (m³ CH₄/kg VS) |
Source |
|---|---|---|
Dairy cattle |
0.24 |
IPCC Table 10.16, high productivity |
Beef cattle |
0.18 |
IPCC Table 10.16, high productivity |
Pigs |
0.45 |
IPCC Table 10.16 |
Poultry (broilers) |
0.36 |
IPCC Table 10.16 |
Poultry (layers/eggs) |
0.39 |
IPCC Table 10.16 |
Data source: data/curated/ipcc_manure_methane_producing_capacity.csv
Methane Conversion Factors (MCF)¶
MCF represents the fraction of B₀ actually realized under specific management conditions. It varies by:
Management system: Liquid systems (lagoons, slurry pits) have high MCF (0.4-0.8), solid systems (composting, daily spread) have low MCF (0.001-0.05)
Climate zone: Warmer climates increase anaerobic activity and MCF
Storage duration: Longer storage increases MCF
The model uses MCF values from IPCC (2019) Table 10.17, which provides system-specific and climate-specific factors for 21 manure management systems.
Current simplification: MCF values are averaged across climate zones for each management system (workflow/scripts/calculate_manure_emissions.py). This will be refined when climate zone data is added to modeling regions, allowing for country-specific and region-specific emission factors.
Manure Management System Distribution¶
Real-world manure CH₄ emissions reflect a weighted average across multiple management practices. The model uses global system distributions from GLEAM 3.0 [2] (Supplement S1, Tables 4.4 and 4.5):
Cattle: Primarily pasture/paddock (low MCF ~0.005) with some confinement and liquid systems
Pigs: Mix of solid storage, liquid slurry, and pit systems (higher MCF ~0.1-0.4)
Poultry: Mostly litter-based and solid systems (moderate MCF ~0.01-0.04)
The weighted MCF is calculated as:
where fi is the fraction of manure managed in system i (from data/curated/gleam_tables/manure_management_systems_fraction.csv).
Data Sources¶
B₀ values:
data/curated/ipcc_manure_methane_producing_capacity.csv(IPCC 2019 Table 10.16)MCF values:
data/curated/ipcc_manure_methane_conversion_factors.csv(IPCC 2019 Table 10.17)MMS distributions:
data/curated/gleam_tables/manure_management_systems_fraction.csv(GLEAM 3.0 Supplement S1)Ash content:
data/curated/feed_ash_content.csv(from feedtables.com, matched to model feed entities)Feed properties:
processing/{name}/ruminant_feed_categories.csvandprocessing/{name}/monogastric_feed_categories.csv(digestibility from GLEAM 3.0)
Implementation¶
Manure emissions are calculated in workflow/scripts/calculate_manure_emissions.py and integrated into the model via workflow/scripts/build_model.py:
Preprocessing (
calculate_manure_emissions.py):Calculate VS excretion for each feed category using digestibility and ash content
Average MCF across climate zones for each management system (temporary simplification)
Compute weighted MCF for each animal product using GLEAM MMS distributions
Calculate CH₄ emissions per kg feed intake: VS × B₀ × MCFweighted × 0.67
Generate
processing/{name}/manure_ch4_emission_factors.csvwith emissions by country, product, and feed category
Model integration (
build_model.py):Load manure emission factors from
processing/{name}/manure_ch4_emission_factors.csvIn
add_feed_to_animal_product_links(), combine enteric and manure CH₄:\[\text{CH}_4\text{/t feed} = \text{MY}_\text{enteric} + \text{MY}_\text{manure}\]Attach total CH₄ to
bus2(methane bus) for all animal production linksEmissions scale with feed consumption in the optimization
Example Calculation¶
Scenario: Dairy cow fed on forage (ruminant_forage category)
- Parameters:
Digestibility: 0.61 (from GLEAM)
Ash content: 7.15% (average for forage feeds)
Urinary fraction (UE): 0.04 (ruminants)
B₀ (dairy): 0.24 m³ CH₄/kg VS
Weighted MCF (dairy, global average): 0.034 (mostly pasture-based)
Calculation:
VS excretion:
\[\text{VS} = (1 - 0.61 + 0.04) \times (1 - 7.15/100) = 0.43 \times 0.9285 = 0.399 \text{ kg VS/kg DMI}\]Manure CH₄:
\[\text{CH}_4 = 0.399 \times 0.24 \times 0.034 \times 0.67 = 0.00217 \text{ kg CH₄/kg DMI} = 2.17 \text{ g CH₄/kg DMI}\]Total CH₄ (enteric + manure):
\[\text{Total} = 21.0 \text{ (enteric)} + 2.17 \text{ (manure)} = 23.17 \text{ g CH₄/kg DMI}\]
This shows that for dairy cattle on forage diets, manure contributes ~9% of total CH₄ emissions, with enteric fermentation being dominant. For monogastrics (pigs, poultry), where enteric emissions are zero, manure is the sole CH₄ source.
Manure Nitrogen Management¶
In addition to methane emissions, the model tracks nitrogen flows from livestock manure, accounting for both the fertilizer value and N₂O emissions from manure application.
Nitrogen Mass Balance
Nitrogen excreted in manure is calculated from a simple mass balance:
- where:
Nfeed is the nitrogen content of feed (from GLEAM feed properties, g N/kg DM)
Nproduct is the nitrogen content of the animal product, derived from protein content
Protein-to-Nitrogen Conversion¶
Animal product nitrogen content is calculated from protein using the standard Jones factor of 6.25:
This factor reflects that proteins average ~16% nitrogen by mass (1/6.25 ≈ 0.16). While specific proteins vary (5.18-6.38), 6.25 is the FAO-recommended general conversion factor for mixed animal products [3].
Protein content is sourced from USDA FoodData Central (data/curated/nutrition.csv).
Manure Nitrogen as Fertilizer¶
Not all excreted nitrogen becomes available as fertilizer due to volatilization and other losses during storage and handling. The model applies a configurable recovery fraction:
where frecovery is configured via fertilizer.manure_n_to_fertilizer (default: 0.75, representing 75% recovery and 25% losses).
This manure N is added to the global fertilizer pool (n_fertilizer bus) where it competes with and substitutes for synthetic fertilizer, subject to the global fertilizer limit.
N₂O Emissions from Manure Application¶
Applied manure nitrogen produces both direct and indirect N₂O emissions following IPCC 2019 Refinement Tier 1 methodology (Chapter 11, Equations 11.1, 11.9, 11.10):
Direct N₂O emissions (Equation 11.1):
Indirect N₂O from volatilization and atmospheric deposition (Equation 11.9):
Indirect N₂O from leaching and runoff (Equation 11.10):
Total N₂O emissions:
- where:
Napplied is manure N applied to soil (FON) or deposited on pasture (FPRP)
EFpasture = EF3PRP from IPCC Table 11.1 (0.02 for cattle/buffalo, 0.01 for others)
EFmanaged = weighted storage EF (Table 10.21) + recovery × application EF (0.006)
FracGASM = 0.21 kg NH₃-N + NOₓ-N per kg N (volatilization fraction for organic N, IPCC Table 11.3)
EF4 = 0.010 kg N₂O-N per kg volatilized N (indirect volatilization/deposition factor, IPCC Table 11.3)
FracLEACH = 0.24 kg N per kg N (leaching fraction in wet climates, IPCC Table 11.3)
EF5 = 0.011 kg N₂O-N per kg leached N (indirect leaching/runoff factor, IPCC Table 11.3)
44/28 converts N₂O-N to N₂O (molecular weight ratio)
The direct emission factors are calculated from Manure Management System (MMS) distributions from GLEAM, combined with IPCC emission factors for each MMS type. This accounts for the different N₂O characteristics of different management systems (pasture deposition, solid storage, liquid systems, deep litter, etc.).
Configuration¶
Manure nitrogen management is configured under fertilizer and emissions.fertilizer:
fertilizer:
manure_n_to_fertilizer: 0.75 # Fraction of excreted N available as fertilizer
emissions:
fertilizer:
# Note: Direct N2O factors are computed from MMS distributions (see calculate_manure_emissions.py)
indirect_ef4: 0.010 # kg N₂O-N per kg volatilized N
indirect_ef5: 0.011 # kg N₂O-N per kg leached N
frac_gasm: 0.21 # Fraction of organic N volatilized
frac_leach: 0.24 # Fraction of N leached (wet climate)
Implementation¶
Manure N₂O emission factors are preprocessed in workflow/scripts/calculate_manure_emissions.py:
For each (product, feed_category) combination, calculate MMS-weighted emission factors:
Load MMS distributions from GLEAM (
data/curated/gleam_tables/manure_management_systems_fraction.csv)Map feed categories to Livestock Production Systems (LPS):
All ruminant categories → Mixed LPS (moderate pasture fraction)
Monogastrics → Industrial/Intermediate LPS (low pasture fraction)
Calculate weighted N₂O factors from
data/curated/ipcc_manure_n2o_emission_factors.csv:pasture_fraction: Share of manure deposited on pasture
pasture_n2o_ef: EF3PRP (0.02 for cattle, 0.01 for others)
managed_n2o_ef: Storage EF + (recovery × application EF)
In
workflow/scripts/build_model/utils.py, the_calculate_manure_n_outputs()function:Calculates N excretion from feed N content (GLEAM) minus product N content (protein ÷ 6.25)
Splits excreted N between pasture and managed fractions using MMS-based
pasture_fractionApplies appropriate emission factors to each fraction:
Pasture: N × pasture_n2o_ef + indirect emissions
Managed: N × managed_n2o_ef + indirect emissions
Computes
pasture_n2o_sharefor plotting breakdown
Attach outputs to the link:
bus3:fertilizer_{country}(manure N contributing to fertilizer pool)bus4:n2o(total N₂O emissions including direct and indirect)
This creates a closed nutrient cycle where livestock manure offsets synthetic fertilizer demand while incurring proportional N₂O emissions, with grazing systems correctly accounting for on-pasture deposition and all N sources including indirect emission pathways.
Example Calculation¶
Scenario: Beef cattle on forage diet (ruminant_forage)
- Parameters:
Feed N: 19.5 g N/kg DM (from GLEAM)
Product protein: 18.59 g/100g (meat-cattle, from USDA FoodData Central)
Product N: 18.59 ÷ 6.25 = 2.97 g N/100g = 29.7 g N/kg
Feed conversion efficiency: 0.15 (6.67 kg feed per kg product)
Recovery fraction: 0.75
Emission factors: EF1 = 0.010, EF4 = 0.010, EF5 = 0.011
Fractions: FracGASM = 0.21, FracLEACH = 0.24
Calculation (per tonne of feed DM):
N inputs and outputs:
\[\begin{split}\begin{aligned} N_\text{feed} &= 19.5 \text{ g/kg} = 0.0195 \text{ t N/t feed} \\ \text{Product output} &= 0.15 \text{ t product/t feed} \\ N_\text{product} &= 29.7 \text{ g/kg} \times 0.15 \text{ t/t} = 0.00446 \text{ t N/t feed} \end{aligned}\end{split}\]N excretion:
\[N_\text{excretion} = 0.0195 - 0.00446 = 0.0150 \text{ t N/t feed}\]Manure N fertilizer (collected manure):
\[N_\text{applied} = N_\text{fertilizer} = 0.0150 \times 0.75 = 0.0113 \text{ t N/t feed}\]N₂O emissions (direct + indirect):
\[\begin{split}\begin{aligned} N_2O_\text{direct} &= 0.0113 \times 0.010 \times \frac{44}{28} = 0.000178 \text{ t N}_2\text{O/t feed} \\ N_2O_\text{vol} &= 0.0113 \times 0.21 \times 0.010 \times \frac{44}{28} = 0.000037 \text{ t N}_2\text{O/t feed} \\ N_2O_\text{leach} &= 0.0113 \times 0.24 \times 0.011 \times \frac{44}{28} = 0.000043 \text{ t N}_2\text{O/t feed} \\ N_2O_\text{total} &= 0.000178 + 0.000037 + 0.000043 = 0.000258 \text{ t N}_2\text{O/t feed} \end{aligned}\end{split}\]
Result: Each tonne of feed produces 11.3 kg of manure N (contributing to the fertilizer pool) and 258 g of total N₂O emissions (178 g direct + 37 g volatilization + 43 g leaching).
Grazing Example: Beef cattle on pasture (ruminant_forage)
Using the same parameters as above but with pasture grazing:
1-2. N excretion remains the same: 0.0150 t N/t feed
Manure N fertilizer (grazing):
\[N_\text{fertilizer} = 0 \text{ (manure deposited on pasture, not collected)}\]N₂O emissions from pasture deposition (direct + indirect, all excreted N):
\[\begin{split}\begin{aligned} N_\text{applied} &= 0.0150 \text{ t N/t feed (all excreted N)} \\ N_2O_\text{direct} &= 0.0150 \times 0.010 \times \frac{44}{28} = 0.000236 \text{ t N}_2\text{O/t feed} \\ N_2O_\text{vol} &= 0.0150 \times 0.21 \times 0.010 \times \frac{44}{28} = 0.000050 \text{ t N}_2\text{O/t feed} \\ N_2O_\text{leach} &= 0.0150 \times 0.24 \times 0.011 \times \frac{44}{28} = 0.000057 \text{ t N}_2\text{O/t feed} \\ N_2O_\text{total} &= 0.000236 + 0.000050 + 0.000057 = 0.000343 \text{ t N}_2\text{O/t feed} \end{aligned}\end{split}\]
Result: No manure N enters the fertilizer pool, but 343 g total N₂O per tonne feed is emitted from pasture deposition (236 g direct + 50 g volatilization + 57 g leaching). Higher than confined systems since all excreted N remains on pasture and is subject to emissions.
Future Refinements¶
Planned improvements to manure emissions modeling:
Climate zone differentiation: Use actual climate zones for each region instead of averaging MCF across zones and using wet climate assumption for all regions
Country-specific MMS distributions: Currently all countries use global GLEAM averages
Manure management system emissions: Differentiate N₂O emission factors by storage system (currently uses field-application factor for all)
Carbon Pricing¶
All GHG emissions (CO₂, CH₄, N₂O) are priced at a configurable rate:
emissions:
ghg_pricing_enabled: true # Whether to include GHG pricing in the objective function
ghg_price: 200 # USD_2024/tCO2-eq (emissions stored in MtCO2-eq internally)
ch4_to_co2_factor: 27.0 # IPCC AR6 GWP100 (WG1, Chapter 7, Table 7.15; https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-7/)
n2o_to_co2_factor: 273.0 # IPCC AR6 GWP100 (WG1, Chapter 7, Table 7.15; https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-7/)
rice:
methane_emission_factor_kg_per_ha: 134.47 # kg CH4 per ha per crop (IPCC 2019 Refinement, Vol 4, Chapter 5, Tables 5.11 and 5.11A. Default for continuously flooded fields.)
rainfed_wetland_rice_ch4_scaling_factor: 0.54 # IPCC 2019 Refinement, Vol 4, Chapter 5, Table 5.12. Scaling factor for "Regular rainfed" water regime.
fertilizer:
synthetic_n2o_factor: 0.010 # kg N2O-N per kg N input (IPCC 2019 Refinement, Table 11.1 aggregated default)
# Indirect N2O emission parameters (IPCC 2019 Refinement, Chapter 11.2.2, Table 11.3)
indirect_ef4: 0.010 # kg N2O-N per kg (NH3-N + NOx-N) volatilized and deposited (EF4)
indirect_ef5: 0.011 # kg N2O-N per kg N leached/runoff (EF5)
frac_gasf: 0.11 # Fraction of synthetic fertilizer N volatilized as NH3 and NOx (FracGASF)
frac_gasm: 0.21 # Fraction of organic N and grazing N volatilized as NH3 and NOx (FracGASM)
frac_leach: 0.24 # Fraction of applied/deposited N lost through leaching and runoff in wet climates (FracLEACH-(H))
residues:
incorporation_n2o_factor: 0.010 # kg N2O-N per kg residue N incorporated into soil (IPCC 2019 Refinement, Table 11.1 aggregated default)
# --- section: land use change ---
luc:
horizon_years: 25
managed_flux_mode: "zero"
forest_fraction_threshold: 0.2 # Minimum forest fraction (0-1) to apply regrowth sequestration
# Data source for cropland baseline area:
# - "gaez": GAEZ RES06-HAR (2010-2019 average harvested area), consistent with production stability
# - "esa": ESA CCI land cover satellite data
cropland_source: "gaez"
IPCC (2019). 2019 Refinement to the 2006 IPCC Guidelines for National Greenhouse Gas Inventories, Volume 4: Agriculture, Forestry and Other Land Use. https://www.ipcc.ch/report/2019-refinement-to-the-2006-ipcc-guidelines-for-national-greenhouse-gas-inventories/
FAO (2022). Global Livestock Environmental Assessment Model (GLEAM) 3.0. Food and Agriculture Organization of the United Nations. https://www.fao.org/gleam/
Land Use Change¶
Land-use change (LUC) emissions capture the carbon consequences of converting land between natural vegetation, cropland, pasture, and spared (actively rewilded) states. The model derives annualized per-hectare coefficients for each resource class and water supply that quantify the net CO₂ flux associated with allocating an additional hectare to a specific land use.
Conceptual overview¶
For every grid cell on the common suitability grid, the workflow computes three main quantities:
Pulse emissions (\(P_{i,u,c}\)) – the one-off release (or uptake) that occurs when land transitions from its natural state to land use \(u\) (cropland or pasture). Pulse emissions are computed separately for forest (\(c = \mathrm{forest}\)) and non-forest (\(c = \mathrm{nonforest}\)) portions of the non-agricultural land in each pixel, since these have very different carbon stocks. Forest AGB is recovered from the pixel-average observation by subtracting agricultural and non-forest contributions; non-forest natural AGB (shrubland, savanna) uses zone-specific estimates from
data/curated/luc_zone_parameters.csv.Annual regrowth (\(R_i\)) – the ongoing sequestration potential when land is spared and allowed to regrow. Regrowth rates are derived from Cook-Patton & Griscom (2020), which quantifies carbon accumulation in young regenerating forests. Spared-land LEFs are already area-weighted by the relevant land-cover fraction (cropland or pasture), so pixels without regrowth potential naturally receive zero credit.
Managed flux (\(M_{i,u}\)) – ongoing emissions from managed systems (e.g., peat oxidation, continuous tillage). The current implementation sets \(M_{i,u} = 0\) everywhere as a simplifying assumption.
The per-hectare land-use change factor (LEF) for conversion is split by cover type:
and similarly for pasture. Here \(H\) is the amortization horizon in years (configured via luc.horizon_years, default 25 years). Spreading the one-off pulse over this period converts a stock change into an annualised flow that is comparable to the other per-year emission terms in the model. Each cover type also gets a conversion share — the fraction of convertible (non-agricultural) land that is forest vs. non-forest — which caps the capacity of the corresponding conversion link in the model.
The LEF for spared land provides sequestration credits through regrowth:
Regrowth is not included in the conversion LEFs to avoid double-counting: the model explicitly represents the reforestation alternative via separate spare_land links.
Sub-pixel stock correction¶
At the modelling resolution (~0.5°), most grid cells contain a mix of land cover types. The observed AGB and SOC rasters report pixel-area averages that blend non-agricultural land (high biomass, undepleted SOC) with cropland and grassland (low biomass, depleted SOC). Using these averages directly would underestimate the carbon cost of converting remaining forest and overestimate the cost of converting non-forest natural land.
The workflow decomposes observed pixel-average AGB into forest and non-forest components. Non-forest natural AGB (shrubland, savanna, tundra) uses zone-level estimates from data/curated/luc_zone_parameters.csv. Forest AGB is then recovered as the residual:
where \(f_\mathrm{forest}\) comes from the Copernicus forest fraction layer and \(f_\mathrm{nonforest} = f_\mathrm{nonag} - f_\mathrm{forest}\). If the residual is negative (observational noise), forest AGB is clipped to zero. Pixels with no forest (\(f_\mathrm{forest} = 0\)) receive zero forest AGB and produce no forest conversion links.
For SOC, the correction is unchanged — SOC does not vary as dramatically as AGB between forest and non-forest natural land:
where \(k_\mathrm{crop}\) and \(k_\mathrm{past}\) are the IPCC Tier 1 SOC retention factors under cropland and pasture, respectively.
LEF aggregation¶
Per-pixel LEFs are aggregated to region/resource-class coefficients using exact_extract with land-cover-weighted averaging. Each use type is paired with a land-cover fraction that acts as an additional weight during aggregation:
Forest conversion LEFs (cropland_forest, pasture_forest) are weighted by the forest fraction of each pixel.
Non-forest conversion LEFs (cropland_nonforest, pasture_nonforest) are weighted by the non-forest natural fraction (nonag − forest).
Spared cropland LEFs are weighted by the cropland fraction, so only pixels currently under crops contribute to the sequestration potential of sparing cropland.
Spared grassland LEFs are weighted by the managed pasture fraction (LUIcube grassland fraction × grazing intensity), so only pixels with active grazing contribute to the sequestration potential. Natural grassland (savanna, tundra, steppe) with near-zero grazing intensity is excluded.
Alongside each conversion LEF, the aggregation also computes the area-weighted conversion share — the fraction of non-agricultural land that is forest vs. non-forest. This share is used in the model builder to split the total new-land capacity between forest and non-forest conversion links.
The composite weight for each pixel is the product of the resource-class mask and the relevant land-cover fraction. Regions or classes where the composite weight sums to zero produce NaN (no data), which is dropped from the output.
Application in the optimisation distinguishes new conversion from existing area. For each (region, class, water supply) combination, two conversion links are created:
convert:new_land_forest:*— converts forest to cropland, capped atnew_available * share_forestconvert:new_land_nonforest:*— converts non-forest natural land to cropland, capped atnew_available * share_nonforest
Similarly for pasture expansion (convert:new_to_pasture_forest:* and convert:new_to_pasture_nonforest:*). This gives the optimizer distinct costs for deforestation vs. shrubland/savanna conversion. Baseline cropland can still be spared to earn the spared cropland LEF, and existing grassland pools can be spared via spare_existing_grassland_* links.
Input datasets¶
The LUC pipeline harmonises several global datasets to the common grid:
Land cover fractions and forest masks from Copernicus ESA CCI land cover (Copernicus Satellite Land Cover)
Above-ground biomass from ESA Biomass CCI v6.0 (ESA Biomass CCI — Global Above-Ground Biomass)
Soil organic carbon stocks (0–30 cm) from ISRIC SoilGrids 2.0 (ISRIC SoilGrids — Global Soil Organic Carbon Stock), scaled to 1 m depth using IPCC Tier 1 factors
Natural forest regrowth rates from Cook-Patton & Griscom (2020) (Cook-Patton & Griscom — Forest Carbon Accumulation Potential), representing the carbon that would accumulate if previously cleared land were reforested
IPCC Tier 1 below-ground biomass ratios, soil depletion factors, and agricultural equilibrium assumptions stored in
data/curated/luc_zone_parameters.csv
These layers are reprojected, resampled, and combined by dedicated Snakemake rules to produce per-cell biomass/SOC stocks, forest masks, and regrowth rates ready for downstream processing. The figure below summarises the harmonised rasters on the common model grid.
Land-use change input layers harmonised to the modelling grid: forest fraction (Copernicus CCI), above-ground biomass (ESA Biomass CCI v6.0), soil organic carbon 0–30 cm (SoilGrids 2.0), and natural forest regrowth potential (Cook-Patton & Griscom, 2020).¶
Model integration and land states¶
The land-use change workflow:
prepare_luc_inputs.pyaligns the raw rasters to the resource-class grid and stores intermediate masks and carbon pools underprocessing/{config}/luc/.build_luc_carbon_coefficients.pyderives pulse emissions, annual LEFs, and aggregates them toluc_carbon_coefficients.csv.build_current_cropland_area.pycaptures irrigated and rainfed cropland already in use ascropland_baseline_by_class.csv.
During model construction, build_model.py loads these inputs, converts LEFs to marginal CO₂ flows (MtCO₂ per Mha-year), and applies them by land state:
Baseline cropland enters via fixed
land_existing_cropland_*generators. It does not pay conversion costs but can be spared viaspare_land_*links that earn regrowth credits.Expansion cropland lives on
land_new_*buses up to the suitability cap; two conversion links per (region, class, water) move this expansion intoland:cropland:*—convert_new_land_forest_*(applying forest-to-cropland LEFs) andconvert_new_land_nonforest_*(applying nonforest-to-cropland LEFs) — each capped by its conversion share. Similarly,convert_new_to_pasture_forest_*andconvert_new_to_pasture_nonforest_*links move expansion intoland:pasture:*.Current grassland is split into
land_existing_grassland_convertible_*andland_existing_grassland_marginal_*generators; both flow to the pasture pool viaexisting_grassland_to_pasturelinks and can be spared viaspare_existing_grasslandlinks.Only the convertible grassland pool is deducted from rainfed conversion potential when computing
land_new_*capacities.
All LUC flows connect to the global co2 bus, which feeds a priced CO₂ store (emissions.ghg_price). This keeps cropland expansion, pasture expansion, and regrowth credits on the same carbon price scale while avoiding double-charging existing land. The spatial pattern of the resulting LEFs is shown in the figure below.
Cropland baseline data source¶
The model can derive baseline cropland area from two sources, controlled by luc.cropland_source:
“gaez” (default): Uses GAEZ RES06-HAR (2010-2019 average harvested area) summed across all crop modules. This ensures consistency with production stability constraints that also use GAEZ data. When multiple model crops map to the same RES06 module (e.g., oat, rye, and buckwheat all map to OCE), the module’s harvested area is counted only once to avoid double-counting.
“esa”: Uses ESA CCI land cover satellite data to identify pixels classified as cropland. This approach may show different spatial patterns than GAEZ, particularly in areas with multi-cropping or mixed land use.
Multi-cropping handling¶
GAEZ RES06-HAR stores harvested area, which can exceed physical land area in regions with double or triple cropping. For example, a field that produces two rice crops per year would have harvested area equal to twice its physical area. To convert harvested area to physical cropland extent:
Sum harvested area across all unique RES06 modules for each water supply (irrigated/rainfed)
Where total harvested area exceeds gridcell physical area, scale proportionally so that irrigated + rainfed = cell area
This approach preserves the irrigated/rainfed split while ensuring baseline cropland doesn’t exceed physical limits.
Irrigated vs. rainfed split¶
Both cropland sources use the GAEZ “land equipped for irrigation” share raster to split total cropland into irrigated and rainfed fractions. This ensures consistent water supply attribution regardless of the underlying cropland extent source.
Spared land regrowth¶
Regrowth sequestration rates from Cook-Patton et al. (2020) represent young regenerating forest (0-30 years) on previously cleared or degraded land. The spared-land LEF is simply the negated regrowth rate:
Pixels without regrowth potential have \(R_i = 0\) from the Cook-Patton data, so they naturally receive zero credit. Spared LEFs are area-weighted by cropland_frac (for spared cropland) or pasture_frac (for spared grassland) during aggregation, so only land currently under agriculture contributes.
Only baseline cropland (existing managed area) and current grassland pools (both convertible and marginal) can be spared in the optimisation; newly converted land must first revert to the baseline pool before becoming eligible for regrowth credits.
Network links that implement this behaviour use the spare_* naming scheme: spare_land_* links pull from land:existing_cropland:* buses, and spare_existing_grassland_* links pull from land:existing_grassland_convertible:* and land:existing_grassland_marginal:* buses. Both produce to dedicated spared-land sinks with CO₂ outputs proportional to the spared LEF.
Annualised land-use change emission factors (LEFs) used in the optimisation. Left: CO₂ released per hectare of cropland expansion. Right: CO₂ sequestered per hectare of existing cropland spared and allowed to regenerate.¶
Limitations and assumptions¶
The current implementation makes several simplifying assumptions that should be considered when interpreting results:
Climatic zones: Zones (tropical, temperate, boreal) are assigned by latitude only (tropical: \(\lvert \phi \rvert < 23.5^\circ\), boreal: \(\lvert \phi \rvert \ge 50^\circ\), temperate: otherwise). This does not account for altitude effects (e.g., highland tropics behave more like temperate zones) or local climate variations. A future enhancement would use actual biome or Köppen-Geiger climate classifications.
Agricultural biomass stocks: Cropland and pasture equilibrium above-ground biomass is assumed to be negligible (0 tC/ha) for annual crops. This is a conservative assumption appropriate for grain crops where biomass is harvested annually, but underestimates carbon storage in perennial crops (orchards, oil palm, coffee) and improved pastures. See
data/curated/luc_zone_parameters.csvfor the zone-specific parameters.Forest mask threshold: Regrowth sequestration is only applied to cells with ≥20% forest fraction in the land-cover-derived potential forest layer (i.e., areas that would naturally support forest if unmanaged). This threshold can be adjusted via
config['luc']['forest_fraction_threshold'](default: 0.2). Raising the threshold restricts eligibility to areas that are strongly classified as forest; lowering it allows credits on lightly wooded mosaics.Soil organic carbon depth: SOC stocks in the 0-30 cm layer (from SoilGrids) are scaled to 1 m depth using zone-specific factors from
data/curated/luc_zone_parameters.csv. TODO: These factors require verification against IPCC 2006/2019 Guidelines Volume 4 Chapter 2 to ensure they match the intended Tier 1 methodology.Managed flux: Set to zero everywhere (\(M_{i,u} = 0\)), meaning ongoing emissions from agricultural management (e.g., peat oxidation, tillage-induced decomposition) are not currently modeled. Future work could incorporate organic soil maps and management-specific emission factors.