Teaching model · France 2050 · v0.27.0

The Net Zero Game

Build a national 2050 pathway. Transport, building heating and industry are driven by the detailed game engine; agriculture, energy and waste complete the national inventory through transparent first-order modules. Play it with a dozen coarse controls in the simple view, or with all of them in the detailed view — the model, the reference scenario and the score are the same in both.
An open-source teaching model by Robin Girard, MINES Paris — PSL · about & other versions

Map of the model

2050 scenario dashboard

National view aligned with SECTEN 2026 and the current SNBC 3 sector pathway.

Reference scenario

Emissions

Six emitting sectors, plus natural and technological carbon sinks.

Resource and system constraints

Three limited renewable molecule and biomass pools, plus the winter electricity peak.

Modal shares always add up to 100%. Use the − / + buttons or sliders to change the pathway.

How far, and by what

Four questions about mobility: how much of it there is, what the cars run on, what pulls the freight, and how much of it flies. Each one moves several detailed settings at once — the annex lists exactly which, and by how much.

Current fuel-car travel: destination in 2050

Allocation of passenger-kilometres currently supplied by fuel cars.

Passenger mobility

Current fuel-truck freight: destination in 2050

“Residual thermal” follows the classification convention used in the workbook.

Freight and fuels

The stock says how much heat the country needs; these say what covers it. Gas has no slider — it absorbs whatever the targets leave uncovered.

How much heat, and where it comes from

Ask for less heat, lose less of it, then change what produces it. Watch the winter peak on the dashboard as you electrify: it is the constraint that bites first.

Targets

Two settings, three numbers. You set how much of the heat runs on electricity and how much wood is burned; gas takes whatever is left, so it is read out below rather than set. The three always close on the heat the stock needs, which is why only two of them can be free.

How the electric heat is produced

Rebalanced to 100% of the electric heat above. The differences are not cosmetic: on the coldest evening an air-air or air-water pump falls to a COP of 2, a network heat pump to 1.5, a resistance stays at 1, and a hybrid moves 70% of its load onto gas.

Heat networks

Declared in TWh. With the network heat pumps set above, these say how much of a network is decarbonised; gas absorbs the rest along with everything else.

Building-stock performance

What the country builds

New in v0.20, and it is where the cement comes from. Until now cement volume was a bare slider: a scenario could remove a third of French cement without naming a building it had not built. Floor area now drives it — but only as far as it can reach. New buildings are about a third of French cement; roads, buried networks and bridges are another third and no square metre drives them; and the last third is renovation plus a gap between two published maps that nobody has closed. Timber takes roughly half the cement out of the square metres it frames, and almost none out of the steel bar, because new buildings are only about a ninth of French steel.

What this does not do yet: the new floor area consumes cement and heats nothing. The heated stock is still frozen at its base-year surface, which is why the heating bill above does not move when you build more. That is the next stage, and it is named in the annex.

Everything that is not space heating

Hot water, cooking, air conditioning and the specific electrical uses — lighting, appliances, screens, and the servers behind them. Roughly as much energy again as heating, and until v0.8.0 none of it was in the account. Appliance efficiency and equipment growth pull against each other on the same usage, which is why both are here.

Air conditioning makes a summer peak, and the only peak this model constrains is a winter one — the number is carried, the asymmetry is not scored. Fuel switching in hot water and cooking is not a lever yet: their carrier mix is carried forward as observed.

What the heat balance and the stock do

Algebraic port of the five value chains represented in Excel: steel, ammonia, olefins, food and cement.

How much material, and made how

The three ways an industrial sector decarbonises: make less of the material, change the process that makes it, or use less energy for the same output. They are separate here because they cost different things and are argued about separately.

Steel and ammonia

How the hydrogen is made

Every tonne of hydrogen in the model — steel, ammonia, freight, chemistry, refining — comes from this mix. Until v0.12.0 all of it was electrolytic by assumption, which was a strong claim wearing no clothes: 87 TWh of electricity, and no way to ask what a reformer would cost instead.

Reforming trades electricity for methane, and in this model 2050 methane is biomethane — so the colour of the hydrogen follows the colour of the gas, and it competes for the same pool the buildings and the power stations want. With capture on biogenic methane the route goes carbon-negative, which is real physics and the most contested line in the model. Read the Controversy tab before leaning on it.

Plastics and industrial heat

The rest of industry

Seventeen manufacturing branches the game does not model as value chains — metals and machinery, minerals, the rest of chemistry, paper, and a diverse remainder. Together about 174 TWh today, 68 of it electricity: more than the five chains above use between them. Output and processes move separately, because the source scenario changes both at once and only one of them is decarbonisation.

Move the output slider before you judge the process one. The 2050 scenario these levers interpolate towards is a reindustrialisation: measured branch by branch it multiplies textile output by 8.5, electronics by 3.1 and mineral extraction by 2.5, while mineral chemistry falls to half and naval and aerospace to 0.56. Growth of that size is not decarbonisation. The reference scenario therefore sits at 0% output change and 100% process change — today's output, modernised processes.

Cement

One account, read four ways. Every hectare sits in exactly one of seven classes and the total never moves; the forest's carbon sink is an identity in cubic metres rather than a number somebody chose; what the country eats sizes its herd, and the herd and the fields are the agriculture sector's emissions; and the biogas, liquid fuel and wood the scoreboard scores are what this same land can supply. Nothing on this tab is a trajectory drawn between two points.

The land, the plate and what grows on the rest

Four questions about the same territory: what is eaten off it, what is planted on it, what is spread on it, and how much of it grows energy. Each one moves several detailed settings at once — the annex lists exactly which, and by how much — and they pull against each other on purpose, because they share one account, whose size the land table below states.

The land account

Seven classes, one fixed total: every hectare one of these levers takes out of a class arrives in another. Nothing absorbs a residual, because there is none — and what a hectare is worth depends entirely on which class it left.

Where the hectares are, and where they go

The same territory twice: as the land survey measured it, and as these levers leave it at the horizon. The two bars are the same length because the account closes — a partition, not a budget — so every gain you can see is a loss somewhere else in the same bar.

The legal reference. The Climat et Résilience law of 2021 asks for half the artificialisation of the 2011–2021 decade by 2031, and none at all — zéro artificialisation nette — by 2050. The comparison is not exact and the difference is not small: the law is written on the cadastre and this account is written on the land survey, which counts a garden and a verge as artificialised and reads two to three times higher. The slider is stated on the survey's measure, because that is the measure the account has to close on; the annex says what the cadastre would say.

The forest and what is cut from it

The sink is growth, less mortality, less what is harvested, times a carbon coefficient per cubic metre. Cutting more wood therefore costs the sink what it gains the boiler — and the climate the forest lives through moves the answer further than any of these levers do.

The six pools of the sink

Positive absorbs, in both columns. The inventory writes a sink negative and this module writes it positive; the sign is applied once, where the national account needs it, so a pool shown here as a source really is one. Two of the six are sources today, and the artificial pool is a source because building on a hectare releases what was in it.

What the country eats, and what it sells

Demand sets production, production sets the herd. Trade sits in the middle: cut the milk and the dairy herd shrinks, but a large share of the beef is a by-product of that herd, so the suckler herd grows to meet a beef demand that has not moved. How large a share is a national number, and the annex gives this edition's.

The fields, the nitrogen and the farm's fuel

Mineral nitrogen is the longest lever here: it sets the nitrous oxide the soils give off, the carbon dioxide of urea and liming, and the ammonia the industry chain has to make — which is where the hydrogen goes.

The farm account — emissions, herd, plates and nitrogen

The agriculture sector is no longer a position on a published trajectory: it is this account, and it is built forwards. The inventory publishes three blocks and this module splits the livestock one into enteric and manure methane on its own authority, which is worth knowing before quoting the split.

What the land can supply

Manure that goes to a digester emits less than manure that sits in a store, and it produces methane while it is there. These levers, the manure one above and the harvest one further up decide all three biomass resources at once — and the scoreboard's biogas, biofuel and wood bands are now those resources rather than a rule. Cover crops share their hectare with the spring crop that follows; the fuel crops do not, and come out of the same arable land the food chain wants.

Biomass, supply against demand

Three pools, each built feedstock by feedstock and each drawn against what the rest of the scenario asks of it, on one scale. The supply bar is what this land makes; the demand bar is what the transport, building, industry and power levers have ordered. The scoreboard's three biomass bands are these same numbers, so a card and a chart cannot disagree.

How much CO₂ a kilowatt-hour carries in 2050. These are scenario assumptions, not measurements, and in a decarbonised pathway they decide almost everything that is left. They were editable in the source workbook and are editable here.

2050 emission factors

Observed 2020 values, for comparison: electricity 79, methane 227, liquid fuel 264, wood 27 gCO₂/kWh. Coal is fixed at 340 gCO₂/kWh because it is a property of the fuel, not a choice. Hydrogen and e-fuel carry no factor of their own — they are converted back into the electricity used to make them.

Try this in class. Set methane back to 227 and liquid fuel to 264 and watch what happens: the scenario relies on every molecule being biogenic. The whole difference between a decarbonised transport sector and today's is carried by two numbers nobody in the game ever chose to produce.

What makes the electricity, and what the gas plants burn when the wind drops. Everything else in this model asks the power system for kilowatt-hours; this is the only tab that answers with what. The hydrogen share below is also the single largest methane lever in the game — every point of it takes gas out of a resource the buildings, the trucks and the factories are all competing for.

The electricity mix

One of RTE's six 2050 scenarios, from M0 at 100% renewable to N03 at about half nuclear. It selects a set of shares, not a quantity: the mix is scaled to whatever electricity the rest of the model turns out to need, so this answers with what and never how much. Capacity follows from energy through a load factor, and what has to be built each year from capacity through a lifetime — which is what the material account below reads.

TechnologyShareTWh/yGWGW built/ybn€/y

This does not check that the mix works. There is no hourly balance, no adequacy calculation and no storage: a 100%-renewable share structure is applied exactly as a nuclear-heavy one is, and the winter peak the building module computes is a demand-side number that nothing here has to meet. The cost is plant only — no fuel, no carbon, no network, no storage.

What the pathway weighs. A satellite account: it reads the scenario, nothing reads it back — the steel a wind farm needs is not charged to the steel industry the model already has, and none of it emits. Wiring it back would double-count against an industry whose output is set by its own levers.

Battery chemistry

The sharpest trade-off in the account, and there is no chemistry that is cheap in every metal at once.

Annual material demand of the transition, 2050

MaterialGenerationVehiclesBatteriesBuildingsTotal

Annualised cost in real euros, from the point of view of whoever pays: the industrial producer, the building owner, the household. Read the deltas rather than the levels — the levels carry all the parameter uncertainty, the deltas are what the game is about.

Financing

Two separate rates, because an industrial investor and a household do not face the same cost of capital. This single choice moves retrofit economics by about a factor of two, which is why it is a lever and not a hidden constant.

Prices and provisional assumptions

The last two are flagged provisional: no primary source has been secured for them yet.

Industry — cost per tonne of product

Product and routeOutput (kt/y)Capital + fixedEnergy and feedstockCarbonTotal €/t

Aviation — what a ticket costs when the kerosene is synthetic

Flight categories and traffic are the DGAC's own, for 2023. The energy is the one the emissions account already charges, so the ticket and the carbon describe the same flight. These are costs, not fares: no margin, no tax, no yield management.

FlightDistanceCost todayof which fuelCost in 2050of which fuelChangekgCO₂ todaykgCO₂ 2050

Every flight gets the same relative increase, and that is a limit of the model, not a result. Everything that is not fuel is derived from today's ticket through a single fuel share of operating cost, so the non-fuel cost is proportional to distance. In reality a short flight carries far more per-flight cost — airport charges, crew, turnaround — so short-haul is much less exposed to the fuel price than long-haul, and its ticket here is understated. Correcting this needs a per-flight versus per-kilometre cost split that no source in hand provides.

Buildings — annualised cost of retrofit, equipment and energy

ComponentInvestment (bn€)Annualised (bn€/y)€/m²/y
The two segments are split by their energy mix, not by floor area. The residential stock takes 87% of the wood but only 54% of the gas, so a floor-area split would have misstated both — which is why the two €/m² figures now differ. The retrofit and equipment annuities are still split by area, because the model has no separate stock for them. That is the remaining approximation, and the reason to split the building module properly rather than its cost.

Households — annualised car mobility cost

Component€/household/yBasis
Purchase, insurance and maintenance are technology-neutral by decision. The electric-versus-thermal purchase premium and maintenance saving are not yet sourced, so they are excluded: only the size of the car fleet moves this block. A scenario that electrifies without changing mobility demand will therefore show its saving on energy only, and understate or overstate the true household cost.
What this cost layer does not include

Freight, aviation and public-transport costs; the counterfactual boiler avoided when a heat pump is installed; grid reinforcement; CO₂ transport and storage; the cost of the CO₂ feedstock for synthetic olefins; industrial equipment for food-industry heat; and any subsidy, tax or transfer. Nothing here says who actually pays.

Prices mix reference years — 2017 for the household mobility budget, 2025 for household energy, 2050 for industrial commodities — with no deflator applied. Treat cross-sector comparisons of levels with caution.

The published inventory and the published objective, side by side with the sectors the model does not compute. The reconciliation that connects them to the model is under the results, on the right, because it belongs next to the number it explains.

The published inventory and the SNBC 3 objective

Official sector1990Model coverage
Latest observed year: 2024 is consolidated in SECTEN 2026. The 2025 figure, 359.4 MtCO₂e gross, is a proxy and remains subject to revision.

What happens to what the model does not compute

0% keeps the consolidated 2024 value; 100% reaches the current SNBC 3 2050 order of magnitude. These are inputs, not results: at 100% agriculture, waste and energy production sit exactly on the SNBC value, so three of the six national rows are a recopy of the objective they are being compared with. Read them as an assumption about the rest of the economy, not as an answer.

The industry lever is a coverage gap, not a pathway. The model computes five value chains — steel, ammonia, olefins, cement and food-industry heat. Glass, paper, non-ferrous metals and the rest of chemistry are not in it. The size of that hole is computed from the official total rather than assumed, and this lever decides only how fast it shrinks.
Official sources and scope caveats

The consolidated 2024 values come from SECTEN 2026, on the France hexagonale + Outre-mer UE perimeter.

Current sector reductions and national totals come from the SNBC 3 ministry pages.

The combined technological sink is inferred transparently as −43 MtCO₂e: −66 MtCO₂e of total 2050 absorptions less the −23 MtCO₂e natural sink. This is a closure convention, not a separately published sector target, which is why the slider no longer opens on it: its reference is 30, and the gap to the −43 is shown rather than assumed away.

Earlier versions rescaled each sector by the ratio between the live game result and the workbook's own 2020 baseline. That method transferred relative change but could never reveal a sub-sector the model omits, because the omission cancels between the numerator and the denominator. It has been replaced by the line-by-line reconciliation shown under the results.

A model that shows its sources still hides which of them are argued over. This names them. Everything here is visible elsewhere in the annex — a reader should not have to reverse-engineer which numbers are settled and which are live.

This is open source, and the point of it is that you can check it. If a number looks wrong to you, that is a contribution, not a complaint.

Where it came from

It started as a home-made Excel workbook — the kind every teacher builds and nobody else can read. Rebuilding it with the help of AI made it something else: every formula is declared in a YAML file, not buried in a cell, and every assumption carries its value, its bounds, its provenance and its sources. The engine that runs in your browser, the annex you are reading and a Python checker are all compiled from those same two files, and a test fails the build if the two engines ever disagree. A value shown and a value used cannot differ.

That is the whole argument for the rewrite. Not that it is more accurate than the spreadsheet — in places it is the same numbers — but that you can audit it.

Who made this, and where it lives

Built by Robin Girard, MINES Paris — PSL. The project page, with every published version kept at its own permanent link, is at robingirard.eu/TheNetZeroGame.html — a scenario shared with a class still opens against the model it was built on.

It is open source. Everything, including the model, its sources and this page:

Tell us what is wrong

In French or in English, whichever you prefer. Bugs, remarks, a figure you disagree with, or a source we should have used and did not.

What happens to it. Every disagreement about a number gets one of three answers, and we will tell you which: the assumption changes, or we explain why it does not, or — when the honest answer is that reasonable people differ — it goes into the Controversy tab so the disagreement is visible to everyone rather than settled quietly.

Before you start

Strategy prompts — not solutions

Four ways in, none of them an answer. A winning combination does exist — every band can be met at once — but there is more than one, and the interesting part is which trade-offs you accept to get there: emissions against electricity, molecules against demand, this decade's peak against the next one's materials.

Start with demand

Ask which services must grow, which can stabilise, and where efficiency or sufficiency can reduce energy before changing technologies.

Electrify selectively

Prioritise direct electricity where it is efficient, while watching the building-heating peak and electricity used indirectly for H₂ and e-fuels.

Reserve scarce molecules

Biogas, biofuels and wood are limited pools. Consider which uses have few credible alternatives and which can switch to direct electricity.

Build a balanced portfolio

Combine modal shift, renovation, process change, material efficiency and carbon capture rather than relying on one lever.

How complete is the calculation engine?

ModuleCoverageWhat is recalculatedMain limitation
TransportDetailed algebraic portNeeds, modal shifts, unit energy, fuel split, H₂/e-fuel electricity and emissionsTwo legacy Excel double counts removed; the Excel edition still has them
Building heatingStock, allocated by target24 segments give the heat need and the 2020 peak anchor; targets allocate it across five electric technologies, biomass, networks and a gas residualOne-shot 2020→2050, no conversion-rate trajectory
Building, other usagesObserved levels, moved by leversHot water, cooking, cooling and specific electricity, by carrier, with efficiency, growth and electrificationNo stock and no technology detail; cooling makes a summer peak the model does not score
IndustryDetailed algebraic portFive value chains plus seventeen branches, production routes, vector consumption, process emissionsInherits some workbook accounting conventions
HydrogenProduction mixElectrolysis, steam reforming and autothermal reforming with capture, serving every consumerNo capture-train capital cost, no CO₂ transport or storage cost
Electricity supplyMix follows demandOne of RTE's six 2050 scenarios sets shares; capacity, annual build, fuel and plant cost followNo hourly balance, no storage, no adequacy check — a 100%-renewable mix is applied exactly as a nuclear-heavy one
MaterialsSatellite accountSteel, concrete and critical metals for the generation build, vehicles and batteriesOne-way: nothing reads it back. Heat pumps absent, nothing recycled
National inventory bridgeScope 1, shared with the inventorySix sectors, both carbon sinks, gross and net totalsInternational aviation and shipping are the one remaining difference
Agriculture and wasteFirst-order trajectoriesLinear interpolation from observed 2024 to the SNBC3 2050 order of magnitudeNo bottom-up physical drivers yet
Energy productionComputed from the mixThe fuel the chosen electricity mix burns, at the model's own emission factorsPower generation only — refining and fugitive emissions are outside the model
Carbon sinksSet directlyNatural and technological absorptions, each on its own sliderThe technological sink is 30 MtCO₂ a year that nothing here builds, powers or pays for, and the control is flagged above 20
Model-risk statement: this version is suitable for teaching and scenario comparison, and not for forecasting. The three limitations that would matter most if anyone tried: there is no adequacy check on the electricity supply, so no scenario here is shown to be buildable hour by hour; the building transition is a single jump from 2020 to 2050 with no rate; and agriculture and waste are interpolations rather than physical models. Each is stated where it applies rather than only here.

Transport levers

Modal destination shares redistribute the 2020 service demand of a source mode among 2050 modes. Existing activity in other modes remains in the calculation.

Passenger or freight demand reduction is applied to all passenger-kilometres or tonne-kilometres before modal allocation.

Biofuel share splits liquid fuel between biofuel and e-fuel. E-fuel production uses electricity with a 40% conversion efficiency.

Building-heating levers

The stock — 3 655 Mm² across 24 segments, 8 heating systems × 3 building types — says how much heat the country needs and anchors the winter peak. What covers that heat is set by target, and gas has no slider: it absorbs whatever the targets leave uncovered. That is what makes the account close by construction, and what makes the cost of not choosing visible.

Biomass is a target in TWh of wood burned, not a share, so it can be read straight against the biomass limit on the dashboard instead of being reconstructed from two shares. Electrification is a share of the heat need — of heat, not of energy; how that heat is produced is the next question down, and it is where the peak is won or lost.

The five electric technologies are not interchangeable. Over a year an air-water pump returns 3 kWh of heat per kWh of electricity, an air-air or network pump 2.5, a resistance 1. On the coldest evening both air pumps fall to 2, a network pump to 1.5, a resistance stays at 1, and a hybrid moves 70% of its load onto gas while running 95% electric over the year. Electric resistance is a slider rather than a stock that can only shrink, because a scenario may genuinely install more of it: it is cheap to fit and the worst thing that can happen to the peak.

Heat networks are declared in TWh of wood and of recovered heat. With the network heat pumps set above, those say how much of a network is decarbonised; gas absorbs the rest along with everything else. Recovered heat has no emission factor and adds nothing to the peak, which makes it the cheapest thing a network can run on — and the model does not check it against the waste-heat gisement the industry module computes, so raising it far is optimistic in a way nothing here will stop you being.

Retrofit improvement is an average demand reduction across the whole stock, not the percentage of buildings renovated. It acts on the heat need before any system sees it, so it benefits every vector alike and is the only lever that lowers the peak without changing a single technology.

If the targets over-subscribe — more heat allocated than the stock needs — gas floors at zero and the surplus is reported beside the sliders rather than absorbed. A scenario that has quietly allocated more heat than exists is one whose numbers should not be trusted.

What this replaced, twice. Until v0.5.0 building heating was an aggregate fitted at a single point: three linear regressions, one COP of 3, one peak COP of 2. Its three carriers each implied a different total heat demand — 332 TWh via electricity, 366 via wood, 229 via gas — so the shares were not a partition and substitution did not conserve heat: on a path to 95% electric, 41 TWh appeared from nowhere. The 60% cap on electric heating existed to hide that. v0.5.0 replaced it with a transition of surfaces, which conserved heat properly but could only ever shrink electric resistance and split the biomass a scenario used between "leaving" and "arriving" shares nobody could add up. v0.7.0 keeps the stock for the heat need and the peak anchor, and sets the allocation by target.

What it still does not carry: domestic hot water, cooking, cooling and the specific electrical uses — this is space heating only, roughly half of what a building consumes. The allocation is national, so it cannot say that a heat network needs density and a detached house will not get one; the residential/tertiary split of each vector follows the heat need rather than a separate stock.

The winter electricity peak constraint

The peak indicator is the additional winter power demand created by electric space heating. It is the constraint that makes electrification a trade-off rather than a free win: a scenario can be excellent on emissions and still be unbuildable because it asks the power system for too much capacity on the coldest evenings.

It is built from the stock: every segment's heat need, at its system's peak efficiency rather than its seasonal one, counting only the share of that system actually running on electricity on the coldest evening. Those three things differ by technology in ways a single COP cannot express. Air-air and air-water heat pumps fall from 2.5 and 3.0 seasonal to 2.0 apiece at peak; district-heating electricity falls from 2.5 to 1.5; electric resistance is 1 in both, which is why retiring it is the strongest single lever here. A hybrid heat pump runs 95% on electricity over the year but 70% on gas at peak, so it is by some distance the cheapest way to electrify heat without buying winter capacity — and the gas shows up in the emissions.

The 2020 figure of 40 GW is an anchor, not an output: the same expression is evaluated for the 2020 and the 2050 stock and their ratio scales it, so freezing the stock returns the anchor. Thresholds are 35 GW (target) and 45 GW (limit).

The reference scenario is over the limit, at 51 GW, and that is the finding rather than a slip. The workbook's own peak formula divided by the peak efficiency twice, and anchored its 40 GW against the 2020 useful heat instead of the 2020 peak load — two different quantities, so running its own 2020 stock through it returned 36.8 GW rather than 40. Its answer, 39.45 GW, is the number the old aggregate module was fitted to reproduce, and the 35/45 band was set against it. Corrected, the transition the workbook describes does not hold the winter peak flat: it multiplies it by about 1.27. The band was deliberately left where it was, because a scenario that meets its carbon targets and still cannot be built is the thing this indicator exists to show. The levers out of the red are real ones — retrofit, hybrid heat pumps, district heating, and not replacing electric convectors with more electric convectors.

Scope limitation: only building heating is counted, as in the workbook. Electricity used by transport, industry, hydrogen and e-fuels changes the annual energy but is not added to this peak, even though electrolysers and industrial loads do interact with system adequacy in reality.

Building usages other than heating

Space heating is about half of what a building consumes. This is the other half — hot water, cooking, air conditioning, and the specific electrical uses: lighting, appliances, screens and the servers behind them. Until v0.8.0 the model left all of it out, which meant it was scoring roughly half the sector.

The data is CEREN's, as the SDES publishes it. Residential is 2024, the latest available. Tertiary is 2019, not 2020: 2020 is a Covid year in which tertiary consumption fell from 237 to 209 TWh and recovered afterwards, so using it would have built a lockdown into the 2050 baseline.

Heat-pump ambient heat is excluded. The source reports it beside the electricity that drives the pump; counting both would double the energy.

It is a weaker model than the heating one, deliberately. There is no stock and no technology choice: each usage is its observed energy carried to 2050 and moved by efficiency, growth, or both. The alternative was to leave 240 TWh out of the account entirely.

Three gaps, named. Fuel switching in hot water and cooking is not a lever — their carrier mix is carried forward as observed, so a scenario cannot electrify a gas water heater here. Air conditioning makes a summer peak and the only peak this model constrains is a winter one, so its growth costs energy and emissions but is never scored against a capacity limit. And district heat is folded into gas, the model having no heat carrier outside the heating module — 2.8 TWh, stated rather than buried.

The accounting scope — read this before comparing anything

This model is a scope-1 account. Emissions are booked where the combustion happens. A power station's emissions belong to the power station; they are not spread back over everyone who used a kilowatt-hour. Electricity therefore carries nothing where it is consumed — a building that electrifies its heating shows zero emissions for that electricity, and the emissions appear in Electricity generation instead, computed from the fuel the chosen mix actually burns.

The consequence to hold onto: electrification moves emissions rather than removing them. Where they land depends on the electricity mix, which is a separate choice on the Supply tab. Grow the specific electrical uses by half and building emissions do not move at all — the energy sector does.

This is the convention SECTEN and the SNBC use, which is why the national reconciliation is now a short page: the only difference left between the two accounts is international aviation and shipping, which the inventory reports as a memo item outside the national total.

Until v0.11.0 it was a footprint account — every sector charged the life-cycle emissions of its electricity at 40 gCO₂/kWh. That is a legitimate convention and it answers a different question: what does this sector cause? rather than what does this sector burn? It made the game total 61.3 MtCO₂ where it is now 30.0, and it made buildings 15.6 where they are now 5.0. Neither number is wrong; they are answers to different questions, and the model now answers the one the national inventory asks.

What the grid factor is and is not. The model derives it from the mix rather than declaring it: roughly 1.7 gCO₂/kWh at the reference. That is a combustion figure — no construction, no fuel chain, no decommissioning — so it is not comparable with the 80-odd gCO₂/kWh a life-cycle study reports for the same grid. Comparing the two is the most common way to make this model say something it does not say.

The electricity mix

The supply follows the demand rather than standing beside it: whatever electricity the rest of the model turns out to need is served by the share structure of one of RTE's six 2050 scenarios, from M0 at 100% renewable to N03 at about half nuclear. Choosing a scenario answers with what, never how much.

Capacity follows from energy through a load factor — RTE's own, read back out of its capacity and generation tables, and remarkably stable between scenarios: onshore wind 23%, offshore 41%, solar 14%. What has to be built each year follows from capacity through a lifetime, on the reasoning that a fleet of that size has to be renewed at that rate. It is a build rate, not a build programme: it understates the years the fleet is still growing and overstates them once it is not.

Two splits the source does not make are made here. Solar is halved between ground and rooftop, offshore wind between fixed and floating. Both matter to the material account — a floating foundation is 480 t of steel per MW against 250 fixed — and neither is a result.

This does not check that the mix works. There is no hourly balance, no adequacy calculation and no storage: a 100%-renewable share structure is applied exactly as a nuclear-heavy one is. The winter peak the building module computes is a demand-side number that nothing on this side has to meet, and the whole question of what a renewable-heavy mix costs in flexibility is absent. The cost shown is plant only — capital recovered over each technology's own life, plus fixed operating cost. No fuel, no carbon, no network, no storage. It lands near RTE's own figure for its scenarios, which is reassuring about the arithmetic and says nothing about the omissions.

How the hydrogen is made

One mix serves every hydrogen consumer in the model. Three routes: electrolysis, which buys hydrogen with electricity at the 60% conversion the rest of the model uses; steam methane reforming, which buys it with methane; and autothermal reforming with capture, which does the same and puts 94% of the carbon underground — ATR concentrates the CO₂ in one stream, which is why it captures where a reformer with post-combustion capture struggles past 60%.

Ammonia no longer owns a route. It used to be two rows — 700 kt from electrolytic hydrogen, 200 kt from a reformer — which put the hydrogen decision inside the ammonia lever and nowhere else. Now every tonne consumes the same 5.94 MWh of hydrogen and the mix decides how it was made, which is where that decision belongs: the same reformers serve steel and everything else.

The capture credit is charged against the physical carbon, not against the emission factor. Those are different numbers and both are needed: efGas at 25 gCO₂/kWh answers "what does burning this count as?", while carbon_in_methane at 202 gCO₂/kWh answers "how much carbon is there to capture?". A capture plant removes molecules, not conventions.

Hence the negative number, and hence the warning. Reforming biomethane with capture takes carbon out of the air and puts it underground, so the route reads about −13 MtCO₂ a year at full deployment — enough to close three quarters of the gap to the SNBC on its own. That is the physics of BECCS. It is also the point at which this model will most easily mislead: it says nothing about whether the biomethane exists, what land it came from, or whether the storage holds. The Controversy tab says so too.

What is missing. No separate capital cost for the capture train — the ATR route uses the reformer's annuity, which understates it. No transport or storage cost for the CO₂. And the methane a reformer needs is charged to the biogas pool, which at full reforming is well past anything France could supply.

Materials of the transition

A decarbonisation pathway is usually argued in TWh and MtCO₂. This says what the same pathway weighs: the steel, concrete and critical metals it asks for each year in 2050.

It is a satellite account, and deliberately a one-way one. It reads the scenario; nothing reads it back. The steel a wind farm needs is not charged to the steel industry the model already has, the concrete is not charged to cement, and none of it emits. Wiring it back would double-count against an industry whose output is set by its own levers — so the honest thing is to compute the demand and put it beside the supply rather than inside it. A test pins that no material lever moves emissions, energy or cost.

What drives it. Generation is a declared build rate in MW per year, because the model has no electricity supply module: it computes demand, not a mix. Vehicles are a declared annual production, but the share of it carrying a battery follows the player's own electrification levers for cars and trucks. Those levers are shares of demand rather than of production; over thirty years the two converge, and the approximation is stated rather than hidden.

The chemistry lever is the sharpest trade-off here. LFP carries almost no cobalt — 7 grams per MWh against 27 kilogrammes — and a quarter of the nickel, but 4.4 times the lithium, 490 kg per MWh against 111. There is no chemistry that is cheap in every metal at once.

Two comparisons worth reading. The transition's steel against the steel this scenario's own industry produces: both sides move with the player, so electrifying harder raises the steel needed and, if the industry levers are left alone, does not raise the steel made. And its concrete against clinker — a ratio above one would not be an error, since concrete is mostly aggregate.

What is missing, and it is named rather than filled. Heat pumps are absent: no source in hand gives their material content per unit, and inventing one would put a number in the annex that nothing supports. Closing it needs a per-unit steel, copper and refrigerant intensity from an LCA or from ADEME. Flat glass, plastics and rubber are carried by the source for vehicles but not totalled here. Nothing is recycled: this is primary demand, so a scenario with a serious secondary-metal loop would need less than the account says.

Industry levers

Steel production change is the relative change in 2050 steel output compared with the country’s 2020 route volumes. The coefficient is used as 1 + g: +30% means a multiplier of 1.30, while −20% means 0.80.

H-DRI steel share splits primary steel between the BF-BOF and hydrogen direct-reduction routes. Recycled EAF steel is scaled by the same production-change coefficient.

Green ammonia is entered in kt/y. The workbook reference also contains 200 kt/y of grey ammonia; its treatment is documented as an accounting limitation.

CO₂ + H₂ olefins combines a new production-route share with plastic-demand reduction and an optional biogenic-CO₂ credit.

Clinker ratio and capture separately affect cement production-process emissions — the decarbonation of the limestone, about 0.53 tCO₂ per tonne of clinker. Capture applies to that term only. A real capture plant on a kiln would take the fuel CO₂ with it, so the lever is a floor on what capture delivers; the kiln’s fuel is charged through the energy account.

The land account, the forest and the carbon sink

The account. Every hectare of the territory sits in exactly one of seven classes — arable, permanent grassland, vines and orchards, forest, heath and scrub, water and wetlands, artificialised — and the seven always sum to 54.919253 Mha, the Teruti land survey's total for 2023. Three levers move hectares between them over the horizon: artificialisation, afforestation, and the conversion of permanent grassland into arable land, which is signed so that re-grassing is reachable. Nothing absorbs a residual, because a partition has none; the model reports what is left as land_account_residual and a test drives 27 corners and 200 seeded Latin-hypercube draws through it to check that it stays under 10−6 Mha.

The forest. The living-biomass sink is an identity in cubic metres, not a trajectory: k · (P·A − M·A − H), where P is gross production per hectare, M mortality, A the production area and H the harvest. The IGN forest inventory measures P = 5.4 m³/ha/y, M = 1.0, A = 16.6 Mha and H = 53.1 Mm³/y including the firewood that is cut and burned and never sold — about 15 Mm³, a quarter of the country's wood, and missing from the commercial harvest statistic that most scenarios are written on. The climate control is three named IGN–FCBA cases rather than a slider, because the projections come as cases and interpolating between them would invent a curve nobody modelled: by 2050 production falls 1%, 12% or 25% while mortality rises to 1.1, 1.4 or 1.8 times today's.

k = 2.0, and the argument for 1.5. This is the single most consequential number in the module and it is contested, so both readings are given. 1.5 tCO₂/m³ is the SNBC's gross increment, 130 MtCO₂e, over IGN's gross production, 87.9 Mm³ — a gross ratio applied to a net balance. 2.0 is IGN's own net sink over IGN's own net balance: 39 MtCO₂/y for a +19.5 Mm³ balance, which is the internally consistent coefficient for this identity and the one used here. At k = 2.0 the identity reproduces IGN's published figure to 39.9 against 39; at k = 1.5 it gives 29.9 and a 15 Mt hole. The marginal response, 2.0 tCO₂ per extra cubic metre harvested, sits between IGN–FCBA's 1.4 and ADEME's 2.2, which is where a marginal figure should sit. A reader who prefers 1.5 should read every sink figure on this page as about a quarter smaller.

An endpoint, not a mean — the caveat most often missed. The identity is evaluated at 2050 and gives a 2050 endpoint. IGN–FCBA and ADEME publish 2020–2050 means, which are higher, because the sink is still falling across the period. A reader comparing this model's −20.1 with IGN–FCBA's B2 case of "10 MtCO₂e/y" is comparing two different quantities. The same applies to the +53.8 corner, a forest being liquidated under the severe climate case: it is reachable inside the declared bounds and is reported rather than clamped away.

The six pools, and the base year. Forest living biomass, dead wood, litter and soil on conversion and the French Guiana forest make the forest pool; then harvested wood products, grassland, cropland, artificialised land and wetlands. The model's own 2024 lands at 51.897 MtCO₂e absorbed against Citepa's −51.956 — a gap of 0.06, which is the rounding of the published sub-sector lines against their published total, and which is reported as land_sink_check_2024 rather than absorbed into a pool. Soil-carbon practices at 100% are INRAE's 17.3 MtCO₂/y, split 14.777 on arable and 2.530 on grassland by the itemised practices. No-till is deliberately excluded, because INRAE's own reading is that it redistributes carbon down the profile rather than adding any; the widely quoted "+21 MtCO₂/y, 4 per 1000" headline includes both it and forest land.

What is left out, and what does not reconcile. The afforestation lever's two ends are not the same measurement: the SNBC 3 plans 15 kha/y of deliberate planting, IGN's inventory measures the forest expanding by 90 kha/y — mostly spontaneously, as canopy closes over abandoned grazing — and Teruti sees 35 on the same territory. No published concordance settles it, and the lever spans all three. The artificialisation lever has the same problem in the other direction: the Climat et Résilience law is written on the cadastre, which counts parcels newly built on, while this account is written on Teruti, which counts every garden and verge; the two differ by a factor of two to three, and the emission content of the artificial pool — 96 tCO₂ per hectare of annual flow — only closes on the Teruti rate. The French Guiana forest is a constant, not a model. Soil carbon saturates and this is a thirty-year rate.

Harvested wood products are a stock, since stage E. Stage A read the pool as a flow — 0.562 tCO₂ per cubic metre of extra long-lived volume, fitted to the SNBC 3's "at least 3 MtCO₂e/y in 2030". It is now the IPCC first-order-decay stock: the inflow of sawn timber, panels and plywood each year, less k times what is standing, with k = ln 2 / 28.9 years — the IPCC 2019 Tier 1 half-lives of 35, 25 and 30 years weighted by the national inventory report's own 2021 inflows to the three categories. The carbon per cubic metre, 0.837 tCO₂, is that report's 10.0 MtCO₂ of long-lived inflow over the model's 11.95 Mm³ of base-year long-lived harvest, and it lands within half a per cent of the IPCC's default density for sawnwood without having been fitted to it. The base stock is derived from the base-year balance — a pool that takes in 10.0 and is measured as a source of 0.4 holds (10.0 + 0.4)/k = 433 MtCO₂ — so the 2024 line is reproduced by construction, and the stock the inventory report's own outflows imply, 359 MtCO₂, is shown beside it: a fifth smaller, because the 2026 inventory vintage books a source where the 2023 report booked a sink. With a constant inflow from the base year the closed form is flux(2050) = 0.526/28.9 × (inflow − base inflow + base balance), so the stock drops out of the flux and the pool responds to the change in what is put in, damped by half over the horizon. At the reference that is 2.50 MtCO₂/y where the flow reading gave 3.00; the flow reading is kept on the page as a comparison line. Paper, at a two-year half-life, is at equilibrium with its own inflow and is left out.

In the simple view. One coarse control drives this section: Plant and protect the forest. At its maximum it takes the afforestation rate from the strategy's 15 to the 90 kha/y the forest inventory measures, cuts the harvest from 60 to 45 Mm³/y, raises the long-lived share of what is still cut from 30 to 35%, and stops artificialisation altogether. It is the control whose cost is most visible — every cubic metre left standing deepens the sink and leaves the boiler — and pushing it to the top takes roughly a fifth off the wood the scoreboard scores, 127 TWh to 102. Two land levers are driven from elsewhere: Fertilise less takes the soil-carbon practices to 100% because they belong with the nitrogen decision rather than with the forest, and grassland conversion is driven by neither, because ploughing grassland is not an effort anybody makes on purpose. The climate case is deliberately not driven at all: it is a scenario choice, not an effort, so the simple view draws it as a slider of its own. Each control's exact segments are listed with it in the tables below.

Sources. IGN, Mémento de l'inventaire forestier 2024; IGN–FCBA (2024), Projections des disponibilités en bois; Agreste, Teruti, Primeur 2025-1 and Dossiers 2021-3; INRAE (2019), Stocker du carbone dans les sols français ?; Citepa, Secten 2026; Haut Conseil pour le Climat, Avis sur le projet de SNBC 3 (2026); Cerema, Analyse de la consommation d'ENAF. Every constant carries its own citation in the generated tables below.

The farm — diet, herd, nitrogen and ammonia

The chain. Agriculture used to be a slider between the 77.53 MtCO₂e the inventory observed in 2024 and the 43.67 the SNBC 3 books for 2050, with no driver at all: a player could not ask what a smaller herd or half the nitrogen would do, because neither was in the model. It is now built forwards. What the country eats per head, times its population, plus what it exports, gives the production each animal product must reach; production divided by a yield gives the herd; the herd times published emission factors gives the enteric and manure methane; and the nitrogen the fields receive gives the soil nitrous oxide and the CO₂ of urea and liming. The sector total is the sum of three post rows and nothing else.

The milk–beef coupling is the part worth playing with. Beef is a joint product: two fifths of it comes off the dairy herd. Cut dairy consumption and the dairy herd shrinks, but the beef demand has not moved, so the suckler herd grows to replace the beef that herd was producing — and a suckler cow emits more per kilogram than a dairy cow whose emissions are shared with her milk. A diet scenario that cuts dairy alone can therefore raise the sector's emissions.

Trade is an identity, not a share. Export volumes are derived so that the base year closes exactly on the farm survey's own production: export = production − consumption × (1 − import share), checked by product_trade_check. A share would have been the wrong form: as it approaches one the herd it implies runs away, and a country that exports two fifths of its milk while importing a third of the dairy it eats has no single share to move. The lever is therefore indexed on the base year's volumes, and without it a diet change would move the herd one for one, which is wrong for every exporting country.

The nitrogen balance, and a result that surprises people. Mineral fertiliser, manure spread on fields, manure dropped by grazing animals and biological fixation. Legumes appear twice and in opposite directions: they replace mineral nitrogen through the INRAE credit and add fixed nitrogen of their own, and the second is the larger — a legume hectare fixes about 106 kg N where the credit replaces 75. So the total nitrogen input rises with the legume area while the emissions fall, because a tonne of mineral nitrogen is charged 5.44 tCO₂e and a tonne of fixed nitrogen 2.31. Both quantities are shown rather than netted. The per-hectare figure on the Land & food tab is an input intensity and not the gross surplus the environmental accounts publish — a surplus subtracts what the harvest removes, and there is no crop-offtake account here to subtract with.

The ammonia link. The mineral nitrogen the fields receive, times the share made inside the country, divided by the nitrogen fraction of ammonia, is the ammonia tonnage the industry chain has to produce — which then draws hydrogen at 5.94 MWh a tonne from whatever mix the Industry tab chooses. A fertiliser decision is now a hydrogen decision. At the base year's 1 817 kt of nitrogen and today's 34% domestic share the derivation gives 900.2 kt, against the 900 kt the retired absolute lever carried — reproduced to a fifth of a kilotonne from two numbers that knew nothing about it.

Calibrated where nothing is published, and it says so. The base year reproduces the inventory by source — livestock 45.700 against 45.70, crops 21.090 against 21.10, farm fuel 10.730 against 10.73 — but the per-head cattle factors behind the livestock line are calibrated on relative weights nobody published, because the inventory reports the herd's methane as one figure. Citepa's OMINEA documentation would replace them, and would move the split between dairy and suckler cattle without moving the total. The same holds for the enteric/manure split the tab draws: the inventory publishes the two together, and the line between them is this module's.

What is left out. Farm fuel is a fixed post term rather than energy times an emission factor, and this is a hole in both directions: 40.6 TWh of farm diesel charged at the horizon's 25 gCO₂/kWh would be 1.0 MtCO₂e against an inventory measuring 10.73, and inventing an electricity demand for 2050 tractors would have been inventing a number. The energy is reported as farm_fuel_energy_2024 so the hole is visible. The crop block has no plant-diet lever, so a shift to pulses and cereals on the plate is not in it; its yield index knows the organic share and the nitrogen dose, and neither climate nor breeding progress; the export lever moves hectares, not the trade balance of the products the model does not follow; refrigerants and residue burning are held at their observed values.

The crop block, since stage E — demand ÷ yield instead of an area held. Until stage E the arable area sat at the base year's 17.26 Mha while everything grown on it moved, which was the module's largest simplification. The block splits the base-year arable area, fuel crops aside, into four uses on two statistics — the farm survey's 2024 areas and FranceAgriMer's five-campaign cereal balance: 27% plant food for people and non-fuel industry, 40% feed for the herd, 23% cereals exported (26.9 of 60.9 Mt), 9% fallow, seed and the rest — and scales each: the food by the population and what is no longer wasted, the feed by the herd (forage with the cattle, grain with the feed industry's species mix, poultry two fifths of it), the exports by their own lever, indexed on the base-year volume exactly as the livestock exports are. Each is divided by a yield index that knows two things. The first is the organic share: an organic hectare yields 0.65 of a conventional one — INRAE's 60% now and 70% at the horizon; Agreste measures −57% on soft wheat and −28% on sunflower, Seufert et al. −25% on average, Ponisio et al. −19% — so the strategy's 25% costs 7% of the yield and every hectare organic costs a third. The second, since 0.24.0, is the mineral dose on the hectares that stay conventional: down to 90% of the 2024 dose it costs nothing, and below that the yield follows the GRAFS hyperbola, Y = Ymax·F/(F + Ymax), passed through the plateau's edge with a cropland efficiency of 0.67 — the reference's 70% keeps 0.90 of the yield, the floor of 40% keeps 0.74. INRAE books the strategy's whole dose cut as efficiency at no yield cost; its own figure, 20% of the 2020 dose, would put the plateau at 0.80 and leave the reference 0.94, and the GRAFS curve with practices unchanged would leave it 0.87. The result is arable_needed against land_arable, and the account reports the difference as arable_headroom rather than resolving it. At the reference it is a shortfall of 1.5 Mha: the strategy's organic share costs 7% of the yield, its dose cut below the plateau another 8%, and its herd gives a little of that back in feed; and the block does not carry the +0.16% a year of breeding progress the strategy's own modelling assumes — about four per cent by 2050 — so read that as a reading, not a verdict. The organic share also takes its hectares out of the mineral dose, and to avoid counting the strategy's −54% twice nIntensity became the dose on the hectares that stay conventional, 70% at the reference: with organic at 25% that delivers 55% of 2024, the strategy's own figure, and INRAE's own decomposition books 330 of its 944 kt N to the organic extension.

Food waste is per product, since stage E. ADEME's 2016 loss study follows each chain from field to plate; the share used is what is lost downstream of the farm — processing, distribution and consumption over the production the study starts from — because the field losses are inside the yields. Beef and pork 8.8%, poultry 19.1%, milk 10.8%, the wheat-to-bread chain 22.2% for the plant basket. The foodWaste lever is still the effort — the share of that avoidable waste removed — and it is now a large lever on poultry and a small one on beef, where one basket share made it the same size on everything. The 7% of the whole food supply the SDES counts as edible waste on the European definition is a different perimeter — it has no split by product family — and is shown beside the basket's weighted 11%, not reconciled with it.

In the simple view. Two coarse controls drive this section. Eat less meat moves the whole plate together — red meat 40 → 20 kgec/cap/y, poultry 28 → 18, dairy to 70% of the base year, edible waste cut by the strategy's own half — and leaves the export position alone, because what a country sells is a separate argument from what it eats. Fertilise less moves the field: the mineral dose on the conventional hectares to 50% of the base year, legumes to 3.0 Mha, half the arable land organic and the soil-carbon practices to the whole identified potential — and, since stage E, it costs arable land, which the crop block reports. Neither drives the export volume, the enteric mitigation or the farm's fuel switch, and the last two for the same reason: their defaults are already the strategy's 82% and 100%, so they have nothing left to give and are reachable only downwards, from the detailed view. Each control's exact segments are listed with it in the tables below.

Sources. Citepa, Secten 2026, and the OMINEA methodology; Agreste's farm survey and food balance sheets; INRAE and ADEME diet scenarios; ANSES INCA3 for the observed diet; UNIFA for fertiliser deliveries; the dairy interbranch for milk volumes and the export share. Every constant carries its own citation in the generated tables below.

What the land can supply — biogas, liquid fuel and wood

Three bands that used to be a rule. Until this module the scoreboard said biogas 70/150, liquid fuel 40/50, wood 80/120 TWh, their provenance said rule, and their own why admitted they were not resource assessments from any published study. Nothing in the model knew how much biogas the country can make. They are now computed from the same land account, the same herd and the same forest the rest of the module builds, feedstock by feedstock, and they move with the scenario. The good band is the domestic supply; the warning band is the domestic supply plus the import allowance, which exists on the liquid pool and nowhere else — so a scenario that meets its liquid demand on imported fuel is amber by construction, which is the argument about whose land grows it, made arithmetically.

The base year is checked pool by pool, against the national energy statistician rather than against a total: wood 120.059 TWh against 120.05 observed, biogas 24.250 against 24.25, liquid biofuel 41.650 against 41.7. Only one of the three is evidence. The biogas line closes by construction, because the residual below is fitted to it; the wood line has one fitted term, the sawmill by-product share; the liquid line has nothing fitted at all — published crop areas times published yields, the shared residue pool, observed waste fats and an import position derived from the trade balance — and it lands a tenth of a per cent under the observed figure. That is the tightest statement this module makes.

The gap, named rather than buried. 18.99 TWh of the biogas supply — 78.3% of the 24.25 TWh the base year observed — is an unattributed residual. The 2024 feedstock split for biomethane is not published, and the two sources that come closest contradict each other, so the term is calibrated so the base year closes and no lever moves it. Every build prints the number and its share, and a test asserts that the figure printed, the figure in the model and the figure a reader sees here are one number. Until a feedstock survey replaces it, the methane pool is that much less explained than the other two, and a reader should discount the biogas supply accordingly.

The fuel-crop nitrogen simplification, which is the module's largest. The hectares the fuel-crop lever names carry no mineral nitrogen of their own. The reason is the accounting boundary: the inventory books the cultivation nitrous oxide of a first-generation biofuel in agriculture, and so does this model, which is why the liquid-fuel emission factor stays at 25 gCO₂/kWh rather than the 179 the renewable-energy directive gives rapeseed FAME. But the model's mineral dose is an intensity on an arable area held at the base year's, so expanding the fuel crops displaces a food crop on land that was already fertilised and moves no N₂O in either direction. That is consistent, and it is consistent only because there is no crop-yield block to say what the displaced food would have cost. A scenario that meets its whole liquid demand on 1G crops is charged exactly what a scenario meeting it on e-fuel is charged, and that is wrong.

Three judgements worth arguing with. The residue pool is split half to a digester and half to a second-generation liquid plant; the mission that studied it recommended a third, but that is a recommendation about which industry to build rather than a property of the straw, and a fixed half makes the competition legible — raise the mobilisation lever and both bands move together. The first-generation yields are one area-weighted constant, 18.899 MWh/ha, rather than four crop rows, so the mix is held fixed while the area moves and a beet hectare is worth three oilseed hectares. And the cover-crop ceiling is INRAE's own 4.0 Mha rather than a measured spring-crop area, so it is a diagnostic and not a constraint — the slider stops below it.

What is left out. Pyrogasification, ligno-cellulosic energy crops and wood imports: each would draw on a pool this model already has rather than add one, and none is coefficiented here. There is no digestate nitrogen credit and no cover-crop nitrogen demand — methanisation is nitrogen-neutral by construction, which is what the underlying study books, and the fertiliser a cover crop needs is named in its own gap list rather than given a coefficient. And the methane emission factor does not respond to the feedstock mix the module now knows: a manure-heavy supply would justify a lower number and a crop-heavy one a higher, the range in the published life-cycle studies runs from −302 to +184 gCO₂/kWh, and the factor stays at 25 with the argument stated rather than acted on.

In the simple view. One coarse control drives this section: Grow energy on the fields. At its maximum the winter cover crops reach 3.0 Mha, the straw taken off the field reaches 30% and the land growing fuel reaches 1.70 Mha, which together take the methane supply from 70 to about 86 TWh and the domestic liquid supply from 24 to 52. Two things it does not do are the point of it. It does not send manure to a digester — manureMethanised stays a fine lever the simple view draws on its own, because the abatement it books rests on an enteric/manure split no inventory publishes, and burying that inside an effort scale would be the wrong place for it. And the fuel crops it plants add no mineral nitrogen, for the reason two paragraphs above. The wood supply is not driven from here at all: it is the harvest, and the harvest belongs to the forest control, which moves it the other way. Each control's exact segments are listed with it in the tables below.

Sources. SDES, Bilan énergétique and Chiffres clés des énergies renouvelables, for the three base-year pools; IGEDD's biomass mission for the manure and residue potentials; Solagro for the straw tonnage; INRAE for the cover-crop area and yield; IGN–FCBA for the harvest and its allocation; the renewable-energy directive's default values for the life-cycle range quoted above. Every constant carries its own citation in the generated tables below.

National reconciliation — method

The game and the national inventory do not measure the same thing. Reconciling them by a ratio, as earlier versions did, transfers relative change but hides two differences and any sub-sector the game does not model. Each difference is now its own line.

Both accounts are now scope 1. Since v0.11.0 the game books emissions where the combustion happens, which is what SECTEN and the SNBC do: power-station emissions sit in the energy branch, at stack level, and not in the sector that used the kilowatt-hour. The line that used to undo a life-cycle electricity factor is therefore zero, and kept only so the change is visible rather than silent. See the scope section above for what that convention costs and what it buys.

International bunkers. International aviation and maritime shipping are in the game and are a memo item outside the national inventory total. The deduction is computed from the model's own international rows, so it follows the scenario instead of being asserted.

The coverage gap. The game models five industrial value chains. Everything else the inventory calls industry is a named line whose size is the difference between the official industry total and what the five chains represent — see the constant industry_covered_2020 in the generated annex for that derivation and its two caveats.

First-order sectors. Agriculture, waste and energy production interpolate linearly between observed 2024 and the current SNBC 3 2050 order of magnitude. At 100% they sit exactly on the SNBC value, so those three rows are an input, not a result.

Carbon sinks. Natural and technological sinks are separate. The −43 MtCO₂e technological value closes the ministry's −66 MtCO₂e total 2050 absorption figure after subtracting the stated −23 MtCO₂e natural sink, and it is what the reconciliation below compares against. The slider's own reference is 30, argued from a published European deployment rather than from that subtraction, so the reference scenario falls thirteen megatonnes short of the published total on purpose.

Emission factors — today and in 2050

These were editable assumptions in the source workbook and are restored here as levers, because they are scenario choices rather than measurements, and because in a decarbonised pathway they decide almost everything that is left.

Carrier2020, observed2050, assumedWhat the 2050 value assumes
Electricity79 gCO₂/kWhderived No longer a slider. Under a scope-1 account the grid factor is a result of the generation mix, so the model computes it — about 1.7 gCO₂/kWh at the reference. That is a combustion figure and is not comparable with the 79 beside it, which is life-cycle: comparing the two is the most common way to make this model say something it does not say.
Methane227 gCO₂/kWh25 gCO₂/kWh That all 2050 methane is biomethane. Raising the slider back towards 227 shows what a failure of that assumption costs.
Liquid fuel264 gCO₂/kWh25 gCO₂/kWh That no fossil liquid fuel is left: every litre is biofuel or e-fuel.
Wood27 gCO₂/kWh0 gCO₂/kWh The biogenic-carbon convention. Note the workbook is not internally consistent here — it uses 27 for 2020 and 0 for 2050 for the same fuel.
Coal340 gCO₂/kWh, both years Coking coal at the IPCC default, 94.6 kgCO₂/GJ. Not a lever: it is a measured property of the fuel, not a scenario choice.
HydrogenDerived, not declared Hydrogen carries no factor of its own. It is converted back into the electricity used to make it, at 60% efficiency, and that electricity carries the electricity factor. The same holds for e-fuel at 40%.
Three corrections were made to the workbook's own accounting. Coal was charged at the hydrogen factor, 66.7 gCO₂/kWh, while the workbook's factor table declared it at zero and its 1.76 tCO₂ per tonne of steel already contained that same carbon — the coal was counted twice, and is now counted once, as energy. Gas used by steel and by grey ammonia was counted in the biogas resource but charged no emissions at all; all gas is now charged. And two legacy transport aggregations created about 32 TWh of electricity that no vehicle consumed; they are gone. Together these move the reference scenario from 47.2 to 40.6 MtCO₂. The Excel edition still contains all three.

Aviation — method, sources and what it leaves out

The ticket is built from the bottom: the energy the model already charges the flight, multiplied by a synthetic-fuel price, plus everything else derived from today's economics.

Distance comes from the DGAC's 2023 traffic statistics for flights departing France: passenger-kilometres divided by passengers, category by category. It is an average over each category, so "Paris ↔ international" blends a Barcelona hop with a Tokyo sector.

Energy is the model's own aviation consumption, not a separate figure — 0.24 kWh per passenger-kilometre for domestic flights and 0.19 for long-haul. Be careful with these: the raw French statistic for 2024 is 29.3 g of kerosene per passenger-kilometre, about 0.35 kWh, because it also carries the freight in the holds and reflects actual load factors. Corrected for both, the same series gives about 19.3 g/pkm, which is the range the model sits in. A real ticket therefore emits more than the figure in the table.

Fuel price. The published estimates for sustainable aviation fuel disagree by a factor of six, and the review behind the two sliders spans EASA, the European Commission's ReFuelEU impact assessment, the DGAC roadmap, ISAE-Supaero, ATAG's Waypoint 2050, E-Cube, the IEA, Solakivi et al. (2022), Brynolf et al. (2020) and Massol et al. (2025). Bio-jet from waste oils is the cheapest route at 600–1 900 €/t; power-to-liquid the dearest at 1 800–10 000. The defaults sit mid-range and the ranges are the honest answer, which is why they are sliders.

Efficiency. The source workbook gives 2050 aviation the same consumption per passenger-kilometre as today, so the default gain is zero. The published trajectories converge on about 1%/year — ICAO, ADEME, T&E, the UK Committee on Climate Change and the World Economic Forum's Clean Skies for Tomorrow all sit between 0.9 and 1.0. Moving the slider to 1 compounds to a 23% saving over twenty-six years, which is less than most people expect and is the point of exposing it.

What this omits

Non-CO₂ effects — contrails and nitrogen oxides — which several studies put at the same order of magnitude again as the combustion CO₂; the upstream chain of the fuel; any change in airline cost structure between now and 2050; airport and air-traffic-control investment; and the question of whether the biomass or the electricity these fuels need is available at all. The last one is not rhetorical: the scenario's aviation fuel alone is a large share of the biofuel pool the scoreboard already flags.

The traffic categories, the fuel-cost review and the efficiency trajectories were assembled in a working file that is not public. Only the derived parameters appear here, each attributed to its primary published source.

The rest of industry — how output and processes were separated

The seventeen branches below were, until this version, a single residual line in the national reconciliation: a number added back to close the account, with no energy behind it and no lever on it. They are now modelled.

Why two levers and not one

The source scenario for 2050 is not a projection. It electrifies — and it also grows output, by very different amounts branch by branch. Measured from the branch sheets' own production data: textile ×8.5, electronics ×3.1, mineral extraction ×2.5, diverse industries ×1.8, rubber ×1.8, pharmacy ×1.5, vehicles ×1.5, machinery ×1.3, non-ferrous metals ×1.1; foundry, ceramics and glass unchanged; paper ×0.86, plastics ×0.70, plastic products ×0.67, naval and aerospace ×0.56, mineral chemistry ×0.52. A single slider would let a player appear to clean up industry while quietly assuming an eightfold textile sector, so output and process are separate.

The decomposition is exact, not fitted

Energy is output × unit consumption, so it is bilinear in the two and four corners reproduce every combination exactly: E00 the observed 2019 situation, E11 the source scenario, E10 the 2050 output at 2019 processes, E01 the 2050 processes at 2019 output. Both end points are the published branch totals. The output index between them is measured, branch by branch, as the energy-weighted ratio of 2050 to 2019 production over the product rows that reproduce their own computed total — between 75% and 100% of each branch's energy, and 100% for thirteen of the seventeen.

At today's output, the 2050 processes take the electricity of these branches from 68 to 138 TWh while cutting coal and fuel oil to zero. Output growth alone would take it from 68 to 87. Both together give the source scenario's 166.

Conventions and what is still missing

Purchased steam is carried with gas, non-renewable waste fuel with coal, and residual fuel oil with the model's liquid-fuel carrier, which in 2050 is biofuel or e-fuel by the same assumption the transport module makes. Process emissions — glass, other building materials, mineral chemistry, 2.5 MtCO₂ in 2019 falling to 1.9 — follow the same two levers.

Not represented: any lever finer than the branch group. Cross-cutting energy efficiency and waste-heat recovery both have published ceilings that would fit here — RTE puts the electricity-efficiency potential at 9.0% for paper to 31.1% for chemistry at long payback, and ADEME finds 15.6 TWh of recoverable waste heat, 7.7 of it above 100 °C — but neither is in the model yet, because applying them correctly needs the temperature split that exists at process level in the source and has not been aggregated. Stated rather than approximated.

Waste heat — a resource that decarbonisation consumes

Industrial processes reject heat. Some of it can be recovered and used instead of burning more fuel. The usual way to model this is a fixed reserve in TWh, and that is wrong in a way that matters here.

Why the gisement shrinks

Waste heat is a by-product of combustion and of process inefficiency. An electric furnace or a heat pump rejects far less of it, and at lower temperature. So the more a scenario electrifies industrial heat, the smaller the waste-heat resource it has left to recover. Recovering waste heat and electrifying heat compete for the same physics, and a model that treats the gisement as a constant lets a player count the same energy twice.

ADEME's study makes the coupling possible because it expresses the gisement against the fuel each sector burns, not as a bare total: 15.6 TWh recoverable on the 2019 industry, 7.7 of it above 100 °C, out of 248 TWh of fuel — 6.3% on average, but from 1.2% in metals to 31% in paper, where drying dominates. The model attaches those intensities to the fuel, post by post, so the gisement follows whatever the scenario actually burns.

Conventions

Recovered heat displaces gas, the marginal fuel, and cannot displace more than the post burns. The second-order feedback — less gas means a slightly smaller gisement in turn — is neglected; at full recovery it is under half a percent. Transport and buildings carry no gisement because the ADEME study is industrial. Glass is listed by ADEME under both chemistry and non-metallic materials; it is assigned to materials here, its furnaces being the hotter of the two contexts.

What this does not say

That the heat can be used where it is produced. Above 100 °C it can displace process heat directly; below, it needs a heat pump to upgrade it or a district network to carry it somewhere useful, and neither is costed here. Roughly half the gisement is below 100 °C, so a recovery rate above 50% implicitly assumes one of those. Nor is the capital cost of recovery represented anywhere in the cost layer.

Energy efficiency — a ceiling, not a wish

Motors, drives, compressed air, insulation, heat integration: the cross-cutting savings that need no change of process. The danger with a lever like this is that it lets a player invent efficiency, so it is bounded by what a published study actually found.

The ceiling

RTE, after CEREN, identifies a potential of 21.1% on industrial electricity and 19.8% on fuels, of which about 58% pays back in under three years. The electricity ceiling is branch-specific and applied as such, which matters because the spread is wide:

PostElectricity ceilingof which under 3 years
Steel11.4%68%
Metals and machinery15.5%73%
Paper and board19.3%47%
Other industries23.6%66%
Minerals, cement24.1%40%
Food industry25.0%60%
Chemistry, ammonia, olefins31.1%38%

The lever says how much of that identified potential is captured, not how much exists. At 100% every branch reaches its own ceiling and no further; at about 58% the scenario is taking roughly the part that pays back in under three years, which is the honest "no-regrets" anchor to argue from in class.

Efficiency also destroys waste heat

Fuel that is never burned rejects no heat. So the efficiency effort shrinks the waste-heat gisement exactly as electrification does — in the reference scenario, from 10.7 TWh to 8.6 at full effort. Efficiency, electrification and waste-heat recovery all draw on the same combustion, and the model makes them compete rather than letting a scenario bank all three.

What is not represented

Only direct electricity carries the electricity ceiling: the electricity that goes into hydrogen and e-fuel is governed by conversion efficiencies declared elsewhere. RTE gives no branch breakdown on the fuel side, so one ceiling applies across industry. Transport and buildings are untouched, their own levers already carrying demand and equipment efficiency. And nothing here costs the investment that buys the efficiency — the cost layer prices energy and plant, not retrofit of motors and heat exchangers.

Every input, with its provenance

This annex is generated from the model specification itself — model/technology.yaml, model/countries/FR/FR.yaml and model/equations.yaml — so what is documented here and what the engine executes are the same thing. The model has 117 levers, 219 constants, 25 data tables and 567 equations.

Published external statistic or study, cited · Workbook inherited from the teaching workbook, not independently re-sourced · Calibrated fitted so the module reproduces a reference baseline · Provisional plausible and widely quoted, but no primary publication secured · Game rule chosen by the teaching team to make the game work · Derived computed from other declared values, not an input in its own right

Levers — what the player can move

LeverDefaultRangeProvenanceWhy, and where it comes from
Fuel car
carFuel
10%0 … 100Game rule

Share of 2020 private-car demand still served by a liquid-fuelled car in 2050. The four car shares are rebalanced to 100% as the player moves them.

Biogas car
carGas
10%0 … 100Game rule—
Electric car
carElectric
70%0 … 100Game rule—
Shift to short-distance rail
carRail
10%0 … 100Game rule

Car demand transferred to short-distance rail, at the occupancy and unit consumption of the rail row rather than the car row.

Passenger mobility reduction
passengerReduction
0%0 … 45Game rule

Flagged above 25%. No published French trajectory, négaWatt's included, cuts passenger travel by much more than a quarter. Past 25% the scenario rests on a change in where people live, work and go that nothing in this model brings about, and whose cost — in housing, in services, in time — appears nowhere in it.

Domestic aviation → rail
domesticAviationRail
50%0 … 100Game rule—
Hydrogen truck
truckH2
20%0 … 100Game rule—
Residual thermal
truckThermal
10%0 … 100Game rule—
Electric truck
truckElectric
40%0 … 100Game rule—
Shift to rail freight
truckRail
30%0 … 100Game rule—
Freight-demand reduction
freightReduction
0%0 … 45Game rule

Flagged above 25%. A quarter less freight is a different economy, not a more efficient one: tonne-kilometres follow what a country makes, imports and consumes. Past 25% the scenario assumes that change rather than producing it — and what the country stops making is not re-imported anywhere in this account.

Air freight → maritime
freightAviationSea
20%0 … 100Game rule—
Biofuel share
biofuelShare
40%0 … 100Game rule

In 2050 the model leaves no fossil liquid fuel at all: every litre is either biofuel or e-fuel made from electricity. This is a scenario assumption, and it is why liquid fuel carries a low emission factor.

Heat covered by electricity
bldgElectricShare
49%0 … 100Game rule

The headline decarbonisation choice for buildings, and the one that drives the winter peak. It is a share of heat need, not of energy: how that heat is produced is the next question down.

Biomass for heating
bldgBiomassTwh
46 TWh/y0 … 120Game rule

A target in the unit the resource constraint is written in, so it can be read straight against the biomass limit instead of being reconstructed from two shares. 46 TWh of wood delivers 39 TWh of heat at a boiler efficiency of 0.85, which is roughly what the previous scheme produced.

Air-air heat pump
bldgElecAirAir
47%0 … 100Game rule

Seasonal COP 2.5, falling to 2.0 at peak.

Air-water heat pump
bldgElecAirWater
31%0 … 100Game rule

Seasonal COP 3.0, falling to 2.0 at peak.

Electric resistance
bldgElecResistance
15%0 … 100Game rule

A slider rather than a stock that can only shrink, because a scenario may genuinely install more electric convectors — they are cheap to fit and terrible for the peak. Efficiency 1 in both seasons, so this is the one electric option that buys no COP at all.

Hybrid heat pump
bldgElecHybrid
4%0 … 100Game rule—
Heat pump on a network
bldgElecDistrictHP
3%0 … 100Game rule—
Wood in heat networks
districtWoodTwh
13 TWh/y0 … 80Game rule

Declared in TWh so that it, the network heat pumps and the recovered heat together say how much of the network is decarbonised, and gas absorbs whatever is left.

Recovered and waste heat
districtWasteTwh
0 TWh/y0 … 60Game rule

Industrial waste heat, incineration and geothermal. It has no emission factor and adds nothing to the winter peak, which makes it the cheapest thing a network can run on — and the model does not check it against the waste-heat gisement the industry module computes, so raising it far is optimistic in a way nothing here will stop you from being.

Average retrofit improvement
bldgRetrofit
30%0 … 65Game rule

One slider conflates retrofit depth and retrofit rate, which have very different costs. Separating them is a documented next step.

Flagged above 50%. Halving the average heating demand of the whole stock means bringing essentially every dwelling to a level France currently reaches a few tens of thousands of times a year, every year until the horizon. One slider also conflates retrofit depth and retrofit rate, whose costs are very different, so past this point it hides which of the two is being asked for.

Temperature-related sufficiency
bldgSobriety
5%0 … 25Game rule—
New housing built
newHousing
20.4 Mm²/y8 … 36Published

Residential floor area started, from the ministry's own construction statistics: 20.4 Mm² in 2024 and 21.0 in 2025, against 34.7 in 2021. France started 412 600 dwellings in 2021 and 258 100 in 2024, a fall of 37% in three years, and the average new dwelling has shrunk from 83 to 76 m² over the same period. The default is the 2024 figure because it is the most recent consolidated year, and because a model whose reference sits on a 2021 peak would make every sufficiency scenario look easy. The range is an argument, not a measurement. The low end, 8 Mm²/y, is roughly where the official housing-need study lands for the 2040s: the statistical service's central scenario needs 208 000 additional main residences a year in the 2020s, 139 000 in the 2030s and 55 000 in the 2040s, because household growth falls from +215 000 a year to +27 000 by 2045-2050 as household size drops to 1.99. The high end, 36, is above anything France has built this century. The draft national strategy assumes 310 000 dwellings a year to 2030 and 100 000 a year over 2040-2050, which straddles the middle of this slider. What it does not include is the sufficiency answer that needs no construction at all: France holds 3.0 million vacant dwellings, 1.2 million of them vacant for over a year, and 3.7 million second homes. The statistical service reckons a 3% vacancy floor in every employment zone would release 600 000 of them. This model has no lever for that, and the omission is named.

  • SDES, Sit@del2 — logements commencés et surface de plancher, séries 2021-2025 (20.4 Mm² en 2024, 21.0 en 2025)
  • SDES, «Besoins en logements à l'horizon 2050» (juin 2025) — 208 000 / 139 000 / 55 000 résidences principales par an
  • Insee, projections de ménages 2018-2050 — +215 000/an jusqu'en 2030, +84 000/an ensuite, taille des ménages 2,20 → 1,99

Flagged above 30 Mm²/y. Above 30 Mm²/y the scenario builds through the 2030s and 2040s at the rate of the 2021 peak, into a country whose household growth has fallen by a factor of eight. The official need study reaches 55 000 additional main residences a year by the 2040s; this is about six times that.

New non-residential built
newNonResidential
19.9 Mm²/y8 … 36Published

Non-residential floor area started, all destinations: 19.9 Mm² in 2025, against about 31 in 2019. The destination split is the reason this lever is not called "tertiary": public buildings 4.01, warehouses 3.77, retail 3.54, farm buildings 3.44, offices 2.61, industry 2.51. Two fifths of it is warehouses and agriculture — floor area that carries cement, carries structural steel, and carries almost no heating. Tertiary proper, the part the building stock counts, is about 9.6 Mm²/y of the total. That distinction is why stage A stops where it does. The cement follows the whole 19.9; the heat would follow only the tertiary half, and the building module has no construction flow to put it in. See the module's own why.

  • SDES, Sit@del2 — locaux non résidentiels commencés par destination, 2025 (19.9 Mm², dont entrepôts 3.77 et exploitations agricoles 3.44)
Built in timber
timberShare
12%0 … 80Published

The default is the observed share, derived in timber_share_base and equal to it by construction — a test asserts the two agree, because a scenario that starts anywhere else would book a cement saving for buildings France has already put up. The range spans the whole published argument, and the two ends are not equally supported. ADEME's biosourced-development scenario, the more cautious of the two French projections, cuts cement by 2% over 2015-2034 and 8% over 2035-2049 — a much weaker result than the phrase "build in timber" suggests. négaWatt goes to 80% of detached houses by 2030 and 95% by 2050, with 40% on collective housing and tertiary, and reports −46% of concrete and −60% of clinker. Both are in the literature; they differ by a factor of five, and the maximum here is négaWatt's order of magnitude rather than ADEME's. Two limits the slider cannot express and the annex has to. A timber building is not a building without concrete: the measured case this module's coefficient comes from still carried 288 kg/m² of it in foundations and ground floor. And the wood has to come from somewhere — at the top of this slider new-building structure alone asks for 6.1 Mm³ of sawn product a year, against a French softwood sawnwood production of about 7.0 Mm³, and land_timber_headroom shows what that leaves the rest of the long-lived harvest.

  • Enquête nationale de la construction bois, activité 2024 — 6.6% du logement neuf, 17.6% de la surface non résidentielle neuve
  • ADEME 2019, «Prospective de consommation de matériaux pour la construction des bâtiments» — scénario biosourcé : ciment −2% (2015-34) puis −8% (2035-49)
  • négaWatt 2022, rapport complet partie 4 — 95% des maisons et 40% du collectif et du tertiaire en bois en 2050 ; béton −46%, clinker −60%
  • IGN–FCBA, «La forêt en 2050» (2024) — l'offre supplémentaire de grumes résineuses reste inférieure de 1.0 à 1.5 Mm³/an à la demande en 2050

Flagged above 45%. At 45% the structure of new buildings alone asks for 3.4 Mm³ of sawn product a year — half of everything French sawmills cut from softwood — in a country that already imports a quarter of the softwood sawnwood it uses and whose forest inventory projects additional sawlog supply falling short of additional demand by one to one and a half million cubic metres a year in 2050, even in its increased-harvest cases. Nothing here stops the slider: what it cannot supply it imports, and imported timber stores no carbon in the French inventory, because the harvested-wood-products pool runs on the production approach. Past this point the cement saving is real and the sink belongs to somebody else.

Roads, networks and civil works
civilWorksVolume
100%50 … 130Game rule

A rule, and the honest kind: the model has no driver for a road programme, so the volume of civil works is set by hand and the annex says so. 100 is "as much as today". What it moves is a third of French cement — roads 13%, buried networks 13%, bridges and retaining structures 9% on the sector's own 2018 end-use map. That is the answer to the question this module was built to answer: a floor-area lever cannot reach it. Concrete's share in civil works is also the one place the timber literature holds constant, because its properties are hard to replace there, so this third is out of reach of the timber lever too. The bounds are a judgement. Civil-works output grew 4% in 2024 while building collapsed, and the network-renewal backlog argues for more rather than less; but nothing published sets a 2050 volume, and a slider that could halve French road building without a word would be worse than a stated rule.

  • SFIC / CIMbéton / ATILH, carte des usages du ciment 2018, reprise par The Shift Project, «Décarboner la filière ciment-béton» (janvier 2022), figure 6 — routes 13%, VRD 13%, ouvrages d'art 9%
  • France Stratégie, «Les coûts d'abattement — Partie 6 : Ciment» (mai 2023) — «utilisé à presque deux tiers par le bâtiment et à un peu plus d'un tiers par les travaux publics»
  • FNTP, «L'activité du secteur en chiffres» — travaux publics 51.3 Md€ en 2024, +4%
H-DRI steel share
steelDRI
50%0 … 100Game rule—
Steel production change
steelGrowth
30%-40 … 50Game rule—
Ammonia production
ammoniaProduction
Hidden
900 kt/y0 … 1 400Workbook

Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column.

Retired in France since the food module arrived, and hidden. The ammonia tonnage is now mineral_nitrogen × ammoniaDomesticShare ÷ 0.822 plus the ammonia French chemistry makes for something other than fertiliser, so a fertiliser decision is a hydrogen decision and the industry chain reads a demand instead of an assertion. At the base year's 1 817 kt of nitrogen and today's 34% domestic share the derivation gives 900.2 kt — this slider's own value, reproduced to a fifth of a kilotonne from two numbers that knew nothing about it. At the reference nitrogen dose it gives 509 kt, and the hydrogen the chain draws falls with it. It stays declared, at the value it always had, because the three provisional editions still use it and because a hidden lever that still moved a number would be a decision the player cannot see; a test asserts it is inert here. The entry itself was not restructured — moving it out of the shared model would have been a change to the country contract, and the same result is had with the land_module_active switch that already gates the rest of the module. What it used to be: one figure instead of a green/grey split. Until v0.12.0 ammonia was two rows — 700 kt made from electrolytic hydrogen and 200 kt from a reformer — which put the hydrogen route inside the ammonia lever and nowhere else. Now every tonne consumes the same 5.94 MWh of hydrogen and the hydrogen mix decides how it was made, which is where that decision belongs: the same reformer serves steel, refining and everything else.

  • Teaching workbook, "Industry" sheet — 700 kt green plus 200 kt grey
CO₂ + H₂ olefin route
olefinRoute
50%0 … 100Game rule—
Biogenic CO₂ share
biogenicCO2
10%0 … 50Game rule

Only the biogenic fraction of the CO₂ fed to the synthetic-olefin route counts as a removal, which is why this lever alone can turn the olefin process term negative.

Plastic-demand reduction
plasticReduction
30%0 … 70Game rule

How much less plastic the country asks for, against the base year — a demand reduction and not a recycling rate. It scales the olefin tonnage the crackers make, and it is the one lever in this chain that answers "how much of this do we need" rather than "how do we make it". The two French reference scenarios cannot anchor it. ADEME's Transition(s) 2050 publishes material-demand trajectories for steel, aluminium, cement and glass and none for plastics; its plastics content is an 80% recycling rate, and négaWatt does the same. Both express plastics as a rate of recycling, and this model has no recycling variable, so neither can be read onto this slider. What can is SYSTEMIQ's ReShaping Plastics, the one published pathway that separates the wedges. European plastic demand grows in its baseline, 37 to 48 Mt by 2050; its Circularity scenario takes 25% off that baseline by reducing demand and 4% more by substituting materials. Against 2050 that is 29%; against today it is under 10%, because a quarter of a growing baseline is a tenth of the present. This slider is written against the base year, so the two readings are the two ends of what one study supports — and the reference, 30%, sits at the far edge of the more generous one. The sectors move in opposite directions underneath: packaging can lose 38% (an eighth eliminated, a further three tenths reused), vehicles 22%, while construction plastic grows by half in every scenario published. A single national share hides that, and a player moving this slider is assuming the packaging wedge does all the work.

  • SYSTEMIQ (2022), ReShaping Plastics: Pathways to a Circular, Climate Neutral Plastics System in Europe, for Plastics Europe — EU27+UK, baseline 37→48 Mt by 2050; Circularity scenario 25% reduce + 4% substitute
  • ADEME, Transition(s) 2050 — material-demand trajectories for steel, aluminium, cement and glass; plastics carried as a recycling rate
  • See docs/waste/olefins_and_plastic_demand.md for the legal instruments (PPWR, SUP, loi AGEC, décret 3R) and why they do not bound this slider

Flagged above 30%. Past 30% no published pathway supports this as a demand reduction. SYSTEMIQ's most circular European scenario takes 29% off a 2050 baseline that has grown by a third — under a tenth against today — and 30% here is already the far edge of reading that against the base year instead. The 70% at the top of this slider exists in the literature only as three quarters less virgin fossil plastic, and that figure already contains the recycling, the material substitution and the CO₂ and bio feedstock which this model carries separately in olefinRoute and biogenicCO2 — so reading it here counts the same effort twice.

Heat pumps for steam
foodHPSteam
60%0 … 100Game rule—
Heat pumps for direct heat
foodHPDirect
25%0 … 100Game rule—
Food-industry efficiency
foodEfficiency
20%0 … 50Game rule—
Less cement per unit of works
cementReduction
10%0 … 60Game rule

Renamed in v0.20, because it finally has a driver. Until then it was "cement-demand reduction" with no why, no help and nothing behind it: a scenario could take 60% off the country's cement without saying which building it had not built, and the annex could not say what the slider meant. How much is built is now the construction module's business. What is left here is the intensity of the works: leaner mixes, thinner slabs and post-tensioned structures, a design that uses the concrete it pours. It is not clinkerRate, which replaces clinker inside the cement with slag or fly ash; this one asks for less cement in the first place. The two multiply, and a scenario that pushes both is asking for a lot from the same building twice over. The range is a rule. The published levers for the sector are the clinker ratio and capture, and nobody has assessed how far structural design alone can go — so 60% is a bound on an argument rather than on an assessment.

Clinker ratio
clinkerRate
60%35 … 78Game rule

The default is the industry's own 2050 target, near enough: the sector roadmap takes the average clinker content of French cement from 77% in 2015 to 68% in 2030 and 62% in 2050. The two are not quite the same quantity. The roadmap's content counts imported clinker, and this rate turns cement demand into French clinker — 71.6% in 2020, where the content was about 78, the difference being clinker fired abroad. 60 sits between the published target and what it would be net of imports. 78, the maximum, is today's content; 35 is a cement that is mostly slag, calcined clay and limestone, and the flag below 45 says why that needs materials France may not have.

Flagged below 45%. A lower clinker rate needs something to put in the clinker's place, and the two supplementary materials that work at scale are blast-furnace slag and coal fly ash — both disappearing from Europe at exactly the moment this scenario asks for more of them. Below 45% the fleet-average cement depends on an addition nobody has shown France will have.

CO₂ capture
carbonCapture
20%0 … 95Game rule

The share of the kiln's calcination CO₂ that is captured. A real capture plant on a cement stack takes the fuel CO₂ with it, so this lever is a floor on what capture delivers, not an estimate of it: in a French works today the kiln fuel is about a third of the stack. Until 0.27.0 the term it multiplied carried the kiln fuel too, which made the lever look like a whole-stack capture while the same fuel was also being charged through the energy account — emitted twice, captured once.

Flagged above 60%. No French cement works captures its CO₂ today, and the one project to have reached a final investment decision covers well under a tenth of the national clinker line. Past 60% the scenario has fitted, powered and paid for capture across most of the fleet inside twenty-five years — and the model charges it for none of the three.

Output of the rest of industry
otherIndustryVolume
0%0 … 100Published

How much the branches the game does not model produce, between today's output and the source workbook's 2050 scenario. That scenario is a reindustrialisation: measured branch by branch it multiplies textile output by 8.5, electronics by 3.1, mineral extraction by 2.5, while mineral chemistry falls to 0.52 and naval and aerospace to 0.56. Growth of that size is not decarbonisation, and separating it from the process lever is the whole point — otherwise a player could appear to clean up industry while assuming an eightfold textile sector.

Processes of the rest of industry
otherIndustryProcess
100%0 … 100Published

How much energy each unit of output takes, between today's processes and the 2050 ones. This is where electrification lives: at constant output it takes the electricity of these branches from 68 to 138 TWh while cutting coal and fuel oil to zero. The default is 100% and the volume default is 0%, so the reference scenario reads "the rest of industry modernises at today's output" — the neutral reading, with growth added explicitly.

  • Offre_et_demande.xlsx, branch sheets E18–E38 — unit consumption in MWh per tonne, 2019 and 2050
Waste-heat recovery
wasteHeatRecovery
0%0 … 100Published

Heat rejected by industrial processes and recovered instead of vented. ADEME puts the recoverable gisement at 15.6 TWh on the 2019 industry, of which 7.7 TWh above 100 °C, and — this is what makes it a real constraint — expresses it against the fuel each sector burns. So the gisement is not a fixed reserve: it shrinks as processes electrify, because there is no combustion left to reject heat from. Recovering waste heat and electrifying heat compete for the same physics, and the model makes them compete.

Energy-efficiency effort
industryEfficiency
0% of the identified potential0 … 100Published

Cross-cutting energy efficiency — motors, drives, compressed air, insulation, heat integration. RTE, after CEREN, identifies a potential of 21.1% on industrial electricity and 19.8% on fuels, of which about 58% pays back in under three years. The ceiling is branch-specific and applied as such: 11.4% for steel, 15.5% for metals and machinery, 19.3% for paper, 24.1% for minerals, 25.0% for the food industry, 31.1% for chemistry. This lever says how much of that identified potential is actually captured, not how much exists — so it cannot invent efficiency beyond what the study found, which is the point of a ceiling.

Flagged above 75% of the identified potential. About 58% of the potential RTE identifies after CEREN pays back in under three years. Past 75% the scenario is taking efficiency nobody has shown pays for itself, in a model that prices none of it. The slider says how much of the identified potential is actually captured, so taking almost all of it is an assumption about industrial investment rather than about engineering.

Methane (biogas), 2050
efGas
25 gCO₂/kWh0 … 250Workbook

The model assumes all 2050 methane is biomethane, so it carries a life-cycle factor rather than the 227 gCO₂/kWh of fossil natural gas. Raising this slider towards 227 shows what happens if the biomethane assumption fails. 25 sits inside the published range, and the range is wide. The two French life-cycle studies of the biomethane mix give 23.4 gCO₂/kWh (multifunctional allocation) and 44 (attributional); the renewable-energy directive's own defaults run from −302 for biomethane from wet manure with a closed digestate store, where the avoided storage methane is credited, to +184 for maize whole-plant. Leakage is 1–6% of the methane nominally and has been measured far higher. So the factor is a statement about the feedstock mix as much as about the process — a manure-heavy supply would justify a lower number and a crop-heavy one a higher — and since stage C the model knows the mix well enough for a reader to make that argument, even though the factor does not respond to it.

Liquid fuel (bio and e-fuel), 2050
efLiquid
25 gCO₂/kWh0 … 300Workbook

Same logic as methane: the 2050 model leaves no fossil liquid fuel, so the factor is that of biofuel and e-fuel, against 264 gCO₂/kWh for the 2020 fossil fuel it replaces. It kept its value when the biofuel supply became a computed one, and the reason is where the cultivation goes. The renewable-energy directive's default for rapeseed FAME is 179 gCO₂e/kWh, of which about 115 is cultivation — fertiliser N₂O and the upstream nitrogen. This model books that nitrogen in agriculture, as the national inventory does: the hectares energyCropArea names are cropland inside the same arable area the crops block fertilises, so charging the fuel for them as well would count one tonne of N₂O twice. What the fuel carries is the processing and transport, which is roughly 60–65 gCO₂/kWh for rapeseed FAME and 54 for waste-oil HVO — still above 25, and the gap is the model's assumption that most of the 2050 liquid is e-fuel made on clean electricity rather than crop oil. Two limitations, stated rather than hidden. The model does not split the factor by origin, so a scenario that meets its liquid demand entirely on 1G crops is charged the same as one that meets it on e-fuel. And expanding energyCropArea adds no mineral nitrogen: the dose is an intensity on an arable area held at the base year's, so a fuel crop displaces a food crop on land already fertilised. The crop block counts that displaced food — the fuel hectare is arable land the plates, the herd and the exports can no longer use — but it does not fertilise the fuel hectare itself, and that is the half of the question still open.

Wood, 2050
efWood
27 gCO₂/kWh0 … 60Workbook

27 gCO₂/kWh, the same figure the workbook observes for 2020, rather than the zero its 2050 column carries. The zero is the biogenic-carbon convention: burning wood emits CO₂, but the convention books it against the forest that regrew rather than against the boiler. Applying it to one year and not the other made the two ends of the model incomparable — wood appeared to decarbonise between 2020 and 2050 without anything physical changing. Holding the factor constant means a scenario that leans on wood is charged for it in both years, and moving this slider to zero still shows exactly what the convention is worth: 2.06 MtCO₂ at the reference scenario, 1.6 of it in buildings. Since stage C the convention is no longer free. The combustion CO₂ the factor omits reappears in the forest sink's response to harvest: cutting more wood feeds the boiler and costs the sink, in the same scenario and from the same identity in cubic metres. A wood-heavy scenario can no longer borrow from a forest the model was not looking at.

  • Teaching workbook, "Synthesis" sheet S16 and S43
  • The 27 gCO₂/kWh is the workbook's own 2020 value; it covers the fossil energy of the wood chain, not the combustion CO₂ the convention omits.
Aviation efficiency gain
aviationEfficiency
0%/y0 … 2Published

Kerosene per passenger-kilometre, improving each year through aircraft renewal, seat density and load factor. Published trajectories converge tightly on 1%/year: ICAO 1.0, ADEME 1.0, T&E 0.9, the UK Committee on Climate Change 0.9, the World Economic Forum's Clean Skies for Tomorrow 1.0, against 2.5 in the more optimistic ICSA figure. The default is 0 because the source workbook uses today's consumption for 2050 — moving the slider to 1 shows what a quarter-century of fleet renewal is worth, and it is worth less than most people expect.

Flagged above 1.5%/y. Published trajectories converge tightly on 1%/year — ICAO 1.0, ADEME 1.0, T&E 0.9, the UK Committee on Climate Change 0.9, the World Economic Forum's Clean Skies for Tomorrow 1.0 — against 2.5 in the most optimistic ICSA figure. Past 1.5%/year the scenario assumes a quarter-century of fleet renewal faster than any of them, compounded over the whole horizon.

Air-traffic growth
aviationDemandGrowth
0%/y-1.5 … 3.5Published

Passenger-kilometres, compounded over thirty years. The source workbook carries 2020 demand straight through to 2050, which is a growth assumption of zero and a very strong one — no published trajectory says that. For flights departing France the DGAC roadmap gives 1.62%/year falling to 1.19, or 1.8 without a price effect and 0.8 with one; ADEME spans −1.3 to +3.0 depending on scenario and price effect; Eurocontrol gives 3.3 then 1.7. World figures are higher still: ICAO 1.1 to 3.4, Airbus 2.6, Boeing 5.6 falling to 2.5. At 1.5%/year over thirty years traffic grows by 56%, which is worth more than every efficiency gain in the sector combined.

Flagged above 2.5%/y. 2.5%/year compounds to 2.1 times today's traffic by 2050. For flights departing France the DGAC roadmap gives 1.62%/year falling to 1.19, and ADEME spans −1.3 to +3.0 across its whole scenario set. Past 2.5 the scenario is on the world's most bullish manufacturer forecasts, applied to a country whose own regulator does not use them.

Bio-jet fuel
safBioPrice
2 000 €/t600 … 4 000Published

Sustainable aviation fuel from biomass. The published estimates disagree by a factor of six, and which route is assumed matters as much as who estimated it: HEFA from waste oils 600–1 900 €/t, biomass-to-liquid 1 400–2 900, alcohol-to-jet 750–3 900. The default sits mid-range across the three. The width of that range is the honest answer, which is why this is a slider and the range is printed beside it.

E-jet fuel (power-to-liquid)
safEfuelPrice
5 000 €/t1 500 … 10 000Published

Synthetic kerosene from electrolytic hydrogen and captured CO₂. Estimates range from 1 820 €/t (European Commission) to 10 000 (DGAC), with the review's central band at 3 700–6 200. Direct air capture costs more than biogenic CO₂: EASA gives 7 300–8 700 €/t for atmospheric CO₂ against 6 600–7 975 for biogenic.

Fuel share of airline operating cost
fuelShareOperating
30%15 … 40Published

Everything that is not fuel — aircraft, crew, airport charges, maintenance, overheads — is assumed unchanged in 2050 and is derived from today's ticket through this share. It is the weakest link in the ticket calculation: a 2050 airline may well have a different cost structure, and nothing here models that.

Agriculture pathway position
agriPathway
Hidden
100%0 … 100Game rule

Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column.

Retired in France since the food module arrived, and hidden. The agriculture sector is now built the way transport, building, industry and energy already are — as a sum of the post table, from three constructive rows: a herd sized by what the country eats and exports, a nitrogen balance on the fields, and the fuel the farm burns. This slider moves nothing here, and its help says so rather than describing a trajectory nobody is on. It stays declared, at the value it always had, because land_module_active reads it and because the three provisional editions still use it: they carry no food module, so their agriculture is still a position on a published trajectory between the observed year and the strategy's horizon. A test asserts that it is inert in France, which is a stronger statement than "it is not drawn". What it did, and why it had to go: it slid the sector between the 77.53 MtCO₂e observed in 2024 and the SNBC 3's 43.67 in 2050 with no driver at all. A player could not ask what a smaller herd, a different diet or half the nitrogen would do, because none of those were in the model — the slider was the model. Its 100% default also meant the reference scenario asserted the strategy's own result instead of producing one, and the module that replaced it lands about three megatonnes above that result, which is the information the slider was hiding.

Waste pathway position
wastePathway
100%0 … 100Game rule—
Natural carbon sink
naturalSink
Hidden
23 MtCO₂e/y absorbed5 … 40Game rule

Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column.

Retired in France since the land module arrived, and hidden. The natural sink is now computed — seven land classes, six inventory pools and a forest identity in cubic metres — so this slider moves nothing here. It stays declared, at the value it always had, because land_module_active reads it and because the three provisional editions still use it as their whole land-use model; a test asserts that it is inert. Everything below is what it said while it was the model, and it is kept because it is the argument the module had to answer. Set directly rather than as a share of a trajectory, because the number is what a reader argues about. Declared as a magnitude absorbed, and negated in the equations: a slider whose right-hand end weakened the sink read backwards, since dragging right is dragging towards more. The dashboard still shows it signed, as −23. 23 is where the SNBC 3 pathway lands, and it is a weakening: the French forest sink has roughly halved since 2010 as the stock ages and dieback and drought bite. Reaching the stronger end of this range means a forest growing faster than it does today, and the model does not say what it would take to get there — that is a genuine gap, and one where defensible figures are scarce.

  • SNBC 3 — puits de carbone des terres, trajectoire 2050
Technological carbon sink
techSink
30 MtCO₂e/y absorbed5 … 60Game rule

Set directly, for the same reason, and it is the single largest assumption in the whole model: megatonnes a year of capture and storage that nothing here builds, powers or pays for. Its cost — in euros and in the energy the capture itself consumes — is not modelled, so moving this slider is free in a way it would not be in reality. The default is no longer the closure residual, and that is deliberate. Until v0.19 it was 43: the difference between the −66 MtCO₂e of total 2050 absorptions the SNBC 3 publishes and the −23 of natural sink stated beside them, which is arithmetic rather than an assessment of anything. It is now 30, roughly France's share of the 280 MtCO₂e a year of injection capacity the European industrial carbon management strategy projects for 2050 across the Union — still a quantity nobody has built, but one argued from a published deployment rather than from a subtraction. The thirteen megatonnes that leaves are not hidden. The reference scenario no longer reaches the published total; the national reconciliation shows the gap against official_technological_sink_2050, which stays at the −43 the strategy implies; and the flag below is lit at the reference rather than only at the extremes. A player who wants the strategy's own closure drags the slider to 43 and reads what it stands on.

  • Inferred 2050 closure value; see the national-reconciliation annex
  • European Commission, Industrial Carbon Management Strategy (COM/2024/62)

Flagged above 20 MtCO₂e/y absorbed. Twenty megatonnes a year, for France alone, is around half of everything the planet currently captures and stores, across every facility in operation. France captures none of it today. Nothing in this model builds the plant, supplies the electricity the capture consumes, or pays for either — so every megatonne dragged past this point is free here and is free nowhere else.

Land taken for building
artificialisationRate
12 kha/y0 … 52Published

Measured on Teruti, not on the cadastre, and the two differ by a factor of two or three: Teruti counts every garden and verge as artificialised and the cadastre counts parcels newly built on, which is why the country is at 15–20 kha/y on one measure and 38–52 on the other. The account is written in Teruti hectares, so it has to be moved by Teruti flows — and the emission content of the artificial pool only closes on Teruti's rate: 5.0 MtCO₂e ÷ 52 kha/y = 96 tCO₂ per ha/y of flow, inside the 15–110 tCO₂/ha range the underlying soil and biomass arithmetic gives. The research note recommended the cadastral measure as "the honest compromise" for a lever; we depart from it, for that reason, and the cadastral measure and the ZAN test belong beside the result as a comparison rather than inside it as the driver. The default is a halving of the 2011–2021 decade, which is what the Climat et Résilience law asks for by 2031 — roughly 12 kha/y on the cadastre, and carried across to the Teruti rate here, which is an approximation and is the weakest step in this lever. Zero is net-zero artificialisation reached early.

New forest planted
afforestationRate
15 kha/y0 … 90Published

The two ends of this slider are not the same measurement, and that is the single largest unreconciled flow in the whole account. The SNBC 3 plans deliberate afforestation outside existing forest: 100 ha/y in 2021, rising to 15 000 by 2030, then 200 000 ha over 2030–2039. IGN's inventory measures the forest expanding by 90 000 ha/y, most of it spontaneous — canopy closing over abandoned heath and grazing. Teruti, on the same territory, sees about 35 000. IGN counts a closing canopy as forest while Teruti still sees heath, and no published concordance settles it. Hectares planted are booked at the expansion storage rate, 3.0 tCO₂/ha/y, and only once they are more than ten years old — new forest does not store like mature forest, and at 15 kha/y the whole term is worth 0.7 MtCO₂/y against a forest pool of about 20. Planting is slow, and this lever says so.

Flagged above 35 kha/y. The SNBC 3 plans deliberate afforestation at 15 000 ha a year by 2030 and 200 000 ha over the decade after it — about 20 000 a year. Past 35 000 the scenario is no longer planting: it is claiming the 90 000 ha a year IGN measures the forest gaining on its own, as the canopy closes over abandoned heath and grazing. That expansion is nobody's policy, no budget line reaches it, and Teruti sees a third of it.

Grassland to crops
grasslandConversion
0 kha/y-50 … 100Published

France ploughed 2.3 Mha of permanent grassland between 1982 and 2018, about 64 kha/y, and the SNBC 3 assumes the area is held from here on. Zero is therefore the strategy's position and not an observation of a stable countryside; the negative end is re-grassing, which no French scenario plans at that rate and which the module allows because a diet scenario in stage B will free the hectares for it. The soil-carbon consequence is asymmetric and that is the teaching in this lever: ploughing grassland loses about 1.0 tC/ha/y for twenty years, putting arable land back to grass gains about 0.5 — loss is twice as fast as gain. At +100 kha/y the twenty-year tail alone is 7.3 MtCO₂/y, which is more than half of what every soil-carbon practice in the INRAE study could store. The fastest way to lose the soil carbon debate is to plough.

Store carbon in the soil
soilCarbonPractices
30%0 … 100Published

100% is 4.72 MtC/y — cover crops 2.02, in-field agroforestry 1.10, temporary grassland in rotations 0.76, grassland intensification 0.69, hedges 0.15 — which is 17.3 MtCO₂/y. No-till is deliberately excluded, because INRAE's own reading is that it redistributes carbon down the profile rather than adding any; putting it back would add 2.5 MtCO₂/y and the widely quoted "+21 MtCO₂/y, 4 per 1000" headline includes both it and forest land. The split between the two land uses follows the itemised practices — 14.777 on arable, 2.530 on grassland — rather than the areas they sit on, which is what the module specification proposed; the specification's "arable 16.0 / grassland 3.8" sums to 19.8, the potential with no-till, not to the 17.3 it also states. The total is the same either way, so only which pool the chart shows it in changes. 30% is a judgement, not a published trajectory: the SNBC 3 asks agricultural soils to "approach equilibrium by 2050" without saying what share of the potential that is. Everything here is a thirty-year rate on a soil that saturates, and after that it stops.

Flagged above 70%. 100% is INRAE's whole itemised potential — cover crops, in-field agroforestry, temporary grassland in rotations, hedges — taken on every eligible hectare at once. Past 70% the scenario has seven eligible hectares in ten actually converted and held for the whole horizon, which no French incentive scheme has ever approached, and the account charges nothing for the ones that lapse.

Wood harvested
forestHarvest
60 Mm³/y40 … 75Published

53.1 Mm³/y is what IGN measures as removals of live trees over 2014–2022, and it is not the 38 Mm³ of the commercial harvest statistic: the difference is the firewood that is cut and burned without ever being sold, about 15 Mm³, and a scenario written on the commercial figure alone is short by a quarter of the country's wood. The default is the SNBC 3's 60 Mm³/y from 2030. 75 is the top of the IGN–FCBA's B3 case and close to the 71 of the two harvest-heavy ADEME scenarios. 40 is low but not unpublished: the Fern–Canopée–Amis de la Terre report takes the harvest down to 30 Mm³/y by 2050 in its most extensive scenario — on a basis that counts branches and dead wood, so about half of what it counts today — and it is also the report that prices that scenario: a supply crisis, sawmill closures and rising imports, which is why its own authors recommend holding 60. Moving this lever moves the land sink by 1.87 tCO₂ per cubic metre — 2.0 in the standing forest, less the 0.13 that cubic metre would have put into wood products — which is the point: until this module existed the game could burn as much wood as it liked and the forest never noticed. What the model does not do is replace the wood that is not cut: no import, no concrete in its place. The controversy table says why that is contested, and since 0.26.0 the scoreboard charges a scenario that leans on its land for more than the SNBC 3's own −23 MtCO₂e.

Flagged below 53 Mm³/y. Below 53 the scenario cuts less wood than IGN measures France cutting today — 53.1 Mm³, informal firewood included — and the wood no longer cut is replaced by nothing this model counts. Every cubic metre spared books 1.87 tCO₂ of absorption: fifteen million fewer than the SNBC 3 asks for is twenty-eight megatonnes a year. The French literature never treats that as free — France Stratégie names the cost of the lower-harvest strategy as a wider trade deficit, importing the chips, sawn wood, pulp, panels and furniture the country still wants — and the scoreboard now charges it, on the land-sink line.

Wood into long-lived products
harvestToProducts
30%15 … 35Published

Only sawn timber and panels hold their carbon for decades — fifty years for structural framing, thirty for flooring, twenty-five for panels — while pulp and packaging give it back within about seven. The SNBC 3 draft moves sawn from 9.5% to 12% of the harvest and panels from 13% to 18%, i.e. 22.5% to 30%, and expects the wood-products pool to go from roughly zero today to at least 3 MtCO₂e/y in 2030. The IGN–FCBA study's most useful finding is that reallocating the marginal cubic metre from energy to material is worth about as much as increasing the harvest at all. This lever is that finding, and it trades against the wood supply: at a fixed harvest, every point that goes into a long-lived product is a point that does not go into a boiler.

Drained peatland rewetted
peatRewetting
Hidden
0%0 … 100Game rule

Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column.

Declared, hidden and provably inert. France's land_class carries no drained organic soil (see the table's own why), so every term this lever enters is a multiplication by an area of zero and a test asserts that its whole range moves no output at all. It is hidden rather than drawn because a slider that cannot change a number is a lie about the model rather than a gap in it. The day Citepa publishes an organic-soil area by land-cover class, this becomes a real French lever and its bounds become a real French argument.

Climate effect on the forest
forestClimate
21 … 3Published

Three positions, from the IGN–FCBA climate cases: by 2050 production falls 1%, 12% or 25% and mortality rises to 1.1, 1.4 or 1.8 times today's. Mortality has already doubled since 2005–2013 — spruce, chestnut and ash are dying now — so C2 is the central case rather than the pessimistic one. This control is what makes the −62 to +5 MtCO₂e band the Haut Conseil pour le Climat puts around the SNBC 3's own sink reachable in the game without inventing a curve. At C3 with a hard harvest the French forest becomes a net source, which is not a modelling artefact: it is what the published severe case says, and the module reports it rather than clamping it away. The player chooses it, which is uncomfortable — nobody chooses their climate — and the alternative was to pick one for them.

Red meat eaten
dietRedMeat
40 kgec/cap/y15 … 60Published

Beef, pork and sheep meat: 20.8 + 30.6 + 2.1 = 53.5 kgec a head in 2024, against 85.0 kgec of all meat. The default of 40 is a quarter below the observed diet and sits between the PNNS 4 recommendation and the −40% every study that reaches −40% greenhouse gases lands on; the minimum is the EAT-Lancet reference diet's order of magnitude, and the maximum is above anything France has eaten since 2004. The SNBC 3 does not publish a diet in kilograms — it says "PNNS-conform" and "limited", and cuts imported meat first — so the default here is the module's reading of a strategy that declined to give a number, not the strategy's own figure. That is worth knowing before quoting it.

Flagged below 20 kgec/cap/y. 53.5 kgec is the observed 2024 diet, and every study that reaches −40% greenhouse gases lands around 32. Below 20 the scenario is at the EAT-Lancet reference diet's order of magnitude: a fall of more than three fifths in a single generation, and a change in what a country eats that nothing in this model brings about, prices or even makes anyone argue for.

Poultry eaten
dietPoultry
28 kgec/cap/y10 … 35Published

Poultry is separated from red meat because it is the one meat whose consumption rises — 2.2% a year, from a quarter of French meat to a third in twenty years — and because every diet scenario cuts it least. A model that moved all meat together would hide the substitution that is actually happening.

Dairy eaten
dietDairy
90%50 … 110Published

An index rather than a quantity, because milk equivalents are published on three incompatible bases and none of them survives a conversion cleanly. The default of 90 is a tenth below today, well short of INRAE's −30%: dairy is the lever that fights back hardest, because cutting milk cuts the dairy herd and the dairy herd supplies two fifths of the beef, so the suckler herd grows to meet a beef demand that has not moved. Moving this slider alone shows that coupling better than any chart.

Cut edible food waste
foodWaste
0%0 … 50Published

It is a small lever, and the arithmetic says why. The share it acts on is the edible fraction of the food supply — 3.8 Mt of edible waste on a supply of order 55 Mt, so 7% — and halving that removes about three and a half per cent of the demand. The thirty per cent everyone quotes is ADEME's share of the food chain's losses that occur at consumption, which is a different quantity and about four times larger; putting it here would make food waste look like the biggest lever in this module rather than one of the smallest. The default is zero and not the SNBC 3's −50%, because the strategy's target is set against 2015 and on the whole chain, and reading it onto an edible-waste share of a 2024 supply would be arithmetic the strategy did not do.

Livestock exports
livestockExport
100%0 … 150Game rule

A rule, and the only lever in this module that no source sets a 2050 level for. France exports two fifths of its milk while importing a third of the dairy it eats, and exports about a fifth of its pork; without this lever a French diet change would move the French herd one for one, which is simply wrong. With it, a player can eat less meat and keep the herd, or keep eating and stop exporting, and see that these are different decisions with different answers. The volumes are indexed rather than the shares, because a share runs away as it approaches one: at an export share of 90% a five-point move doubles the herd. The bounds are the game's, not a study's, and nothing published says what France should export in 2050.

Crop exports
cropExport
100%0 … 150Published

France exports 26.9 Mt of cereals a year on a harvest of 60.9 Mt, the average of the five campaigns 2020/21 to 2024/25 — 44% of what its fields grow, half of it soft wheat, and the largest use of its arable land after feeding the herd. A domestic diet change therefore moves exports before it moves fields, and a crop block that ignored the export position would find France with idle hectares the day it eats less bread. The lever is indexed on the base-year volume, exactly as livestockExport is, and the default holds it: no published scenario sets a 2050 export level, INRAE only notes that a smaller herd and less ethanol free cereals for export. The maximum is half as much again.

Mineral nitrogen
nIntensity
70%40 … 110Published

The SNBC 3's −54% against 2020 is 55% of the 2024 delivery, and the reference delivers exactly that — but since stage E the lever is the dose on the hectares that stay conventional, because the organic share takes its hectares out of the mineral dose on its own. INRAE's decomposition of the strategy's cut is the reason: of the −944 kt N it books, 330 come from extending organic farming to a quarter of the area, and reading the −54% onto a dose and moving the organic lever would have counted those 330 twice. So the default is 70% on the conventional hectares, which with organic at 25% delivers 55% of 2024 in all; INRAE's own proposal is −46%, TYFA goes to zero on a fully organic Europe, and the maximum is a little above the 2020 level, which 2024 has already fallen below. It is the lever with the longest reach in the module: it sets the soil N₂O and the urea and liming CO₂ in agriculture, and the ammonia the French industry chain has to make, and the hydrogen that ammonia draws from the hydrogen mix. Halving French nitrogen is worth about five megatonnes in agriculture and about a million tonnes of ammonia in industry at the same time, and until this module those were two unconnected numbers. Since 0.24.0 it also sets a yield. Below 90% of the 2024 dose (n_yield_plateau) the conventional hectares lose yield along the GRAFS hyperbola — they keep 0.90 of it at the reference 70% and 0.74 at the floor of 40% — and the crop block asks for the arable land that loss costs. Above 90% a heavier dose buys nothing, which is why the maximum of 110% only adds nitrous oxide.

Flagged below 50%. The SNBC 3's own cut — −54% against 2020 — is 55% of the 2024 delivery, and the reference books it already; INRAE's own proposal is milder still, at −46%. Below 50% of the base-year dose on the hectares that stay conventional the scenario is past every published French trajectory. Only TYFA goes lower, and it does so on a fully organic Europe, with the yields and the diet that implies.

Legumes in the rotation
legumeArea
2.7 Mha1 … 3Published

The SNBC 3 multiplies the legume area by two by 2030 and by nearly three by 2050, from one million hectares to 2.7, and the default is that target. INRAE books a credit of 128 kt of mineral nitrogen for an increase of 1.7 Mha, which is the coefficient this module reads, linearly over that span. The hectares sit inside arable land and move no class of the land account: a legume is a crop in a rotation, not a change of land use. What they do compete for is the same arable land the energy crops of stage C will want, and arable_committed is where that competition is reported.

Organic farming
organicShare
25%0 … 50Published

The SNBC 3 takes organic farming from 5.6% of the field-crop area in 2024 to 21% in 2030 and 25% in 2050, and the default is that target. The lever is stated on the arable area rather than on the whole farmland, because that is where both of its effects sit: the 10% of the agricultural area the organic agency publishes for 2024 — 2.7 Mha — is mostly grassland, which takes little mineral nitrogen and has no yield gap worth modelling. The maximum, 50%, is Afterres2050's organic share, and ADEME's S1 goes to 70%. Two consequences, and the second is the one the module was missing. An organic hectare takes no mineral nitrogen, so the mineral dose falls in proportion — the INRAE hypotheses for the strategy book −330 kt N for the same extension, and this lever gives −360 at the base-year dose. And an organic hectare yields about two thirds of a conventional one, so the same plates, the same herd and the same exports need more land: at 25% the arable area the country needs rises by 7%, and at 100% by half. The land account does not resolve that tension; it reports it as arable_headroom, negative where the fields the diet needs do not exist.

Cattle on low-methane rations
entericMitigation
82%0 … 100Published

The SNBC 3 puts lipid-enriched rations — linseed, rapeseed — on 82% of housed cattle by 2050, at −14% of enteric methane where they are fed, after Pellerin's 2013 assessment. That is the default, so this lever is one of the ones reachable only downwards from the reference. The additive that would do better is not in it. 3-NOP cuts enteric methane by 20–35% in dairy cows in the trials, but it is fed only while the animals are housed, it is not in the SNBC 3, and putting its number here would be claiming a strategy France has not adopted. Raising the maximum to 100% is as far as this module goes.

Manure to digesters
manureMethanised
0%0 … 80Game rule

The default is zero, and it is not the SNBC 3's 80%. The strategy's figure is the maximum here and is reachable, and it is worth about three megatonnes; what it is not is a number the reference scenario should book. The abatement rests on a split between enteric and manure methane that Citepa publishes only as a total — the per-species manure_ch4_share in the livestock table is an assumption, not a measurement — and booking three megatonnes on an unpublished split would have closed most of this module's gap to the SNBC's own 2050 agriculture figure with a coefficient nobody can check. The gap is information; see the changelog. What the lever will also do, from stage C, is produce biogas. It is declared here because it belongs to the manure block, and its supply side is the next stage's.

Get fossil fuel off the farm
agriFuelSwitch
100%0 … 100Published

The SNBC 3 takes fossil fuel on farms to zero by 2050, and the default is that. It is worth 10.73 MtCO₂e — agriculture 10.33 plus forestry 0.41 — which is a seventh of the sector and the single largest thing a French farm can stop doing. What it does not say is what runs the tractors afterwards, and neither does the strategy. This module therefore books the emissions and not the energy: the roughly forty terawatt-hours behind the line are outside the model's carrier pools in both directions, and that is stated in the farm_fuel_emissions equation rather than papered over with an invented electricity demand.

Nitrogen made at home
ammoniaDomesticShare
34%0 … 100Published

France Fertilisants puts French production at 34% of the nitrogen French farms use, with 24% from other EU countries and 42% from third countries — mostly urea, UAN and DAP from Russia, the United States, Egypt, Algeria and Trinidad. That is the default, and it replaces the free-standing ammonia tonnage the model used to carry. At the base year's 1 817 kt of nitrogen and 34%, the derived tonnage is 900 kt, which is what the retired slider asserted — a cross-check rather than a fit, because the share comes from the fertiliser industry and the nitrogen from Citepa, and neither was chosen to land there. Moving this lever is a sovereignty argument with an energy bill attached: making all of France's nitrogen at home multiplies the ammonia and the hydrogen it draws by three.

Winter energy cover crops
civeArea
2.5 Mha0 … 3Published

2.5 Mha is the energy directorate's own figure (2.55), and it is the default because it is the one a national scenario has actually written down. The mission that reviewed the biomass potential recommends "about 3", which is the maximum here; INRAE's expertise says 4 Mha of French spring cropping could carry a cover crop at all, which is cive_land_ceiling and is deliberately not reachable by the slider. This is the largest single term in the biogas supply — 2.5 Mha at 6 t DM and 2.8 MWh/t is 42 TWh, half of everything the module produces — and it is also the one an agronomist will argue with first. A cover crop takes no food land, but it needs mineral nitrogen in most years and this model does not charge it; the interannual variation of the yield is ±5 Mt DM on 15, which is a third of the term.

Crop residues taken off the field
residueMobilisation
16%0 … 30Published

16% is what an INRA/ADEME study finds can be exported without a soil carbon loss — 55% of the surplus straw, which is 4.1 Mt of fresh matter. Solagro caps at 20%; a 2025 agronomic study finds more than 30% is possible at département scale while keeping the fifty-year soil-carbon loss under 2.5%, which is the maximum here. The ceiling is soil carbon and nothing else: a tonne of straw left on the field returns 400 kg of carbon and 6 kg of nitrogen to it. Push the slider and the land account does not charge you for the carbon, because the inventory's cropland pool is calibrated on the base year's practice — a named limitation, and the reason the maximum is 30 and not 50.

Flagged above 25%. 16% is what the INRA/ADEME work finds can leave the field without a soil-carbon loss, and Solagro caps at 20%. A tonne of straw carried away takes 400 kg of carbon and 6 kg of nitrogen with it — and the cropland pool here is calibrated on the base year's practice, so the land account does not charge the loss back. Past 25% the biogas is real and the soil carbon it costs is invisible.

Land growing fuel
energyCropArea
0.62 Mha0 … 1.7Published

0.618 Mha today, and the default is that rounded to the slider's step: 218 kha of ethanol crops (wheat 115.8, maize 75.2, sugar beet 27.2, FranceAgriMer 2026) and about 400 kha of rapeseed and sunflower for FAME. The 400 kha is the weakest number in this block — it is a FranceAgriMer estimate quoted by the trade press and was not verified at source — and it carries 6.8 of the 11.7 TWh the term produces. The maximum is the mission's own proposal: +1.1 Mha of rapeseed and beet for +19 TWh. Note what the slider does not say — the "about one million hectares" often quoted for French biofuels is the European footprint of French consumption, and half of what France burns is imported as fuel or as feedstock. French land in French biofuels is 0.6 Mha for 11.7 TWh.

Land growing methane
energyMaizeArea
Hidden
0 Mha0 … 0Published

Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column.

Zero, with a range of zero, and hidden. French methanisation runs on manure, waste and cultures intermédiaires à vocation énergétique, which is what civeArea is: the SNBC 3 and the biomass strategy both rule out a dedicated main crop, and the maize grown in France is grown for silage and for grain. The lever exists because Germany's does, and it is fixed at its declared value rather than merely hidden so that its inertness is arithmetic rather than a promise — the minimum and the maximum are the same number, so no run of the model can move it.

Imported biofuel allowed
bioImports
20 TWh/y0 … 40Published

France imported about 19 TWh of finished biofuel and 11 TWh of feedstock in 2023; the ecological planning secretariat's own 2030 balance keeps 12 to 20 TWh of liquid imports. 20 is the middle of that and the default; 40 is roughly today's gross import position, which a 2050 that has not reduced its liquid demand would still need. The bounds are a rule dressed as data and the model says so. No published French study sets a 2050 import allowance for liquid biofuel, so what anchors this slider is today's trade position and one 2030 figure. Wood imports (5–10 TWh) are left at zero because they are small, and there is no biomethane import line in any French study at all. What it buys is worth stating plainly: the good band is the domestic supply, so importing fuel moves the warning line and never the target. A scenario that meets its liquid demand on imports is amber by construction.

Flagged above 30 TWh/y. No French study sets a 2050 import allowance for liquid biofuel: what anchors this slider is today's trade position and one 2030 balance, which keeps 12 to 20 TWh. Past 30 the scenario meets its liquid demand on fuel grown somewhere else — on land this account does not hold, under a sustainability regime it does not check, and with an emission the game perimeter never sees.

Hot-water efficiency
usageDhwEfficiency
0%0 … 40Game rule—
Cooking efficiency
usageCookingEfficiency
0%0 … 40Game rule—
Hot water on electricity
usageDhwElectric
68%0 … 100Game rule

A share of the service, not of the energy. Switching a gas water heater for an electric one does not move the same number of kilowatt-hours: the electric route delivers the same hot water from less energy, and the model converts through the two efficiencies rather than shifting the energy across unchanged. 68% is where France is today — of the service, which is why it is not the 47% an energy split would give: a kilowatt-hour of electricity delivers more hot water than a kilowatt-hour of gas. At that default the model reproduces the observed energy exactly. The 26 TWh of gas, oil and LPG behind the remaining third is one of the two things standing between a maximal scenario and a winnable game. One approximation: a single share is applied to residential and tertiary alike, where today they sit at 75% and 51%. The national total is exact; the split between the two segments is not.

Cooking on electricity
usageCookingElectric
61%0 … 100Game rule

Same treatment, and the efficiency gap is much wider here: a gas hob puts about 40% of its energy into the pan and an induction plate about 84%, so electrifying cooking roughly halves the energy it takes. 61% of the service is electric today, which reproduces the observed energy exactly.

Air-conditioning growth
usageCoolingGrowth
0%0 … 300Game rule

Cooling is the one building usage certain to grow, and the model cannot score it properly: it makes a summer peak, and the only peak constraint here is a winter one. The number is carried and the asymmetry is stated. The 24 TWh is the building_usage table's own two cooling rows, residential plus tertiary.

Appliance efficiency
usageSpecificEfficiency
0%0 … 50Game rule

Lighting, appliances, screens and servers. It is the lever that has historically delivered — French specific consumption has been roughly flat for a decade while the equipment count rose — and here it is set against the growth lever below, which is the whole point of having both.

Digital and equipment growth
usageSpecificGrowth
0%-20 … 150Game rule

The counterweight to appliance efficiency. Data centres and AI are the part of this that is growing fastest and the part the model is least able to source, so it is left as an explicit assumption rather than given a trajectory it cannot defend.

Gas plants run on hydrogen
gasPlantHydrogen
0%0 … 100Game rule

RTE keeps a few GW of combustion capacity in every 2050 scenario, for the windless fortnight that no amount of storage covers. What it burns is a choice: methane, which draws on the same biomethane everything else wants, or hydrogen, which draws on electricity instead and emits nothing at the stack. Hydrogen is much the dearer of the two, and the model charges it: the electrolytic price the industry module already computes, against a methane price. What it does not do is add the electrolysis back into the electricity the mix has to serve — that would be a fixed point the compiler cannot express, since demand sets the mix and the mix would set demand. The extra electricity is reported instead of hidden.

Electrolysis
h2Electrolysis
100%0 … 100Game rule

The model assumed this for every tonne of hydrogen until v0.12.0, which was a strong assumption wearing no clothes: 87 TWh of electricity for hydrogen, and no way to ask what a reformer would cost instead.

Steam methane reforming
h2Smr
0%0 … 100Game rule

A reformer burns and reforms methane. In this model 2050 methane is biomethane, so the colour of the hydrogen depends on the colour of the gas — and it draws on the same biomethane pool as everything else, which is the trade-off worth seeing.

Autothermal reforming with capture
h2AtrCcs
0%0 … 100Game rule

ATR concentrates the CO2 in one stream, which is why it captures at 94% where a reformer with post-combustion capture struggles past 60%. On biomethane this goes negative, and that is not a trick of the accounting: the carbon came out of the air last season and is being put underground. It is also the single most contested line in the model — see the controversy tab — because it makes a scenario's arithmetic depend on a biomass supply chain the model does not represent.

RTE 2050 scenario
rteScenario
41 … 6Published

Which of RTE's six 2050 mixes the scenario is built on, from M0 at 100% renewable to N03 at about half nuclear. It selects a set of shares, not a quantity: the mix is scaled to whatever electricity the rest of the model turns out to need, so choosing a scenario here answers "with what" and never "how much".

LFP share of batteries
batteryLfpShare
0%0 … 100Game rule

The chemistry choice, and the sharpest trade-off in the account. LFP carries almost no cobalt (7 grams per MWh against 27 kg) and a quarter of the nickel, but 4.4 times the lithium — 490 kg per MWh against 111. There is no chemistry that is cheap in every metal at once, which is the point of putting it on a slider. Zero by default because the source scenario's 2050 reference is NMC 811.

Industry discount rate
discountIndustry
8%2 … 15Published
Residential discount rate
discountResidential
4%0 … 10Game rule

A household and an industrial investor do not face the same cost of capital. Moving this rate from 4% to 8% raises the building indicator by about a third with no physical change at all, which is why it is a lever and not a hidden constant.

Carbon price
carbonPrice
150 €/tCO₂0 … 300Published
Industrial electricity price
elecPriceIndustry
70 €/MWh20 … 120Published
Deep-retrofit cost
retrofitCost
550 €/m²200 … 900Provisional

No primary publication has been secured for this figure. It is exposed as a slider rather than hidden as a constant so the uncertainty is testable. Securing the CSTB renovation-gesture database is the single change that would most improve the building cost module.

  • ADEME renovation cost orders of magnitude; CSTB gesture database derived from Batiprix 2022 (used by OptoBat, not public)
Liquid fuel at the pump
liquidFuelPrice
200 €/MWh80 … 400Provisional

A 2050 pump price for biofuel and e-fuel, taxes included. No source has been secured; the aviation module now prices synthetic fuel bottom-up and is the better anchor.

  • No primary source secured — see the aviation fuel-cost table for a bottom-up range
Travel less
simpleTravelLess
Coarse control
0%0 … 100Game rule

The passenger sufficiency control. At 100% it removes 45% of passenger travel and takes air traffic from the workbook's implicit 0%/y to -1.5%/y — the two demand assumptions the transport module is most sensitive to, moved together because a scenario that flies as much as today while driving 45% less is not a coherent story about sufficiency.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Passenger mobility reduction passengerReduction: 0% → 45%
  • Air-traffic growth aviationDemandGrowth: 0%/y → -1.5%/y
Electric cars instead of fuel cars
simpleCarElectric
Coarse control
0%0 … 100Game rule

Moves the 20% of 2020 car demand still served by a liquid- or gas-fuelled car in the reference onto the electric fleet. The rail transfer is left where it is: electrifying the fleet and shifting trips off it are two different decisions, and folding them together would hide which one paid.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Fuel car carFuel: 10% → 0%
  • Biogas car carGas: 10% → 0%
  • Electric car carElectric: 70% → 90%
Get the diesel out of freight
simpleTruckClean
Coarse control
0%0 … 100Game rule

The reference already leaves only 10% of road freight thermal, so this is a small lever by construction, and that is the lesson: on the workbook's own trajectory the remaining road-freight emissions are not where the tonnes are. Hydrogen trucks are left alone, because arbitrating between hydrogen and battery is a detailed-view argument, not a coarse one.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Residual thermal truckThermal: 10% → 0%
  • Electric truck truckElectric: 40% → 45%
  • Shift to rail freight truckRail: 30% → 35%
Off the plane — rail and sea instead
simpleFlyLess
Coarse control
0%0 … 100Game rule

Modal shift away from aviation, which is where the transport module's residual emissions concentrate once the fleet is electric. Distinct from "travel less": this one moves the same journeys onto another mode rather than removing them.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Domestic aviation → rail domesticAviationRail: 50% → 100%
  • Air freight → maritime freightAviationSea: 20% → 100%
Heat less
simpleHeatLess
Coarse control
5%5 … 25Game rule

The building sufficiency control, in the unit of the lever it drives because it drives only that one. It starts at the reference 5% rather than at zero: the simple view offers effort beyond the reference scenario, never less than it.

Moving this control from 5% to 25% moves, in step and in proportion:

  • Temperature-related sufficiency bldgSobriety: 5% → 25%
Renovate the building stock
simpleRenovate
Coarse control
30%30 … 65Game rule

As with sufficiency, this is the stock-performance lever shown in its own unit and bounded below by the reference scenario. 65% across the whole stock is the upper end the workbook contemplates, not a technical limit.

Moving this control from 30% to 65% moves, in step and in proportion:

  • Average retrofit improvement bldgRetrofit: 30% → 65%
Build less, and in timber
simpleBuildLess
Coarse control
0%0 … 100Game rule

The materials side of the building question, and the one control in the simple view whose whole interest is how far it cannot reach. At 100% the country builds 8 Mm² of housing and 8 of everything else a year instead of 20.4 and 19.9 — the order of magnitude the official housing-need study reaches for the 2040s — and frames 60% of it in timber instead of 12%. Together those take roughly a quarter off national cement demand. They take far less off steel, because new buildings are about a ninth of it; and they cannot touch the third of cement that is roads, buried networks and bridges, nor the third that nobody has attributed. Two ideas in one control is a deliberate departure. Building less and building in timber are different decisions, and the detailed view keeps them apart; here they are bundled because they are the same material choice seen from a distance, and because a simple view that separated them would have spent two of its dozen controls on one question.

Moving this control from 0% to 100% moves, in step and in proportion:

  • New housing built newHousing: 20.4 Mm²/y → 8 Mm²/y
  • New non-residential built newNonResidential: 19.9 Mm²/y → 8 Mm²/y
  • Built in timber timberShare: 12% → 60%
Heat pumps instead of boilers
simpleHeatPumps
Coarse control
0%0 … 100Game rule

Electrification of heating, with the two consequences that make it a real choice rather than a free win. The wood boilers go with the gas ones, because 95% electric plus 46 TWh of wood would allocate more heat than the stock needs; the resistance heaters go into air-water heat pumps, because electrifying on resistance is what makes the winter peak unmanageable. The peak still rises sharply, and that is the point of the control. Pushing sufficiency and renovation at the same time shrinks the heat need under a fixed 95% share, so the building readout may report over-allocated heat; the model reports it rather than absorbing it.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Heat covered by electricity bldgElectricShare: 49% → 95%
  • Biomass for heating bldgBiomassTwh: 46 TWh/y → 0 TWh/y
  • Electric resistance bldgElecResistance: 15% → 0%
  • Air-water heat pump bldgElecAirWater: 31% → 46%
Electrify hot water and cooking
simpleElectrifyUsages
Coarse control
0%0 … 100Game rule

Hot water and cooking are about as much energy again as space heating, and neither is fully electric today. Their observed electric shares are the starting points, 100% the end.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Hot water on electricity usageDhwElectric: 68% → 100%
  • Cooking on electricity usageCookingElectric: 61% → 100%
Consume less material
simpleConsumeLess
Coarse control
0%0 … 100Game rule

The industrial sufficiency control. Freight demand is driven here rather than in transport on purpose: freight is what material consumption looks like on a road, and a scenario that halves plastic and cement demand while moving the same tonne-kilometres is not consistent. Steel goes from +30% to -40% against 2020, which is the widest swing any single number in the game commands. The output of the rest of industry is not driven, because its scale starts at today's output and has nowhere lower to go.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Plastic-demand reduction plasticReduction: 30% → 70%
  • Less cement per unit of works cementReduction: 10% → 60%
  • Steel production change steelGrowth: 30% → -40%
  • Freight-demand reduction freightReduction: 0% → 45%
Change the industrial processes
simpleCleanProcesses
Coarse control
0%0 … 100Game rule

Every route change the five value chains offer, moved together: H-DRI steel, the CO2 + H2 olefin route and the biogenic carbon it uses, heat pumps for food-industry steam and direct heat, the lowest clinker ratio in range, and capture on what is left. The processes of the rest of industry are not driven, because the reference already sits at 100% of them.

Moving this control from 0% to 100% moves, in step and in proportion:

  • H-DRI steel share steelDRI: 50% → 100%
  • CO₂ + H₂ olefin route olefinRoute: 50% → 100%
  • Biogenic CO₂ share biogenicCO2: 10% → 50%
  • Heat pumps for steam foodHPSteam: 60% → 100%
  • Heat pumps for direct heat foodHPDirect: 25% → 100%
  • Clinker ratio clinkerRate: 60% → 35%
  • CO₂ capture carbonCapture: 20% → 95%
Use less energy for the same output
simpleIndustryEfficiency
Coarse control
0%0 … 100Game rule

Efficiency rather than sufficiency or fuel switching: the same product, less energy. At 100% it claims the whole potential RTE identifies and recovers all of the recoverable waste heat, neither of which is costless or instantaneous — the cost panel and the annex say what that means.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Energy-efficiency effort industryEfficiency: 0% of the identified potential → 100% of the identified potential
  • Waste-heat recovery wasteHeatRecovery: 0% → 100%
  • Food-industry efficiency foodEfficiency: 20% → 50%
Eat less meat
simpleEatLess
Coarse control
0%0 … 100Game rule

The demand end of the food chain, moved as one plate. At 100% red meat falls from 40 to 20 kgec/cap/y — below INRAE's −40% and above ADEME's S1 divide-by-three — poultry from 28 to 18, dairy to 70% of the base year and the edible waste by the SNBC 3's own half. Exports are deliberately left alone: what a country sells is a separate argument from what it eats, and folding them together would let a diet lever cut a herd that is producing for somebody else's plate. The lesson is in the coupling rather than in the total. Two fifths of French beef is a by-product of the dairy herd, so cutting the milk makes the suckler herd grow to meet a beef demand that has not moved; only moving both together shrinks the cattle. A player who moves this control and watches the grassland released is watching the land account answer a food question, which is what the module is for.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Red meat eaten dietRedMeat: 40 kgec/cap/y → 20 kgec/cap/y
  • Poultry eaten dietPoultry: 28 kgec/cap/y → 18 kgec/cap/y
  • Dairy eaten dietDairy: 90% → 70%
  • Cut edible food waste foodWaste: 0% → 50%
Plant and protect the forest
simplePlantForest
Coarse control
0%0 … 100Game rule

The sink side of the land account. At 100% the forest expands at the 90 kha/y IGN's inventory measures rather than the 15 the SNBC 3 plans, the harvest falls from 60 to 45 Mm³/y, the long-lived share of what is still cut rises from 30 to 35%, and artificialisation stops entirely — the Climat et Résilience law's 2050 destination, on this account's own measure. It is the control that most obviously costs something, and that is the point: the forest identity is k · (P·A − M·A − H), so every cubic metre not cut deepens the sink and leaves the boiler. Pushed to the top this control takes about a fifth off the wood the scoreboard scores — 127 TWh to 102 — and a scenario that has also electrified its heating will not notice while one that leaned on wood will. The climate case the forest lives through is not driven: it is a scenario choice rather than an effort, it moves the answer further than any of these four, and it stays a fine lever the simple view draws on its own.

Moving this control from 0% to 100% moves, in step and in proportion:

  • New forest planted afforestationRate: 15 kha/y → 90 kha/y
  • Wood harvested forestHarvest: 60 Mm³/y → 45 Mm³/y
  • Wood into long-lived products harvestToProducts: 30% → 35%
  • Land taken for building artificialisationRate: 12 kha/y → 0 kha/y
  • Drained peatland rewetted peatRewetting: 0% → 100%
Fertilise less
simpleFertiliseLess
Coarse control
0%0 … 100Game rule

The field end of the farm. At 100% the mineral dose on the conventional hectares falls to 50% of the base year and half the arable land goes organic, which between them deliver 26% of the 2024 nitrogen — well below the SNBC 3's own −54% and short of TYFA's zero — the legumes reach the 3.0 Mha the rotation studies stop at, and the whole 17.3 MtCO₂/y of soil-carbon practice INRAE itemises is taken. Four consequences are worth watching rather than assuming. The organic half yields two thirds of what it replaces, and since 0.24.0 the conventional half, at half the 2024 dose, keeps 0.79 of its yield — it is below the plateau — so this control costs arable land: the fields the same plates, herd and exports need grow by more than a third, and the crop block reports the shortfall, 4.2 Mha at 100%, against the land account rather than closing it — fertilising less is not free of land, and the page says by how much. Mineral nitrogen is also an industrial decision here: the same tonnage sets the ammonia the chain has to make, so fertilising less is a hydrogen saving as well as a nitrous-oxide one. More legumes raise the nitrogen balance while lowering the emissions — a legume hectare fixes more nitrogen than the mineral fertiliser its credit replaces, and only the difference between the two emission factors makes the net move downwards, so the balance is not a proxy for the tonnes. And the soil-carbon target is a thirty-year rate on a stock that saturates: the practice has to be kept up after 2050 for the carbon to stay where this account puts it.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Mineral nitrogen nIntensity: 70% → 50%
  • Legumes in the rotation legumeArea: 2.7 Mha → 3 Mha
  • Store carbon in the soil soilCarbonPractices: 30% → 100%
  • Organic farming organicShare: 25% → 50%
Grow energy on the fields
simpleGrowEnergy
Coarse control
0%0 … 100Game rule

The supply side of the biomass the rest of the game spends. At 100% the winter cover crops reach 3.0 Mha, the straw taken off the field reaches 30% — Agro-Transfert's ceiling for less than 2.5% of soil carbon lost — and the land growing fuel reaches 1.70 Mha, nearly three times today's and the IGEDD mission's own upper case. Between them they take the methane supply from 70 to about 86 TWh and the domestic liquid supply from 24 to 52. Two things this control does not do. It does not send manure to a digester: manureMethanised sits at 0 in the reference because the abatement it books rests on an enteric/manure split no French inventory publishes, and burying that argument inside an effort scale would be the wrong place for it. And the fuel crops it plants add no mineral nitrogen, because the dose is an intensity on an arable area held at the base year's: a fuel hectare displaces a food hectare that was already fertilised. The crop block counts the displaced food — the fuel hectare is arable land the plates, the herd and the exports can no longer use, and the headroom says by how much — but the fuel hectare itself adds no nitrogen and no nitrous oxide. That is the module's largest structural simplification and it sits directly under this control.

Moving this control from 0% to 100% moves, in step and in proportion:

  • Winter energy cover crops civeArea: 2.5 Mha → 3 Mha
  • Crop residues taken off the field residueMobilisation: 16% → 30%
  • Land growing fuel energyCropArea: 0.62 Mha → 1.7 Mha

Constants — fixed inputs

ConstantValueUnitProvenanceWhy, and where it comes from
efficiency_electricity_to_h20.6MWh H₂ per MWh electricityWorkbook

The workbook converts electricity to hydrogen at 60%. POMMES-INDUSTRY uses 45 MWh of electricity per tonne of hydrogen, which is 74%. The model keeps the workbook value so the cost layer and the electricity indicator describe the same hydrogen; hydrogen is therefore about 40% more expensive here than a POMMES-native calculation gives.

  • Teaching workbook, "General hypotheses" sheet E11
efficiency_electricity_to_efuel0.4MWh fuel per MWh electricityPublished

Electricity in, liquid e-fuel out, across the whole chain: electrolysis, CO2 supply, synthesis and upgrading. Concawe's techno-economic assessment gives 38% when the carbon comes from direct air capture and 44% when it comes from a concentrated industrial source, and 0.4 sits between the two. It is a whole-barrel figure, not a kerosene-only one: Fischer-Tropsch sends roughly a fifth of its liquids to gasoline and diesel, so the electricity behind one tonne of jet fuel alone is higher — about 38 MWh, or 3.2 kWh per kWh burnt. Use this parameter for total liquid demand, which is what the equations do, and do not quote it as an aviation figure.

ef_electricity_202079gCO₂/kWhWorkbook
  • Teaching workbook, "Synthesis" sheet S41 and "Industry" sheet D37
dhw_efficiency_fuel0.85fraction of the energy delivered as hot waterProvisional

A gas or oil water heater, standing losses included.

  • ADEME orders of magnitude for domestic hot water production
dhw_efficiency_electric2MWh of hot water per MWh of electricityProvisional

Above one because it is not all resistance: a 2050 electric water heater stock is a mix of resistance tanks and heat-pump water heaters, the latter at a COP near 3. Two is the blend assumed here and it is an assumption, not a measurement — the honest range runs from 1.0 if nothing changes to near 3 if the stock is heat pumps. It sets how much electricity electrifying hot water actually costs, so it is worth arguing about.

  • ADEME, chauffe-eau thermodynamique — COP de 2,5 à 3,5 selon l'installation
cooking_efficiency_fuel0.4fraction of the energy reaching the panProvisional
  • Standard hob efficiencies; a gas burner loses most of its heat around the pan
cooking_efficiency_electric0.84fraction of the energy reaching the panProvisional

Induction. The gap with gas is the widest of any usage in the model.

  • Standard induction hob efficiency
carbon_in_methane202gCO₂ per kWh of methanePublished

The carbon actually in the molecule, released whether it is burned or reformed. Distinct from efGas, which is 25 gCO₂/kWh in 2050 because the model's methane is biomethane and the convention books its carbon against the digester feedstock rather than the flame. Both numbers are needed and they answer different questions. efGas answers "what does burning this count as?"; this one answers "how much carbon is there to capture?" A capture plant removes molecules, not conventions.

ef_gas_2020227gCO₂/kWhWorkbook
  • Teaching workbook, "Synthesis" sheet S42
ef_liquid_2020264gCO₂/kWhWorkbook
  • Teaching workbook, "Synthesis" sheet S44
ef_wood_202027gCO₂/kWhWorkbook
  • Teaching workbook, "Synthesis" sheet S43
ef_coal340gCO₂/kWhPublished

Coking coal, 94.6 kgCO₂ per GJ, converted at 3.6 GJ/MWh. The workbook declares coal at 0 gCO₂/kWh in its factor table and then charges it at the hydrogen factor, 66.7 gCO₂/kWh, which is neither. This model uses the published factor and removes the double count that resulted — see steel_bf_process_residual.

steel_bf_base_production7 830kt/yPublished

Crude steel by the blast-furnace route, France 2020, split by the H-DRI lever in 2050. worldsteel publishes France at 11.6 Mt that year, 67.5% oxygen converter and 32.5% electric furnace; Eurofer's more precise total is 11 596 kt. It was 9 900 kt, and that figure was 2015, not 2020. France made 9 825 kt by this route in 2015, out of 14 984 kt — the last year the country reached fifteen million tonnes, and the base year of ADEME's sectoral plan for steel. Since then: 10 061 kt in 2019, 7 830 in 2020, 9 280 in 2021, and about 6 300 in 2025, with one of Fos's two blast furnaces idle from October 2023 to mid-2026. On the old figure, steelGrowth's "+30% on 2020" made 19.5 Mt of French steel in 2050, which is +68% on 2020; it now makes 15.1 Mt, the country's 2015 level. The limitation. 2020 is a Covid trough, 20% below 2019. It is used because it is this model's base year, not because it is typical, and the route split after 2019 is published free only as a rounded percentage, so the figure carries about ±50 kt of rounding.

steel_eaf_base_production3 770kt/yPublished

Crude steel from scrap in an electric furnace, France 2020: 32.5% of 11.6 Mt. It was 5 100 kt, which was 2015 (5 159 kt observed). The electric route is the more resilient of the two: between 2015 and 2025 it fell 30% against 36% for the blast furnace, so its share rose from 34% to 36.4% even as its tonnage fell. A3M counts fourteen electric steelmaking sites in France making about 4 Mt a year.

steel_bf_direct_intensity1.76tCO₂ per tonne of steelPublished

The total direct intensity of the integrated route — every source on site, not a process term. It was inherited from the teaching workbook as "the blast furnace's process figure", and under that name it had been counted on top of the coal it mostly is. Re-sourced in 0.27.0, it holds: the IPCC Tier 1 defaults summed over the chain give 1.87 tCO₂/t (1.46 for the converter, which already includes the blast furnace, plus 0.56 per tonne of coke and 0.20 per tonne of sinter); the EU ETS benchmarks, set on the best tenth of European plants, chain to about 1.4; and ArcelorMittal Dunkerque, at 6.8 Mt of steel and about 12 MtCO₂ a year, is at 1.76. The model charges the route's coal its own published factor, so this figure is never booked as such: steel_bf_process_residual keeps the remainder. The limitation: 1.76 and the 0.62 t of coal charged beside it describe a furnace about 20% better than the world average — worldsteel's route average is 780 kg of coal, which at this model's factor alone would release 2.08 t. The two are consistent with each other and should be changed together or not at all.

steel_eaf_process_per_tonne0.08tCO₂ per tonne of steelPublished

What an electric furnace emits on site besides its electricity: the graphite electrodes it burns and the carbon charged to foam the slag and carburise the melt. The IPCC's Tier 1 default, and the floor of the published range — the EU ETS benchmark for carbon steel is 0.215, because it also covers the gas burners and the ladle furnace. It applies to both electric routes, from scrap and from hydrogen-reduced iron, since both end in the same furnace. Until 0.27.0 the model gave these two rows no direct term at all, so the only steel that emitted on site was the blast furnace's.

olefin_base_production3 656kt/yPublished

Ethylene plus propylene produced in France in the base year: 2 270 kt of ethylene and 1 386 of propylene, from the SDES annual census of the chemical industry. It was 4 605 kt, and that figure was the wrong row of the right table. 2 270 + 1 386 + 949 = 4 605, where the 949 is the C4 cut, and the workbook took the line for the crackers' primary products as a whole. Three things in this model say the C4 does not belong in it: the row is named for ethylene and propylene, olefin_carbon_per_tonne is the 3.138 tCO₂/t of a CH₂ chain where butadiene is 3.255 and the cut also carries saturated butanes, and methanol_per_olefin is a methanol-to-olefins yield that makes light olefins and not a C4 stream. A perimeter that included the C4 would need the aromatics too, a different carbon coefficient and a different route — a different model, not a different number. The fleet has shrunk since, and this figure does not say so. France had six steam crackers; ExxonMobil shut Port-Jérôme-Gravenchon for good in June 2024, and output fell from 3 803 kt in 2021 to 2 878 in 2024 and 2 458 in 2025. Berre is under exclusive sale negotiation. The base year of this whole model is 2020, so a 2024 tonnage here would be a single recent observation among base-year ones; the fall is stated rather than substituted, and a 2050 scenario that assumes the 2020 fleet is making an assumption this why is where you find.

  • SDES, enquête annuelle de recensement de la production industrielle — éthylène 2 270 kt, propylène 1 386 kt, coupes C4 949 kt (France, 2020)
  • Citepa, Secten 2026, p. 6 — « la fermeture d'un vapocraqueur courant 2024 sur les six présents sur le territoire national »
  • See docs/waste/olefins_and_plastic_demand.md for the full series 2014–2025 and the plant-by-plant fleet
olefin_carbon_per_tonne3.138tCO₂ per tonne of olefinDerived

The carbon a tonne of olefin can physically hold, which is the ceiling on any claim that the product stores CO₂. Ethylene and propylene are both 85.63% carbon by mass, so a tonne holds 0.8563 × 44.009 / 12.011 = 3.138 tonnes of CO₂ equivalent. Nothing about the route changes it: it is the polymer's own composition. It replaces a coefficient of 4.3 that was 37% above this ceiling. The old figure came from the teaching workbook's "Industry" sheet K48 with no derivation, and it reproduces exactly as the CO₂ fed to the front of the route rather than the carbon locked in the product: 2.988 tonnes of methanol per tonne of olefin (methanol_per_olefin, published) times the 1.3735 tCO₂ per tonne of methanol that stoichiometry demands is 4.105, and 3.138 / 4.105 = 0.765 is an ordinary light-olefin selectivity for a methanol-to-olefins step. The 0.97 tCO₂ of difference leaves as C₄⁺, coke and purge gas; it is consumed by the plant, not stored by the polymer, and crediting it was double-counting the losses as a removal.

  • IPCC 2006 Guidelines, Vol. 3, Ch. 1 §1.3.1 — feedstock carbon is stored, and released when the product is oxidised
  • Atomic masses: C 12.011, O 15.999, H 1.008 (IUPAC 2021)
cement_base_production16 500kt/yPublished

France's 2020 cement production, to half a per cent: France Ciment publishes 16 422 kt. Inherited from the teaching workbook without a source and re-sourced in 0.27.0; the round figure is kept because the construction module is calibrated to it. Still the anchor, and no longer the driver. Since v0.20 cement volume is demand-driven and this constant sets no production directly; what it does is fix the total the four rows of construction_use must sum to, so that the base year of the industry chain, the process emissions and the kiln fuel all stay exactly where the workbook put them. It is a pre-2022 figure and the market has moved a long way since: France Ciment publishes 13.996 Mt produced and 15.970 Mt consumed in 2024, against about 19.1 Mt consumed in 2022. Re-anchoring it would re-anchor the whole industry block and is a change of its own.

cement_process_per_tonne0.527tCO₂ per tonne of clinkerPublished

The decarbonation of the limestone, and nothing else: 6 193 ktCO₂ of calcination in the French inventory for 11 759 kt of clinker in 2020. The neighbouring years give 0.524 (2019) and 0.531 (2021), and it is what stoichiometry predicts: the IPCC's 0.51 × 1.02 for kiln dust = 0.52 for a 65%-lime clinker, 0.53 at 67%. No change of kiln fuel can remove it — only capture, or less clinker. It was 0.7925, and that was a total wearing the wrong name. The old value was 10.2 MtCO₂ over 12.87 Mt of clinker. 10.2 Mt is not the calcination line for any year France has published — that line ran 6.19 to 6.81 over 2015–2021 — but it is inside the range of the whole cement industry's CO₂, calcination and kiln fuel. And 12.87 Mt was not an observation: it is 16 500 × 0.78, this model's own cement anchor times the top of its own clinkerRate slider. The kiln fuel is charged separately through the energy account, so it was emitted twice — and carbonCapture, which multiplies this term, was capturing fuel CO₂ under a name that said it could not. The limitation. 0.527 is a French fleet average for one year, and it moves with the lime content of the clinker and with how much of the lime comes from slag or ash instead of carbonate: the IPCC's range is 0.47 to 0.53. It is also domestic clinker; about a quarter of the clinker behind French cement is calcined abroad, outside this perimeter.

food_steam_demand21.876TWh/yWorkbook
  • Teaching workbook, "Industry" sheet, steam rows 49 and 51
food_direct_heat_demand10.693TWh/yWorkbook
  • Teaching workbook, "Industry" sheet, direct-heat rows 50 and 52
food_heat_pump_cop3MWh heat per MWh electricityWorkbook—
food_hydrogen0.138TWh/yWorkbook

Residual hydrogen use in the food industry, unaffected by any lever.

building_need_calibration0.652836fractionCalibrated

Surface times surfacic need overstates the stock's real heat consumption, so the workbook scales the whole 2020 account by this one coefficient to land on the observed 359.34 TWh. It is a single stock-wide calibration, not a per-segment fudge: every segment carries the same factor, so the shape of the stock is untouched and only its level is set by observation.

  • Teaching workbook, "Building heating" sheet B53
building_peak_202040GWWorkbook

The winter power drawn by electric space heating in 2020. It anchors the 2050 peak: the model computes a peak-coincident electric load for both years from the same expression and scales this figure by their ratio, so running the 2020 stock through the calculation returns 40 GW exactly. The workbook's own version did not -- it divided by the 2020 useful heat rather than the 2020 peak load, and returned 36.8 GW for 2020.

  • Teaching workbook, "Building heating" sheet B55
official_transport_2024125.35MtCO₂e/yPublished
official_building_202456.073MtCO₂e/yPublished
official_industry_202461.5895MtCO₂e/yPublished
official_industry_20505.60569MtCO₂e/yPublished

4% of the 1990 level, the current SNBC 3 industry reduction.

official_agriculture_202477.5259MtCO₂e/yPublished
official_agriculture_205043.6652MtCO₂e/yPublished

47% of the 1990 level.

official_waste_202415.2952MtCO₂e/yPublished
official_waste_20507.50194MtCO₂e/yPublished

45% of the 1990 level.

official_energy_202431.1849MtCO₂e/yPublished
official_energy_20503.15447MtCO₂e/yPublished

4% of the 1990 level. Note what this implies: about 3 MtCO₂e for the whole energy branch in 2050, against roughly 600 TWh of electricity. That is around 5 gCO₂/kWh at the stack — far below the 40 gCO₂/kWh life-cycle factor the game applies, because the two count different things. This contrast is the point of the national reconciliation.

official_natural_sink_2024-51.9564MtCO₂e/yPublished
official_natural_sink_2050-23MtCO₂e/yPublished

The official pathway weakens the natural sink, it does not strengthen it.

official_technological_sink_2050-43MtCO₂e/yGame rule

A transparent closure residual, not a published sector target: −66 MtCO₂e of total 2050 absorptions less the −23 MtCO₂e natural sink.

snbc_gross_205063MtCO₂e/yPublished

The published SNBC 3 gross national total for 2050, rounded.

industry_covered_202060.6MtCO₂e/yDerived

What the model now represents of the industry sector, on the inventory's combustion-plus-process basis and with 2020 emission factors. The five value chains account for 37.0 — steel 15.2, cement 8.4, food 5.8, olefins 5.8, ammonia 1.7, electricity excluded as the inventory excludes it — and the seventeen other branches for a further 23.6, from 7.9 TWh of coal, 8.3 of fuel oil, 68.8 of gas and purchased steam, 19.4 of biomass and 2.5 MtCO₂ of process emissions. Steel and cement were recomputed in 0.27.0 from the model's own chain rows at 2020 volumes: 7 830 kt of blast-furnace steel and 3 770 of electric, and 11 759 kt of clinker at 0.527 tCO₂ of calcination. They were 18.8 and 13.1, the workbook's own figures, which carried the 2015 steel and the cement's kiln fuel twice. Cement at 8.4 is below the 9.53 the inventory books for 2020, and the gap is the kiln fuel the chain row undercounts — about 1.1 MtCO₂, named in industry_chain. Compared with the 61.6 MtCO₂e the inventory books, the model's perimeter is now slightly the smaller, by about as much as that kiln fuel. The two are not the same object anyway: the manufacturing survey the rest of industry is built from is a 2019 base, industry emissions have fallen since, and SECTEN's industry sector also contains construction and refining, which the survey does not. The difference is reported as a diagnostic and is not added to anything.

fuel_efficiency_ceiling0.19792fraction of fuel savedPublished

RTE gives the fuel-side efficiency potential for industry as a whole and does not break it down by branch, so a single ceiling applies to every industrial post. The same source retains 10% as the readily achievable part; the model exposes the full 19.8% and lets the effort lever say how much of it is captured.

lhv_kerosene11.9MWh per tonnePublished

42.8 MJ/kg, the standard lower heating value of jet A-1.

  • Standard lower heating value of aviation kerosene
jet_fuel_price_2023816€/tPublished

The anchor for today's ticket. Everything that is not fuel is derived from it through the fuel share of operating cost, so an error here moves the whole non-fuel block.

co2_per_tonne_kerosene3.16tCO₂ per tonne of fuelPublished

Combustion only — neither the upstream chain nor non-CO₂ effects.

  • ICAO; corroborated by the US Energy Information Administration
aviation_demand_horizon_years30yearsDerived

2020, the base year of the workbook's service demand, to 2050. It is deliberately not the same anchor as the efficiency horizon: consumption per passenger-kilometre is anchored on the 2024 statistic, demand on the 2020 workbook value.

aviation_horizon_years26yearsDerived

2024, the latest year of the traffic series, to 2050.

observed_kerosene_per_pkm_202429.28g of kerosene per passenger-kilometrePublished

The raw French statistic — 6.95 Mt of kerosene for 237.4 Gpkm in 2024. It is higher than the figure the model uses because it also carries the freight in the holds and reflects actual load factors. Corrected for both, the same series gives about 19.3 g/pkm in 2023, which is the range the model's own aviation rows sit in. A real ticket therefore emits more than the per-passenger-kilometre figure below suggests.

  • DGAC mémentos de statistiques and CPDP kerosene deliveries, compiled 1950–2024
lhv_coal7.5MWh per tonnePublished

Lower heating values, used to turn POMMES prices per tonne into prices per MWh.

  • Standard lower heating values for hard coal, natural gas and hydrogen
lhv_methane13.9MWh per tonnePublished
  • Standard lower heating value of methane
lhv_hydrogen33.33MWh per tonnePublished
  • Standard lower heating value of hydrogen
price_methane_per_tonne561€/tPublished
price_coal_per_tonne99€/tPublished
price_iron_ore100€/tPublished
price_scrap180€/tPublished
price_limestone20€/tPublished
price_household_electricity260€/MWh incl. taxPublished
price_household_gas134€/MWh GCV incl. taxPublished
price_wood77.5€/MWhPublished

7.75 c€/kWh for bulk pellets.

iron_ore_per_steel_bf1.8t per t of steelPublished
iron_ore_per_steel_dri1.6t per t of steelPublished
scrap_per_steel_eaf1t per t of steelPublished
cement_per_concrete300kg of cement per m³ of concreteProvisional

Structural concrete dosages run roughly 250 to 400 kg a cubic metre, and 300 is the middle of the structural range. It is not the 266 kg a cubic metre that the cement-and-concrete literature uses for "béton équivalent": that figure is a whole-economy bookkeeping factor that already absorbs mortars, renders, screeds and bagged cement, and applying it to building cement alone overstates the concrete by about seven tenths. Used only to express the construction module's cement as a concrete tonnage in the materials account; no emission depends on it.

  • Usual structural concrete dosage range; cross-checked against The Shift Project's 266 kg/m³ béton-équivalent factor, which is a different perimeter
concrete_density2 380kg/m³Published

Ordinary reinforced structural concrete. Presentation only, like the dosage above.

  • Standard value for ordinary reinforced concrete, used in the comparative life-cycle assessment this module's timber coefficients come from
limestone_per_clinker1.6t per t of clinkerPublished
kiln_heat_per_clinker0.888889MWh per t of clinkerPublished
coal_per_kiln_heat0.11919t of coal per MWh of kiln heatPublished

The cement kiln fuel appears in the cost model but NOT in the physical model, which gives cement only its grinding electricity. Cement combustion CO₂ is therefore missing from the emissions account — a known defect of the workbook, recorded here rather than silently patched.

cement_capture_extra_electricity0.54MWh per t of clinkerPublished

reference_plant_CCS less reference_plant.

smr_methane_per_tonne_h23.33t of methane per t of hydrogenPublished
smr_electricity_per_tonne_h20.58MWh per t of hydrogenPublished
smr_emission_per_tonne_h29.23tCO₂ per t of hydrogenPublished
methanol_per_olefin2.98837t of methanol per t of olefinPublished
floor_area_total4 200Mm²Published

France's total residential and tertiary floor area, kept as a cross-check rather than as an input: the model's own heated stock is 3 654.9 Mm², and building_surface_coverage reports the 87% ratio. The residential share that used to sit beside it is gone -- the stock carries the building type, so the split is counted rather than assumed.

deep_retrofit_saving0.6fraction of demand removedProvisional

Demand reduction achieved by one deep renovation, used to convert the average stock improvement into an equivalent number of deep renovations.

  • ADEME orders of magnitude for a BBC-rénovation-level retrofit
retrofit_life30yearsProvisional
  • Conventional lifetime for building-envelope work
heat_pump_life17yearsProvisional
  • Conventional lifetime for a residential heat pump
heat_pump_cost_per_m280€/m² incl. taxProvisional

Air-to-water heat pump, in the 60–100 €/m² range.

  • ADEME cost ranges for residential heat pumps
renovation_vat1.055multiplierPublished

Reduced VAT rate of 5.5% on renovation work.

  • CSTB / OptoBat convention, VAT_RENOVATION = 1.055
households31.377millionPublished
car_ownership_reference2 541€/household/yPublished

Net purchase 1 459 + insurance 518 + maintenance 564.

car_transport_reference3 803€/household/yPublished
km_per_car_per_year11 600kmPublished
reference_car_fleet2.88237e+07carsDerived

The car fleet the model computes at the reference scenario, used as the denominator of the fleet ratio so household ownership cost scales with fleet size. It is pinned rather than recomputed because the model runs in one pass; the regression test checks it still matches.

afforestation_lag10yearsGame rule

New forest does not store carbon the year it is planted. Hectares planted less than ten years before the horizon are left out of the afforestation term altogether, which is a crude step where the truth is a curve; the alternative — a growth function nobody in the sources publishes — would be a curve we invented.

afforestation_storage_rate3tCO₂/ha/yPublished

New forest is booked at the expansion rate rather than at the average per-hectare rate of the standing forest, because a young stand does not store like a mature one. The same source gives 5.0 for a renewal plan on existing forest and 0.2 to 2.4 for the rest of the forest depending on management and climate; 3.0 is the expansion line.

soil_carbon_grass_to_crop3.6667tCO₂/ha/yPublished

1.0 tC/ha/y lost for twenty years when permanent grassland is ploughed, converted here at 44/12. The interval on it is ±40%, and the stock difference between the two uses (84.6 against 51.6 tC/ha over 0–30 cm) would imply 1.65 tC/ha/y if all of it were lost before a new equilibrium — it is not, and the modal value is what the inventory uses. These coefficients are measured on one country's soils and a port should check them against its own; they are shared because soil chemistry does not stop at a border, not because they are beyond argument.

soil_carbon_crop_to_grass1.8333tCO₂/ha/yPublished

0.5 tC/ha/y regained for twenty years when arable land goes back to grass, converted at 44/12. Half the loss rate, and deliberately so: the same source's finding is that "loss is twice as fast as gain", which is what makes re-grassing a slower repair than ploughing was a break.

soil_carbon_conversion_years20yearsPublished

How long a hectare goes on emitting, or storing, after it changes use. Twenty years is the tail the inventory applies, so at a horizon 26 years away only the last twenty years of conversions are still in the flux.

land_module_active1Game rule

France carries the land module, so the natural sink is computed and the naturalSink slider is retired — declared, hidden, and inert. The three provisional editions carry 0 and keep the slider.

land_horizon_years26yearsGame rule

2024 to 2050. The stock the account starts from is Teruti's 2023 survey — the last edition before IGN's OCS GE takes over, and a definitional break to expect — and the flows run from the year after it. It is deliberately not the model's own 2020 base year: a land account is only as good as the survey it is written on, and this one is dated 2023.

forest_production5.4m³/ha/yPublished

87.9 ± 1.3 Mm³/y over 16.6 Mha. It was 5.8 m³/ha/y over 2005–2013: gross production is already falling, before any of the climate cases is applied.

forest_mortality1m³/ha/yPublished

15.2 ± 0.6 Mm³/y over 16.6 Mha, windthrow excluded (4.2 Mm³/y more). It was 7.4 Mm³/y over 2005–2013: mortality has doubled in a decade, spruce 2.2, chestnut 1.6 and ash 1.4 Mm³/y of it. Half a percent of the standing stock a year, and the reason the flux balance has halved.

forest_production_area16.6MhaPublished

The forest available for wood production, out of a forest area of 17.5 Mha. It is not the forest row of land_class, which is Teruti's 17.521 on Teruti's nomenclature: two perimeters, kept apart on purpose, and afforestation adds hectares to the land account without adding any to this one.

forest_standing_volume2 827Mm³Published

1 842 Mm³ of broadleaf and 985 of conifer, 2023. A thousand million cubic metres more than in 1985, 260 of them in the last ten years — which is the context for every flow above: the annual balance is under one percent of this stock, and a forest that stops growing does not shrink, it stops absorbing.

forest_harvest_base53.1Mm³/yPublished

Removals of live trees, ± 2.9, over 2014–2022 — 23.8 broadleaf and 29.4 conifer, up from 47.2 over 2005–2013. Not the 38 Mm³ of the commercial harvest statistic: the difference is firewood cut and never sold.

forest_carbon_k2tCO₂/m³Derived

IGN's own pair: 39 MtCO₂/y of net absorption by living biomass for a +19.5 Mm³/y flux balance. Both numbers come from the same document, the same campaigns and the same perimeter, which is what makes the ratio internally consistent for this identity. The research note behind this module recommends 1.5, and we depart from it. 1.5 is the SNBC 3's gross increment, "about 130 MtCO₂e", over IGN's gross production of 87.9 Mm³ — a gross ratio applied to a net balance. At 1.5 the identity gives 29.9 MtCO₂/y where IGN publishes 39, a 10 Mt hole that would then have to be absorbed by a calibrated constant. At 2.0 it gives 39.9. The marginal response of this pool, 2.0 tCO₂ per extra cubic metre harvested — 1.87 for the whole land account, once the wood-products pool that cubic metre would have fed is netted — sits between the 1.4 the IGN–FCBA B1→B2 pair implies and the 2.2 ADEME's S1–S4 spread implies, which is where a marginal coefficient should sit. This is the single most consequential number in the sink block and it is a live argument; 1.5 is recorded here so the argument stays visible. The "10 Mt hole" is a weaker argument than it looks, and it is recorded as such: the litter-and-soil residual already is a calibrated constant, and re-closed at 14.59 it holds the base-year forest line exactly at 1.5 too. What does separate the two is 2050. At 1.5, with the residual re-closed, the reference's natural sink is 32.3 MtCO₂e against the SNBC 3's own 23, because the residual does not weaken while the living biomass does. 2.0 stays until the forest line can be closed in level and in slope from the same pair; docs/forest/harvest_must_cost.md in the repository, stage B.

forest_dead_wood_coefficient0.6024tCO₂ per m³ of annual mortalityCalibrated

Fitted so the dead-wood pool is 10.0 MtCO₂/y at the base year's mortality, which is what SECTEN's 2025 edition added to the forest line when it made the pool dynamic. Citepa does not publish the pool split in tonnes — that is in the ministry's CRT submission, not in SECTEN — so this level is calibrated against a difference rather than read off a table, and it is one of the two places the forest line rests on an inference.

forest_litter_soil_sink4.62MtCO₂/yCalibrated

What closes the forest line: 39.88 of living biomass plus 10.00 of dead wood plus 10.0 of French Guiana leaves 4.62 against Citepa's −64.5 for 2024. It stands for litter and forest soil on land-use change, which is what the inventory books there, and its size is the measure of what the volume identity does not explain — 7% of the forest line. The ministry's CRT tables would replace it with a measurement.

forest_overseas_sink10MtCO₂/yProvisional

French Guiana's forest, 7.9 Mha of it, which the inventory treated as carbon-neutral until 2025 and now books at "about −10 MtCO₂e/y". It sits outside the metropolitan land account and inside the national total, so it is carried as a constant nothing steers — a fifth of the forest line that no lever in this game can touch, which is worth knowing before arguing about the other four fifths. No published figure with a decimal has been secured.

forest_harvest_sawlogs18.3Mm³/yPublished

Sawlogs in the 2024 commercialised harvest, round wood over bark.

forest_harvest_industrial10Mm³/yPublished

Industrial wood — pulp and panels — in the 2024 commercialised harvest.

forest_harvest_energy_commercial9.7Mm³/yPublished

Energy wood sold, 2024 — 10.4 in 2023, the year it first exceeded industrial wood. It is well under half of what France actually burns.

forest_informal_firewood15.1Mm³/yDerived

53.1 of removals less 38.0 of commercialised harvest. Nothing measures it directly: the independent estimates run 14.5 Mm³ (IGN less the annual branch survey, 2016) to about 17 (ADEME's 16.9 Mm³ of self-consumed wood in 2018, three quarters of it from forests), and the last field study is from 2018. It is roughly 28% of the country's harvest and about 32 TWh of its wood energy, which makes it the largest energy flow in this model that nobody meters.

forest_harvest_unutilised0Mm³/yPublished

Zero. The French harvest statistic has no unutilised category: Agreste counts what leaves the forest gate, and the storm and dieback wood that is felled and abandoned is inside the mortality the forest inventory measures rather than inside the harvest. The four French uses of the harvest therefore close on the harvest without a fifth row, and forest_unutilised_share_base is exactly 0, which leaves the wood supply the number it was.

forest_harvest_volume_factor1m³ of standing stock per m³ of the harvest statisticPublished

One. forest_harvest_base is already declared in the inventory's own bois fort tige — IGN's removals, not Agreste's round wood — so the harvest, the gross production and the mortality are three numbers in one volume convention and the identity needs no conversion. Stating it as a constant rather than leaving it implicit is what lets Germany, whose harvest statistic is published in Erntefestmeter ohne Rinde, keep its lever in the unit its own statistics use.

hwp_coefficient0.562tCO₂/m³Derived

Fitted to the SNBC 3's own statement: 22.5% to 30% of a 60 Mm³/y harvest should give at least 3 MtCO₂e/y in 2030. Measured against the base year's 11.95 Mm³ of long-lived product, that is 3.4 MtCO₂ over 6.05 Mm³ of extra volume, hence 0.562 tCO₂ per cubic metre a year. It is a flow coefficient standing in for a stock model with half-lives from seven to fifty years, and it is the crudest object in the sink block.

hwp_long_lived_share_base0.225fractionPublished

Sawn timber 9.5% plus panels 13% of the harvest, the SNBC 3 draft's own base-year split.

timber_cement_saving67kg cement per m² of floor framed in timberProvisional

Measured on one building and cross-checked against element coefficients, because no whole-building intensity by structural system is published anywhere. The anchor is an eight-storey, 142-dwelling mass-timber residential building whose bill of materials was compared with a functionally equivalent concrete one: 519 to 553 kg/m² of concrete avoided over 13 766 m² of gross floor area, which at 280–320 kg of cement a cubic metre and a density of 2 380 kg/m³ is 61 to 74 kg of cement, and 67 is the middle. A timber building is not a building without concrete, and that is the point of a saving rather than a substitution. The same measured building still carried 288 kg/m² of concrete in its foundations, its ground floor and its toppings, and used more lean concrete than its concrete twin. Against the 137 kg/m² this model books for new French housing, 67 is close to half — which is the right order: négaWatt reaches −46% of concrete at 80 to 95% timber, and half of 90% is 45. The competing way to model this is a displacement factor in tonnes of carbon avoided per tonne of carbon in the wood, and it is deliberately not used here. That literature has moved from 2.1 (Sathre and O'Connor 2010, 21 studies) to 1.2 (Leskinen 2018, 51 studies) to 0.55 at market level (Hurmekoski 2021, 44 studies, range 0.27–1.16), with a French critique arguing the benefit has been overstated several fold. A kilogramme of cement not made is a physical quantity this model already prices and emits; a displacement factor is an argument about counterfactuals. The model takes the physical route and leaves the argument to the annex.

  • FPInnovations / Gouvernement du Québec, comparative LCA of an 8-storey mass-timber residential building (Arbora, Montréal) — bill of materials
  • Hurmekoski et al. 2021, «Substitution impacts of wood use at the market level», Environmental Research Letters — market-level displacement factor 0.55 (0.27–1.16)
  • FCBA/BIPE 2019 for CODIFAB, FBF and ADEME — element-level equivalences: 1 kg of wood replaces 5.24 kg of concrete and 0.18 kg of rebar in a load-bearing CLT façade
timber_steel_saving17kg steel per m² of floor framed in timberProvisional

From the same measured building, and deliberately the net figure: the timber structure removes about 21 kg/m² of reinforcement, and adds back steel balconies, galvanised studs and brick support, so the whole-building balance is roughly −17 kg/m². Against the 21 kg/m² this model books for new French housing that is most of it — which is exactly why the national effect is small: new buildings are about a tenth of French steel, so even a wholesale switch to timber moves the steel bar by a few percent. ADEME's own biosourced scenario finds −2% then −5% on steel against −2% then −8% on cement, and this model reproduces that asymmetry rather than asserting it.

  • FPInnovations / Gouvernement du Québec, comparative LCA of an 8-storey mass-timber residential building — whole-building steel balance
  • ADEME 2019, «Prospective de consommation de matériaux pour la construction des bâtiments», scénario «développement des biosourcés»
timber_wood_intensity0.189m³ of wood product per m² of floor framed in timberProvisional

Two independent anchors agree, which is the only reason this number is here at all. The measured mass-timber building carries 2 597 m³ of cross-laminated timber, glulam beams and glulam columns over 13 766 m² — 0.189 m³/m². The French biosourced-building label's top level asks for 45 kgC/m² for housing, which at the carbon content and density of softwood is 0.200 m³/m². Light timber frame sits well below both, so 0.189 is a mass-timber figure and overstates what an ossature-bois house uses; the model says so rather than splitting a coefficient it cannot source.

  • FPInnovations / Gouvernement du Québec, Arbora mass-timber building — 2 047 m³ CLT + 378.2 m³ beams + 171.6 m³ columns over 13 766 m²
  • Arrêté du 2 juillet 2024, label «bâtiment biosourcé» — 45 kgC/m² for level 3 in housing
sawnwood_roundwood_factor2m³ of roundwood per m³ of sawn productProvisional

A sawmill turns roughly half of a sawlog into sawn timber; the rest is slabwood, sawdust and bark, and most of it is sold as chips, pellets or panel furnish rather than lost. The factor is what lets construction timber demand be compared with the long-lived harvest the forest account already computes, and 2.0 is the round number the trade uses. It is provisional because a national yield is not published on the same perimeter as this model's harvest.

  • Agreste, «Récolte de bois et production de sciages en 2024» — 18.3 Mm³ of sawlogs against 8.16 Mm³ of sawnwood produced
timber_share_base0.12fractionPublished

12% of new floor area framed in timber, and the weighting is the whole difficulty. The national timber-construction survey counts housing in dwellings and non-residential in square metres, and the two cannot be added: 6.6% of new dwellings in 2024 (18 250 of them) against 17.6% of new non-residential floor area (2.56 Mm²). Weighting the two observed shares by the floor areas this country file declares — 20.4 and 19.9 Mm²/y — gives 12.0%, and that is the number here. It treats the housing share by dwelling as if it were a share by area, which is an approximation the survey does not let anyone avoid. The detail is worth reading before quoting it: detached houses in the individually-commissioned sector are at 9.1%, collective housing at 5.6%, agricultural buildings at 26.1% and industrial ones at 19.9%. French timber construction is mostly sheds and barns, not apartment blocks. And the survey's own definition excludes roof trusses and external insulation: it counts buildings whose structure is wood, not the great majority of French houses that carry a timber roof on masonry walls.

  • Enquête nationale de la construction bois, activité 2024 (8ᵉ édition), Xerfi Specific pour France Bois Forêt et le CODIFAB
hwp_base_sink-0.4MtCO₂/yPublished

A source of 0.4 MtCO₂e in 2024, and the sign is the news: this pool absorbed 4.7 MtCO₂e in 1990 and has drifted to zero and past it as short-lived products replaced long-lived ones. A country that keeps cutting and stops sawing turns its wood-products pool into an emitter, and France has.

hwp_carbon_per_m30.8373tCO₂/m³Derived

The national inventory report's 2021 inflow to the long-lived wood-products pool — sawn timber 1 158 536 tC, panels 1 360 387, plywood 209 296, 2 728 219 tC in all, 10.00 MtCO₂ — over this model's base-year long-lived volume, 53.1 Mm³ × 22.5% = 11.95 Mm³. That is 0.228 tC/m³, against the IPCC's default carbon density of sawnwood, 0.229 tC/m³ — agreement to half a per cent, unfitted, which is the cross-check that the strategy's "sawn plus panels" share and the inventory's tonnes are the same object.

hwp_half_life28.87yearsDerived

The IPCC 2019 Tier 1 half-lives — sawn wood 35 years, panels 25, and 30 for plywood as the French inventory reads it — weighted by the inventory's 2021 inflows to the three categories, as one decay rate: k = 0.02401 a year, a half-life of 28.9 years. The French inventory itself uses a finer set — 50 years for framing, 30 for flooring, 15 for joinery, 10 for furniture, 25 for panels — and does not publish the weights between them, so the IPCC defaults are used and the inventory's own list is recorded here. Paper is left out: at a two-year half-life it is at equilibrium with its own inflow and adds nothing to a 2050 flux.

hwp_stock_nir_2021359.4MtCO₂Derived

The inventory report's 2021 outflows from the three long-lived categories — sawn timber 989 713 tC, panels 1 193 460, plywood 170 198, 8.63 MtCO₂ in all — over the decay rate of hwp_half_life, which is the stock a first-order pool must hold to release that much: 359 MtCO₂, 98 MtC. The stock this model derives from the base-year balance is a fifth larger, 433 MtCO₂, because the 2026 inventory vintage books the pool as a source of 0.4 where the 2023 report booked a sink of 1.4 for 2021, and the balance is what the model is held to. Shown beside it; not fitted to it.

grassland_sink_coefficient0.6237tCO₂/ha/yDerived

5.7 MtCO₂e absorbed in 2024 over Teruti's 9.139 Mha of permanent grassland. Calibrated on Teruti's grassland deliberately: the farm survey reports 10.527 Mha and the SNBC 3 a third figure again, 7 150 kha of "productive" grassland, and a coefficient derived on one area and applied to another would not close. The livestock block of stage B reads the farm-survey area instead, and carries the 1.388 Mha reconciliation explicitly.

cropland_source_coefficient0.6777tCO₂/ha/yDerived

11.7 MtCO₂e emitted in 2024 over Teruti's 17.265 Mha of arable land. It already contains the historic grassland conversions and the drained organic soils, which is why the module books a conversion flux only for the change the player makes and not for the base year over again. Cropland has been a source in every year the inventory covers, and a large one: +24 MtCO₂e in 1990.

artificialisation_carbon_content96.2tCO₂ per ha/y of flowDerived

5.0 MtCO₂e in 2024 over Teruti's 52 kha/y. It is a standing emission per unit of annual flow, not a one-off per hectare, because sealing and the biomass it removes are booked over a twenty-year tail. Per hectare it implies 15–110 tCO₂ once, depending entirely on which land is taken — 4 tC/ha from cropland, 11 from grassland, and 81 tC/ha of standing trees if the hectare was forest — and 96 tCO₂ per ha/y of flow sits inside that range, which is the check that the coefficient and the rate are the same pair. Choose the rate before the coefficient: on the cadastral rate of ~20 kha/y the same line would imply 250 tCO₂ per ha/y and nothing would close.

wetland_other_source1.2MtCO₂/yPublished

Wetlands, other land and dams, a source of 1.2 MtCO₂e in 2024 and between 0.5 and 2.1 in every year since 1990. Nothing in the game moves it and no source says what would.

peat_rewetted_emission5tCO₂e/ha/yProvisional

Five tonnes of CO₂ equivalent a hectare a year, mostly methane — what a rewetted peat soil still emits once the oxidation of the peat has stopped. Nothing in this edition reads it: the French organic-soil areas are zero. It is declared with the figure the European rewetting literature converges on so that the constant carries a number rather than a placeholder, and it would have to be re-sourced on French sites before any French result depended on it.

  • Not a French source: the order of magnitude the European rewetting literature converges on. Nothing in this edition reads it, because the declared organic-soil areas are zero.
peat_rewetting_base0fraction of the drained organic soilPublished

Zero, and not an approximation: the drained area France declares is zero, so the share of it already rewetted is zero too.

  • countries/FR/FR.yaml, land_class — the declared drained organic-soil area is zero on every row, so this share has nothing to be a share of
peat_agri_n2o_ef0tCO₂e/ha/yPublished

Zero, for the same reason the areas are: Citepa's agricultural-soil N₂O already contains whatever the country's drained organic soils mineralise, inside the line ef_other_crop_n2o is calibrated on, and there is no published organic-soil area to take it back out with. With the area at zero this factor cannot move a French number whatever it were set to; it is declared 0 so that the two statements agree.

soil_practice_potential_arable14.777MtCO₂/yDerived

Cover crops extended 2.02, in-field agroforestry 1.10, temporary grassland in rotations 0.76 and hedges 0.15 — 4.03 MtC/y on arable land, converted at 44/12. Reduced tillage is excluded: INRAE reads its +0.68 MtC/y as a redistribution down the soil profile rather than a gain, and including it would add 2.5 MtCO₂/y here. The widely quoted "+21 MtCO₂/y, 4 per 1000" headline includes both no-till and forest land and is a different quantity.

soil_practice_potential_grassland2.53MtCO₂/yDerived

Grassland intensification, 0.69 MtC/y on 3.9 Mha, converted at 44/12. The two potentials together are 17.31 MtCO₂/y, which is the study's own agricultural total without no-till. The module specification proposed splitting that total "arable 16.0 / grassland 3.8"; those two sum to 19.8, which is the potential with no-till, so the itemised split is used instead. The total is identical either way and only the pool the chart draws it in changes.

artificialisation_to_arable_share0.75fractionPublished

Roughly three quarters of the farmland France lost between 1982 and 2018 went to artificialisation and the rest to natural regrowth, so three quarters of what is artificialised is taken from arable land and the rest from heath and scrub. It decides which class shrinks, and therefore how much of the cropland source the artificialisation lever removes as it goes.

artificialisation_to_grassland_share0fractionPublished

Zero. The ZAN accounting France's land-take figures come from does not separate grassland from arable land in what is built on — both are espaces naturels, agricoles et forestiers — so the arable share carries the whole farmland side and this term is exactly zero, leaving the account as stage A wrote it. What would close it: Teruti's own year-on-year transition matrix, which does distinguish the two.

artificialisation_to_forest_share0fractionPublished

Zero, and for the same reason: the quarter of French land take that is not booked to arable land is booked to the semi-natural class, which is where Teruti puts the woodland edges, the scrub and the bare ground that roads and estates actually take. Splitting a forest share out of it would move hectares between two classes of the same account without a published measurement to do it with.

artificialisation_rate_base52kha/yPublished

Teruti's 1982–2022 mean, and the rate artificialisation_carbon_content is derived on — the two have to be the same pair or the artificial pool does not close. The recent rate is under 38 kha/y on the same measure, and 15–23 on the cadastre, which counts different hectares.

afforestation_rate_base0kha/yPublished

Deliberate afforestation outside existing forest was 100 ha/y in 2021 — 0.1 kha/y, which rounds to nothing at the precision this account is kept in. It is not the forest expansion the inventory measures, 90 kha/y, which is mostly spontaneous and already inside the standing forest's own sink.

grassland_conversion_base0kha/yGame rule

Zero because the SNBC 3 holds the permanent grassland area, not because the countryside is stable: France ploughed about 64 kha/y through the 2000s. This is the strategy's position taken as the base, and it is one of the places where the reference scenario on this tab is already an effort.

  • SNBC 3 — permanent grassland maintained to 2050
soil_practice_base0fractionPublished

Zero by construction: INRAE states its potential as storage additional to current practice, so the base year has taken none of it by definition.

secten_sink_forest_2024-64.5MtCO₂e/yPublished

Living biomass, dead wood, litter and soil on land-use change, and French Guiana, in one line. It was −80.9 in 2008. Forest figures are five-year centred means extrapolated for the last two years, so 2023 and 2024 will be revised again.

secten_sink_hwp_20240.4MtCO₂e/yPublished

A source in 2024, against −4.7 in 1990.

secten_sink_grassland_2024-5.7MtCO₂e/yPublished

The second of the two lines that absorb, and it was −8.6 in 1990.

secten_sink_cropland_202411.7MtCO₂e/yPublished

A source, and the largest one in the land account. +24.0 in 1990.

secten_sink_artificial_20245MtCO₂e/yPublished

A source, and remarkably steady: between +4.2 and +5.5 every year since 1990.

secten_sink_wetland_20241.2MtCO₂e/yPublished

The six lines sum to −51.90 while Citepa's own UTCATF total for 2024 is −51.96. The 0.06 is the rounding of the published sub-sector lines against their published total, and land_sink_check_2024 reports it rather than absorbing it into a coefficient.

diet_dairy_index_base1index, base year = 1Game rule

One, by definition: dietDairy is an index on the base year, so the base year sits at 100%. It is declared rather than written into the formula so that the switched-off branch of the module names what it reads.

food_waste_cut_base0fraction of edible waste removedGame rule

Zero: the base year has cut none of its own waste, because the waste share is measured on it.

livestock_export_base1index, base year = 1Game rule

One: the export volumes the table declares are the base year, so the index that scales them is one there.

crop_export_base1index, base year = 1Game rule

One, like livestock_export_base: the export hectares the crop block declares are the base year's, and the index that scales them is one there.

n_intensity_base1index, base year = 1Game rule

One: mineral_n_base is the base-year delivery, and nIntensity is a percentage of it.

enteric_mitigation_base0fraction of cattleGame rule

Zero, and this is a statement about the calibration rather than about farming practice: the per-head emission factors are fitted to the observed inventory year, so whatever low-methane feeding that year already contained is inside the factors. The lever measures the change from there, and the change at the base year is nothing.

manure_methanised_base0fraction of manureGame rule

Zero, for the same reason as enteric_mitigation_base: the digesters the base year already runs are inside the observed emission factors, and the lever books the change from there. It is not a claim that no manure is methanised today.

agri_fuel_switch_base0fraction of farm fuelGame rule

Zero: the base year burns all of the fossil fuel the inventory measures on its farms.

ef_liquid_fossil_observed264gCO₂/kWhWorkbook

The observed emission factor of fossil liquid fuel, the value efLiquid slides away from and the one the base-year farm burned. It is used in one place only — to say how much energy the base year's farm fuel represents — and no emission is charged at it.

ln_two0.693147Published

The natural logarithm of two, which turns a half-life into a first-order decay rate: k = ln 2 / half-life. Declared once rather than written into a formula, like the nitrogen fraction of ammonia, because a number that appears in an equation should be a number a reader can find.

nh3_nitrogen_fraction0.822t N per t NH₃Published

14 ÷ 17: the nitrogen in a tonne of ammonia, from the atomic masses. It is the one number in this module that is chemistry rather than statistics, and it is what turns a nitrogen demand into an ammonia tonnage for the industry chain.

  • IUPAC atomic weights: N 14.007, H 1.008 — 14.007 / 17.031 = 0.8225
population_base68.55million peopleDerived

5 827 kt of meat consumed in 2024 at 85.0 kgec a head gives 68.55 million people. It is derived from the food balance itself rather than taken from the census, because a diet in kilograms per person and a population from another source will not multiply back to the published tonnage — and the tonnage is what sizes the herd.

population_horizon69.21million peoplePublished

69 206 324 people at 1 January 2050 in the central scenario of INSEE's 2021–2070 projections, France including Mayotte, from the detailed results workbook. The projection peaks in 2044 at 69.3 million and is back to 68.1 by 2070 — the figure this constant carried as a provisional value until stage E, mislabelled as 2050. It scales every diet-driven quantity by about one per cent over the base year's 68.55, which is itself derived from the food balance rather than from the census; the projection's own 2024 figure is 67.8 million, so on the projection's own base the increase would be two per cent, and the difference is the perimeter of the balance sheet, not the demography.

diet_red_meat_base53.5kgec/cap/yPublished

Beef and veal 20.8 + pork 30.6 + sheep 2.1 kgec a head in 2024, on a total meat consumption of 85.0 kgec. Red meat has fallen 5.8% a head over twenty years while its share of all meat went from three quarters to two thirds.

diet_poultry_base30.8kgec/cap/yDerived

2 133 kt of poultry consumed in 2024 over 68.55 million people. The balance sheet publishes the tonnage and the +7.1% on 2023 but not the per-capita figure, so this one is the division.

food_waste_base0.07fraction of the food supplyPublished

3.8 Mt of edible food waste — 55 kg a head — on a food supply of order 55 Mt. Read it against the two larger figures it is constantly confused with: total food waste on the European definition is 9.7 Mt, and ADEME's often-quoted "30%" is the share of the chain's losses that occur at consumption, not a share of the food. Using either of those here would make the waste lever look several times as powerful as it is; the finding that food waste is a small lever on this account depends entirely on this 7%, and the SDES detail against a French food balance sheet is what would confirm it.

dairy_beef_coupling_share0.4fraction of beef productionProvisional

The number the whole milk–beef coupling rests on, and it is an estimate. The farm survey reports 501 kt of cull-cow carcass in the 1 267 kt of French beef, and this module reads that as the dairy herd's contribution — 40%. The survey's line is all cull cows, dairy and suckler together, so the reading is generous to the dairy herd; Idele's herd-flow accounts would settle it. The alternative split, proportional to cow numbers, gives yields of 74 and 282 kg a head instead of 165 and 207, and a dairy-only diet cut would then send far less beef to market.

enteric_lipid_effect0.14fraction of enteric methane removedPublished

−14% of enteric methane where a lipid-enriched ration is fed, the figure the SNBC 3 uses after Pellerin's 2013 assessment for INRA. On 82% of housed cattle it is the −5% herd-wide the strategy books. 3-NOP would give 20–35% but is not in the strategy and is fed only during the housed period, so it is named in the lever's why rather than used here.

methanisation_abatement0.6fraction of manure methane removedProvisional

Three fifths of the methane a manure store would have released is captured when that manure goes to a digester instead. No French figure was secured for this, and it is one half of a provisional pair — the other is manure_ch4_share in the livestock table. Together they are why manureMethanised defaults to zero rather than to the SNBC 3's 80%: booking three megatonnes of abatement on an unpublished split would have closed most of this module's gap to the strategy with a coefficient nobody can check. Citepa's OMINEA database, or the CRF table 3.B for France, would replace both.

refrigerants_fixed0.02MtCO₂e/yPublished

HFC leakage on farms, the one line of the "other livestock" block that is not a ruminant. Citepa books it inside agriculture, so the module carries it there; it is subtracted from the small-ruminant factor's calibration so it is not counted twice.

mineral_n_base1 817kt N/yPublished

1 817 kt of nitrogen delivered in the 2024 calendar year — ammonium nitrate 631, urea 520, UAN 481, compounds 120, other 65 — which is the series the inventory's own emission factors are implied against. The fertiliser survey publishes a July–June campaign instead: 1 887 kt for 2024-25, up 2.8%, and 1 835 revised for 2023-24. The two are not the same quantity and mixing them would move every nitrogen result by about four per cent.

manure_n_spread_base735kt N/yPublished

735 kt of usable nitrogen collected in buildings and spread, out of 1 462 kt excreted in all — cattle 1 228, pigs 78, poultry 64, sheep 75. 92.8% of the 105 Mt of manure and treatment co-products is simply stored, which is the pool manureMethanised acts on.

manure_n_grazing_base727kt N/yPublished

727 kt of nitrogen deposited directly at pasture, the other half of the 1 462 kt excreted. It carries its own emission factor, a third above the one for spread manure, so the two are charged separately.

fixation_n_base364.6kt N/yPublished

364 580 tonnes of nitrogen fixed biologically in 2023, the latest year of Eurostat's gross nitrogen balance for France, read through the API. The series is volatile — 405 kt in 2021, 290 in 2022, 365 in 2023, a 2019–2023 mean of 329 — because the legume harvest is, and the latest year is used rather than a mean so that the number is the one a reader can find in the table. It replaces the 300 kt this constant carried as an order of magnitude until stage E; the base-year crops block moves by 0.15 MtCO₂e with it, inside its tolerance, and the same table gives the mineral fertiliser at 1 733 kt for 2023 against the inventory's 1 817 for 2024, which is the calendar-year series this module reads.

fixation_gain0.6fraction of base-year fixationProvisional

Sixty per cent more biological fixation when the legume area rises by the whole 1.7 Mha the INRAE credit is measured over — 180 kt of nitrogen, or about 106 kg a hectare, which is inside the range the fixation literature reports for faba bean and clover and below what a pure legume ley fixes. 1.0 to 2.7 Mha nearly triples the cropped legume area while the grassland legumes do not move, so the total rises by less than the crop area does. It pulls the other way from the mineral credit, and by more: 180 kt fixed against 128 kt of mineral nitrogen replaced, so the nitrogen balance grows as the fertiliser bill shrinks. Emissions still fall, because mineral nitrogen is charged at 5.44 tCO₂e a tonne and total input at 2.31, but the two move in opposite directions and the model reports both.

  • NO PRIMARY SOURCE. Derived as an assumption from the legume areas of the SNBC 3 and the %Ndfa ranges of the fixation literature
legume_area_base1MhaPublished

One million hectares of legumes in the French rotation, the figure the SNBC 3 starts its 1 → 2 → 2.7 Mha trajectory from. The farm survey's protein crops and pulses are 321 kha of that; the rest is forage legumes.

legume_n_credit128kt N/yPublished

128 kt of mineral nitrogen no longer needed, which is what INRAE books for the legume part of its −944 kt proposal. It is one of four terms there — organic 330, agroecology 426, legumes 128, volatilisation 60 — and the only one this module reads separately, because the other three are inside the nIntensity lever rather than beside it.

legume_credit_span1.7MhaPublished

The 1.0 → 2.7 Mha increase the 128 kt credit is booked over. Declaring the span beside the credit is what makes the pair a coefficient instead of two numbers; the module reads it linearly inside the span, which is what the study does, and the lever's bounds keep the scenario close to it.

organic_share_base0.056fraction of the arable areaPublished

5.6% of the field-crop area in organic farming in 2024, the SNBC 3's own base figure for the target this lever defaults to; Agreste's arable-land survey had 4.6% in 2022. Not the 10% of the agricultural area the organic agency publishes, which counts 2.7 Mha of mostly grassland.

organic_yield_ratio0.65fraction of the conventional yieldPublished

Two thirds of the conventional yield, at the scale of a rotation: the INRAE hypotheses for the strategy take organic yields at 60% of conventional now and 70% at the horizon, and 0.65 is the middle of that. It is the contested number in this block, and the range is wide. Agreste's field-crop survey measures the French gap crop by crop — soft wheat −57%, winter barley −47%, triticale −37%, maize −31 to −35%, sunflower −28% in 2022, stable over 2018–2022 — which at France's crop mix is worse than 0.65; the two global meta-analyses are better: Seufert et al. 2012 find organic yields 25% lower on average, from 5% to 34% depending on crop and practice, and Ponisio et al. 2015, on a data set three times larger, 19.2% ± 3.7% lower, and 8–9% where rotations and multi-cropping are used. A reader who takes Ponisio should read the land cost of the organic lever as about half of what this page shows; one who takes Agreste's wheat should read it as half as much again.

n_yield_plateau0.9index, base-year dose = 1Game rule

A stance, bracketed by two published ones. A conventional hectare keeps its yield down to 90% of the 2024 mineral dose; below that, every cut is nitrogen the crop was using. INRAE's hypotheses for the strategy book 426 kt of their −944 kt as "mesures agroécologiques et optimisation fertilisation N" — 20% of the 2020 mineral dose — "sans altérer les rendements (ou marginalement)", with levers taken from INRA 2013, whose specification was no loss or less than 5%: realistic yield targets alone are 10 to 15% of the dose. That reading is a plateau at 0.80. The GRAFS curve with practices unchanged has no plateau at all, and the JRC's DayCent run finds soft wheat losing up to 2.1% of its yield for the first 5% of mineral nitrogen cut: that reading is 1.00. Mineral nitrogen has already fallen 13% since 2010, so part of the excess INRA measured in 2006 practices is gone; 0.90 sits between the two. At the reference dose of 70% the conventional hectares keep 0.90 of their yield; the plateau at 0.80 would leave them 0.94, and no plateau 0.87. The SNBC 3 itself books the whole cut at no yield cost, which is the one assumption this constant declines to copy.

crop_nue_base0.67fraction of the nitrogen inputPublished

Two thirds of the nitrogen French cropland receives leaves the field in the harvest. Lassaletta et al. (2014) put France at about 70% in 2009, on a path that rose from 30–35% in the 1960s — from the mid-1970s French yields went up on a flat or falling input — read on the first author's 2018 reproduction of their Fig. 1(c) rather than on the article itself. A cropland budget built from Eurostat's gross nitrogen balance for 2019–2023 gives 0.68, between 0.61 and 0.75 by how the inputs are split between cropland and grassland; the Seine basin gives 0.63 for 2014–2019. 0.67 is the rounded middle. It sets the curve's bend below the plateau: across 0.60 to 0.72 the conventional yield at the reference dose moves between 0.91 and 0.89.

crop_food_waste_share0.222fraction of the supplyDerived

The soft-wheat chain of ADEME's 2016 loss study, compounded downstream of the farm: 6% lost in milling, 10% in baking and 8% of what is bought, so 1 − 0.94 × 0.90 × 0.92 = 22% of the flour equivalent that leaves the farm. Wheat stands for the plant-food basket because it is the largest item of it and the only one the study follows from grain to plate; potatoes lose more, sugar and oil less. The 6% lost in the field is not in it — it is inside the yields.

arable_share_food0.2696fraction of the non-energy arable areaDerived

The four shares are one arithmetic on two sources — the farm survey's 2024 areas and FranceAgriMer's five-campaign cereal balance — over the 16.33 Mha of arable land that is not growing fuel (16.948 less 0.618). Cereals, 8.527 Mha, are split by the balance: 44.2% exported (26.9 of 60.9 Mt), 29.1% fed (9.2 Mt to the feed industry and the 14% of the harvest consumed or stocked on farms), 22.0% milled, malted, starched, distilled or ground (4.6 + 1.6 + 4.3 + 2.1 + 0.6 + 0.2 Mt), 4.7% seed and stock change. Food is the milled share less the 0.191 Mha of ethanol cereals, plus oilseeds less the 0.4 Mha of biodiesel, plus beet less its ethanol, plus potatoes and vegetables: 4.40 Mha, 27.0%.

arable_share_feed0.4049fraction of the non-energy arable areaDerived

Silage maize 1.275 Mha and temporary grassland 2.534, plus 29.1% of the cereal area and the 0.321 Mha of protein crops: 6.61 Mha, 40.5% of the non-energy arable area — the largest use of French fields. Same two sources as arable_share_food.

arable_share_export0.2306fraction of the non-energy arable areaDerived

44.2% of the cereal area, 3.77 Mha, 23.1% of the non-energy arable area: the hectares behind the 26.9 Mt France ships abroad in an average year. Oilseed exports are not in it — rapeseed is mostly crushed at home.

arable_share_other0.0949fraction of the non-energy arable areaDerived

Fallow 0.521 Mha, 4.7% of the cereal area for seed and stock changes, and the 0.625 Mha the farm survey's arable total holds beyond the crops itemised here. It closes the four shares to one, and the rounding of the other three sits in it.

feed_forage_share0.576fraction of the feed areaDerived

Silage maize and temporary grassland, 3.81 Mha, over the 6.61 Mha of feed area. Forage is eaten by cattle and follows the cattle index; the remaining 42% is grain and follows the compound-feed species mix.

energy_maize_area_base0MhaPublished

Zero: no French hectare grows a main crop for a digester. The 2016 decree caps main-crop feedstock at 15% of a plant's tonnage and the sector's own feedstock surveys report the rest as manure, waste and cover crops, which is civeArea. The base-year biogas balance is therefore built without a main-crop term, and biogas_other carries whatever main-crop maize does reach a French digester inside the residual it already names.

energy_maize_dm_yield0t DM/haPublished

Zero, because the area is. A yield beside an area of zero is a number nothing multiplies; it is declared 0 rather than at some agronomic value so that no future reader mistakes it for a French measurement.

  • countries/FR/FR.yaml, energy_maize_area_base — zero, so this yield multiplies nothing
energy_maize_digestate_ef0tCO₂e/ha/yPublished

Zero. Citepa's agriculture sector has no line for the digestion of energy crops — the emissions of a French digester's store are inside the manure management the livestock block already carries — so there is nothing to book here and nothing to divide by an area that is itself zero.

compound_feed_share_poultry0.426fraction of compound feedPublished

2 044 kt of poultry feed of 4 801 kt of compound feed in the last quarter of 2024, Agreste after the feed industry's own returns: poultry 42.6%, cattle 27.2%, pigs 22.5%, the rest 7.7%. A quarter rather than the year because the quarterly note is what the statistician publishes with a species split.

compound_feed_share_cattle0.272fraction of compound feedPublished

1 304 of 4 801 kt, same note.

compound_feed_share_pig0.225fraction of compound feedPublished

1 081 of 4 801 kt, same note.

ef_mineral_n2o4.21024tCO₂e per t NDerived

7.65 MtCO₂e of N₂O on the mineral-fertiliser line divided by 1 817 kt of nitrogen delivered, both from the same inventory year. It implies an emission factor of 1.0% of the nitrogen applied lost as N₂O-N, and the IPCC 2019 default EF₁ is 0.010, which gives 4.16 tCO₂e/t N — one per cent apart, and neither was fitted to the other. That agreement is the best cross-check in this module, and it is worth stating because the same inventory calls soil N₂O its most uncertain line.

ef_mineral_co21.2328tCO₂e per t NDerived

2.24 MtCO₂ of urea hydrolysis and liming on the same line, over the same 1 817 kt of nitrogen. Liming is driven by area and soil pH, not by nitrogen, so charging it per tonne of nitrogen is a stated approximation: a scenario that halves the nitrogen dose here also halves the liming, which is not what a farm would do. The inventory publishes the two on one line, which is why they are carried on one factor.

crop_carbon_fixed0MtCO₂e/yPublished

Zero, because France charges its liming on nitrogen instead: the 1.2328 tCO₂e per tonne of mineral N in ef_mineral_co2 is urea hydrolysis and liming together, as that constant's own why says. The two are alternatives — declaring a fixed liming line here as well would book the same limestone twice — and the choice is recorded rather than silent, because charging liming on nitrogen is an approximation and a reader should be able to find where it was made.

  • countries/FR/FR.yaml, ef_mineral_co2 — the French liming CO₂ is inside that factor, so this line is zero by construction
ef_organic_n2o2.01361tCO₂e per t NDerived

1.48 MtCO₂e over 735 kt of nitrogen in spread manure — an implied emission factor of 0.48% of the nitrogen lost as N₂O-N, half the mineral one. The inventory applies a lower factor to organic nitrogen because it is released more slowly; the IPCC's own 2019 refinement makes the same distinction in wet climates.

ef_grazing_n2o1.9945tCO₂e per t NDerived

1.45 MtCO₂e over 727 kt of nitrogen deposited at pasture. The IPCC's EF₃PRP for cattle is 0.004 in the default case — 1.67 tCO₂e/t N — and 0.006 in a wet climate — 2.50. France sits between the two, which is what a country with both an Atlantic west and a Mediterranean south should.

ef_other_crop_n2o2.26424tCO₂e per t N of total inputCalibrated

The module's largest single approximation. 8.25 MtCO₂e of "other crop emissions" — residues, mineralisation, leaching and the indirect N₂O pathways — divided by the whole 3 643.6 kt of nitrogen input, so that the base year closes. Re-calibrated in stage E, from 2.305 on 3 579 kt, when the biological fixation went from a 300 kt order of magnitude to Eurostat's 364.6 — a calibrated factor follows the input it was fitted on, or the base-year check it exists for stops holding. It lumps an area-driven quantity (crop residues) with a nitrogen-driven one (indirect N₂O), and a scenario that cuts nitrogen hard therefore also cuts the residue term, which is not physical. The inventory's CRF table 3.D splits them, and reading it is what would replace this factor with two.

residue_burning_fixed0.02MtCO₂e/yPublished

Field burning of crop residues, down from 0.10 MtCO₂e in 1990 as the practice was restricted. It is a constant because no lever here drives it and because it is a fiftieth of the crops block.

farm_fuel_202410.73MtCO₂e/yPublished

Engines, motors and boilers: agriculture 10.33 + forestry 0.41 MtCO₂e, of which 9.42 is CO₂. It is a seventh of the whole sector and it behaves like any other combustion — which is exactly why the SNBC 3 takes it to zero and why agriFuelSwitch defaults to 100%.

grassland_rough1.38846MhaDerived

10.527 Mha of permanent grassland in the farm survey less 9.138540 Mha of it in the land survey. The farm survey counts farm-declared rough grazing as permanent grassland; the land survey books the same hectares under heath and scrub. Both are right about their own nomenclature, and the module keeps them apart on purpose: the livestock block reads grassland + grassland_rough, so its base year is the farm survey's 10.527, and the land account still closes on the land survey's 54.919 territory. Merging them would break either the account or the calibration. It is also the largest of the module's three statistical reconciliations, and the definitional spread behind it is wider still — the strategy's draft says 9.6 Mha and its final text 7.15 Mha of "productive" grassland.

ammonia_non_fertiliser148.6kt NH₃/yCalibrated

The ammonia French chemistry makes for something other than fertiliser — nitric acid for explosives, caprolactam, industrial refrigeration. It is the residual of a calibration and not a measurement: at the base year's 1 817 kt of nitrogen and a 34% domestic share the fertiliser term is 751.6 kt, and 148.6 is what has to sit beside it to reproduce the 900 kt the retired ammoniaProduction slider asserted. That the two land within a fifth of a kilotonne of each other is a cross-check rather than a fit — the 34% comes from the fertiliser industry, the 1 817 kt from Citepa, and the 900 kt from a teaching workbook that knew neither. What would replace this constant is French ammonia output itself and its split between fertiliser and other chemistry, which the USGS does not itemise for France and which a market report's 632 kt for 2023 does not settle.

ammonia_domestic_share_base0.34fractionPublished

34% of the nitrogen French farms use is made in France, 24% comes from other EU countries and 42% from third countries. It is the value ammoniaDomesticShare is read at where the module is switched off, and it is also that lever's default.

citepa_livestock_202445.7MtCO₂e/yPublished

Cattle 38.64 + pigs 2.47 + poultry 0.23 + other livestock 4.36 in 2024 — 59% of the whole agriculture sector, and 86% of its methane. It is the calibration target of the livestock block: the three cattle factors are fitted to it in the IPCC Tier-2 order, and the other three are derived from their own lines.

citepa_crops_202421.1MtCO₂e/yPublished

Mineral fertilisers 9.90 + organic 1.48 + grazing 1.45 + residue burning 0.02 + other crop emissions 8.25 in 2024 — 27% of the sector, and 81% of national N₂O. The module reproduces 21.09 against it, because the published mineral line of 9.90 is its own two gases, 7.65 and 2.24, rounded up: the module adds the gases and the inventory rounds the line, and the hundredth between them is reported rather than absorbed.

biomass_biogas_yield2MWh PCI per t DMPublished

Methane yield of the wet feedstocks a digester takes — manure, crop residues and grass alike, which is how the source publishes it, as one number rather than three. Cover crops get their own, higher figure (cive_biogas_yield), because a whole green plant digests better than straw or a slurry does. It is shared rather than national because it is a property of the substrate, not of the country: the same tonne of dry manure yields the same methane in Germany. What is national is how many tonnes there are, which is manure_dm_per_cattle_head and its neighbours.

cive_biogas_yield2.8MWh PCI per t DMPublished

A winter intermediate crop harvested whole gives 250–320 Nm³ of methane a tonne of dry matter, and a normal cubic metre of methane is 9.97 kWh PCI, so the range is 2.5–3.2 MWh/t DM. 2.8 is its middle, and it is the figure that makes the mission's own arithmetic work: 6 t DM/ha × 2.8 is 17 TWh per million hectares, which is what the report quotes.

residue_liquid_yield2MWh per t DMPublished

A tonne of dry residue turned into a second-generation liquid fuel by the thermochemical route yields the same 2.0 MWh as the same tonne turned into biogas, which is exactly why the two compete: choosing one forecloses the other at no gain in energy. Declared separately from the biogas figure so that a source which does separate them can move one without the other. The equality is not a coincidence of rounding — Fischer-Tropsch converts at up to 50% and a digester's methane at a similar order — but it is a coarse number, and the route's real efficiency depends on the plant.

wood_energy_per_m32.14MWh per m³Published

Two administrations publish two numbers and the game has to pick one. The energy directorate's biomass balance uses 2.14 MWh per cubic metre of roundwood; the environment inspectorate's annex uses 2.4. 2.14 is taken because it is the figure the balance that also supplies non_forest_wood and waste_wood is written on, and mixing two conventions inside one total would be worse than choosing the lower of them. The difference is 12%, or about fourteen terawatt-hours on the base year — larger than any single lever in this block moves. It is shared rather than national because it is a conversion, not a measurement of a country: what varies across borders is the species mix behind it, and a country that knows its own should say so in the why of the entries that use it.

manure_dm_per_cattle_head0.6t DM per head per yearDerived

Back-cast from the mission's own 2050 case: 7.8 Mt DM of manure reaching digesters on a herd 30% smaller in cattle and 16% smaller in pigs. At those herds, 0.60 t DM per head of cattle and 0.08 per pig reproduce 7.71 Mt, which is the mission's figure to within a per cent. It is collectable manure — what a store receives — and not everything the animal produces: French cattle are at grass for a large part of the year and what they leave in the field never reaches a digester. The housing period is therefore already inside this coefficient rather than declared as a separate share, which is a simplification worth naming: a scenario that housed the herd differently would need a different number and this model gives it no way to say so.

manure_dm_per_pig_head0.08t DM per head per yearDerived

The other half of the same back-cast. A pig is housed all year, so almost all of its slurry is collectable; what makes the figure small is that slurry is 5–13% dry matter against a solid manure's 12–23%. The whole French pig herd contributes about 0.95 Mt DM against cattle's 9.87.

manure_methanised_20240.1fraction of collectable manureProvisional

Ten per cent of the collectable manure, which is 2.17 TWh of the 24.25 the base year consumed. It is not a measurement and it is half of gap 3. The mission counts about 1 Mt DM of manure going to energy in 2020, which is 9% of this model's collectable pool; the national strategy's "22% methanised by 2030" implies little more today; a gas-network panorama's site-type shares — four fifths of injected biomethane from farm sites — imply a great deal more. Both cannot be right, and no feedstock tonnage survey was obtained to settle it. It is deliberately not manure_methanised_base, which is zero. That one belongs to the emissions side: the abatement lever books the change from observed emission factors which already contain the digesters the base year ran, so booking a base-year share there would double-count the abatement. This one belongs to the supply side, where those same digesters made methane somebody consumed. Two base years, two purposes.

cive_dm_yield6t DM per hectarePublished

Six tonnes of dry matter a hectare, INRAE's central figure. The published range is 4 to 8, and below 4 the crop is not worth harvesting; the Arvalis trial network reads 6 in the north-east and more than 10 in the south-west. The interannual spread is ±5 Mt DM on a 15 Mt national total — a third of the term, and larger than most levers in this module. Two things it assumes and this model does not charge: the crop needs some mineral nitrogen in most years, and its soil-carbon effect is positive only if the digestate goes back to the field.

cive_area_base0.15MhaProvisional

About 150 000 hectares in the base year, and it is an estimate rather than a census: what is published is that cover crops are 13% of the ration French digesters eat (Arvalis, 2022, rising), and 0.15 Mha at 6 t DM and 2.8 MWh/t is 2.5 TWh of the 24.25 the base year consumed, which is consistent with that share. No survey of the area itself was found.

cive_land_ceiling4MhaPublished

Four million hectares, INRAE's own estimate of the French spring cropping that could carry a winter cover crop at all — the expertise reads it as 37 TWh of biogas at 6 t DM a hectare. It bounds nothing: civeArea stops at 3.0, which is what the mission recommends, so the headroom this reports is never negative inside the declared slider and is a diagnostic rather than a constraint. It is here so a reader can see how much of the physical limit the game's own maximum represents — three quarters of it.

residue_dm_yield3.3015t DM per hectareDerived

Solagro's 57 Mt DM of French crop residues, over this model's arable area of 17.2648 Mha. The note derives 3.36 t DM/ha instead, over Agreste's 16.948 Mha of terres arables; the two differ because the land account is in Teruti hectares and Agreste's arable is a narrower class. What is measured is the tonnage, so the tonnage is what is preserved: at the base year this coefficient reproduces 57.0 Mt DM exactly, where 3.36 would have produced 58.0 and quietly added a megatonne of straw nobody counted.

residue_mobilisation_base0.01fraction of the residue poolProvisional

One per cent of the residue pool leaves the field for energy today — about 0.57 Mt DM, or 1.1 TWh split between biogas and second-generation liquid. It is an estimate: what is published is that straw export is marginal against the tonnage produced, not a national figure for it. The lever's default of 16% is therefore a sixteen-fold increase, which is worth knowing before reading the residue term as an easy gain.

residue_to_biogas_share0.5fraction of mobilised residuesGame rule

Half the mobilised residue goes to a digester and half to a second-generation liquid plant. The mission's own 2050 case splits 5 Mt DM to biogas against 10 Mt DM to liquid, which is a third; half is taken here because the mission's split is a recommendation about which industry to build rather than a property of the straw, and because a fixed half makes the competition between the two pools legible on the dashboard — raise the mobilisation lever and both bands move together, which is the teaching. What matters more than the value is that the split is exhaustive: this share and its complement are the only two claims on the pool, so the same tonne cannot be counted in both, and a test asserts it.

biogas_other18.9947TWh/yCalibrated

Nineteen terawatt-hours, 78% of the base-year biogas total, and the module's largest declared hole. It is what closes 2024 once the manure, the cover crops and the residues this model builds are counted: household biowaste, sewage sludge, agri-food effluent and landfill gas, plus whatever share of the feedstock the published sources disagree about. The disagreement is the point. The national strategy's "22% of manure methanised by 2030" implies very little manure in today's digesters; a gas network panorama's site shares — four fifths of injected biomethane from farm sites — imply a great deal. Both are published, both cannot be right, and no feedstock tonnage survey was obtained. So the residual is declared, it moves with no lever, and every build prints it with its share so it cannot quietly become the answer. An SDES or Panorama feedstock survey, or ADEME's methanisation observatory, would close it. Read the biogas supply with this number in mind: at the reference the module produces about 70 TWh, and 19 of them are this.

wood_byproduct_share0.581fraction of the material harvestCalibrated

Of every cubic metre that leaves the French forest as material, 58% comes back as fuel: sawmill offcuts and bark, panel residues, and the black liquor a pulp mill burns to run itself. It is fitted so the base-year wood supply lands on the 120.05 TWh the energy statistician observes, and it is the second-largest thing in that total — about 35 TWh. It is large because sawing is wasteful: a log yields well under half its volume as sawn timber, and the rest is chips, slabs and sawdust that a boiler or a panel press takes. A sawnwood balance against sawlog input, with the paper industry's own energy consumption beside it, would measure it instead of fitting it.

non_forest_wood22.8TWh/yPublished

Hedges, orchards, vineyards and trees outside woodland, burned for energy. 22.8 TWh is the national energy and climate plan's figure as the inspectorate reports it; ADEME's 2017 count is 25.7. The lower is taken, for the same reason wood_energy_per_m3 takes the lower of its two figures: it is the number the balance the rest of this block is written on uses. It is a fixed term because no lever in this model plants or grubs up a hedge — a real limitation, since hedgerow policy is one of the few biomass decisions a farm can take on its own.

waste_wood9TWh/yPublished

About 2 Mt of dry matter of end-of-life wood — pallets, packaging, demolition timber — burned for energy, which is 9 TWh. An older energy directorate count puts it at 16.5 TWh on a wider perimeter; 9 is the inspectorate's own figure and is on the perimeter of the rest of this block. A fixed term: it is a waste-management quantity, and this model has no waste-management lever that reaches it.

biofuel_1g_yield18.899MWh per hectareDerived

The average of the crops France actually grows for fuel, weighted by their areas: wheat 115.8 kha and maize 75.2 kha at 18 MWh/ha of ethanol, sugar beet 27.2 kha at 53, and about 400 kha of rapeseed and sunflower at 17 of FAME. That is 11.68 TWh on 618 kha, or 18.899 MWh a hectare. Two things it makes visible. A beet hectare is worth three oilseed hectares, so the mix matters as much as the area — and this model holds the mix fixed while the area moves, which is a simplification a scenario that wanted more beet would have to break. And 11.68 TWh reproduces the mission's "about 11 TWh from French land" by a route that starts from hectares rather than from fuel, which is a cross-check rather than a fit. The weakest input is the 400 kha of oilseed: a FranceAgriMer estimate quoted by the trade press, not verified at source, carrying 6.8 of the 11.68 TWh.

energy_crop_area_base0.618MhaPublished

218 kha of ethanol crops, published by crop, plus about 400 kha of oilseed, estimated. 0.8% of the utilised agricultural area, for 11.7 TWh — against 41.7 TWh of liquid biofuel the country actually burned. The gap is imported, as fuel or as feedstock, and that is the number this constant exists to make readable.

waste_fats_supply3TWh/yPublished

Used cooking oil is 5.3% of French biodiesel and animal fats 4.7%, which is 3.0 TWh of the domestic supply. Solagro's ceiling is 0.4–0.5 Mt DM, or 5–6 TWh: the quantity is set by how much a country eats and slaughters and no lever can raise it, which is why it is a constant and not a slider. It is also the one liquid route whose life-cycle emissions are genuinely low — 54 gCO₂/kWh against 179 for rapeseed FAME under the renewable energy directive's defaults — and the model does not distinguish it, charging every liquid at efLiquid.

bio_imports_base26.4TWh/yDerived

What France imported in the base year, as finished fuel and as feedstock, derived so the supply check closes on the observed total: 41.7 TWh consumed less the 15.25 TWh this model builds from French land, waste fats included. The planning secretariat's own 2023 balance reads 19 TWh of fuel plus 11 TWh of feedstock imported against 14 exported, which is the same order by an independent route; the international energy agency reads net imports at 48% of biodiesel use and 30% of ethanol. It is the base year of bioImports and the only anchor its bounds have.

sdes_wood_2024120.05TWh/yPublished

Primary consumption of wood energy in 2024, 29.5% of all French renewable energy and the largest single renewable the country has. It is the target wood_byproduct_share is fitted to, and the check the tests run. Not climate-corrected, and that matters for a term two thirds of which is household heating: a mild winter moves this number by several terawatt-hours without anything physical changing.

sdes_biogas_202424.25TWh/yPublished

Primary consumption of biogas in 2024, all uses on the lower heating value: 10.44 TWh injected into the network (11.6 TWh on the higher value the gas industry publishes), 7.99 in cogeneration, 1.98 in electricity alone and 0.03 in heat alone. It is the target biogas_other closes on, so the share that residual represents of this number — 78% — is the module's headline gap.

sdes_biofuel_202441.7TWh/yPublished

Primary consumption of liquid biofuel in 2024 — biodiesel 73%, bio-gasoline 25%, bio-jet 2% — imports included. The same publication's filière table reads 41.05 on a slightly different perimeter, and the gross final consumption of transport is 38.5; 41.7 is taken because it is the primary figure, which is the basis the other two pools are on. It is the only one of the three base-year checks that is not closed by a calibrated residual, so it is the one that says whether the liquid coefficients are right. It lands at −0.05 TWh, which is a tenth of a per cent.

Data tables

The categories the model iterates over. Every row is addressed by its identifier, which is what the formulas in the next section refer to.

Passenger transport categories Workbook

Demand is 2020 service demand in billion passenger-kilometres; unit consumption is per vehicle-kilometre and occupancy converts it back to passenger-kilometres. in_inventory says whether the category is inside the national inventory perimeter: international aviation is reported by SECTEN as a memo item and excluded from the national total.

Rowvectorunit_consumptionoccupancydemand_2020in_inventoryaviation
Fuel car
car_fuel
liquid651.555510
Biogas car
car_gas
gas651.50.810
Electric car
car_electric
electricity201.51.233210
Fuel utility vehicle
utility_fuel
liquid851.8162.01210
Gas utility vehicle
utility_gas
gas851.84.510
Electric utility vehicle
utility_electric
electricity201.80.05986810
Fuel two-wheeler
two_wheeler_fuel
liquid501.011110
Electric two-wheeler
two_wheeler_electric
electricity151.010.1069210
Fuel bus
bus_fuel
liquid28414.2746.448910
Gas bus
bus_gas
gas28014.270.13128410
Electric bus
bus_electric
electricity7514.270.026256810
Hydrogen bus
bus_h2
hydrogen20014.27010
Long-distance train
train_long
electricity1 859457.99263.4610
Short-distance train
train_short
electricity97585.218144.610
Domestic aviation
aviation_domestic
liquid2 1609015.611
Overseas aviation
aviation_overseas
liquid3 50018033.611
International aviation
aviation_international
liquid3 50018036401

Passenger demand reallocation Workbook

Each row moves a share of one 2020 category's demand to a 2050 category. Shares that a lever drives are overridden in the equations; the rest are fixed workbook conventions. A category with no row keeps nothing, which is how fuel cars, fuel utility vehicles, fuel two-wheelers and fuel buses are retired.

  • Teaching workbook, "Transport parc 2050" sheet
Rowsourcetargetshare
car_to_fuel
car_to_fuel
car_fuelcar_fuel0
car_to_gas
car_to_gas
car_fuelcar_gas0
car_to_electric
car_to_electric
car_fuelcar_electric0
car_to_rail
car_to_rail
car_fueltrain_short0
gas_car_keep
gas_car_keep
car_gascar_gas1
electric_car_keep
electric_car_keep
car_electriccar_electric1
utility_to_fuel
utility_to_fuel
utility_fuelutility_fuel0
utility_to_gas
utility_to_gas
utility_fuelutility_gas0.1
utility_to_electric
utility_to_electric
utility_fuelutility_electric0.9
gas_utility_keep
gas_utility_keep
utility_gasutility_gas1
electric_utility_keep
electric_utility_keep
utility_electricutility_electric1
two_wheeler_to_fuel
two_wheeler_to_fuel
two_wheeler_fueltwo_wheeler_fuel0
two_wheeler_to_electric
two_wheeler_to_electric
two_wheeler_fueltwo_wheeler_electric1
electric_two_keep
electric_two_keep
two_wheeler_electrictwo_wheeler_electric1
bus_to_fuel
bus_to_fuel
bus_fuelbus_fuel0
bus_to_gas
bus_to_gas
bus_fuelbus_gas0.2
bus_to_electric
bus_to_electric
bus_fuelbus_electric0.5
bus_to_h2
bus_to_h2
bus_fuelbus_h20.3
gas_bus_keep
gas_bus_keep
bus_gasbus_gas1
electric_bus_keep
electric_bus_keep
bus_electricbus_electric1
h2_bus_keep
h2_bus_keep
bus_h2bus_h21
train_long_keep
train_long_keep
train_longtrain_long1
train_short_keep
train_short_keep
train_shorttrain_short1
aviation_keep
aviation_keep
aviation_domesticaviation_domestic1
aviation_to_rail
aviation_to_rail
aviation_domestictrain_long0
overseas_keep
overseas_keep
aviation_overseasaviation_overseas1
international_keep
international_keep
aviation_internationalaviation_international1

Freight transport categories Workbook

Demand is 2020 service demand in billion tonne-kilometres and unit consumption already includes loading. International air freight carries the gas vector in the workbook, so about 23 TWh of the game's "biogas" resource is in fact air-freight fuel — a workbook convention worth knowing before reading the biomass scoreboard.

  • Teaching workbook, "Transport parc 2050" sheet
Rowvectorunit_consumptiondemand_2020in_inventory
Hydrogen truck
truck_h2
hydrogen5001
Fuel truck
truck_fuel
liquid503001
Electric truck
truck_electric
electricity2001
Rail freight
rail_freight
electricity3.2501
Maritime
maritime
liquid0.67000
International air freight
air_freight
gas245120

Freight demand reallocation Workbook

Rowsourcetargetshare
truck_to_h2
truck_to_h2
truck_fueltruck_h20
truck_to_thermal
truck_to_thermal
truck_fueltruck_fuel0
truck_to_electric
truck_to_electric
truck_fueltruck_electric0
truck_to_rail
truck_to_rail
truck_fuelrail_freight0
h2_truck_keep
h2_truck_keep
truck_h2truck_h21
electric_keep
electric_keep
truck_electrictruck_electric1
rail_keep
rail_keep
rail_freightrail_freight1
maritime_keep
maritime_keep
maritimemaritime1
air_to_sea
air_to_sea
air_freightmaritime0
air_keep
air_keep
air_freightair_freight0

Building heating systems Workbook

The eight systems the stock is made of. is_destination says whether new surface can arrive: fuel boilers and electric resistance can only shrink, because nobody installs either in 2050, so the six remaining systems are what the stage-2 mix distributes over. heat_pump is used by the cost layer to price the equipment actually installed.

  • Teaching workbook, "Building parc 2020" and "Building heating" sheets
Rowis_destinationheat_pump
Biomass
biomass
10
Fuel boiler
fuel
00
Gas boiler
gas
10
Electric resistance
resistance
00
District heating
district
10
Air-air heat pump
air_air
11
Air-water heat pump
air_water
11
Hybrid heat pump
hybrid
11

Building stock segments, 2020 Workbook

3 654.9 Mm2 and, after the stock-wide calibration, 359.34 TWh of heat need in 2020. Surfacic need is what the segment asks of its heating system per square metre and per year, before retrofit; it is a need, not a consumption, so the efficiencies in building_vector have not been applied yet. dwellings is informational and no equation reads it: the workbook counts tertiary floor area directly rather than in buildings, so it is zero on those three rows.

  • Teaching workbook, "Building parc 2020" sheet rows 3-26
Rowsystembuilding_typesurface_2020surfacic_needdwellings
Biomass, apartment
biomass_apartment
biomassapartment2.14595e+07160.745320 487
Fuel boiler, apartment
fuel_apartment
fuelapartment3.26277e+07178.999475 230
Gas boiler, apartment
gas_apartment
gasapartment3.53574e+08148.1945 334 267
Electric resistance, apartment
resistance_apartment
resistanceapartment2.11641e+0872.8233 995 209
District heating, apartment
district_apartment
districtapartment9.7389e+07186.5871 554 877
Air-air heat pump, apartment
air_air_apartment
air_airapartment2.82849e+0763.9689636 490
Air-water heat pump, apartment
air_water_apartment
air_waterapartment1.5063e+0614.7621146 882
Hybrid heat pump, apartment
hybrid_apartment
hybridapartment014.76210
Biomass, house
biomass_house
biomasshouse4.25995e+08178.4653 775 624
Fuel boiler, house
fuel_house
fuelhouse2.83748e+08189.3212 428 267
Gas boiler, house
gas_house
gashouse5.64693e+08159.0645 168 802
Electric resistance, house
resistance_house
resistancehouse4.69674e+0881.01284 442 744
District heating, house
district_house
districthouse1.15162e+06186.84813 311
Air-air heat pump, house
air_air_house
air_airhouse3.38464e+0763.7414365 908
Air-water heat pump, house
air_water_house
air_waterhouse1.80247e+0614.709684 440.2
Hybrid heat pump, house
hybrid_house
hybridhouse014.70960
Biomass, tertiary
biomass_tertiary
biomasstertiary40 726 800206.0120
Fuel boiler, tertiary
fuel_tertiary
fueltertiary210 049 200200.0510
Gas boiler, tertiary
gas_tertiary
gastertiary501 552 000198.4290
Electric resistance, tertiary
resistance_tertiary
resistancetertiary204 120 00095.57450
District heating, tertiary
district_tertiary
districttertiary67 748 400206.5580
Air-air heat pump, tertiary
air_air_tertiary
air_airtertiary13 996 80091.69180
Air-water heat pump, tertiary
air_water_tertiary
air_watertertiary89 326 80096.10590
Hybrid heat pump, tertiary
hybrid_tertiary
hybridtertiary096.10590

Heating system efficiencies and vector mix Workbook

How a segment's heat need becomes energy: need x unit consumption / efficiency, summed over the pairs below. A system can draw on several vectors -- district heating on six, a hybrid heat pump on two -- and unit_2020 / unit_2050 are the repartition keys, which is why they sum to one per system rather than carrying a physical unit. Two columns carry the whole argument for replacing the old aggregate. peak_efficiency is separate from seasonal_efficiency and lower for every heat pump (air-air 2.5 -> 2.0, air-water 3.0 -> 2.0, district-heating electricity 2.5 -> 1.5), because a heat pump loses efficiency exactly when the system needs it most. peak_share makes the hybrid heat pump run 70% on gas on the coldest evenings while running 95% on electricity over the year. The module this replaces flattened all of it into two constants, a seasonal COP of 3 and a peak COP of 2.

  • Teaching workbook, "Building heating" sheet rows 22-35
Rowsystemvectorseasonal_efficiencypeak_efficiencypeak_shareunit_2020unit_2050
Biomass, wood
biomass_wood
biomasswood0.850.85111
Fuel boiler, fuel oil
fuel_liquid
fuelliquid0.90.9111
Gas boiler, gas
gas_gas
gasgas0.950.95111
District heating, gas
district_gas
districtgas0.850.8510.3520.6
District heating, fuel oil
district_liquid
districtliquid0.850.8510.0050
District heating, wood
district_wood
districtwood0.850.8510.2380.3
District heating, coal
district_coal
districtcoal0.850.8510.0370
District heating, other
district_other
districtother0.850.8510.3680
District heating, heat pump
district_electricity
districtelectricity2.51.5100.1
Electric resistance, electricity
resistance_electricity
resistanceelectricity11111
Air-air heat pump, electricity
air_air_electricity
air_airelectricity2.52111
Air-water heat pump, electricity
air_water_electricity
air_waterelectricity32111
Hybrid heat pump, electricity
hybrid_electricity
hybridelectricity330.30.950.95
Hybrid heat pump, gas
hybrid_gas
hybridgas0.950.950.70.050.05

Where the cement and the steel go Derived

Two published maps of French cement disagree by a factor of about 1.7, and this table keeps the disagreement visible rather than choosing. Top down, the sector's own 2018 end-use map — tertiary 20%, collective housing 18%, detached houses 12%, industrial and agricultural buildings 5%, renovation 10%, roads 13%, buried networks 13%, bridges 9% — puts new buildings at 55% of French cement and infrastructure at 35%. France Stratégie states the same two-thirds/one-third split in its own words, and a 2012 bottom-up study lands a little lower at 55 to 60% for buildings overall. Bottom up, ADEME's material-consumption study gives 137 kg of cement per m² for new housing and 135 for new tertiary, which on this country's floor areas is 5.5 Mt — about a third of the total, not 55%. The table uses the bottom-up intensities, because a floor-area driver needs a per-square-metre coefficient and only the bottom-up study has one, and books the difference in unattributed. That row is 31.8% of French cement and it holds three distinct things: renovation, which the top-down map puts at 10%; the part of new build the bottom-up study does not see, since its tertiary perimeter covers about 58% of the sector and excludes industrial and agricultural buildings entirely; and the gap between the two sources, which nobody has closed. ADEME's own conclusion calls its housing result robust and urges "une plus grande prudence" on tertiary, and the two do reconcile beautifully on detached houses (2.25 against 2.04 Mt) while tertiary is out by more than a factor of two. The consequence is the one worth teaching. The two floor-area levers reach 33% of French cement. Civil works are another 35% and no square metre drives them. And 32% is a residual that nobody, including this model, can attribute. A player who wants to cut French cement by building less can move a third of it. Steel is the same table and a different answer. New buildings carry 21 kg of steel per m² in housing and 47 in tertiary — 1.36 Mt a year against a French apparent consumption of 11.5 Mt. Construction as a whole is 43% of French steel demand, so new buildings are about a sixth of the construction envelope and about a ninth of the country's steel. That is why this table's steel column is read by the materials account and by nothing else: steelGrowth still sets what the mills make. floor_2024 is zero on the two rows no floor area drives, and the equations rely on it.

  • ADEME 2019, «Prospective de consommation de matériaux pour la construction des bâtiments» — 137 kg ciment et 21 kg acier par m² en logement neuf ; 135 et 47 en tertiaire CHEB
  • SFIC / CIMbéton / ATILH, carte des usages du ciment 2018, reprise par The Shift Project, «Décarboner la filière ciment-béton» (janvier 2022), figure 6
  • France Stratégie, «Les coûts d'abattement — Partie 6 : Ciment» (mai 2023), p. 6
  • A3M, répartition sectorielle de la demande française d'acier, reprise par France Stratégie, «Les coûts d'abattement — Partie 7 : Acier» (octobre 2024) — construction 43%, transport 26%
  • worldsteel, World Steel in Figures 2026 — consommation apparente française 11.5 Mt (2024)
Rowcement_intensitysteel_intensitycement_2024steel_2024floor_2024driver
New housing
housing_new
137210020.4newHousing
New non-residential
other_new
135470019.9newNonResidential
Roads, networks and civil works
civil_works
005 77500civilWorksVolume
Renovation, and what nobody attributes
unattributed
005 243.700none

Industrial production routes Workbook

Unit consumption in MWh per tonne of product and process emissions in tCO₂ per tonne. These are shared by the physical model and the cost model, so the two can never drift apart. Grey ammonia's 0.914 MWh/t of gas is an order of magnitude below the roughly 9 MWh/t of a real reforming plant; it is kept for continuity with the workbook energy balance but the figure needs review, and the cost module prices that route from POMMES instead. The cement row carried electricity and a process term but no kiln fuel at all until 0.9.0: a clinker kiln burns 0.70 MWh a tonne and the model had it burning nothing, which left about 9 TWh of industrial fuel — and the combustion emissions that go with it — outside the account. The three fuel intensities are the source workbook's own, from its plaster/lime/cement branch sheet. The kiln row is still wrong, and 0.27.0 names it rather than fixing it. A French kiln burned 3 830 MJ, 1.064 MWh, per tonne of clinker in 2021, where this row burns 0.700; and it burns petroleum coke, coal and waste — 43 to 52% of the heat is waste-derived fuel, about half of it biomass — where this row burns 28% gas and 51% "liquid", which draws on the liquid-biofuel pool. At 2020 factors the row emits 0.19 tCO₂ of fuel per tonne of clinker against 0.28 observed. While the process term carried the fuel as well, the two errors cancelled at the national level; now that it does not, the kiln's fuel is visibly a third short. The fix needs a carrier this model does not have, waste-derived fuel, and the waste module that would give it one is the next piece of work.

Rowsubpostelectricitygascoalliquidhydrogen
Steel — BF-BOF
steel_bf
steel0.1940.625.0474200
Steel — H₂-DR-EAF
steel_dri
steel1.2310.55001.683
Steel — EAF from scrap
steel_eaf
steel0.9180000
Ammonia
ammonia
ammonia0.7780005.94
Olefins — CO₂ + H₂
olefins
olefins5.95120001.32
Cement clinker
cement
cement0.15230.1950.1470.3580

Industrial plant, capital and fixed cost Published

CAPEX in euros per tonne of annual capacity, lifetime in years, fixed O&M in euros per tonne of capacity per year. The annualised cost is CAPEX × CRF(discount rate, lifetime) + fixed O&M, at full utilisation.

Rowcapexlifefixed
Blast furnace + BOF
steel_bf
4422553
H₂ direct reduction + EAF
steel_dri
4142553
Electric arc furnace
steel_eaf
1842553
Haber-Bosch ammonia
haber_bosch
1 0002050
Water electrolyser
electrolyser
1 12511.4216.87
Steam methane reformer
smr
3 24325546
Cement kiln
cement_kiln
186259.31
Cement kiln with capture
cement_kiln_ccs
4562522.81
Methanol synthesis
methanol
3002015
Methanol to olefins
methanol_to_olefins
1 0002063.7

Flight categories Published

The DGAC's own route categories for traffic departing France in 2023, with passengers and passenger-kilometres, from which an average distance follows. game_row says which of the model's three aviation categories supplies the unit consumption, so the ticket is priced on exactly the energy the emissions account already charges.

Rowpax_2023pkt_2023game_row
Paris ↔ province
paris_province
12.257.75aviation_domestic
Province ↔ province
province_province
8.985.46aviation_domestic
Paris ↔ international
paris_international
82.68263.17aviation_international
Province ↔ international
province_international
55.9270.58aviation_international
Paris ↔ Outre-mer
paris_overseas
4.7438.55aviation_overseas
Province ↔ Outre-mer
province_overseas
0.090.74aviation_overseas
Outre-mer ↔ international
overseas_international
2.456.68aviation_international
Outre-mer ↔ Outre-mer
overseas_overseas
2.51.26aviation_domestic

The rest of industry — energy and process emissions Published

The seventeen manufacturing branches the game does not model as value chains, grouped so the published efficiency and waste-heat studies map onto them. Energy is output times unit consumption, so it is bilinear in the two levers and four corners reproduce every combination exactly: e00 is the observed 2019 situation, e11 the source workbook's 2050 scenario, e10 the 2050 output at 2019 processes and e01 the 2050 processes at 2019 output. Both end points are the published branch totals; the output index between them is measured from the branch sheets' own production data, not assumed.

Rowgroupcarriere00e10e01e11
Metals and machinery — coal
metals_machinery__coal
metals_machinerycoal2.19812.604500
Metals and machinery — oil
metals_machinery__oil
metals_machineryoil2.03432.415300
Metals and machinery — gas
metals_machinery__gas
metals_machinerygas17.305423.052215.794217.815
Metals and machinery — biomass
metals_machinery__biomass
metals_machinerybiomass001.17411.2733
Metals and machinery — electricity
metals_machinery__electricity
metals_machineryelectricity28.31939.244465.139884.1051
Metals and machinery — hydrogen
metals_machinery__hydrogen
metals_machineryhydrogen0.02330.04810.02570.0257
Metals and machinery — steam
metals_machinery__steam
metals_machinerysteam0.63970.71660.47970.5217
Minerals and building materials — coal
minerals__coal
mineralscoal1.24441.244400
Minerals and building materials — oil
minerals__oil
mineralsoil2.16322.337300
Minerals and building materials — gas
minerals__gas
mineralsgas16.130816.44438.88888.9452
Minerals and building materials — biomass
minerals__biomass
mineralsbiomass0.40710.407100
Minerals and building materials — electricity
minerals__electricity
mineralselectricity6.4436.756512.486212.9326
Minerals and building materials — hydrogen
minerals__hydrogen
mineralshydrogen000.05820.1452
Minerals and building materials — process
minerals__process
mineralsprocess1.99121.99121.9431.943
Chemicals, other — coal
chemicals_other__coal
chemicals_othercoal4.31772.248300
Chemicals, other — oil
chemicals_other__oil
chemicals_otheroil2.90751.780400
Chemicals, other — gas
chemicals_other__gas
chemicals_othergas8.52486.8582.03871.5872
Chemicals, other — biomass
chemicals_other__biomass
chemicals_otherbiomass0.8680.45160.63460.3304
Chemicals, other — electricity
chemicals_other__electricity
chemicals_otherelectricity13.22339.807530.286120.5227
Chemicals, other — hydrogen
chemicals_other__hydrogen
chemicals_otherhydrogen1.53520.81123.06021.6041
Chemicals, other — steam
chemicals_other__steam
chemicals_othersteam5.74523.6585.15542.7832
Chemicals, other — process
chemicals_other__process
chemicals_otherprocess0.55590.289200
Paper and board — coal
paper__coal
papercoal0.12790.109600
Paper and board — oil
paper__oil
paperoil0.37220.318800
Paper and board — gas
paper__gas
papergas9.2117.89047.16016.1336
Paper and board — biomass
paper__biomass
paperbiomass14.17712.144513.793911.8164
Paper and board — electricity
paper__electricity
paperelectricity7.53626.455812.957711.1
Paper and board — steam
paper__steam
papersteam3.4892.98883.94553.3798
Other industries — coal
other_industries__coal
other_industriescoal0.02330.042900
Other industries — oil
other_industries__oil
other_industriesoil0.83741.788300
Other industries — gas
other_industries__gas
other_industriesgas6.943120.50831.50514.1839
Other industries — biomass
other_industries__biomass
other_industriesbiomass3.97757.31870.84881.5619
Other industries — electricity
other_industries__electricity
other_industrieselectricity12.409224.647216.751237.1683
Other industries — steam
other_industries__steam
other_industriessteam0.76762.00370.14640.3741

Building energy by usage, observed Published

Final energy by usage and by carrier, from the CEREN series the SDES publishes. Residential is 2024, the latest available; tertiary is 2019 rather than 2020, because 2020 is a Covid year — tertiary consumption fell from 237 to 209 TWh and recovered afterwards, so using it would build a lockdown into the 2050 baseline. The heat harvested by heat pumps is excluded: the source reports it as a renewable input beside the electricity that drives the pump, and counting both would double the energy. heat is district heat, which the model has no carrier for and which the equations fold into gas — networks in this model are majority gas, so it is the least wrong of the available homes for 2.8 TWh, and it is stated rather than buried. Space heating is deliberately absent: it is the stock model, and the two perimeters do not match — this table's heating rows would say 335 TWh against the stock's 383 for 2020, different years and different methods.

Rowusagesegmentelectricitygasliquidwoodheat
Hot water, residential
dhw_residential
dhwresidential24.3413.513.320.661.24
Hot water, tertiary
dhw_tertiary
dhwtertiary7.2311.753.080.141.55
Cooking, residential
cooking_residential
cookingresidential9.3310.98000
Cooking, tertiary
cooking_tertiary
cookingtertiary4.477.10.080.070
Air conditioning, residential
cooling_residential
coolingresidential2.590000
Air conditioning, tertiary
cooling_tertiary
coolingtertiary21.660000
Specific electricity, residential
specific_residential
specificresidential67.150000
Specific electricity, tertiary
specific_tertiary
specifictertiary70.30000
Other uses, tertiary
other_tertiary
othertertiary2.133.994.410.170

RTE 2050 generation mixes Published

Each row is one of RTE's 2050 scenarios reduced to shares of total supply, so it can be applied to whatever electricity this model's own demand turns out to be rather than carrying RTE's demand with it. The range is the one RTE built it to span: M0 has no nuclear at all, N03 about half. Two splits the source does not make are made here and declared: solar is halved between ground and rooftop, and offshore wind between fixed and floating. Both matter to the material account — a floating foundation is 480 t of steel per MW against 250 fixed — and neither is a result.

Rowscenario_indexnuclearpv_groundpv_roofwind_onshorewind_offshore_fixedwind_offshore_floatinghydrobioenergygas_turbinecombined_cycle
M0 — 100% renewable
m0
100.1730820.1730820.2030740.1519990.1519990.1085420.0157780.0217630.00068
M1 — renewables, distributed
m1
20.1244510.1748770.1748770.162870.1114160.1114160.1090830.0159170.0144070.000686
M23 — renewables, large farms
m23
30.1294220.108680.108680.2064210.1529340.1529340.1110950.016480.0126440.00071
N1 — new nuclear, 4 EPR2
n1
40.2601490.1032020.1032020.1676670.1144940.1144940.1113490.0165810.0081480.000715
N2 — new nuclear, 8 EPR2
n2
50.3678230.0802240.0802240.1512680.0940690.0940690.1120660.0169050.0027690.000583
N03 — new nuclear, ~50% nuclear
n03
60.5010360.0634250.0634250.128330.0576520.0576520.1113080.0171700

Generation technologies, material intensity Workbook

Tonnes of material per MW of capacity built, 2050 values. These drive a satellite account: the model has no electricity supply module, so what is built here is a declared build rate rather than a mix sized to cover the demand the model computes. Making it cover that demand needs load factors the source does not provide — that is the next step, and until it is taken these numbers say what a build costs in materials, not whether it is enough. thermal_efficiency and fuel_carrier are what make the account scope 1: a thermal plant burns a fuel, that fuel goes through the same constructive account as every other, and it takes the emission factor of its carrier. A combined cycle running on biomethane therefore emits at 25 gCO2/kWh of fuel and not at 356 — and it draws on the same biomethane the buildings want, which is a competition the model did not previously represent. Efficiencies are RTE's own: 60% for a combined cycle, 25% for bioenergy. The bioenergy plants burn gas here, not wood. RTE's category mixes solid biomass, biogas and the renewable part of waste; sending it to wood would have the power system eating 54 TWh of a resource the buildings and industry are already short of, to make electricity at 25% efficiency, which is the one thing biomass should not be used for. Calling it biogas is a modelling choice and it is deliberately conservative on quantity: a gas engine would be nearer 40% efficient than 25%, so the fuel this asks for is on the high side rather than the low. The gas turbine runs on hydrogen in every RTE 2050 scenario, so it burns no fuel here; the electricity that made the hydrogen is not traced back, which is a hole and a small one at these volumes. Hydro, bioenergy and the two thermal rows carry intensities but no lever: the source scenario builds none of them after 2050, and a slider that only ever sat at zero would be decoration.

  • Offre_et_demande.xlsx, "Energie" sheet rows 19-33 — intensité matière 2050
Rowrenewableload_factorthermal_efficiencyfuel_carrierhydrogen_capablelifetimecapex_per_kwopex_per_kw_yearsteelconcretealuminiumcopperlithiumcobaltnickelrare_earth
Nuclear
nuclear
00.750none06011 900100675330.351.61.5e-073.8e-0502.3e-05
Solar PV, ground
pv_ground
10.140none0257471128.470635.137317.43.19.37e-070.0003202.2235e-05
Solar PV, rooftop
pv_roof
10.140none0257471116.176528.8627123.18.7e-070.00031396201.9765e-05
Wind, onshore
wind_onshore
10.230none0251 300402004500.692.67.1e-063.4e-0504.2e-05
Wind, offshore fixed
wind_offshore_fixed
10.410none0202 6008025091018.58.1e-063.65e-0500.106674
Wind, offshore floating
wind_offshore_floating
10.410none0202 600804801 7001.158.558.55e-064.8e-0500.106676
Hydro
hydro
10.2950none0701 0001598210.520.181.9e-070.0001409e-05
Bioenergy
bioenergy
10.5890.25gas0253 000120573.50.0590.127.2e-075.4e-0505.4e-06
Gas turbine
gas_turbine
00.1140none025800486.3410.750.791.5e-087.2e-0606.4e-06
Combined cycle
combined_cycle
00.1140.6gas1301 1004829361.11.23.6e-080.001802e-05

Vehicle production and material intensity Workbook

Kilogrammes of body material per vehicle and units produced per year in 2050. electric_share is the share of that production carrying a battery; it is derived from the source's own battery-capacity row rather than assumed, and it is overridden by the player's own electrification levers for cars and trucks. Only steel and aluminium are carried here. The source also gives flat glass, plastics and rubber per vehicle, which are real but are not what the transition changes — the battery is.

  • Offre_et_demande.xlsx, "Matériaux transports" sheet rows 2-9 and 32-33
Rowproduction_2050battery_kwhelectric_sharesteelaluminium
Car
car
2 500 004450.99951 111130
Utility vehicle
van
500 004800.99599052
Bus and coach
bus
15 7834000.94316 7851 670
Truck
truck
55 0051 0000.98 738351
Motorcycle
motorcycle
220 00714122226
Moped
moped
110 0028122226
Bicycle
bicycle
15 701 8790.5168

Battery material intensity by chemistry Workbook

Tonnes per MWh of battery. The two the model blends are the two credible 2050 options; the source also documents NMC 333, NCA and LTO.

  • Offre_et_demande.xlsx, "Matériaux transports" sheet rows 19-28
Rowsteelaluminiumcopperlithiumcobaltnickel
NMC 811
nmc_811
1.911.80.1110.0270.75
LFP
lfp
21.31.60.496.8e-060.03

Hydrogen production routes Published

Per MWh of hydrogen produced. methane is the feedstock and fuel together, which is how a reformer is measured; carbon_captured is the share of the carbon in that methane that ends up underground rather than in the air. Electrolysis has no methane, and its electricity column is zero because the figure is derived in the equations from the conversion efficiency the rest of the model uses — declaring it here as well would be two copies of one number. The reformer figures come from the constants the cost layer already used and nothing else did: 3.33 t of methane and 9.23 tCO2 per tonne of hydrogen, converted at the lower heating values declared beside them.

Rowmethaneelectricitycarbon_captured
Electrolysis
electrolysis
000
Steam methane reforming
smr
1.390.01740
Autothermal reforming + capture
atr_ccs
1.450.030.94

The land of France Published

Teruti 2023, metropolitan France, in million hectares, aggregated from the survey's own nomenclature: arable is annual crops 14.198 + temporary grassland 2.587 + fallow 0.317 + other agricultural 0.163; other_natural is other wooded land 1.346 + heath and scrub 1.587 + bare natural soil 0.511; artificial is built 0.830 + paved 1.405 + stabilised 0.961 + grassed or bare artificial 2.043. The seven add up to 54 919 253 ha against Teruti's published 54 919 252 — one hectare of rounding — and the areas are declared to the hectare rather than to three decimals because the account's closure is asserted on their sum. Teruti is used because it is the only source that covers the whole territory with one nomenclature and a published national total. It is also the last of its line: from 2025 IGN's OCS GE becomes the reference and a definitional break is to be expected. Two figures deliberately do not come from here — the forest area the sink identity runs on (IGN's 16.6 Mha of production forest) and the grassland the livestock block will read (the farm survey's 10.527 Mha) — because they are different perimeters, and merging them would break either the account or the calibration. French Guiana's 7.9 Mha of forest sits outside this account and inside the national inventory total; it is carried as forest_overseas_sink. soil_carbon_stock is the mean stock over 0–30 cm and is carried for display and for the conversion arithmetic a reader will want to check; no equation reads it in stage A. Permanent crops are the mean of the vineyard and orchard medians (34.3 and 46.5), artificial land is the inventory's default for bare urbanised soil, and water carries zero because no stock is published for land under water. peat_area and peat_ef are zero on every row, and the French sink does not move because of it. Citepa books the emissions of France's drained organic soils inside the cropland, grassland and wetland lines the per-hectare coefficients and wetland_other_source are already calibrated on, and publishes no organic-soil area by land-cover class that could be taken back out of them. An area declared here without the matching tonnes removed from those coefficients would count French peat twice. Zero is therefore the honest declaration and not a hole: the six pools reproduce the inventory exactly as they did before the peat term existed, and peatRewetting is hidden and provably inert. About 100 kha of French agricultural peat is the order of magnitude at stake, and the CRT organic-soil tables of the national submission are what would close it.

Rowarea_2023soil_carbon_stockpeat_areapeat_ef
Arable land
arable
17.264851.600
Permanent grassland
grassland
9.1385484.600
Vines and orchards
perm_crops
1.2757140.400
Forest
forest
17.52138100
Heath, scrub and bare ground
other_natural
3.444277900
Water and wetlands
water
1.03458000
Artificialised
artificial
5.240063000

Climate cases for the forest Published

IGN–FCBA's three climate cases, as factors on the base year at 2050: production falls 1%, 12% or 25% and mortality rises to 1.1, 1.4 or 1.8 times today's. C2 is the central case and the default, and it is central rather than pessimistic because mortality has already doubled since 2005–2013. In C3 production loses a quarter and mortality nearly doubles again — the study's own reading of its drought trends, not an extreme invented for the game. Three positions rather than a slider because that is how the projections are published; interpolating between them would invent a curve. Reading them across is also the fastest way to see what the sink is really made of: the same harvest gives a forest pool of 61, 34 or 2 MtCO₂/y absorbed depending only on this control, which is a wider spread than every lever in this module put together.

Rowpositionproduction_factormortality_factor
C1 — mild
c1
10.991.1
C2 — central
c2
20.881.4
C3 — severe
c3
30.751.8

The French herd Calibrated

Six categories, on the farm survey's end-2024 herd: 3.076 M dairy cows, 3.675 M suckler cows, 9.706 M other cattle (16.457 total less the cows, derived), 11.902 M pigs, 272.724 M poultry and 7.868 M sheep and goats. The three cattle factors are calibrated and their relative weights are provisional, and that is the module's second-largest known weakness. Citepa publishes enteric fermentation and manure management as one number per species group and no per-category factor at all; its OMINEA database has them and was not obtained. So the three weights are set in the IPCC Tier-2 order — a dairy cow eats more, digests more and produces more methane than a suckler cow, and a suckler cow more than a heifer — at 3.64 : 3.08 : 1.60, and the level is then fitted so the herd reproduces Citepa's 38.64 MtCO₂e exactly. The scale factor that does it is 1.0156, and it is small for a reason worth saying: the herd average that comes out, 2.348 tCO₂e a head, is within half a per cent of the 2.36 the inventory's own total over its own herd gives, and the difference is that Citepa counts 16.364 M metropolitan cattle where the farm survey counts 16.457 M for France as a whole. The other three factors are each derived from their own published line: 2.47 MtCO₂e over 11.902 M pigs, 0.23 over 272.724 M birds, and (4.36 − 0.02 of refrigerants) over 7.868 M sheep and goats — horses and the block's indirect N₂O ride along in that last one, which is why it is the only factor here that is not about the animal it names. manure_ch4_share is an assumption, not a measurement: the inventory does not split the two methanes, and these shares say that nearly all of a pig's emissions come from the slurry pit, about a fifth of a dairy cow's do, and a grazing ewe's almost none. They are what manureMethanised acts on, and they are why its default is zero. grassland_ha_per_head is calibrated on livestock-unit weights — a cow 1, other cattle 0.6, a sheep or goat 0.15 — so that the 2024 herd requires exactly the 10.527 Mha of permanent grassland the farm survey observes. It is grassland only: the fodder maize, the cereals and the imported soy the same herd eats are not in it.

Rowspecies_groupheads_2024emission_factorenteric_mitigablemanure_ch4_sharemanure_n_2024grassland_ha_per_head
Dairy cows
dairy_cow
cattle3.0763 69710.2300.390.765333
Suckler cows
suckler_cow
cattle3.6753 12810.06358.890.765333
Other cattle
other_cattle
cattle9.7061 62510.12568.720.4592
Pigs
pig
pig11.902207.52800.95780
Poultry
poultry
poultry272.7240.8433400.6640
Sheep and goats
small_ruminant
small_ruminant7.868551.60100.05920.1148

Animal products, and where they go Derived

Five products, on the base year's trade position, in kilotonnes: carcass weight for the four meats and product weight for milk. Consumption and the import share are observed — beef 1 424 kt consumed with 25.5% imported, pork 2 116 with 30%, poultry 2 133 with 46%, sheep 145 with 58%, and 21.24 Mt of dairy with a third imported. Production is the farm survey's — beef 1 267, pork 2 099, poultry 1 692 (derived, the sum of broiler, turkey and duck), sheep 103, milk 23 600 (23.6 Mt, from the dairy council's 22.97 billion litres collected). The export volumes are derived so the base year closes exactly: export = production − consumption × (1 − import share), and product_trade_check asserts it. They are not published as such, and declaring all four numbers independently would have left a residual that the herd would then have carried. The milk figure that comes out, 9 433 kt, is 39.97% of production against the dairy council's published 40% — a cross-check the calculation was not fitted to. Two facts this table exists to keep visible. France exports two fifths of its milk while importing a third of the dairy it eats, so herd size and diet are coupled through trade rather than one for one. And nearly half the poultry eaten in France is imported, so a French poultry diet lever moves a Polish or Brazilian flock as much as a French one — which this module cannot see, because an inventory is territorial. The per-capita column carries the published figures, which do not multiply back to the tonnages exactly: the balance sheet gives 20.8, 30.6 and 2.1 kgec against a total of 85.0 kgec for 5 827 kt, while the four product lines sum to 5 818 kt. The nine kilotonnes are rabbit and goat, and the rounding is the balance sheet's. waste_share, since stage E, is per product and downstream of the farm. ADEME's 2016 loss study follows each chain from field to plate and publishes the edible tonnage lost at each stage; the share here is processing plus distribution plus consumption over the production the study starts from, because the field losses are inside the yields and the farm gate is where this model's demand chain begins. Beef and pork, studied as one chain: 48 000 + 99 700 + 173 300 tec over 3 650 000, 8.8%, and sheep meat is read with them. Poultry: 171 000 + 105 000 + 77 000 tec over 1 850 000, 19.1% — the processing stage alone loses 9%. Milk: 740 + 350 + 1 710 million litres over 26 000, 10.8%. Weighted by what the country eats, the animal basket loses 12% downstream of the farm, against the 7% of the whole food supply the environment statistician counts as edible waste on the European definition — a different perimeter, shown beside it rather than reconciled with it.

Rowspeciesconsumption_baseper_capita_2024import_shareexport_baseproduction_2024waste_share
Beef and veal
beef
suckler_cow1 42420.80.255206.121 2670.088
Pork
pork
pig2 11630.60.3617.82 0990.088
Sheep meat
sheep
small_ruminant1452.10.5842.11030.088
Poultry
poultry
poultry2 13330.80.46540.181 6920.191
Cow milk
milk
dairy_cow21 240309.80.3339 432.9223 6000.108

Scoreboard bands Game rule

These set the difficulty of the game; they are not resource assessments from a published national study, and the biomass one in particular is argued over — see the controversy table. Declared here rather than in the interface because the feasibility tool has to score the same scenario the player does. Two copies of a rule are two rules. The four emission bands are on the game perimeter — the footprint basis — not on the national figures the sector cards show. The two differ by the electricity life-cycle and by international bunkers, so scoring one against the other's band would be meaningless. agriculture is the one emission band with a published national number behind it. good is 44, which is the SNBC 3's own 2050 agriculture figure of 43.67 rounded up to something a player can read; warning is 60, a teaching rule sitting between that and the inventory's 2024 of 77.53 — roughly where a scenario lands that changed the fields and left the herd alone. The line is scored on the three agriculture rows of the post table rather than on the national figure, for the same perimeter reason as the other three; in France the two are the same number, because agriculture has no electricity worth the name and no international bunkers. The reference is amber on it, at 46.38 against 44, and that is a statement about this module rather than about the band: the SNBC 3 reaches 43.67 through measures — organic farming, agroforestry in detail, a manure-management line — that this account does not carry. The total band moved with that perimeter in 0.15.0: 15/30 became 50/75. Agriculture used to sit outside the constructive account, on a slider, and the game perimeter was the three modelled sectors plus the power system — 30.02 MtCO₂ at the reference, which is what a band of 30 was set against. Since the food module the sector is three rows of the post table and the perimeter is 77.07, two thirds of it a farm. The new band is a teaching rule like the old one: 50 is roughly the strategy's own 2050 total for these sectors, and 75 is where a scenario has stopped trying. The reference sat above the warning line from then until 0.27.0, at 77.07 and later 77.36; the steel and cement corrections of 0.27.0 took it to 73.84, just inside. Either way it is a statement about the reference rather than about the band — the SNBC 3's own agriculture is 43.67 and this module produces 47.05 at the strategy's own settings. sink is a published number, and it was added in 0.26.0 to price one move. Cutting the wood harvest from 60 to 40 Mm³/y took the country under net zero on its own and improved the score, because the net line is hinged at zero and every tonne the forest absorbs past the crossing is scored as nothing. This line scores the land sink as a magnitude against the −23 MtCO₂e the SNBC 3 itself publishes for 2050 UTCATF (official_natural_sink_2050), so a scenario that leans on the land for more than the strategy does pays for it by the same percentage rule as every other band. The warrant is the Haut Conseil pour le climat's recommendation to budget reversible sequestration apart from permanent removals. warning 40 is a teaching rule: the top of the retired naturalSink slider, the most any earlier version of this game let a player claim. The reference sits just inside, at 20.1 against 23, and that margin — about 1.5 Mm³ of harvest — is a fact about the model rather than a design choice: the band is the published figure, not one tuned to leave the reference green. It charges peat rewetting and halted artificialisation too, which are reductions and not removals; that is the price of comparing like with like against a whole-UTCATF figure, and it is named in the controversy table.

Rowgoodwarning
Total emissions, game perimeter
total
5075
Transport emissions
transport
410
Building emissions
building
37
Industry emissions
industry
1015
Agriculture emissions
agriculture
4460
Winter electricity peak
peak
3545
Biogas
biogas
70150
Biofuels
biofuel
4050
Wood energy
biomass
80120
Land sink reliance
sink
2340

Contested assumptions Game rule

A model that shows its sources still hides which of them are argued over. This table names them. weight is how much the answer moves: high means a reasonable person taking the other side gets a materially different 2050. Nothing here is a secret — every one of these is visible in the annex — but a reader should not have to reverse-engineer which numbers are settled and which are live. The eight rows the land and food module added cite their sources in sources below rather than in their own prose: a controversy is read and a source is checked, and mixing the two would lengthen a player-facing text for a reader who has the annex.

  • IGN, Mémento de l'inventaire forestier 2024, and IGN-FCBA (2024), Projections des disponibilités en bois — the forest identity's P, M, A and H, and the three climate cases behind the sink row
  • Citepa, Secten 2026 — the LULUCF vintage series (-20.7 for 2023, -37, then -50.2) and the combined enteric-plus-manure livestock line the manure row turns on
  • INRAE (2019), Stocker du carbone dans les sols français ? — the 17.3 MtCO₂/y itemised potential, the 21 MtCO₂/y headline it is usually quoted as, and the no-till reading behind the soil-carbon row
  • INRAE (2023), Une prospective pour l'agriculture et l'alimentation françaises, and ADEME, Transition(s) 2050 — the two published diet pathways the diet row is scaled against
  • Idele / Agreste, Statistique agricole annuelle — the 501 kt of cull cows behind the 0.40 dairy-beef coupling
  • IGEDD (2024), Mission biomasse — the 80% methanised case, the residue split and the +1.1 Mha of fuel crops the land-competition row argues about
  • SDES, Bilan énergétique de la France, and the ADEME methanisation observatory — the 24.25 TWh of 2024 biogas against which the residual term is 78%
  • Agreste, Primeur 2023-8, Enquête Terres labourables 2022; INRAE (2023), hypothèses AMS SNBC 3; Seufert, Ramankutty & Foley (2012), Nature 485; Ponisio et al. (2015), Proc. R. Soc. B 282 — the four readings of the organic yield gap the organic row is scaled between
  • Kallio A.M.I. & Solberg B. (2018), Leakage of forest harvest changes in a small open economy: case Norway, Scandinavian Journal of Forest Research 33(5); and Kallio et al. (2018) on European roundwood — the 80% and 79% of the leakage row
  • IGN–FCBA (2024), Projections des disponibilités en bois, p. 49 — the 0.5 and 1.1 tCO₂/m³ substitution coefficients of the leakage row
  • Harmon M.E. (2019), Environmental Research Letters 14:065008; Leturcq P. (2020), GHG displacement factors of harvested wood products: the myth of substitution, Scientific Reports 10:20752 — the 2-to-100 dispute
  • I4CE (2022), Réorienter les usages du bois pour améliorer le puits de carbone, p. 12, citing Citepa — harvested wood products counted on the production approach, imports excluded
  • France Stratégie (July 2023), Note d'analyse n° 124, p. 12 — the trade-deficit cost of the lower-harvest strategy
Rowtopicweightpositioncontestedsettles_it
Is burning wood carbon-neutral?
wood_factor
emission factorshigh27 gCO2/kWh in 2050, the same figure the source observes for 2020, rather than the zero the biogenic convention gives it.The convention books the CO2 against the forest that regrew, not the boiler. Whether that holds depends on the harvest, the rotation and the counterfactual. **Since the land module the model has two of the three**, and the biogenic convention is no longer free: the forest identity subtracts the harvest from the sink at 2.0 tCO₂ per cubic metre, so a scenario that burns more wood pays for it in the LULUCF line whatever this factor says. The two are not the same accounting and are not meant to be netted — the factor is a combustion figure on the game perimeter, the sink response is a land-use figure on the national one — but a reader who moves the harvest lever and watches only the boiler is reading half the answer. The factor is worth 2.1 MtCO₂ here; the sink response to the full harvest range, 40 to 75 Mm³, is worth about sixty-five.A carbon-debt payback period for French forestry, and a rule for which harvests qualify. It is a live scientific argument, not a missing number — and the sink side of it is now in the model, which is the part that changed.
30 MtCO2 a year of capture that nothing builds
technological_sink
carbon sinkshighA slider between -60 and -5, opening at -30 — roughly France's share of the injection capacity the European industrial carbon management strategy projects for 2050, and flagged red past -20. It used to open at -43, the residual that closes the published national account; that residual is still what the national reconciliation compares against.It is the single largest assumption in the model and the cheapest to move: nothing here builds the capture plant, powers it, or pays for it. A scenario reaches net zero partly by sliding this. Twenty megatonnes a year, for France alone, is already around half of everything the planet captures today — which is where the red mark sits, and the reference scenario is past it.Costing it — in euros and in the energy capture itself consumes — and charging that back to the scenario. Not modelled.
Which climate does the forest live through?
natural_sink
carbon sinkshighThe sink is no longer a slider. It is seven land classes, six inventory pools and one forest identity — k · (P·A − M·A − H) — and it lands at **−20.1 MtCO₂e** at the reference. Across the levers and the three IGN–FCBA climate cases the same account runs from about **+5 to −62**: a sink, or a source, depending mostly on a case nobody gets to choose.Three things, in the order they move the answer. **k = 2.0 tCO₂/m³** is IGN's own net sink over IGN's own net balance; the research note argued for **1.5**, the SNBC's gross increment over IGN's gross production — a gross ratio on a net balance. At 1.5 the identity gives 29.9 MtCO₂ against IGN's published 39, and **every sink figure on this page is about a quarter smaller** — unless the litter-and-soil residual is re-closed to hold the base year, which it can be exactly, and then the 2050 sink comes out *larger*, 32.3 against the strategy's 23. The base year cannot choose k; 2050 moves whichever way it is closed. Second, the identity is evaluated at 2050 and gives an **endpoint**, while IGN–FCBA and ADEME publish 2020–2050 **means**, which are higher because the sink is still falling: comparing this model's −20.1 with a published "10 MtCO₂e/y" is comparing two different quantities, and it is the mistake most often made with this module. Third, the vintage: Secten gave −20.7 for 2023, −37 a year later and −50.2 the year after that, so the calibration rests on a number that has moved by more than a factor of two in three publications.For k, a published net-sink-per-cubic-metre coefficient for French forestry, which IGN could produce and has not. For the endpoint, only a convention: say which quantity you are quoting, every time. For the vintage, nothing — expect the next inventory to move it again, and read the year on the label.
The wood we do not cut, somebody else cuts
harvest_leakage
carbon sinkshighThe inventory counts wood where it grows, and so does this model: a cubic metre not harvested in France stays in the French sink, at 1.87 tCO₂, and nothing is booked for what replaces it — no import, no concrete, no steel. Since 0.26.0 the scoreboard charges a scenario that leans on its land for more than the SNBC 3's −23 MtCO₂e, which prices the *reliance*; it still books no leakage.The demand for wood does not fall because the harvest does. Kallio and Solberg find a 10–30% cut in Norway's harvest at least 80% made up by harvests elsewhere, and Kallio and co-authors 79% for a cut in European roundwood; France Stratégie names the same response in French terms, a wider trade deficit in chips, sawn wood, pulp, panels and furniture. IGN–FCBA put the substitution a cubic metre forgoes at 0.5 tCO₂ burned and 1.1 built with. Against that, the displacement factors are themselves disputed by a factor of 2 to 100 — Harmon; Leturcq, "the myth of substitution" — and a factor applied here would count twice the fossil fuel this game already charges where it burns. And the new score line charges peat rewetting and halted artificialisation too, which are reductions rather than reversible removals: the band is a whole-UTCATF figure, and comparing like with like is the price of its being a published one.A run of the French forest-sector model with a harvest cut and an import response, stated in MtCO₂e. None that we have found: the leakage rates are Norwegian and pan-European, and the French study that used the model for a low-harvest scenario publishes no trade response in its main text.
Is 45 GW the right red line?
peak_limit
system constraintsmediumTarget 35 GW, limit 45, on the electric-heating contribution alone.The band was calibrated against a peak calculation that was wrong, and was deliberately left where it was when the calculation was corrected. The reference scenario is over it at 50.6 GW. Whether that is the model failing or the scenario failing is exactly the question.An adequacy study. The model has no supply-side balance, so it cannot answer this on its own.
Nuclear or renewables?
nuclear_share
electricity supplyhighNeither. Six RTE scenarios are offered, M0 at 100% renewable to N03 at about half nuclear, and the player chooses.The most argued question in French energy policy, and the model declines to answer it. What it will not do is check that any of them works: there is no hourly balance, no storage and no adequacy calculation, so a 100%-renewable mix is applied exactly as a nuclear-heavy one is.Hourly dispatch with storage and flexibility. Until then the cost shown here is plant only and favours whichever mix has the lowest capital cost per MWh, which is not the same as the cheapest system.
How much biomass is actually available?
biomass_ceiling
resourcesmediumSince the land module, the three biomass bands are the supply this model builds from hectares, animals and cubic metres: about 70 TWh of methane, 24 of French liquid fuel and 127 of wood at the reference. They were a scoreboard rule until then — 80 TWh of wood, target, and 120 as the limit.What "mobilisable" means is the whole argument, and the published French estimates span more than a factor of two: 170 to 340 TWh across the three pools depending on how much straw a soil can lose, how much land may grow fuel and whether a forest is cut for the boiler or left for the sink. This model picks one point in that range and shows its coefficients. **And 19 TWh of the biogas — 78% of the base year — is a residual it cannot account for**, because the 2024 feedstock split is not published and the two sources that come closest contradict each other. Every build prints that number.A feedstock tonnage survey for the base year, which would replace the residual with terms; and a national potential with its own perimeter stated, which would say whether the coefficients here are the right point in the range. The first exists and was not obtained; the second is a live argument between administrations.
Is what a country eats a policy lever?
diet_lever
food and landhighFour sliders — red meat, poultry, dairy, edible waste — set demand per head, and demand sets production, the herd and two thirds of the agriculture sector. The reference keeps today's plate; the coarse control *Eat less meat* takes red meat from 40 to 20 kgec/cap/y.Two objections, and they point in opposite directions. A diet is not a decree — no French instrument sets it, and modelling it as a slider makes a cultural change look like a procurement decision. But every published pathway to a French 2050 assumes one, INRAE's and ADEME's most explicitly, so leaving it out would not be neutral either. **The coupling is where the model earns its keep and where it is most easily misread**: the dairy–beef coupling share, 0.40, books two fifths of French beef to the dairy herd, so cutting the milk alone makes the *suckler* herd grow to meet a beef demand that has not moved. That 0.40 is read off the SAA's 501 kt of cull cows as though all of them were dairy, which Idele's herd-flow accounts would refine. Exports are left alone on purpose: what France sells is a separate argument from what it eats, and folding them together would let a diet lever shrink a herd producing for somebody else's plate.For the coupling, Idele's herd-flow accounts, which would say how much of the cull-cow tonnage is dairy. For the lever itself, nothing: it is a question about what a model of a country is for, and the honest answer is to show the slider and say who is allowed to move it.
Methanising manure: abatement, or a new demand for crops?
manure_methanisation
food and landmediumThe manure-to-digesters lever **defaults to 0**, not to the SNBC 3's 80%. At 80% it removes 2.4 MtCO₂e of stored-manure methane and adds about 14 TWh of biogas; the reference books neither. The lever reaches 80 and is drawn in both views.The abatement rests on a number no French inventory publishes. Citepa reports enteric fermentation and manure management **together**, so the share of livestock methane that comes from the store, species by species, is an assumption of this module, and the abatement is only as good as it. That is why the default is 0: the reference books the emissions the inventory measures and no abatement resting on a split it does not publish. The second argument is upstream of the digester rather than inside it. IGEDD calls 80% "a profound change of practice", and a methanisation industry that size does not run on manure alone — it runs on cover crops, which is why the cover-crop lever exists beside it and why the two are usually argued about together. This model books **no** nitrogen for the cover crops and **no** digestate credit, on the reasoning that the digestate returns the nitrogen the manure carried; a scenario that stopped returning it would be wrong here.Citepa's OMINEA report, or France's CRF table 3.B, which split enteric fermentation from manure management. With that split the default could move to the strategy's 80% and the lever would stop being an argument about a number nobody has measured.
Energy crops against food, in one account
land_competition
food and landmediumThe fuel-crop lever commits arable land — 0.62 Mha at the reference, up to 1.70 — and the hectares are subtracted from the same arable class the food chain draws on. The cover-crop lever does not: a winter cover crop shares its hectare with the spring crop that follows, so it is reported against a 4.0 Mha ceiling rather than committed.**The fuel crops add no mineral nitrogen, and that is the module's largest structural simplification.** The dose is an intensity on an arable area held at the base year's, so planting a fuel hectare displaces a food hectare that was already fertilised and moves no nitrous oxide in either direction. Since stage E the crop block counts the displaced food as arable land the plates, the herd and the exports need, and the yield now answers the dose on what is left; what is still missing is the nitrogen the fuel hectare itself would take. The liquid-fuel emission factor stays at 25 gCO₂/kWh for the same reason: the cultivation N₂O of a first-generation biofuel is booked in **agriculture**, as the inventory books it, so the fuel carries processing and transport only, and the factor is not split by origin. Whether 1.70 Mha is available at all is a second argument: it is nearly three times today's area and is the IGEDD mission's own upper case, not a comfortable assumption.A fertiliser dose per crop — the fuel crops their own, the food crops theirs — which would let a fuel hectare carry its own nitrous oxide instead of displacing a hectare fertilised at the base year's dose. The crop block, the organic yield gap and the yield response to the dose are in place; that dose per crop is the piece still missing.
4 per 1000: 21 MtCO₂/y, or a rounding error?
soil_carbon
carbon sinksmediumThe soil-carbon lever at 100% is INRAE's **17.3 MtCO₂/y**, split 14.777 on arable land and 2.530 on grassland by the itemised practices — cover crops, agroforestry, temporary grassland, hedges, and intensification on grassland. The reference takes 30% of it.The headline usually quoted is **21 MtCO₂/y**, and the difference is not rounding. It includes no-till, which INRAE's own reading says redistributes carbon down the profile rather than adding any, and it includes forest land, which this account books in the forest pool. Excluding both is a choice and it is stated; a reader who prefers the 21 should read this pool as a fifth larger. Two limits travel with the number whichever figure is used. **Soil carbon saturates**: this is a thirty-year rate on a stock that stops responding, so it is not an annual flow anybody can keep drawing after 2050. And it is **reversible** — one ploughing releases what a decade of cover crops stored — so the pool is a claim about practice being maintained rather than about carbon being stored. Neither the saturation nor the reversal is modelled.A saturation curve and a permanence rule, which INRAE's study has the material for and did not publish as a trajectory. Until then the honest reading is a rate with an expiry date on it, and the annex says so.
Organic farming: two thirds of the yield, or four fifths?
organic_yield
crops and landmediumAn organic hectare yields **0.65** of a conventional one here, INRAE's own 60% now and 70% at the horizon for the strategy's scenario, at the scale of a rotation. At the strategy's 25% of the arable area that costs 7% more arable land for the same plates, herd and exports; at 100% it costs half as much land again, and the land account reports the shortfall rather than closing it.The range is the argument. Agreste's arable-land survey measures the French gap crop by crop and finds it wider: soft wheat **−57%**, winter barley −47%, maize −31 to −35%, sunflower −28% in 2022, stable over five years, and worst for the winter cereals that carry most of the area. The global meta-analyses find it narrower: Seufert et al. find organic 25% lower on average, between 5% and 34% by crop and practice, and Ponisio et al., on a data set three times larger, **−19.2%**, falling to −8 or −9% where rotations and multi-cropping are used — which is what an organic rotation does. Whether the French figure is a property of organic farming or of where it is practised — organic fields sit in the south, on poorer land — is the open question, and the survey itself says the gap narrows to 38% in Auvergne-Rhône-Alpes.A yield gap measured at rotation scale on matched soils, which Agreste's survey has the plots for and has not published. Until then the lever's land cost should be read with the range on it: half of what the page shows at Ponisio's figure, half as much again at Agreste's wheat.
Fertilising less: free down to 90% of the dose, or from the first kilo?
nitrogen_yield
crops and landhighA conventional hectare keeps its yield down to **0.90** of the 2024 mineral dose, then loses it along the hyperbola the GRAFS school fits to every country's cropland, with a French cropland efficiency of 0.67. At the reference dose of 70% it keeps 0.90 of its yield, and the reference is 1.5 Mha short of arable land where the same scenario at the 2024 dose would be 0.2 Mha short. Above the plateau a heavier dose buys nothing.The plateau is the argument, and both ends of it are published. INRAE's hypotheses for the strategy book 426 kt of the cut — 20% of the 2020 dose — as efficiency "sans altérer les rendements (ou marginalement)", and the strategy's own "optimised" wheat keeps its conventional yield: that is a plateau at **0.80**, where the reference keeps 0.94 of its yield and is 0.9 Mha short. The GRAFS curve with practices unchanged has no plateau, and the JRC's DayCent model finds soft wheat losing up to **2.1%** of its yield for the first 5% of mineral nitrogen cut: that is 1.00, where the reference keeps 0.87 and is 2.1 Mha short. Underneath is whether France's cut since 2010 — mineral nitrogen down 13% with crop removal flat — was efficiency, or breeding and weather hiding a loss.A French series of dose and harvest on the same fields, cropland only — EuropeAgriDB and the per-crop budgets of Lin et al. (2026) carry it to 2019 — read across the 2022 price shock, when the dose fell for a reason that had nothing to do with agronomy. Until then, read the reference's shortfall with the bracket on it: 0.9 Mha at INRAE's plateau, 2.1 Mha with none.
Reforming biomethane with capture, and calling it negative
beccs
hydrogen and carbon removalhighThe capture credit is charged against the carbon physically in the methane, 202 gCO2/kWh, not against the 25 gCO2/kWh the biogenic convention books for burning it. On biomethane the route therefore reads negative — about -13 MtCO2 a year at full deployment.The physics is not in doubt: carbon that came out of the air last season goes underground. What is in doubt is everything around it. The model does not say whether that much biomethane exists, what land it came from, whether the digester feedstock had a better use, or whether the storage holds for a century. It is also large enough to close three quarters of the gap to the SNBC on its own, which should make a reader suspicious rather than pleased.A biomass supply chain with land use in it, and a storage integrity assumption. Neither is in this model, and the first is a research programme rather than a number.
The gap to the SNBC
perimeter_gap
accountinglowReported as a named reconciliation, never divided away.Not really contested, and listed here so the distinction is visible: a gap that is explained line by line is a result, not a discrepancy. The model counts life-cycle electricity and international bunkers; the inventory does neither.Nothing to settle. This one is arithmetic.
Carbon stored in plastic
plastic_carbon
accountinghighThe synthetic-olefin route is credited with the carbon its product holds, capped at the 3.138 tCO₂ a tonne of olefin can physically hold, and only for the biogenic share of the CO₂ fed to it. Nothing releases it afterwards.**This is the assumption the model is least able to defend, and it is listed here rather than fixed because fixing it needs an account the model does not have.** A store is not a removal. The 2019 Refinement books only the *oxidation* of fossil carbon in waste as a net emission, and puts thermal treatment with energy recovery in the energy sector — which in France is 99.6% of it; the biogenic CO₂ released there is an information item and never enters the total. The EU's own delegated regulation on permanent carbon removals (2024/2620, article 3) says outright that a product which may be exposed to high-temperature combustion, such as during waste incineration, shall not be considered to bind CO₂ permanently. The one product pool the Guidelines do recognise — harvested wood — is modelled as leaking, with half-lives of two to thirty-five years. Two consequences are visible in this game. A scenario is credited for carbon that French incinerators would return within a few years, about 7.2 MtCO₂ of fossil carbon a year across the whole fleet. And the credit grows with production, so **cutting plastic demand raises this model's net emissions** — a sufficiency lever scored as harmful, which is the clearest sign that the convention is wrong rather than merely uncertain.An end-of-life account: what the plastic put on the market comes back as, how much of it goes up a stack rather than into a landfill, and the fossil share of that. The emission factor is published and not in dispute — 2.75 tCO₂ of fossil carbon per tonne of plastic burned, IPCC Volume 5 Table 2.4 and the Citepa factor agree. What has to be argued is the link between a tonne of olefin made here and a tonne of plastic burned here, with trade in finished goods in between.

Emissions and energy posts Derived

waste_heat_share is the recoverable waste heat ADEME finds per unit of fuel burned, and waste_heat_hot_share the fraction of it above 100 °C. They are attached to the fuel, not to the sector, which is the point: heat that is a by-product of combustion disappears when the combustion does. Transport and buildings carry zero because the ADEME study is industrial. The constructive account. Every emission the game reports is built up from these posts, and every post is energy times an emission factor plus a named process term. Nothing is added at the sector level that is not in this table, which is what makes a missing sub-sector visible.

Rowsectorkindwaste_heat_sharewaste_heat_hot_shareelec_efficiency_ceiling
Passenger mobility
passenger_mobility
transportmobility000
Freight
freight_mobility
transportmobility000
Residential heating
residential_heating
buildingheat000
Tertiary heating
tertiary_heating
buildingheat000
Residential, other uses
residential_uses
buildingother000
Tertiary, other uses
tertiary_uses
buildingother000
Electricity generation
energy_production
energyother000
Hydrogen production
hydrogen_production
energyother000
Steel
steel
industryprocess0.012490.64490.11412
Ammonia
ammonia
industryprocess0.018310.43970.31091
Olefins and plastics
olefins
industryprocess0.018310.43970.31091
Cement
cement
industryprocess0.086760.83540.24128
Food-industry heat
food_heat
industryheat0.016430.32760.25011
Metals and machinery
other_metals
industryother0.061850.5560.15539
Minerals and materials
other_minerals
industryother0.087480.82830.24128
Chemicals, other
other_chemicals
industryother0.018310.43970.31091
Paper and board
other_paper
industryother0.31080.33480.19258
Other industries
other_diverse
industryother0.11130.54120.23636
Livestock
livestock
agricultureprocess000
Crops and soils
crops
agricultureprocess000
Farm and forestry engines
farm_machinery
agricultureother000

Every equation

The complete calculation, in the order it is evaluated. A name in a formula is either a lever, a constant, or another equation in this list; row.x is a field of the row being computed; and sum(table.column, condition) totals a column over the rows that satisfy the condition.

Transport — demand reallocation

Every 2020 service demand is reallocated to the 2050 categories through an explicit matrix. Reading the matrix is the only way to see that, for instance, car demand shifted to rail is then served at the occupancy and unit consumption of a train rather than a car.

NameFormulaUnitNotes and sources
shift_share
per row of passenger_shift
car_to_fuel: carFuel
car_to_gas: carGas
car_to_electric: carElectric
car_to_rail: carRail
aviation_keep: 1 - domesticAviationRail
aviation_to_rail: domesticAviationRail
default: row.share
fraction

Fixed workbook conventions come from the table; the six shares a lever drives are overridden here. The four car shares and the two aviation shares each sum to one by construction of the controls.

aviation_demand_factor(1 + aviationDemandGrowth) ** aviation_demand_horizon_yearsmultiple of 2020 demand

Growth compounded over thirty years. At the default of 0%/year it is exactly 1, which reproduces the workbook: the workbook carries 2020 air traffic straight through to 2050.

demand_2050_before_shift
per row of passenger
row.demand_2020 * (aviation_demand_factor if row.aviation == 1 else 1)Gpkm/y

Only aviation carries a demand trend. Road and rail demand is set by the modal levers, which is where the player's choices act.

passenger_flow
per row of passenger_shift
passenger[row.source].demand_2050_before_shift * (1 - passengerReduction) * row.shift_shareGpkm/y—
passenger_demand
per row of passenger
sum(passenger_shift.passenger_flow, passenger_shift.target == row.id)Gpkm/y—
aviation_efficiency_factor(1 - aviationEfficiency) ** aviation_horizon_yearsfraction of today's consumption

A yearly improvement compounded to 2050. At the default of 0%/year it is exactly 1, which reproduces the workbook: the workbook gives 2050 aviation the same consumption per passenger-kilometre as today.

unit_consumption_2050
per row of passenger
row.unit_consumption * (aviation_efficiency_factor if row.aviation == 1 else 1)MWh per million vehicle-kilometres

Only aviation carries an efficiency trend. Road and rail keep the workbook's 2050 values, in which the shift between vehicle types already does the work.

passenger_energy
per row of passenger
row.passenger_demand * row.unit_consumption_2050 / row.occupancy / 100TWh/y

Unit consumption is per vehicle-kilometre, so dividing by occupancy converts it to passenger-kilometres. The factor 100 carries the unit change from the workbook's mixed units to TWh.

freight_shift_share
per row of freight_shift
truck_to_h2: truckH2
truck_to_thermal: truckThermal
truck_to_electric: truckElectric
truck_to_rail: truckRail
air_to_sea: freightAviationSea
air_keep: 1 - freightAviationSea
default: row.share
fraction—
freight_flow
per row of freight_shift
freight[row.source].demand_2020 * (1 - freightReduction) * row.freight_shift_shareGtkm/y—
freight_demand
per row of freight
sum(freight_shift.freight_flow, freight_shift.target == row.id)Gtkm/y—
freight_energy
per row of freight
row.freight_demand * row.unit_consumption / 100TWh/y—

Transport — energy by vector

Liquid fuel is split between biofuel and e-fuel by the biofuel-share lever, and the e-fuel half is converted back into the electricity needed to make it, at the declared conversion efficiency. Hydrogen is handed on as hydrogen: the posts module converts it through the production mix, like every other consumer's. That is why an electrified transport scenario still shows a large electricity demand even where no vehicle is plugged in.

NameFormulaUnitNotes and sources
passenger_liquidsum(passenger.passenger_energy, passenger.vector == "liquid")TWh/y—
passenger_gassum(passenger.passenger_energy, passenger.vector == "gas")TWh/y—
passenger_electricity_directsum(passenger.passenger_energy, passenger.vector == "electricity")TWh/y—
passenger_hydrogensum(passenger.passenger_energy, passenger.vector == "hydrogen")TWh/y—
freight_liquidsum(freight.freight_energy, freight.vector == "liquid")TWh/y—
freight_gassum(freight.freight_energy, freight.vector == "gas")TWh/y—
freight_electricity_directsum(freight.freight_energy, freight.vector == "electricity")TWh/y—
freight_hydrogensum(freight.freight_energy, freight.vector == "hydrogen")TWh/y—
passenger_biofuelpassenger_liquid * biofuelShareTWh/y—
passenger_electricity_efuelpassenger_liquid * (1 - biofuelShare) / efficiency_electricity_to_efuelTWh/y—
freight_biofuelfreight_liquid * biofuelShareTWh/y—
freight_electricity_efuelfreight_liquid * (1 - biofuelShare) / efficiency_electricity_to_efuelTWh/y—

Building heating

The stock says how much heat the country needs and anchors the winter peak. What covers that heat is set by target: so many TWh of wood, such a share of the need on electricity, and that electric heat split across five technologies with genuinely different efficiencies — in season and, which is what the peak cares about, on the coldest evening. Gas is the residual. It is not a target and has no slider: it absorbs whatever the other choices leave uncovered, which is what makes the account close by construction and what makes the cost of not choosing visible. If the targets over-subscribe the need, gas goes to zero and a surplus is reported rather than silently absorbed.

NameFormulaUnitNotes and sources
need_2020
per row of building_segment
row.surface_2020 * row.surfacic_need / 1000000000 * building_need_calibrationTWh/y

Surface times surfacic need, scaled by the one stock-wide calibration that lands the 2020 account on the observed 359.34 TWh.

need_2050
per row of building_segment
row.need_2020 * (1 - bldgRetrofit) * (1 - bldgSobriety)TWh/y

Retrofit and temperature-related sufficiency act on the need itself, before any heating system sees it, so they benefit every vector alike and they are the only levers that lower the peak without changing a single technology.

building_heat_needsum(building_segment.need_2050)TWh/y—
building_heat_need_residentialsum(building_segment.need_2050, building_segment.building_type != "tertiary")TWh/y

Apartments and houses. The stock carries the building type, so the residential/tertiary split of every vector is counted rather than assumed — the allocation is national, but the need it is applied to is not.

building_residential_sharebuilding_heat_need_residential / building_heat_needfraction—
vector_need_2020
per row of building_vector
sum(building_segment.need_2020, building_segment.system == row.system)TWh/y—
vector_peak_load_2020
per row of building_vector
row.vector_need_2020 * row.unit_2020 / row.peak_efficiency * row.peak_shareTWh/y equivalent

The 2020 stock at its own peak efficiencies. This is the denominator of the peak anchor and the only thing the segment table is still needed for once the allocation is set by target.

building_peak_load_2020sum(building_vector.vector_peak_load_2020, building_vector.vector == "electricity")TWh/y equivalent—
heat_from_biomassbldgBiomassTwh * building_vector["biomass_wood"].seasonal_efficiencyTWh/y

Wood burned times the boiler efficiency gives the heat delivered.

heat_from_electricitybldgElectricShare * building_heat_needTWh/y—
heat_from_district_wooddistrictWoodTwh * building_vector["district_wood"].seasonal_efficiencyTWh/y—
heat_from_district_wastedistrictWasteTwhTWh/y

Recovered heat is delivered as it is found; no conversion, no losses charged.

heat_targetedheat_from_biomass + heat_from_electricity + heat_from_district_wood + heat_from_district_wasteTWh/y—
heat_from_gasmax(0, building_heat_need - heat_targeted)TWh/y

The residual, floored at zero. Gas is the only thing here without a slider, which is the point: it is what a scenario is left burning.

building_heat_surplusmax(0, heat_targeted - building_heat_need)TWh/y

What the targets over-subscribe, once gas has gone to zero. It is reported rather than absorbed, because a scenario that has quietly allocated more heat than the stock needs is a scenario whose numbers should not be trusted, and the interface says so.

electric_split_totalbldgElecAirAir + bldgElecAirWater + bldgElecResistance + bldgElecHybrid + bldgElecDistrictHPfraction

The interface rebalances these five to 100%, but a scenario file is just JSON and can be hand-edited. Normalising here means the electric heat is shared out rather than over- or under-allocated, so the five shares cannot between them invent heat that the target did not grant.

heat_air_airheat_from_electricity * bldgElecAirAir / electric_split_total if electric_split_total > 0 else 0TWh/y—
heat_air_waterheat_from_electricity * bldgElecAirWater / electric_split_total if electric_split_total > 0 else 0TWh/y—
heat_resistanceheat_from_electricity * bldgElecResistance / electric_split_total if electric_split_total > 0 else 0TWh/y—
heat_hybridheat_from_electricity * bldgElecHybrid / electric_split_total if electric_split_total > 0 else 0TWh/y—
heat_district_hpheat_from_electricity * bldgElecDistrictHP / electric_split_total if electric_split_total > 0 else 0TWh/y—
electricity_air_airheat_air_air / building_vector["air_air_electricity"].seasonal_efficiencyTWh/y—
electricity_air_waterheat_air_water / building_vector["air_water_electricity"].seasonal_efficiencyTWh/y—
electricity_resistanceheat_resistance / building_vector["resistance_electricity"].seasonal_efficiencyTWh/y—
electricity_hybridheat_hybrid * building_vector["hybrid_electricity"].unit_2050 / building_vector["hybrid_electricity"].seasonal_efficiencyTWh/y

A hybrid runs 95% of its output on electricity over the year and the rest on gas — and reverses that on the coldest evening, which is what the peak calculation picks up.

gas_hybridheat_hybrid * building_vector["hybrid_gas"].unit_2050 / building_vector["hybrid_gas"].seasonal_efficiencyTWh/y—
electricity_district_hpheat_district_hp / building_vector["district_electricity"].seasonal_efficiencyTWh/y—
building_electricityelectricity_air_air + electricity_air_water + electricity_resistance + electricity_hybrid + electricity_district_hpTWh/y—
building_gasheat_from_gas / building_vector["gas_gas"].seasonal_efficiency + gas_hybridTWh/y

The residual heat at a boiler efficiency, plus the gas a hybrid burns over the year. Network gas is charged the same efficiency as a boiler — the allocation no longer distinguishes a network from an individual installation, which slightly understates distribution losses and is stated rather than hidden.

building_woodbldgBiomassTwh + districtWoodTwhTWh/y—
building_waste_heatdistrictWasteTwhTWh/y—
building_liquid0TWh/y

Zero by construction: fuel oil is not one of the targets and gas is the residual, so no scenario can leave heating oil in 2050. Carried so the account stays constructive and so the post table keeps a line that would reappear the moment fuel became a choice again.

building_coal0TWh/y—
building_electricity_residentialbuilding_electricity * building_residential_shareTWh/y—
building_gas_residentialbuilding_gas * building_residential_shareTWh/y—
building_wood_residentialbuilding_wood * building_residential_shareTWh/y—
building_liquid_residentialbuilding_liquid * building_residential_shareTWh/y—
building_coal_residentialbuilding_coal * building_residential_shareTWh/y—
building_peak_load_2050heat_air_air / building_vector["air_air_electricity"].peak_efficiency + heat_air_water / building_vector["air_water_electricity"].peak_efficiency + heat_resistance / building_vector["resistance_electricity"].peak_efficiency + heat_hybrid * building_vector["hybrid_electricity"].unit_2050 / building_vector["hybrid_electricity"].peak_efficiency * building_vector["hybrid_electricity"].peak_share + heat_district_hp / building_vector["district_electricity"].peak_efficiencyTWh/y equivalent

Each technology at its peak efficiency rather than its seasonal one, and only the share of it actually running on electricity then. Those two things differ by technology in ways a single COP cannot express: air-air and air-water both fall to 2.0, a network heat pump to 1.5, resistance stays at 1, and a hybrid puts 70% of its peak on gas.

building_peakbuilding_peak_2020 * building_peak_load_2050 / building_peak_load_2020GW

The peak-coincident electric load is built for 2020 and for 2050 from the same rule, and the observed 2020 peak scales their ratio, so the anchor checks itself: run the 2020 stock through this and it returns 40 GW exactly. Electric space heating only, as in the source. Transport, industry and electrolysis change annual electricity but never this figure — a real asymmetry of the model, stated rather than silently patched.

building_surface_2020sum(building_segment.surface_2020) / 1000000Mm²—
building_surface_residentialsum(building_segment.surface_2020, building_segment.building_type != "tertiary") / 1000000Mm²—
building_surface_coveragebuilding_surface_2020 / floor_area_totalfraction

What share of France's floor area this stock covers: 3 654.9 Mm² of heated surface against the 4 200 Mm² ADEME reports after CEREN, so 87%. Every €/m² the model prints is per square metre of heated stock.

heat_pump_surface_2050building_surface_2020 * (heat_air_air + heat_air_water + heat_hybrid) / building_heat_needMm²

Surface in proportion to the heat that heat pumps cover. The allocation is national and carries no stock of its own, so this is a conversion rather than a count — enough to price the equipment, not enough to say which buildings got it.

heat_pump_surface_2020sum(building_segment.surface_2020, building_segment.system == "air_air" or building_segment.system == "air_water" or building_segment.system == "hybrid") / 1000000Mm²—
heat_pump_surface_addedmax(0, heat_pump_surface_2050 - heat_pump_surface_2020)Mm²

The surface that gains a heat pump it did not have in 2020 — what the scenario has to buy and install.

What the country builds, and what it takes

Stage A of the construction module. Until v0.20 no square metre was built anywhere in this model. Cement volume was a bare index — a player could remove a third of French cement by moving cementReduction without saying which building was not built — and the materials account knew about wind turbines and cars but not about buildings, which are the largest mineral flow in any industrial country. The chain is short and every step is an observation. Two floor-area levers set how much is built; the construction_use table says how many kilogrammes of cement and of steel a square metre of each destination carries, and how much of the country's cement no square metre reaches; a timber share converts part of that floor area to a frame that carries less of both and more wood. Cement demand then drives cement production, which is the change this stage exists to make. Three things this stage deliberately does not do, each because the evidence says it should not. It does not drive steel. New buildings are roughly a tenth of French steel use and about a sixth of the construction envelope, the rest being civil engineering, renovation and cladding; and construction itself is 43% of a demand whose other 57% is vehicles, machinery, tubes and metalware that nothing here models. Construction steel is computed and put beside production in the materials account, and steelGrowth remains the driver. A model that set steel output from floor area would be wrong by a factor of ten. It does not make the building stock grow. New floor area consumes cement here and heats nothing: building_heat_need still reads a stock frozen at its base-year surface. That is a real and named gap — the land account has been booking artificialised hectares since stage A of the land module while the building account stayed still — and it is stage B. It does not move the harvested-wood-products pool. Construction timber is compared with the long-lived harvest the forest account already computes, and the headroom is reported; the pool's inflow is calibrated on the inventory and is left alone. Making construction demand set the long-lived share is stage C, and it needs a sawn-versus-panel split the base year does not carry.

NameFormulaUnitNotes and sources
construction_floor_housingnewHousingMm²/y—
construction_floor_othernewNonResidentialMm²/y—
construction_floor_totalconstruction_floor_housing + construction_floor_otherMm²/y—
construction_timber_extraconstruction_floor_total * (timberShare - timber_share_base)Mm²/y

The floor area a scenario frames in timber beyond what the country already does. The base year's timber buildings are already inside the observed cement and steel tonnages the table carries, so booking the whole timber share as a saving would count today's timber twice. It can go negative — a scenario is free to build less in timber than the country does now — and then the sign works the other way, which is correct and is the reason it is not clamped.

construction_cement_savedconstruction_timber_extra * timber_cement_savingkt/y

Megagrammes per square metre are kilotonnes per square megametre, so the unit carries itself: Mm² times kg/m² is kt.

construction_steel_savedconstruction_timber_extra * timber_steel_savingkt/y—
construction_use_cement
per row of construction_use
housing_new: construction_floor_housing * row.cement_intensity
other_new: construction_floor_other * row.cement_intensity
civil_works: row.cement_2024 * civilWorksVolume
unattributed: row.cement_2024
kt/y

How much cement each end use asks for at the horizon. The two new-build rows are floor area times an intensity, which is the whole point of the module; civil works are a base-year tonnage times an index, because no square metre drives a road; and the residual row is held where it is, since a slider on a quantity nobody has attributed would be a slider on an accounting gap. An edition that has not been through its own end-use map declares zero intensities and puts all of its cement in the residual row. The arithmetic then returns the base-year tonnage unchanged, which is what the three provisional editions do and why they are unaffected by this module.

construction_use_steel
per row of construction_use
housing_new: construction_floor_housing * row.steel_intensity
other_new: construction_floor_other * row.steel_intensity
civil_works: row.steel_2024
unattributed: row.steel_2024
kt/y—
cement_demandmax(0, sum(construction_use.construction_use_cement) - construction_cement_saved)kt cement/y

The country's cement demand at the horizon, before any change in how much cement a cubic metre of concrete carries. At the reference it is the base-year total to the last digit: the four rows sum to it by construction, every index is 1, and the timber share sits on its own base — which is what lets this stage replace an exogenous volume without moving a single published result.

construction_steel_demandmax(0, sum(construction_use.construction_use_steel) - construction_steel_saved)kt/y

Structural and reinforcing steel for new buildings, computed and never read back: steelGrowth still sets what the country's mills make. The materials account puts the two side by side, which is the honest comparison — and the gap between them is the point. New buildings are a small part of construction steel, construction is 43% of French steel demand, and the rest is transport, machinery and metalware that nothing in this model drives.

construction_timber_floorconstruction_floor_total * timberShareMm²/y—
construction_timber_woodconstruction_timber_floor * timber_wood_intensityMm³/y of sawn product—
construction_timber_roundwoodconstruction_timber_wood * sawnwood_roundwood_factorMm³/y

What the built square metres ask of the forest, in the standing-stock volume the harvest is written in. It is compared with land_harvest_long_lived further down rather than subtracted from it: the long-lived share is a supply decision the player makes with harvestToProducts, and this is the demand that decision has to meet.

Industry — production volumes

NameFormulaUnitNotes and sources
steel_bf_productionsteel_bf_base_production * (1 - steelDRI) * (1 + steelGrowth)kt/y—
steel_dri_productionsteel_bf_base_production * steelDRI * (1 + steelGrowth)kt/y—
steel_eaf_productionsteel_eaf_base_production * (1 + steelGrowth)kt/y—
olefin_productionolefin_base_production * olefinRoute * (1 - plasticReduction)kt/y—
cement_productioncement_demand * clinkerRate * (1 - cementReduction)kt clinker/y

Demand now sets this, and it did not before v0.20. Until then the volume was cement_base_production — a bare base-year tonnage — times a slider, so a scenario could remove a third of the country's cement without naming a building it had not built. It is now the demand the construction module computes from floor area, civil works and the share nothing attributes, times the clinker ratio, times what a cubic metre of concrete still asks of the cement works. cementReduction survives the change and finally has a driver: it is no longer "less cement" but less cement per unit of works — leaner mixes, thinner structures, more supplementary material inside the concrete rather than inside the cement, which is what clinkerRate does. The two are not the same lever and the annex says so. What this equation still does not do is import. About a seventh of French cement consumption is imported, and clinker imports on top of that put roughly a quarter of the clinker behind French cement in a kiln outside France. Demand here drives domestic output one for one, which overstates what a French kiln burns and, in the other direction, quietly leaves the imported quarter's carbon outside the perimeter. Named rather than corrected: a domestic-supply share would be a fifth lever on a chain that already has four.

chain_production
per row of industry_chain
steel_bf: steel_bf_production
steel_dri: steel_dri_production
steel_eaf: steel_eaf_production
ammonia: chain_ammonia_production
olefins: olefin_production
cement: cement_production
kt/y—

Industry — energy and process emissions

Energy is production times unit consumption. Process emissions are the part that no change of fuel can remove: the carbon of the limestone, the carbon locked into the product, and the residue of the blast-furnace route once its coal has been counted as energy.

NameFormulaUnitNotes and sources
chain_electricity
per row of industry_chain
row.chain_production * row.electricity / 1000TWh/y—
chain_gas
per row of industry_chain
row.chain_production * row.gas / 1000TWh/y—
chain_coal
per row of industry_chain
row.chain_production * row.coal / 1000TWh/y—
chain_liquid
per row of industry_chain
row.chain_production * row.liquid / 1000TWh/y

Only the cement kiln burns liquid fuel among the five chains, and it burns more of it than of gas or coal.

chain_hydrogen
per row of industry_chain
row.chain_production * row.hydrogen / 1000TWh/y—
steel_bf_process_residualsteel_bf_direct_intensity - industry_chain["steel_bf"].coal * ef_coal / 1000tCO₂ per tonne of steel

A remainder, not a measurement. The route's direct total, steel_bf_direct_intensity, less the coal the chain row charges at the published coal factor: 1.76 − 5.047 MWh × 340 g = 0.044 tCO₂ per tonne. The coal is counted once, as energy, where the fuel levers can reach it; this keeps the rest. The teaching workbook had charged both, so the coal carbon was counted twice until this line existed. The rest is physically the limestone flux — 0.27 t per tonne of steel, +0.12 tCO₂ — less the carbon that stays in the steel, −0.04, less whatever leaves the site in blast-furnace and coke-oven gas. 0.044 is inside that band, but it is the difference of two numbers of order 1.7, so a 2% revision of either moves it by 78%. Treat it as a closure, and build it from the flux if it ever matters.

chain_process_per_tonne
per row of industry_chain
steel_bf: steel_bf_process_residual
steel_dri: steel_eaf_process_per_tonne
steel_eaf: steel_eaf_process_per_tonne
olefins: -olefin_carbon_per_tonne * biogenicCO2
cement: cement_process_per_tonne * (1 - carbonCapture)
default: 0
tCO₂ per tonne of product

Emissions no change of fuel can remove: the limestone carbon in cement, the carbon locked into synthetic olefins — a credit, hence negative — the blast-furnace residue left once its coal has been counted as energy, and, since 0.27.0, the electrodes and charge carbon of the two electric-furnace routes.

chain_emissions_per_tonne
per row of industry_chain
row.coal * ef_coal / 1000 + row.chain_process_per_tonnetCO₂ per tonne of product

What the plant emits on site, per tonne of product. The cost model charges the carbon price on exactly this quantity, so the cost and the emissions account can never describe different plants.

chain_process
per row of industry_chain
row.chain_production * row.chain_process_per_tonne / 1000MtCO₂/y—
food_steamfood_steam_demand * (1 - foodEfficiency)TWh/y—
food_direct_heatfood_direct_heat_demand * (1 - foodEfficiency)TWh/y—
food_electricity(food_steam * foodHPSteam + food_direct_heat * foodHPDirect) / food_heat_pump_copTWh/y

Heat delivered by heat pumps, divided by their coefficient of performance.

food_gasfood_steam * (1 - foodHPSteam) + food_direct_heat * (1 - foodHPDirect)TWh/y—

The rest of industry

Seventeen manufacturing branches the game does not model as value chains — metals and machinery, minerals, the rest of chemistry, paper, and a diverse remainder. Together they are about 174 TWh today, 68 of it electricity, more than the five modelled chains use between them. Output and processes move on separate levers because the source scenario mixes the two: it electrifies, and it also multiplies textile output by 8.5.

NameFormulaUnitNotes and sources
other_energy
per row of industry_other
row.e00 + (row.e10 - row.e00) * otherIndustryVolume + (row.e01 - row.e00) * otherIndustryProcess + (row.e11 - row.e10 - row.e01 + row.e00) * otherIndustryVolume * otherIndustryProcessTWh/y, or MtCO₂/y for the process rows

Bilinear interpolation between the four corners. It is exact at all four, so at the default levers the block reproduces the published 2050 processes applied to today's output, and at (100%, 100%) it reproduces the source scenario to the last decimal.

other_industry_energysum(industry_other.other_energy, industry_other.carrier != "process")TWh/y—
other_industry_electricitysum(industry_other.other_energy, industry_other.carrier == "electricity")TWh/y—

The constructive account — energy and emissions by post

One row per sub-sector, one column per energy carrier. Sector totals are sums of this table and nothing else. Electricity is kept in three columns — used directly, used to make hydrogen, used to make e-fuel — because the three have very different implications for the power system even though they carry the same emission factor.

NameFormulaUnitNotes and sources
energy_electricity_direct_raw
per row of post
passenger_mobility: passenger_electricity_direct
freight_mobility: freight_electricity_direct
residential_heating: building_electricity_residential
tertiary_heating: building_electricity - building_electricity_residential
residential_uses: usages_electricity_residential
tertiary_uses: usages_electricity_tertiary
steel: sum(industry_chain.chain_electricity, industry_chain.subpost == "steel")
ammonia: sum(industry_chain.chain_electricity, industry_chain.subpost == "ammonia")
olefins: sum(industry_chain.chain_electricity, industry_chain.subpost == "olefins")
cement: sum(industry_chain.chain_electricity, industry_chain.subpost == "cement")
food_heat: food_electricity
other_metals: sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "electricity")
other_minerals: sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "electricity")
other_chemicals: sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "electricity")
other_paper: sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "electricity")
other_diverse: sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "electricity")
energy_production: 0
hydrogen_production: 0
livestock: 0
crops: 0
farm_machinery: 0
TWh/y—
energy_hydrogen
per row of post
passenger_mobility: passenger_hydrogen
freight_mobility: freight_hydrogen
steel: sum(industry_chain.chain_hydrogen, industry_chain.subpost == "steel")
ammonia: sum(industry_chain.chain_hydrogen, industry_chain.subpost == "ammonia")
olefins: sum(industry_chain.chain_hydrogen, industry_chain.subpost == "olefins")
food_heat: food_hydrogen
other_metals: sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "hydrogen")
other_minerals: sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "hydrogen")
other_chemicals: sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "hydrogen")
other_paper: sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "hydrogen")
other_diverse: sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "hydrogen")
default: 0
TWh/y

The hydrogen each post consumes, before anything is said about how it was made. Until v0.12.0 this was converted straight into electricity at the electrolyser efficiency, which hard-coded one production route into every consumer of hydrogen in the model. That release undid it for industry but left the two transport rows pointing at figures the transport module had already divided by that efficiency, so transport hydrogen was converted twice — 2.78 MWh of electricity per MWh of hydrogen instead of 1.67 — until v0.14.3.

hydrogen_mix_totalh2Electrolysis + h2Smr + h2AtrCcs if h2Electrolysis + h2Smr + h2AtrCcs > 0 else 1fraction

Normalised in the model rather than trusted to the interface, like the building and generation mixes. Falls back to one if a scenario zeroes all three, since hydrogen has to come from somewhere.

hydrogen_demand_totalsum(post.energy_hydrogen)TWh/y—
route_share
per row of hydrogen_route
electrolysis: h2Electrolysis / hydrogen_mix_total
smr: h2Smr / hydrogen_mix_total
atr_ccs: h2AtrCcs / hydrogen_mix_total
fraction—
route_hydrogen
per row of hydrogen_route
hydrogen_demand_total * row.route_shareTWh/y—
route_electricity_per_mwh
per row of hydrogen_route
electrolysis: 1 / efficiency_electricity_to_h2
default: row.electricity
MWh of electricity per MWh of hydrogen

The electrolyser's figure is derived from the conversion efficiency the rest of the model already uses, rather than declared again in the table. Two copies of that number would be two numbers.

route_methane
per row of hydrogen_route
row.route_hydrogen * row.methaneTWh/y—
route_captured_methane
per row of hydrogen_route
row.route_methane * row.carbon_capturedTWh/y—
hydrogen_electricity_totalsumproduct(hydrogen_route.route_hydrogen, hydrogen_route.route_electricity_per_mwh)TWh/y—
hydrogen_methane_totalsum(hydrogen_route.route_methane)TWh/y

Feedstock and fuel together. It draws on the same methane the buildings and the power stations want, and the scoreboard counts it there — which is the trade-off a reforming route actually makes.

hydrogen_carbon_capturedsum(hydrogen_route.route_captured_methane) * carbon_in_methane / 1000MtCO₂/y

The carbon in the reformed methane that ends underground. Charged against the physical carbon the methane carries, not against efGas: what a capture plant removes is molecules, and efGas at 25 gCO₂/kWh is a biogenic accounting convention rather than a measurement of what is in the pipe. The consequence is deliberate and contested. On biomethane this makes hydrogen production carbon-negative — the physics of BECCS, and the place where this model will most easily mislead a reader who has not read the controversy tab.

hydrogen_electricity_per_mwhhydrogen_electricity_total / hydrogen_demand_total if hydrogen_demand_total > 0 else 0MWh of electricity per MWh of hydrogen

The mix's average. Each consumer's electricity-for-hydrogen is its own hydrogen times this, so reforming half the country's hydrogen halves the electricity every hydrogen user draws.

energy_electricity_hydrogen
per row of post
row.energy_hydrogen * hydrogen_electricity_per_mwhTWh/y—
energy_electricity_efuel
per row of post
passenger_mobility: passenger_electricity_efuel
freight_mobility: freight_electricity_efuel
default: 0
TWh/y—
energy_gas_raw
per row of post
passenger_mobility: passenger_gas
freight_mobility: freight_gas
residential_heating: building_gas_residential
tertiary_heating: building_gas - building_gas_residential
residential_uses: usages_gas_residential
tertiary_uses: usages_gas_tertiary
energy_production: generation_gas_fuel
hydrogen_production: hydrogen_methane_total
steel: sum(industry_chain.chain_gas, industry_chain.subpost == "steel")
ammonia: sum(industry_chain.chain_gas, industry_chain.subpost == "ammonia")
olefins: sum(industry_chain.chain_gas, industry_chain.subpost == "olefins")
cement: sum(industry_chain.chain_gas, industry_chain.subpost == "cement")
food_heat: food_gas
other_metals: sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "gas") + sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "steam")
other_minerals: sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "gas") + sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "steam")
other_chemicals: sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "gas") + sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "steam")
other_paper: sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "gas") + sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "steam")
other_diverse: sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "gas") + sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "steam")
livestock: 0
crops: 0
farm_machinery: 0
TWh/y

Before any waste heat is recovered against it.

energy_biofuel_raw
per row of post
passenger_mobility: passenger_biofuel
freight_mobility: freight_biofuel
cement: sum(industry_chain.chain_liquid, industry_chain.subpost == "cement")
residential_heating: building_liquid_residential
tertiary_heating: building_liquid - building_liquid_residential
residential_uses: usages_liquid_residential
tertiary_uses: usages_liquid_tertiary
other_metals: sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "oil")
other_minerals: sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "oil")
other_chemicals: sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "oil")
other_paper: sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "oil")
other_diverse: sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "oil")
default: 0
TWh/y—
energy_wood_raw
per row of post
residential_heating: building_wood_residential
tertiary_heating: building_wood - building_wood_residential
residential_uses: usages_wood_residential
tertiary_uses: usages_wood_tertiary
energy_production: generation_wood_fuel
other_metals: sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "biomass")
other_minerals: sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "biomass")
other_chemicals: sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "biomass")
other_paper: sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "biomass")
other_diverse: sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "biomass")
default: 0
TWh/y—
energy_coal_raw
per row of post
steel: sum(industry_chain.chain_coal, industry_chain.subpost == "steel")
cement: sum(industry_chain.chain_coal, industry_chain.subpost == "cement")
residential_heating: building_coal_residential
tertiary_heating: building_coal - building_coal_residential
other_metals: sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "coal")
other_minerals: sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "coal")
other_chemicals: sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "coal")
other_paper: sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "coal")
other_diverse: sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "coal")
default: 0
TWh/y—
efficiency_elec_factor
per row of post
1 - industryEfficiency * row.elec_efficiency_ceilingfraction of the electricity remaining

The effort lever times this post's own ceiling, so the lever can never buy more efficiency than RTE identified for that branch. Only direct electricity is affected: the electricity that goes into hydrogen and e-fuel is set by conversion efficiencies declared elsewhere.

efficiency_fuel_factor
per row of post
1 - industryEfficiency * (fuel_efficiency_ceiling if row.sector == "industry" else 0)fraction of the fuel remaining

RTE gives no branch breakdown on the fuel side, so one ceiling applies across industry. Transport and buildings are untouched: their own levers already carry demand and equipment efficiency.

energy_electricity_direct
per row of post
row.energy_electricity_direct_raw * row.efficiency_elec_factorTWh/y—
energy_gas_gross
per row of post
row.energy_gas_raw * row.efficiency_fuel_factorTWh/y—
energy_coal
per row of post
row.energy_coal_raw * row.efficiency_fuel_factorTWh/y—
energy_biofuel
per row of post
row.energy_biofuel_raw * row.efficiency_fuel_factorTWh/y—
energy_wood
per row of post
row.energy_wood_raw * row.efficiency_fuel_factorTWh/y—
combustion_fuel_gross
per row of post
row.energy_gas_gross + row.energy_coal + row.energy_biofuel + row.energy_woodTWh/y

Everything burned, before recovery. ADEME expresses the waste-heat gisement against exactly this — fossil fuels and biomass together.

waste_heat_potential
per row of post
row.combustion_fuel_gross * row.waste_heat_shareTWh/y

The recoverable gisement of this post, at the fuel it actually burns in this scenario. It is not a fixed reserve: electrify the heat and the gisement goes with it, because there is no combustion left to reject heat from. That is the trade-off the lever exists to show.

waste_heat_recovered
per row of post
min(row.waste_heat_potential * wasteHeatRecovery, row.energy_gas_gross)TWh/y

Recovered heat is assumed to displace gas, the marginal fuel, and cannot displace more gas than the post burns. The second-order feedback — less gas means a slightly smaller gisement — is neglected; at full recovery it is under half a percent.

energy_gas
per row of post
row.energy_gas_gross - row.waste_heat_recoveredTWh/y—
energy_electricity_total
per row of post
row.energy_electricity_direct + row.energy_electricity_hydrogen + row.energy_electricity_efuelTWh/y—
energy_total
per row of post
row.energy_electricity_total + row.energy_gas + row.energy_biofuel + row.energy_wood + row.energy_coalTWh/y—
emissions_electricity
per row of post
0MtCO₂/y

Zero, and that is the accounting scope, not an omission. The model is a scope-1 account: emissions are booked where the combustion happens. A power station's emissions belong to the power station, so they sit on the energy_production post, computed from the fuel the chosen mix actually burns — not spread back over everyone who used a kilowatt-hour. This is the same convention SECTEN and the SNBC use, which is why the national reconciliation no longer needs a life-cycle line to undo it. The consequence a reader should hold onto: electrifying a sector moves its emissions rather than removing them, and where they land depends on the electricity mix, which is a separate choice.

emissions_gas
per row of post
row.energy_gas * efGas / 1000MtCO₂/y—
emissions_biofuel
per row of post
row.energy_biofuel * efLiquid / 1000MtCO₂/y—
emissions_wood
per row of post
row.energy_wood * efWood / 1000MtCO₂/y—
emissions_coal
per row of post
row.energy_coal * ef_coal / 1000MtCO₂/y—
emissions_process
per row of post
steel: sum(industry_chain.chain_process, industry_chain.subpost == "steel")
ammonia: sum(industry_chain.chain_process, industry_chain.subpost == "ammonia")
olefins: sum(industry_chain.chain_process, industry_chain.subpost == "olefins")
cement: sum(industry_chain.chain_process, industry_chain.subpost == "cement")
other_metals: sum(industry_other.other_energy, industry_other.group == "metals_machinery" and industry_other.carrier == "process")
other_minerals: sum(industry_other.other_energy, industry_other.group == "minerals" and industry_other.carrier == "process")
other_chemicals: sum(industry_other.other_energy, industry_other.group == "chemicals_other" and industry_other.carrier == "process")
other_paper: sum(industry_other.other_energy, industry_other.group == "paper" and industry_other.carrier == "process")
other_diverse: sum(industry_other.other_energy, industry_other.group == "other_industries" and industry_other.carrier == "process")
hydrogen_production: -hydrogen_carbon_captured
livestock: agriculture_livestock_post
crops: agriculture_crops_post
farm_machinery: agriculture_fuel_post
default: 0
MtCO₂/y—
emissions_combustion
per row of post
row.emissions_gas + row.emissions_biofuel + row.emissions_wood + row.emissions_coal + row.emissions_processMtCO₂/y

Everything except the electricity, which the inventory attributes elsewhere.

emissions_total
per row of post
row.emissions_electricity + row.emissions_combustionMtCO₂/y—

Sector and resource totals

NameFormulaUnitNotes and sources
transport_emissionssum(post.emissions_total, post.sector == "transport")MtCO₂/y—
building_emissionssum(post.emissions_total, post.sector == "building")MtCO₂/y—
industry_emissionssum(post.emissions_total, post.sector == "industry")MtCO₂/y—
game_emissionssum(post.emissions_total)MtCO₂/y—
electricity_demand_before_power_hydrogensum(post.energy_electricity_total)TWh/y

Everything the sectors consume, before the power system's own electrolysis.

power_hydrogen_feedbackclamp(sum(generation_technology.generation_share_thermal_gas) * gasPlantHydrogen / efficiency_electricity_to_h2, 0, 0.9)fraction of total demand

The share of total electricity that goes back into making the hydrogen the gas plants burn. It depends on the mix's shares and on two efficiencies, never on the demand itself, which is what makes the loop solvable rather than iterative. Clamped below one: a fleet consuming more electricity than it produces has no solution, and the model says so by refusing to divide rather than by returning a negative demand.

electricity_demandelectricity_demand_before_power_hydrogen / (1 - power_hydrogen_feedback)TWh/y

base / (1 - k). Closing the loop in one line rather than iterating: demand sets the mix, the mix sets the fuel, the fuel sets the electrolysis, and the electrolysis is demand — but k depends only on shares and efficiencies, so the fixed point is linear. It matters. Converting the whole gas fleet adds around a ninth of national demand, and reporting that beside the total instead of inside it would let a scenario buy clean combustion for free.

electricity_direct_demandsum(post.energy_electricity_direct)TWh/y—
electricity_hydrogen_demandsum(post.energy_electricity_hydrogen)TWh/y—
electricity_efuel_demandsum(post.energy_electricity_efuel)TWh/y—
biogas_demandsum(post.energy_gas)TWh/y

The methane resource the scenario needs. It includes about 23 TWh of international air-freight fuel, which the workbook classes as gas — worth knowing before reading this against a biomethane potential.

biofuel_demandsum(post.energy_biofuel)TWh/y—
wood_demandsum(post.energy_wood)TWh/y—
coal_demandsum(post.energy_coal)TWh/y—
efficiency_savingsum(post.energy_electricity_direct_raw) - sum(post.energy_electricity_direct) + sum(post.energy_gas_raw) - sum(post.energy_gas_gross) + sum(post.energy_coal_raw) - sum(post.energy_coal) + sum(post.energy_biofuel_raw) - sum(post.energy_biofuel) + sum(post.energy_wood_raw) - sum(post.energy_wood)TWh/y

What the effort lever removes from final energy, all carriers together.

efficiency_saving_fuelsum(post.energy_gas_raw) - sum(post.energy_gas_gross) + sum(post.energy_coal_raw) - sum(post.energy_coal) + sum(post.energy_biofuel_raw) - sum(post.energy_biofuel) + sum(post.energy_wood_raw) - sum(post.energy_wood)TWh/y

The fuel part of the saving. It is the part that also removes waste heat, which is why it is reported separately from the electricity.

waste_heat_potential_totalsum(post.waste_heat_potential)TWh/y—
waste_heat_recovered_totalsum(post.waste_heat_recovered)TWh/y—
waste_heat_potential_hotsumproduct(post.waste_heat_potential, post.waste_heat_hot_share)TWh/y

The part of the gisement above 100 °C, which is the part that can displace process heat directly.

total_final_energysum(post.energy_total)TWh/y—
electric_shareelectricity_demand / total_final_energyfraction—

Land, forest and the carbon sink

Stage A of the land module. It replaces a slider that had no driver — a natural sink set by hand, anywhere between 5 and 40 MtCO₂e absorbed — with a physical account: seven land classes that add up to a fixed territory, three flows that move hectares between them, and a forest whose sink is an identity in cubic metres rather than a number somebody chose. Three things are worth understanding before reading the formulas. The account closes by construction, and nothing absorbs a residual. Every flow is a signed transfer with a named source and a named destination, and the destination gains exactly what the source loses, so the seven classes sum to the same territory at every position of every lever. Nothing is clamped: land_clamped_kha reports how much flow a class could not have supplied, and it is zero everywhere inside the declared bounds. Clamping would have been the alternative, and it would have broken the closure it was meant to protect. The forest sink is k · (P·A − M·A − H) and nothing else. Gross production less mortality less removals, in cubic metres, times a carbon coefficient. A harvest lever therefore moves the sink, which is exactly the argument the forestry literature is having, and a wood-heavy scenario no longer gets its biomass for free. What the identity does not book is substitution — the fossil fuel and the concrete that wood displaces — for the reason the whole model is built on: the game already charges fossil fuel where it burns, so a substitution credit here would count it twice. The base year is checked, the horizon is not. A parallel set of *_2024 equations recomputes each pool at the base year, on base-year quantities and with no climate factor, and the tests hold them against the published inventory pool by pool. The 2050 figures are results, and two of them are uncomfortable: under the severe climate case with a hard harvest the forest becomes a net source, which is reachable inside the declared bounds and is reported rather than clamped away. Read the 2050 sink as an endpoint, not as an average — published projections usually quote a 2020–2050 mean, which is higher because the sink is still falling.

NameFormulaUnitNotes and sources
land_setting_artificialisationland_module_active * artificialisationRate + (1 - land_module_active) * artificialisation_rate_basekha/y

The module's switch applied to a lever. Where land_module_active is 0 the whole module is read at its base year, so a package that does not carry it reports no land movement rather than another country's, and a lever hidden in that package cannot move a number. Both sides always evaluate — this is arithmetic and never a branch — so the three back-ends see one expression and cannot take different paths through it.

land_setting_afforestationland_module_active * afforestationRate + (1 - land_module_active) * afforestation_rate_basekha/y—
land_setting_grasslandland_module_active * grasslandConversion + (1 - land_module_active) * grassland_conversion_basekha/y—
land_setting_soil_practicesland_module_active * soilCarbonPractices + (1 - land_module_active) * soil_practice_basefraction of the identified potential—
land_setting_harvestland_module_active * forestHarvest + (1 - land_module_active) * forest_harvest_baseMm³/y—
land_setting_long_livedland_module_active * harvestToProducts + (1 - land_module_active) * hwp_long_lived_share_basefraction of the harvest—
land_setting_peat_rewettingland_module_active * peatRewetting + (1 - land_module_active) * peat_rewetting_basefraction of the drained organic soil

The same switch on the peat lever. It is a share of the drained organic soil rewetted by the horizon, not a rate: rewetting is a one-off change of state, and a country that has already rewetted part of its peat declares that as peat_rewetting_base so the base year reads what it observed rather than a bare zero.

forest_production_factorland_module_active * sum(forest_climate.production_factor, forest_climate.position == forestClimate) + (1 - land_module_active)factor on the base-year production

The climate case, read out of the table by the position the control sits at — a plain filtered column total, the same idiom the electricity mix uses, and no loader change. Switched off, the factor is 1: a forest whose growth has not changed, which is the state the base-year check is written in.

forest_mortality_factorland_module_active * sum(forest_climate.mortality_factor, forest_climate.position == forestClimate) + (1 - land_module_active)factor on the base-year mortality—
land_flow_artificialisedland_setting_artificialisation * land_horizon_years / 1000Mha over the horizon

A rate in thousand hectares a year, sustained over the whole horizon, in million hectares. Artificialisation is measured on the land survey the account is written in, not on the cadastre: the cadastre counts parcels newly built on and the survey counts every garden and verge as well, so the two differ by a factor of two or three, and the emission content of the artificial pool only closes on the survey's rate. The cadastral measure belongs beside the result as a comparison, not inside it as the driver.

land_flow_afforestedland_setting_afforestation * land_horizon_years / 1000Mha over the horizon—
land_flow_grassland_to_arableland_setting_grassland * land_horizon_years / 1000Mha over the horizon

Signed: positive ploughs grassland into arable land, negative puts arable land back to grass. One flow rather than two levers, because the two directions are one decision and a country cannot do both at once.

land_arableland_class["arable"].area_2023 - land_flow_artificialised * artificialisation_to_arable_share + land_flow_grassland_to_arableMha

Land take draws on three named classes and the semi-natural residual, and the four shares are declared rather than assumed. A country whose building spreads onto arable land alone declares 1, 0 and 0 and the other two terms are exactly zero; a country whose forest inventory measures how much woodland the roads and the industrial estates took declares that share too.

land_grasslandland_class["grassland"].area_2023 - land_flow_grassland_to_arable - land_flow_artificialised * artificialisation_to_grassland_shareMha—
land_perm_cropsland_class["perm_crops"].area_2023Mha

Vines and orchards. No lever moves them, and saying so as an equation rather than leaving the class out is what keeps the account a partition of the whole territory.

land_forestland_class["forest"].area_2023 + land_flow_afforested - land_flow_artificialised * artificialisation_to_forest_shareMha

The forest class of the land account, which is not the forest area the sink identity runs on: the identity uses the area available for wood production, a smaller and differently drawn perimeter. The two are kept apart on purpose, and afforestation adds hectares to this one while the identity's area stays where it is — new forest is booked at the expansion storage rate instead, because a young stand does not store like a mature one.

land_other_naturalland_class["other_natural"].area_2023 - land_flow_artificialised * (1 - artificialisation_to_arable_share - artificialisation_to_grassland_share - artificialisation_to_forest_share) - land_flow_afforestedMha

Heath, scrub, copses and bare ground — the class both other flows draw on, and the one that empties first. It is also where the largest unreconciled disagreement in the account sits: a forest inventory sees canopy closing on former heath and calls it new forest, while a land survey still sees heath, and the two published expansion rates differ by a factor of nearly three.

land_waterland_class["water"].area_2023Mha—
land_artificialland_class["artificial"].area_2023 + land_flow_artificialisedMha—
land_area_2023
per row of land_class
row.area_2023Mha

The base-year column, re-emitted as a result so the partition chart reads both of its bars from one place instead of one from the model and one from the raw table.

land_area_2050
per row of land_class
arable: land_arable
grassland: land_grassland
perm_crops: land_perm_crops
forest: land_forest
other_natural: land_other_natural
water: land_water
artificial: land_artificial
Mha

One formula per class, side by side, which is what makes the transfers auditable: every hectare that leaves a class arrives in another, and reading the seven lines together is how you see it. This is also what makes land_class a fixed-row table — the row set is derived from this map, not restated by hand.

land_peat_emission
per row of land_class
row.peat_area * (row.peat_ef - land_setting_peat_rewetting * (row.peat_ef - peat_rewetted_emission))MtCO₂e/y emitted

A drained peat soil is a chimney, and in some countries it is the largest one on the land. Per land class, the area of organic soil the inventory maps under it times the emission factor that class's drained peat carries, with the share the player rewets moved onto the much smaller wet factor. The two are declared in land_class beside the area, because an organic-soil area is a fact about a land class and putting it anywhere else would let the two drift apart. Three things about it are deliberate. The peat area does not follow the class area: a peat deposit is where it is, and ploughing a hectare of grassland does not move the peat under it. The rewetted hectare keeps emitting — peat_rewetted_emission, mostly methane — rather than going to zero, because a wet peatland is not a sink on this timescale. And the factors are the inventory's implied ones, so a country with no mapped organic soil declares zero areas and every term here is exactly zero, which is what keeps this addition inert where it does not apply.

land_peat_emission_2024
per row of land_class
row.peat_area * (row.peat_ef - peat_rewetting_base * (row.peat_ef - peat_rewetted_emission))MtCO₂e/y emitted—
land_peat_arablesum(land_class.land_peat_emission, land_class.id == "arable")MtCO₂e/y emitted—
land_peat_grasslandsum(land_class.land_peat_emission, land_class.id == "grassland")MtCO₂e/y emitted—
land_peat_forestsum(land_class.land_peat_emission, land_class.id == "forest")MtCO₂e/y emitted—
land_peat_watersum(land_class.land_peat_emission, land_class.id == "water")MtCO₂e/y emitted—
land_peat_artificialsum(land_class.land_peat_emission, land_class.id == "artificial")MtCO₂e/y emitted—
land_peat_totalsum(land_class.land_peat_emission)MtCO₂e/y emitted—
land_peat_unbookedland_peat_total - land_peat_arable - land_peat_grassland - land_peat_forest - land_peat_water - land_peat_artificialMtCO₂e/y emitted

Zero, and asserted rather than assumed. Five of the seven classes hand their peat to a named pool of the inventory; the two that do not — permanent crops and semi-natural land — have no pool of their own to book it in, so a country that declared organic soil under them would otherwise lose it silently. This is the line that refuses to.

land_peat_area_totalsum(land_class.peat_area)Mha—
land_peat_rewetted_arealand_peat_area_total * land_setting_peat_rewettingMha

The hectares the lever puts back under water, over the whole horizon. It is reported because it is the quantity a rewetting programme is actually written in — Germany's own targets are in hectares, not in megatonnes — and because it is what the grassland the herd can graze loses.

land_total_2023sum(land_class.area_2023)Mha—
land_total_2050sum(land_class.land_area_2050)Mha—
land_account_residualland_total_2050 - land_total_2023Mha

Zero, at every position of every lever, and a test asserts it over the corners of the three flow levers and a seeded sweep between them. It is emitted rather than assumed because an account that closes by construction is a claim about the algebra, and a claim worth making is worth showing.

land_clamped_kha(max(0, -land_arable) + max(0, -land_grassland) + max(0, -land_perm_crops) + max(0, -land_forest) + max(0, -land_other_natural) + max(0, -land_water) + max(0, -land_artificial)) * 1000 / land_horizon_yearskha/y

How much annual flow would have to be given back for every class to stay non-negative — the answer to the author's own question, "should the extreme corner be clamped, or reported?". It is reported. Inside the declared bounds it is exactly zero, with the smallest margin on the semi-natural class, which both artificialisation and afforestation draw on; a bound loosened without checking this number would silently start taking hectares out of a class that does not have them.

forest_production_2050forest_production * forest_production_factorm³/ha/y—
forest_mortality_2050forest_mortality * forest_mortality_factorm³/ha/y—
forest_volume_balance(forest_production_2050 - forest_mortality_2050) * forest_production_area - land_setting_harvest * forest_harvest_volume_factorMm³/y

Production less mortality less removals — the volume the forest gains in a year. It is the quantity every argument about the forest is really about, and it has roughly halved in a decade as mortality doubled. Negative means the standing stock is falling.

forest_removal_rateland_setting_harvest * forest_harvest_volume_factor / (forest_production_2050 * forest_production_area)fraction of gross production

Removals over gross production, the ratio the forestry debate is usually conducted in. Quote it with its base: the same forest is at 60% on the inventory's production and at 70% on the industry's "availability", and the two numbers are not comparable.

land_sink_forest_biomassforest_carbon_k * forest_volume_balanceMtCO₂/y absorbed

k · (P·A − M·A − H). The whole forest argument in one line, and the coefficient k — forest_carbon_k, tonnes of CO₂ per cubic metre of the volume balance — is the single most consequential number in it. It is national, stated on each inventory's own volume definition, and each package argues its value where it declares it; this line carries the argument, not a number. There are two ways to derive it. One divides the inventory's published living-biomass sink by the volume balance that produced it, which is internally consistent by construction. The other takes a gross carbon increment over a gross volume production, which is independent of that sink but applies a gross ratio to a net balance. The base-year check cannot choose between them: the forest line is closed by a flat litter-and-soil residual, and whatever k does not explain in the base year, the residual absorbs. What the choice decides is the slope — what one more cubic metre harvested does to the 2050 sink — and, because the residual does not move with the harvest, the 2050 level too. Two things k is not. It is not the response of the land account: a cubic metre not harvested also never enters the wood-products pool, so the whole sink moves by k less that pool's share. And it is not a price: nothing here says what happens to the wood that is not cut, which the scoreboard answers separately, by charging a scenario that leans on its land for more than its own strategy does.

land_sink_forest_dead_woodforest_dead_wood_coefficient * forest_mortality_2050 * forest_production_areaMtCO₂/y absorbed

Dead wood, per cubic metre of annual mortality. It is a sink while the necromass builds up, which is why a climate case that kills more trees makes this pool larger even as it makes the living-biomass pool collapse. That is not a modelling accident: the inventory books it the same way, and it will turn to a source when decomposition catches up, on a timescale past this horizon.

land_sink_forest_afforestationafforestation_storage_rate * land_setting_afforestation * max(0, land_horizon_years - afforestation_lag) / 1000MtCO₂/y absorbed

New forest, booked at the expansion storage rate on the hectares planted more than the establishment lag before the horizon. Hectares planted later store nothing here — a step where the truth is a curve, and the honest alternative was a curve nobody published.

land_sink_forestland_sink_forest_biomass + land_sink_forest_dead_wood + land_sink_forest_afforestation + forest_litter_soil_sink + forest_overseas_sink - land_peat_forestMtCO₂/y absorbed—
hwp_inflow_2024forest_harvest_base * hwp_long_lived_share_base * hwp_carbon_per_m3MtCO₂/y

The carbon that entered the long-lived wood-products pool in the base year: the base-year harvest, times the share that became sawn timber and panels, times the carbon a cubic metre of that share carries. The coefficient is derived so that this reproduces the national inventory report's own inflow, 10.0 MtCO₂/y, and it lands within half a per cent of the IPCC's default carbon density of sawnwood without having been fitted to it.

hwp_inflowland_harvest_long_lived * hwp_carbon_per_m3MtCO₂/y—
hwp_decay_rateln_two / hwp_half_life1/y—
hwp_stock_2024(hwp_inflow_2024 - hwp_base_sink) / hwp_decay_rateMtCO₂

The stock the pool must hold for the base year to balance: a first-order pool releases k · stock a year, so a pool that takes in 10.0 MtCO₂ and is measured as a source of 0.4 holds (10.0 + 0.4) / k. It is derived from the base-year balance rather than declared, which is what makes the base-year check hold by construction — and it is reported beside the stock the inventory report's own outflows imply, hwp_stock_nir_2021, which is a fifth smaller because the two inventory vintages do not agree on the sign of the 2021 balance.

hwp_retention0.5 ** (land_horizon_years / hwp_half_life)fraction

What is left of a tonne put into the pool at the base year by the horizon: 0.5 ^ (years / half-life), which is e^(−k·T) written with the half-life a reader knows. At 26 years and a half-life of 28.9 it is 0.536 — roughly half of what stands today is still standing in 2050, and roughly half of what is added between now and then.

hwp_stock_2050hwp_stock_2024 * hwp_retention + hwp_inflow / hwp_decay_rate * (1 - hwp_retention)MtCO₂

The first-order-decay stock at the horizon, in closed form for a constant inflow from the base year on: what remains of the base-year stock, plus what the horizon inflow has built towards its own equilibrium inflow / k. A constant inflow is the assumption to name — the lever is a 2050 setting and the model has no trajectory to integrate — and it errs on the side of a larger stock for a rising harvest, because it books the 2050 inflow from 2025.

hwp_decay_2050hwp_decay_rate * hwp_stock_2050MtCO₂/y—
land_sink_hwphwp_inflow - hwp_decay_2050MtCO₂/y absorbed

Harvested wood products as a stock, since stage E: the inflow of long-lived products less the decay of everything already standing, at the horizon. With a constant inflow the closed form collapses to retention × (inflow − base-year inflow + base-year balance), so the stock itself drops out of the flux — which is why the base stock is derived rather than fetched — and the pool responds to the change in what is put in, damped by half over the horizon. That damping is what the flow reading of stage A lacked: at the reference it gives 2.5 MtCO₂/y where the flow gave 3.0, and hwp_flow_reading keeps the old figure beside it. Raising the harvest and the long-lived share together is still the one move that deepens this pool and the wood supply at once.

hwp_flow_readinghwp_coefficient * (land_setting_harvest * land_setting_long_lived - forest_harvest_base * hwp_long_lived_share_base) + hwp_base_sinkMtCO₂/y absorbed

The stage-A flow reading of the same pool — a coefficient on the change in long-lived volume plus the base-year balance — kept as a comparison line and read by nothing else. It overstates the 2050 flux by the decay of what is added, which the stock reading carries.

hwp_stock_checkhwp_stock_2024 - hwp_stock_nir_2021MtCO₂

The derived base-year stock less the stock the inventory report's own 2021 outflows imply. Positive, and not meant to be zero: the balance this model is held to is the 2026 vintage's, which books a source where the 2023 report booked a sink.

land_soil_practice_gain(soil_practice_potential_arable + soil_practice_potential_grassland) * land_setting_soil_practicesMtCO₂/y absorbed

The identified soil-carbon potential, taken at the share the lever asks for, split between the two land uses it sits on. Reduced tillage is deliberately excluded: the study that sizes the potential calls it a redistribution down the soil profile rather than a gain, and including it would add about a seventh. The headline "4 per 1000" figure quoted in public is larger still, because it counts no-till and forest land together; this one is the agricultural part without them, and the split between arable and grassland follows the itemised practices rather than the areas they sit on.

land_soil_conversion_flux(max(0, land_setting_grassland) * soil_carbon_grass_to_crop - max(0, -land_setting_grassland) * soil_carbon_crop_to_grass) * min(land_horizon_years, soil_carbon_conversion_years) / 1000MtCO₂/y emitted

The soil-carbon tail of ploughing grassland, or of putting arable land back to grass. Only the last twenty years of conversions are still in the flux at the horizon, and the two directions carry different coefficients — loss is about twice as fast as gain, so re-grassing repairs more slowly than ploughing broke. Written with two max terms rather than a conditional so that nothing branches: at a conversion of zero both terms are zero, which is where the reference scenario sits. It is booked on top of the per-hectare cropland and grassland coefficients, and only for the change the player makes: those coefficients are calibrated on a base year that already contains the historic conversions, so charging the base year twice would have been the mistake to avoid here.

land_sink_grasslandgrassland_sink_coefficient * land_grassland + soil_practice_potential_grassland * land_setting_soil_practices - land_peat_grasslandMtCO₂/y absorbed

Mineral grassland absorbs; the organic soil under part of it emits ten times as much per hectare, and which of the two wins is a national fact rather than a general one. Splitting the line is what lets the same equation carry a country whose grassland is a sink and a country whose grassland is its second largest source — and it is what stops a herd cut from raising emissions, which is what a single negative per-hectare coefficient would have done.

land_sink_cropland-(cropland_source_coefficient * land_arable) + soil_practice_potential_arable * land_setting_soil_practices - land_soil_conversion_flux - land_peat_arableMtCO₂/y absorbed

A source, not a sink, and it has been one in every year the inventory covers: arable soil loses carbon under crops, and the drained organic soils and the historic conversions are booked here too. Soil practices are what pushes back against it, and the conversion flux of a grassland decision lands here as well, because that is where the inventory puts it.

land_sink_artificial-(artificialisation_carbon_content * land_setting_artificialisation / 1000) - land_peat_artificialMtCO₂/y absorbed

Always a source. A standing emission per unit of annual flow rather than a one-off per hectare, because sealing and the biomass it removes are booked over a twenty-year tail: stop artificialising and this line goes to zero, which is exactly what the net-zero-artificialisation target claims.

land_sink_wetland-wetland_other_source - land_peat_waterMtCO₂/y absorbed—
land_sink_totalland_sink_forest + land_sink_hwp + land_sink_grassland + land_sink_cropland + land_sink_artificial + land_sink_wetlandMtCO₂/y absorbed

The six pools, added up, positive for absorption — the module's own sign, which national_natural_sink then negates once, where the national account needs it. The specification calls this quantity lulucf_absorbed; the name here follows the land_ prefix the rest of the module carries.

land_sink_forest_2024forest_carbon_k * ((forest_production - forest_mortality) * forest_production_area - forest_harvest_base * forest_harvest_volume_factor) + forest_dead_wood_coefficient * forest_mortality * forest_production_area + forest_litter_soil_sink + forest_overseas_sink - land_peat_forest_2024MtCO₂/y absorbed

The same identity on base-year quantities, with no climate factor and no afforestation term: the standing forest already contains everything planted before the base year, and the inventory's forest line already counts it. This and the five pools after it are what the module is calibrated on, and the only numbers in the block that are checked against an observation rather than produced as a result.

land_sink_hwp_2024hwp_inflow_2024 - hwp_decay_rate * hwp_stock_2024MtCO₂/y absorbed

The base-year inflow less the decay of the base-year stock, which is the published balance to the bit, because the stock was derived from it. Written out rather than restated as the constant so that the identity the stock rests on is on the page.

land_peat_arable_2024sum(land_class.land_peat_emission_2024, land_class.id == "arable")MtCO₂e/y emitted—
land_peat_grassland_2024sum(land_class.land_peat_emission_2024, land_class.id == "grassland")MtCO₂e/y emitted—
land_peat_forest_2024sum(land_class.land_peat_emission_2024, land_class.id == "forest")MtCO₂e/y emitted—
land_peat_water_2024sum(land_class.land_peat_emission_2024, land_class.id == "water")MtCO₂e/y emitted—
land_peat_artificial_2024sum(land_class.land_peat_emission_2024, land_class.id == "artificial")MtCO₂e/y emitted—
land_peat_total_2024sum(land_class.land_peat_emission_2024)MtCO₂e/y emitted—
land_sink_grassland_2024grassland_sink_coefficient * land_class["grassland"].area_2023 - land_peat_grassland_2024MtCO₂/y absorbed—
land_sink_cropland_2024-(cropland_source_coefficient * land_class["arable"].area_2023) - land_peat_arable_2024MtCO₂/y absorbed—
land_sink_artificial_2024-(artificialisation_carbon_content * artificialisation_rate_base / 1000) - land_peat_artificial_2024MtCO₂/y absorbed—
land_sink_wetland_2024-wetland_other_source - land_peat_water_2024MtCO₂/y absorbed—
land_sink_total_2024land_sink_forest_2024 + land_sink_hwp_2024 + land_sink_grassland_2024 + land_sink_cropland_2024 + land_sink_artificial_2024 + land_sink_wetland_2024MtCO₂/y absorbed—
land_sink_check_2024-land_sink_total_2024 - official_natural_sink_2024MtCO₂e/y

What the module reproduces for the base year, less what the inventory books, in the inventory's sign. It is not zero and is not meant to be: it is the rounding of the published sub-sector lines against their own published total, and a residual that had been tuned away would have told a reader nothing. Watch it after any change to the calibrated coefficients — it is the first place a mis-calibration shows.

land_harvest_long_livedland_setting_harvest * land_setting_long_livedMm³/y—
land_timber_headroomland_harvest_long_lived - construction_timber_roundwoodMm³/y

What the long-lived harvest has left for everything else made of wood — furniture, joinery, panels, packaging — once the built square metres have taken theirs. At the reference construction takes 1.8 of 18.0 Mm³; at the top of the timber slider it takes 12.2, which is two thirds of the pool. It does not go negative inside the declared ranges, and that is not reassurance: the binding constraint is not the standing harvest but the sawmill. New-building structure alone asks for 6.1 Mm³ of sawn product at the top of the slider, against a French softwood sawnwood production of about 7.0 Mm³ — and France already imports a quarter of what it uses, while the national forest inventory's own projection finds additional sawlog supply short of additional demand by one to one and a half million cubic metres a year in 2050 even under its increased-harvest cases. And imported timber does not store carbon here. The harvested-wood- products pool is kept on the production approach, so a beam sawn in Finland and bolted into a French building adds nothing to the French inventory's wood pool: the carbon is Finland's. A scenario that builds in timber on imports gets the cement saving and none of the sink.

land_harvest_otherland_setting_harvest - land_harvest_long_livedMm³/y

Everything the harvest is not turning into sawn timber and panels: pulp, packaging, fuel and what is burned without being sold. Stage C converts it into a wood supply and puts it beside the game's wood demand; stage A only says how large it is.

forest_material_share_base(forest_harvest_sawlogs + forest_harvest_industrial) / forest_harvest_basefraction of the harvest

Sawlogs and industrial wood over the whole base-year harvest — the share that leaves the forest as material rather than as fuel. It is not the long-lived share: pulp and packaging are material and come back within a few years, which is why the harvested-wood-products pool reads the smaller number.

forest_unutilised_share_baseforest_harvest_unutilised / forest_harvest_basefraction of the harvest

Wood that was felled, left the live stock, and supplies nothing. Windthrow and beetle-killed stems cut and abandoned on the forest floor: the harvest statistic counts them, the forest identity must count them because the tree is no longer growing, and the boiler never sees them. A fifth row rather than a fold into the informal firewood, which was the other option and would have handed the wood supply three million cubic metres of fuel that does not exist. Zero in a country whose statistic does not report the category, and then every term below is unchanged.

land_harvest_checkforest_harvest_sawlogs + forest_harvest_industrial + forest_harvest_energy_commercial + forest_informal_firewood + forest_harvest_unutilised - forest_harvest_baseMm³/y

Zero: the four declared uses of the base-year harvest add up to the harvest. It matters because one of the four — the firewood cut and never sold — is an estimate by difference, so the closure is what makes it visible instead of leaving it inside a larger number. It is about a quarter of the whole harvest and the independent estimates of it span two and a half million cubic metres.

Livestock, crops, nitrogen and diet

Stage B of the land module. It replaces the second of the two sliders that had no driver — an agriculture sector sliding along a published trajectory between the observed year and the strategy's horizon — with a chain that runs from a plate to a herd to a field, and it makes the agriculture sector a sum of the constructive account like every other sector. Four things are worth understanding before reading the formulas. Causality runs demand → production → herd, and trade sits in the middle. What a country eats, times its population, times what it no longer wastes, is a domestic demand; what it imports is subtracted and what it exports is added; the result is production, and production divided by a yield per head is a herd. The export term is indexed on volumes rather than on a share, because a share runs away as it approaches one and because a country that exports two fifths of its milk while importing a third of the dairy it eats has no single share to move. Without it a diet change would move the herd one for one, which is wrong for every exporting country. The dairy herd sells its culls whatever the diet does. Two fifths of French beef is a by-product of the dairy herd, so the suckler herd is the residual: it supplies the beef the dairy herd did not. Cut the milk and beef still reaches the market; cut the beef and the milk decides how much of the cut the suckler herd absorbs. That coupling is in the equations rather than in a footnote, and dairy_beef_coupling_share is the one number it rests on. Nitrogen is one decision with two consequences. The mineral nitrogen the fields receive drives the soil N₂O and the urea and liming CO₂ in agriculture, and it drives the ammonia the industry chain has to make and the hydrogen that ammonia draws. Until this module those were two unconnected numbers — a fertiliser dose nobody chose and an ammonia tonnage nobody explained. They are now one lever and a domestic share. The base year is checked by source, the horizon is not. A parallel set of *_2024 equations recomputes the livestock and the crops blocks on base-year quantities with no lever at all, and the tests hold them against the published inventory line by line. Every figure in this module is traced through docs/agriculture/agriculture_food_fertilisers.md, the sourced study behind it, to the publication named in its own sources; what is cited here is that publication rather than the study, because a citation has to be findable by somebody who does not have this repository. The 2050 figures are results, and the reference scenario's is uncomfortable: at the national strategy's own settings this module lands about three megatonnes above the strategy's own 2050 agriculture figure, because the strategy reaches it through practices it does not fully publish. That gap is information, and closing it by construction would have thrown the information away.

NameFormulaUnitNotes and sources
food_setting_red_meatland_module_active * dietRedMeat + (1 - land_module_active) * diet_red_meat_basekgec/cap/y

The land module's switch applied to a lever, the same arithmetic the seven land levers use. Where land_module_active is 0 the whole food block is read at its base year, so a package that does not carry the module reports its own observed farm projected forward rather than another country's diet, and a lever hidden in that package cannot move a number. Both sides always evaluate — this is arithmetic and never a branch — so the browser engine, the Python evaluator and the solver see one expression and cannot take different paths through it.

food_setting_poultryland_module_active * dietPoultry + (1 - land_module_active) * diet_poultry_basekgec/cap/y—
food_setting_dairyland_module_active * dietDairy + (1 - land_module_active) * diet_dairy_index_baseindex, base year = 1—
food_setting_wasteland_module_active * foodWaste + (1 - land_module_active) * food_waste_cut_basefraction of edible waste removed—
food_setting_exportland_module_active * livestockExport + (1 - land_module_active) * livestock_export_baseindex, base year = 1—
food_setting_nitrogenland_module_active * nIntensity + (1 - land_module_active) * n_intensity_baseindex, base year = 1—
food_setting_legume_arealand_module_active * legumeArea + (1 - land_module_active) * legume_area_baseMha—
food_setting_entericland_module_active * entericMitigation + (1 - land_module_active) * enteric_mitigation_basefraction of cattle—
food_setting_manureland_module_active * manureMethanised + (1 - land_module_active) * manure_methanised_basefraction of manure—
food_setting_farm_fuelland_module_active * agriFuelSwitch + (1 - land_module_active) * agri_fuel_switch_basefraction of farm fuel—
food_setting_ammonia_shareland_module_active * ammoniaDomesticShare + (1 - land_module_active) * ammonia_domestic_share_basefraction—
food_setting_organicland_module_active * organicShare + (1 - land_module_active) * organic_share_basefraction of the arable area—
food_setting_crop_exportland_module_active * cropExport + (1 - land_module_active) * crop_export_baseindex, base year = 1—
plant_food_waste_factor(1 - crop_food_waste_share) / (1 - crop_food_waste_share * (1 - food_setting_waste))factor on demand

Apparent consumption is published on today's losses, so cutting waste does not cut consumption — it cuts the supply the same nutrition needs. (1 − w) / (1 − w·(1 − cut)) is that: at no cut it is one, and at a complete cut it is 1 − w. Since stage E the share w is per product: this one is the plant-food basket's, read from the wheat-to-bread chain, and the animal products carry their own in animal_product.waste_share — a fifth of the poultry that leaves the farm never reaches a plate, a tenth of the milk, a twelfth of the beef and pork. The whole-basket figure the environment statistician publishes, 7% of the supply on the European definition, is a different perimeter and is reported beside these rather than used for them.

product_waste_factor
per row of animal_product
(1 - row.waste_share) / (1 - row.waste_share * (1 - food_setting_waste))factor on demand

The same identity, on each product's own downstream loss share. It is what makes the waste lever a large lever on poultry and a small one on beef — the chain-loss study finds them two and a half times apart — where a single basket share made it the same size on everything.

food_waste_basket_sharesumproduct(animal_product.consumption_base, animal_product.waste_share) / sum(animal_product.consumption_base)fraction of the animal supply

The per-product shares weighted by what the country eats — the animal basket's own downstream loss, about 12% — for comparison with the 7% the environment statistician counts as edible waste on the whole food supply. Not an identity: the two perimeters differ, and the difference is reported rather than reconciled.

population_ratiopopulation_horizon / population_basefactor on demand

Demography is a constant here and not a lever: the module does not offer the size of the population as a choice a player makes. It moves every diet-driven quantity by about a per cent, which is small beside the diet levers and large beside the food-waste one.

demand_index_red_meatfood_setting_red_meat / diet_red_meat_base * population_ratioindex, base year = 1

Diet and population in one multiplier, one for the base year by construction; the waste factor joins it per product, below. Beef, pork and sheep meat share it because every published diet scenario moves the three together and none of them publishes a separate trajectory for sheep.

demand_index_poultryfood_setting_poultry / diet_poultry_base * population_ratioindex, base year = 1—
demand_index_dairyfood_setting_dairy / diet_dairy_index_base * population_ratioindex, base year = 1—
product_demand_index
per row of animal_product
beef: demand_index_red_meat * row.product_waste_factor
pork: demand_index_red_meat * row.product_waste_factor
sheep: demand_index_red_meat * row.product_waste_factor
poultry: demand_index_poultry * row.product_waste_factor
milk: demand_index_dairy * row.product_waste_factor
index, base year = 1

Which diet lever drives which product, written out one line per product rather than hidden in a conditional. This map is also what makes animal_product a fixed-row table: every row has to have a formula, so a country cannot quietly drop a product the account needs.

product_domestic_demand
per row of animal_product
row.consumption_base * row.product_demand_indexkt/y—
product_production
per row of animal_product
row.consumption_base * row.product_demand_index * (1 - row.import_share) + row.export_base * food_setting_exportkt/y

Domestic demand less what is imported, plus what is exported. The import share is held at the base year's — a country that eats less meat is not assumed to import a different fraction of it — while the export volume is the lever. That asymmetry is deliberate: the import share is an observed market position, and the export volume is the policy choice, because it is the one that decides whether a herd exists to feed this country or another.

product_self_sufficiency
per row of animal_product
row.product_production / row.product_domestic_demand if row.product_domestic_demand > 0 else 0fraction

Production over domestic demand. Above one the country is a net exporter of that product, below one a net importer, and the two can coexist inside one product — France exports two fifths of its milk and imports a third of the dairy it eats — which is why the ratio is reported beside the trade terms rather than instead of them.

product_production_2024
per row of animal_product
row.production_2024kt/y—
product_trade_check
per row of animal_product
row.consumption_base * (1 - row.import_share) + row.export_base - row.production_2024kt/y

Zero for every product: consumption net of imports, plus exports, is production. It is the identity the base-year trade position rests on, and it is emitted rather than assumed because the export volumes are derived from it — a country that declared all four numbers independently would find out here, and not in a footnote, that its statistics do not agree.

milk_productionsum(animal_product.product_production, animal_product.id == "milk")kt/y—
beef_productionsum(animal_product.product_production, animal_product.id == "beef")kt/y—
pork_productionsum(animal_product.product_production, animal_product.id == "pork")kt/y—
poultry_productionsum(animal_product.product_production, animal_product.id == "poultry")kt/y—
sheep_productionsum(animal_product.product_production, animal_product.id == "sheep")kt/y—
milk_per_dairy_cowanimal_product["milk"].production_2024 / livestock["dairy_cow"].heads_2024kg/head/y

Derived from the base-year production and the base-year herd rather than declared beside them, because a yield declared next to the two numbers it is the ratio of would be a third copy of the same fact and could drift from them. Every yield in this block is derived the same way.

beef_per_dairy_cowdairy_beef_coupling_share * animal_product["beef"].production_2024 / livestock["dairy_cow"].heads_2024kg/head/y

The beef a dairy cow sends to market anyway — cull cows and the calves the dairy herd does not keep. It is dairy_beef_coupling_share of the whole beef production divided by the dairy herd, so the coupling rests on that one share, which is estimated rather than published: a herd-flow account is what would replace it, and the alternative split, proportional to cow numbers, gives a very different pair of yields.

beef_per_suckler_cow(1 - dairy_beef_coupling_share) * animal_product["beef"].production_2024 / livestock["suckler_cow"].heads_2024kg/head/y—
other_cattle_per_cowlivestock["other_cattle"].heads_2024 / (livestock["dairy_cow"].heads_2024 + livestock["suckler_cow"].heads_2024)head per cow

Heifers, bullocks, calves and everything else in the herd that is neither a dairy cow nor a suckler cow, per cow. The ratio is held at the base year's: the module sizes a herd, not a herd structure, and a changed rearing pattern is a decision the model does not carry.

dairy_cowsmilk_production / milk_per_dairy_cowM head—
suckler_cowsmax(0, (beef_production - dairy_cows * beef_per_dairy_cow) / beef_per_suckler_cow)M head

The residual herd: the beef the market wants, less the beef the dairy herd sells anyway, over what a suckler cow produces. It is the line that makes a dairy-only diet cut still send beef to market, and the line that makes a beef-only cut fall hardest on the suckler herd. Floored at zero rather than allowed to go negative. The floor is reachable: a diet that cuts beef far harder than dairy asks for less beef than the dairy herd already supplies, and the honest answer there is that the suckler herd disappears and the surplus dairy beef is exported or not produced — not that the country keeps a negative number of cows. Where the floor binds, self-sufficiency in beef rises above one and says so.

other_cattle_heads(dairy_cows + suckler_cows) * other_cattle_per_cowM head—
pig_herdlivestock["pig"].heads_2024 * pork_production / animal_product["pork"].production_2024M head—
poultry_headslivestock["poultry"].heads_2024 * poultry_production / animal_product["poultry"].production_2024M head—
small_ruminant_herdlivestock["small_ruminant"].heads_2024 * sheep_production / animal_product["sheep"].production_2024M head—
livestock_heads
per row of livestock
dairy_cow: dairy_cows
suckler_cow: suckler_cows
other_cattle: other_cattle_heads
pig: pig_herd
poultry: poultry_heads
small_ruminant: small_ruminant_herd
M head

One formula per animal category, side by side, which is what makes the chain auditable: a dairy cow is sized by milk, a suckler cow by the beef the dairy herd did not supply, the rest of the cattle by the cows, and a pig, a bird and a ewe by their own product. This map is what makes livestock a fixed-row table.

livestock_heads_2024
per row of livestock
row.heads_2024M head

The base-year column, re-emitted as a result so a chart that compares the herd with the herd it started from reads both from one place instead of one from the model and one from the raw table.

cattle_base_headssum(livestock.heads_2024, livestock.species_group == "cattle")M head—
cattle_headssum(livestock.livestock_heads, livestock.species_group == "cattle")M head—
cattle_indexcattle_heads / cattle_base_headsindex, base year = 1

The cattle herd against the base year's. It is what the manure and grazing nitrogen are scaled by, and using cattle alone for all of it is an approximation: cattle are about five sixths of the nitrogen excreted here, but a scenario that cut pigs and kept cattle would be charged too much organic nitrogen. manure_nitrogen_excreted is the same quantity computed species by species and is reported beside it, so the size of the approximation is visible rather than argued about.

livestock_row_base
per row of livestock
row.livestock_heads * row.emission_factor / 1000 * (1 - food_setting_enteric * enteric_lipid_effect * row.enteric_mitigable)MtCO₂e/y

Heads times a per-head factor, less what a low-methane ration removes where one is fed. The factor covers enteric fermentation and manure management together because that is how the inventory publishes it; manure_ch4_share splits the result below, and the split is the module's, not the inventory's.

livestock_row_enteric
per row of livestock
row.livestock_row_base * (1 - row.manure_ch4_share)MtCO₂e/y—
livestock_row_manure
per row of livestock
row.livestock_row_base * row.manure_ch4_share * (1 - food_setting_manure * methanisation_abatement)MtCO₂e/y

The manure half, and the only half a digester can take. Sending manure to a digester removes methanisation_abatement of the methane the store would have released, on the share that goes there. Both coefficients are provisional, and they are the module's weakest pair: the inventory publishes enteric and manure methane as one number, so the share each species carries is an assumption rather than a measurement, and the detailed reporting tables are what would settle it.

livestock_row_emissions
per row of livestock
row.livestock_row_enteric + row.livestock_row_manureMtCO₂e/y—
livestock_enteric_emissionssum(livestock.livestock_row_enteric)MtCO₂e/y—
livestock_manure_emissionssum(livestock.livestock_row_manure)MtCO₂e/y—
livestock_emissionslivestock_enteric_emissions + livestock_manure_emissions + refrigerants_fixedMtCO₂e/y

The whole livestock block, refrigerant leakage included. The refrigerants are a constant because no lever in this module drives them and because the inventory books them inside the agriculture sector; leaving them out would break the base-year closure by exactly their own size.

livestock_row_manure_n
per row of livestock
row.manure_n_2024 * row.livestock_heads / row.heads_2024kt N/y—
manure_nitrogen_excretedsum(livestock.livestock_row_manure_n)kt N/y

The nitrogen the herd excretes, scaled species by species — the quantity the crops block approximates with a cattle index, reported here so the approximation can be measured instead of taken on trust. It is also the feedstock a digester eats, which is what stage C will read it for.

manure_nitrogen_excreted_2024sum(livestock.manure_n_2024)kt N/y—
livestock_row_grassland
per row of livestock
row.grassland_ha_per_head * row.livestock_headsMha—
grassland_requiredsum(livestock.livestock_row_grassland)Mha

The permanent grassland the herd needs, at per-head requirements calibrated so the base-year herd needs exactly the grassland the base year has. It is grassland only: the fodder maize, the cereals and the imported protein the same herd eats are not in it, and neither is temporary grassland, which the land account books inside arable land.

grassland_availableland_grassland + grassland_rough - land_class["grassland"].peat_area * land_setting_peat_rewettingMha

The land account's permanent grassland plus the rough grazing the farm survey counts and the land survey books under heath. Two statistics, reconciled in the open: the livestock block reads the farm survey's total while the land account still closes on the land survey's.

grassland_releasedgrassland_available - grassland_requiredMha

Grassland available less grassland required. Positive means a shrinking herd has freed hectares; negative means the herd asks for more grass than the land account has, which is a tension the module reports rather than resolves — nothing here plants a forest on freed grassland, and nothing forces a herd onto land that does not exist. Whether freed grassland should afforest automatically is a decision, and it is left to the land levers.

legume_creditlegume_n_credit * (food_setting_legume_area - legume_area_base) / legume_credit_spankt N/y

The mineral nitrogen the rotation no longer needs, read linearly over the span of hectares the study that measured it used. Outside that span the extrapolation belongs to the reader, and the lever's bounds are set so it is not left far outside.

mineral_nitrogenmax(0, mineral_n_base * food_setting_nitrogen * organic_nitrogen_factor - legume_credit)kt N/y

The dose the conventional fields receive, less the hectares gone organic and less the legume credit, floored at zero. It is the module's most consequential single number: it sets the soil N₂O and the urea and liming CO₂ in agriculture, and it sets the ammonia the industry chain has to make and the hydrogen that ammonia draws. Two things that were unconnected — how much nitrogen the fields get and how much hydrogen the country must produce — are one decision here.

organic_nitrogen_factor(1 - food_setting_organic) / (1 - organic_share_base)factor on the mineral dose

(1 − organic share) / (1 − base-year organic share): an organic hectare takes no mineral nitrogen, and the base-year delivery already excludes the hectares that were organic then, so only the change moves the dose. It multiplies nIntensity, which since stage E is the dose on the hectares that stay conventional; at the reference the two together deliver 55% of 2024, the strategy's −54%, without counting the organic extension twice. INRAE books −330 kt N for the same extension; this factor gives −360 at the base-year dose.

nitrogen_manure_spreadmanure_n_spread_base * cattle_indexkt N/y—
nitrogen_manure_grazingmanure_n_grazing_base * cattle_indexkt N/y—
nitrogen_fixationfixation_n_base * (1 + fixation_gain * (food_setting_legume_area - legume_area_base) / legume_credit_span)kt N/y—
nitrogen_input_totalmineral_nitrogen + nitrogen_manure_spread + nitrogen_manure_grazing + nitrogen_fixationkt N/y

Mineral, spread manure, grazing deposits and biological fixation. Atmospheric deposition is not in it — the inventory books it elsewhere — and neither is seed or irrigation nitrogen. Legumes appear twice, on purpose and in opposite directions, and the result is worth stating because it surprises people: they take mineral nitrogen out through legume_credit and put fixed nitrogen in through nitrogen_fixation, and the second is the larger. A hectare of legumes fixes more nitrogen than the mineral fertiliser it saves the next crop, so the total input rises with the legume area even as the mineral dose falls. Emissions still fall, because a tonne of mineral nitrogen is charged at more than twice what a tonne of total input costs on the indirect line — but a scenario that reads the nitrogen balance as a proxy for emissions would get the sign wrong here.

agricultural_arealand_arable + land_perm_crops + grassland_availableMha—
nitrogen_input_per_hectarenitrogen_input_total / agricultural_areakg N/ha/y

Total nitrogen input over the agricultural area — arable, permanent crops and grassland, the farm survey's grassland included. It is an input intensity and not the gross nitrogen surplus the environmental accounts publish: a surplus subtracts the nitrogen the harvest removes, and this model has no crop-offtake account to subtract with. The two are different numbers and the surplus is much the smaller — about 45 kg/ha against an input of 123 in the base year — so read this as a trend against its own base year and not against a published surplus.

crop_soil_n2o(mineral_nitrogen * ef_mineral_n2o + nitrogen_manure_spread * ef_organic_n2o + nitrogen_manure_grazing * ef_grazing_n2o + nitrogen_input_total * ef_other_crop_n2o) / 1000MtCO₂e/y

The four nitrogen sources at their own emission factors. Mineral nitrogen is charged the heaviest one, grazing deposits the next, spread manure the lightest, and the whole input again at the factor that covers residues, mineralisation, leaching and the indirect pathways. That last term is the module's largest approximation: it lumps an area-driven quantity with a nitrogen-driven one, which the inventory's detailed tables separate.

crop_fertiliser_co2mineral_nitrogen * ef_mineral_co2 / 1000MtCO₂/y

Urea hydrolysis and liming, charged on mineral nitrogen. Liming is driven by area and soil pH rather than by nitrogen, so this is a stated approximation and not a measurement of liming; it is kept on the nitrogen because the inventory publishes the two on one line.

peat_agriculture_n2o(land_class["arable"].peat_area + land_class["grassland"].peat_area) * peat_agri_n2o_ef * (1 - land_setting_peat_rewetting)MtCO₂e/y

The nitrous oxide of a drained agricultural peat soil, taken out of the nitrogen dose. The inventory books it in agriculture, not in land use, so it cannot live in the land module's peat term; and it is not a response to fertiliser — it is what a drained organic soil mineralises out of its own carbon and nitrogen — so leaving it inside ef_other_crop_n2o would have let a nitrogen cut switch off a chimney that fertiliser never lit. Rewetting is what stops it, and the whole of it stops: the emission is a drainage emission.

peat_agriculture_n2o_2024(land_class["arable"].peat_area + land_class["grassland"].peat_area) * peat_agri_n2o_ef * (1 - peat_rewetting_base)MtCO₂e/y—
digestate_emissionsbioenergy_setting_energy_maize * energy_maize_digestate_efMtCO₂e/y

The methane and nitrous oxide a digester's own store and its digestate release, per hectare of the main crop grown to feed it. The inventory gives it a line of its own inside agriculture where the practice is large enough to have one, and it is booked on the area rather than on the gas because that is the quantity the lever moves. Zero where no main crop is grown for methane, and then the line is not there.

digestate_emissions_2024energy_maize_area_base * energy_maize_digestate_efMtCO₂e/y—
crop_emissionscrop_soil_n2o + crop_fertiliser_co2 + residue_burning_fixed + crop_carbon_fixed + peat_agriculture_n2o + digestate_emissionsMtCO₂e/y—
arable_committedfood_setting_legume_area + bioenergy_setting_energy_crop + bioenergy_setting_energy_maizeMha

The arable hectares two levers have spoken for by name: the legumes in the rotation and the land growing a first-generation biofuel. Since stage E it is a readout rather than the headroom's numerator — the headroom is now the whole arable area the diet, the herd, the exports and the fuel crops need at the yield the organic share leaves, arable_needed — and it is kept because the two levers still compete for the same hectares and a reader wants to see how many. The cover crops are deliberately not here. A winter intermediate crop occupies the same hectare as the spring crop that follows it, so it commits no land; what limits it is the spring-crop area, and cive_headroom reports that separately.

crop_mineral_input_sharemineral_n_base / (mineral_n_base + manure_n_spread_base + fixation_n_base)fraction of the field nitrogen input

Mineral fertiliser's share of the nitrogen the fields receive in the base year — mineral, spread manure and biological fixation, from the module's own base-year inputs: 0.62 in France, 0.49 in Germany, where manure carries more of the load. These are national totals, grassland included. A cropland-only budget, which takes grassland's share of the fixation and the manure out and adds deposition, puts France at 0.65 to 0.71, and the stockless Seine basin at 0.76: the response here is, if anything, a little gentle — about one point of yield at the reference.

nitrogen_plateau_input1 - crop_mineral_input_share * (1 - n_yield_plateau)fraction of the base-year input

The nitrogen a conventional field receives at the plateau's edge, against the base year: the excess above n_yield_plateau removed, the manure and fixation held. The crop harvests the same there, so the field is more efficient at the edge than in the base year — which is what makes the excess an excess.

nitrogen_useful_dosemin(food_setting_nitrogen, n_yield_plateau)fraction of the base-year dose

The conventional dose, capped at the plateau: above n_yield_plateau the extra nitrogen is what the crop does not take up, and a heavier dose buys nothing — French doses sit at or above the technical optimum, and yields have risen since the 1980s on a flat or falling input.

nitrogen_input_index(1 - crop_mineral_input_share * (1 - nitrogen_useful_dose)) / nitrogen_plateau_inputindex, plateau edge = 1

The nitrogen a conventional field receives against the plateau's edge: one on the plateau, less below it, by the mineral nitrogen cut there.

crop_nue_plateaucrop_nue_base / nitrogen_plateau_inputfraction of the nitrogen input

The cropland's nitrogen use efficiency at the plateau's edge: the same harvest as the base year on less input. It fixes the hyperbola's one free parameter, Ymax = Y/(1 − NUE), at the point the curve starts from.

nitrogen_yield_factornitrogen_input_index / (nitrogen_input_index + crop_nue_plateau * (1 - nitrogen_input_index))index, base year = 1

The yield of a conventional hectare at this dose, against the base year's. Above the plateau, one. Below it, the hyperbola the GRAFS school fits to every country's cropland, Y = Ymax·F/(F + Ymax) (Lassaletta et al. 2014), passed through the plateau's edge and divided by its value there: φ/(φ + NUE·(1 − φ)), with φ the input index and NUE the efficiency at the edge. The yield falls slowly at first and faster as the input shrinks, and never to zero, because manure and fixation still feed the crop. Written so that it is exactly one on the plateau, which keeps the base year and every edition without the module bit-identical. Legumes do not move it: their credit replaces mineral nitrogen with the rotation's own and is taken off mineral_nitrogen, not off the dose.

crop_yield_index((1 - food_setting_organic) * nitrogen_yield_factor + food_setting_organic * organic_yield_ratio) / (1 - organic_share_base + organic_share_base * organic_yield_ratio)index, base year = 1

The average yield of the arable area against the base year's: the conventional hectares at nitrogen_yield_factor, the organic ones at organic_yield_ratio, over the same mix at the base-year organic share. One at the base year by construction; 0.66 with every hectare organic, whatever the dose. Two things move it, the organic share and the mineral dose below its plateau; neither the climate nor the breeding progress the strategy's own modelling assumes at +0.16% a year does, and that is a named gap rather than a number.

organic_areafood_setting_organic * land_arableMha—
crop_food_indexpopulation_ratio * plant_food_waste_factorindex, base year = 1

The plant food people eat, per person held at the base year — the module offers no plant-diet lever, so a shift to pulses and cereals is not in it and is a named gap — times the population, times what is no longer wasted downstream of the farm.

poultry_indexpoultry_heads / livestock["poultry"].heads_2024index, base year = 1—
pig_indexpig_herd / livestock["pig"].heads_2024index, base year = 1—
small_ruminant_indexsmall_ruminant_herd / livestock["small_ruminant"].heads_2024index, base year = 1—
feed_grain_indexcompound_feed_share_poultry * poultry_index + compound_feed_share_cattle * cattle_index + compound_feed_share_pig * pig_index + (1 - compound_feed_share_poultry - compound_feed_share_cattle - compound_feed_share_pig) * small_ruminant_indexindex, base year = 1

The grain the herd eats, weighted by which herd eats it: the compound-feed industry's species mix — poultry two fifths, cattle and pigs a quarter each — with the rest read as the small ruminants. Poultry is the point: a diet that swaps beef for chicken frees grassland and takes arable land, and a feed index that followed the cattle alone would have hidden it.

crop_feed_indexfeed_forage_share * cattle_index + (1 - feed_forage_share) * feed_grain_indexindex, base year = 1—
arable_base_non_energyland_class["arable"].area_2023 - energy_crop_area_base - energy_maize_area_baseMha

The base-year arable area less the base-year fuel crops — the area the four use shares are declared on, because the fuel crops are a lever of their own and enter arable_needed at the player's value.

arable_share_checkarable_share_food + arable_share_feed + arable_share_export + arable_share_other - 1fraction

Zero: the four use shares of the base-year arable area sum to one, so arable_needed equals the base-year arable area at the base-year settings. Emitted because the shares are four numbers from two statistics and the rounding of three of them was put in the fourth.

arable_need_energybioenergy_setting_energy_crop + bioenergy_setting_energy_maizeMha

The arable hectares a digester and a fuel plant take out of the food chain: the first-generation fuel crop, and the main crop grown for methane. The second is separated from the cover crops on purpose — a winter intermediate crop shares its hectare with the spring crop that follows, and a field of silage maize cut for a digester does not share anything. Both are read at the player's value, so a scenario that grows its own gas pays for it in food land here rather than nowhere.

arable_need_foodarable_base_non_energy * arable_share_food * crop_food_index / crop_yield_indexMha—
arable_need_feedarable_base_non_energy * arable_share_feed * crop_feed_index / crop_yield_indexMha—
arable_need_exportarable_base_non_energy * arable_share_export * food_setting_crop_export / crop_yield_indexMha—
arable_need_otherarable_base_non_energy * arable_share_otherMha—
arable_neededarable_need_food + arable_need_feed + arable_need_export + arable_need_other + arable_need_energyMha

The arable land this scenario's plates, herd, exports and fuel crops need, at the yield its organic share leaves — the crop block stage E added, and the module's answer to its own largest simplification, which was an arable area held at the base year while everything on it moved. Demand ÷ yield, use by use: the plant food people eat, scaled by population and waste; the feed the herd eats, scaled by the herd; the exports, scaled by their lever; fallow and seed held; the fuel crops at the player's value. The land account does not resolve the difference with land_arable: arable_headroom reports it, and a negative headroom is a diet, a herd and an export position the country's fields cannot carry at that yield.

arable_headroomland_arable - arable_neededMha

What the land account holds less what the scenario needs. Positive is arable land the fields could spare; negative is the tension the crop block exists to show, reported rather than clamped. At the reference it is 1.5 Mha short: the strategy's organic share costs 7% of the yield, its dose cut below the nitrogen plateau another 8%, and the strategy's herd gives a little of that back in feed.

crop_self_sufficiency(land_arable - arable_need_other - arable_need_energy) * crop_yield_index / (arable_base_non_energy * (arable_share_food * crop_food_index + arable_share_feed * crop_feed_index))fraction

What the arable land the account holds can grow at this yield, over what the country's own plates and herd need of it — fallow, seed and fuel crops set aside on both sides. 1.4 at the base year: France grows two fifths more than it eats, which is the cereal exporter the trade statistics describe. Below one the country would import grain to feed itself, whatever the export lever says.

crop_output_index(land_arable - arable_need_other - arable_need_energy) * crop_yield_index / (arable_base_non_energy * (1 - arable_share_other))index, base year = 1

What the fields the account holds produce, against the base year: the arable area net of fallow and fuel crops, times the yield index. It moves with the land levers and the organic share and with nothing the plates decide, which is the point of showing it beside arable_needed.

farm_fuel_emissionsfarm_fuel_2024 * (1 - food_setting_farm_fuel)MtCO₂e/y

The combustion of tractors, engines and farm boilers, taken to zero by the lever. It is booked as a named process term rather than as energy times a factor, and that is a deliberate departure from the rule the rest of the account follows. The reason is the model's own liquid fuel: efLiquid is a horizon-year assumption of about 25 gCO₂/kWh, because the model's 2050 leaves no fossil liquid, and charging farm diesel at it would put the base-year farm at about one megatonne against an inventory that measures ten and a half. The inventory measures this combustion directly, so the module books the measured quantity and lets the lever remove it. What that costs, stated rather than hidden: the roughly forty terawatt-hours of fuel behind the line are not in the model's carrier pools, so a farm that keeps burning diesel does not show up in the liquid-fuel demand the scoreboard scores. Neither does whatever replaces it — the national strategy sets the target of zero fossil fuel without publishing what carries the tractors afterwards, and inventing an electricity demand for them would be inventing a number. Both are reported as farm_fuel_energy_2024 and are the first thing stage C should close.

farm_fuel_energy_2024farm_fuel_2024 / ef_liquid_fossil_observed * 1000TWh/y

The base-year farm fuel, converted to energy at the observed emission factor of fossil liquid fuel — a diagnostic, and the size of the hole the line above describes. No equation reads it.

agriculture_livestock_postland_module_active * livestock_emissionsMtCO₂e/y

The module's switch again, this time on what reaches the constructive account. Gating the levers is not enough here: a package that does not carry the module would otherwise find three agriculture rows in its post table, computed on placeholder data, adding some seventy megatonnes to a total that is meant not to move. At zero the three rows are present, empty, and visible as such.

agriculture_crops_postland_module_active * crop_emissionsMtCO₂e/y—
agriculture_fuel_postland_module_active * farm_fuel_emissionsMtCO₂e/y—
agriculture_emissionssum(post.emissions_total, post.sector == "agriculture")MtCO₂e/y

A sum of the post table filtered on the sector, exactly as transport, building, industry and energy already are. That is the point of the three new rows: the sector total is now a sum of the constructive account and nothing else, so a missing sub-sector would be visible instead of invisible.

livestock_emissions_2024sumproduct(livestock.heads_2024, livestock.emission_factor) / 1000 + refrigerants_fixedMtCO₂e/y

The same per-head factors on the published base-year herd, with no lever and no diet: this is what the factors are calibrated on, and the only number of the livestock block that is held against an observation rather than produced as a result. It is deliberately not the chain evaluated at base-year lever positions — the chain's own agreement with the published herd is a separate identity, checked separately, and folding the two together would let a demand error hide behind a factor error.

nitrogen_input_2024mineral_n_base + manure_n_spread_base + manure_n_grazing_base + fixation_n_basekt N/y—
crop_emissions_2024(mineral_n_base * (ef_mineral_n2o + ef_mineral_co2) + manure_n_spread_base * ef_organic_n2o + manure_n_grazing_base * ef_grazing_n2o + nitrogen_input_2024 * ef_other_crop_n2o) / 1000 + residue_burning_fixed + crop_carbon_fixed + peat_agriculture_n2o_2024 + digestate_emissions_2024MtCO₂e/y—
agriculture_emissions_2024livestock_emissions_2024 + crop_emissions_2024 + farm_fuel_2024MtCO₂e/y—
livestock_check_2024livestock_emissions_2024 - citepa_livestock_2024MtCO₂e/y—
crops_check_2024crop_emissions_2024 - citepa_crops_2024MtCO₂e/y—
agriculture_check_2024agriculture_emissions_2024 - official_agriculture_2024MtCO₂e/y

What the module reproduces for the base year, less what the inventory books. It is not zero and it is not meant to be: three of the five sources are reproduced from published quantities and published implied factors, and what is left is the rounding of the published lines against their own published total. Watch it after any change to the calibrated factors — it is the first place a mis-calibration shows.

ammonia_productionmineral_nitrogen * food_setting_ammonia_share / nh3_nitrogen_fraction + ammonia_non_fertiliserkt NH₃/y

The nitrogen the fields receive, times the share made at home, divided by the nitrogen fraction of ammonia, plus the ammonia the chemical industry makes for something other than fertiliser. At the base year's nitrogen and the base year's domestic share it reproduces the tonnage the model used to carry as a free-standing lever to within a fraction of a per cent — a cross-check rather than a fit, because the domestic share comes from the fertiliser industry and the nitrogen from the inventory, and neither was chosen to land there. The consequence is that a fertiliser decision is now a hydrogen decision. At the reference nitrogen dose the ammonia demand is little more than half what the lever used to assert, and the hydrogen it draws falls with it.

ammonia_production_2024mineral_n_base * ammonia_domestic_share_base / nh3_nitrogen_fraction + ammonia_non_fertiliserkt NH₃/y—
chain_ammonia_productionland_module_active * ammonia_production + (1 - land_module_active) * ammoniaProductionkt NH₃/y

Which of the two the industry chain reads. Where the module is carried, the ammonia tonnage is derived from the nitrogen the fields ask for and the ammoniaProduction slider is retired and hidden; where it is not, the slider is the model exactly as it was. The switch is arithmetic and not a branch, which is what lets one shared equation serve both and lets the retired slider be provably inert rather than merely invisible. Restructuring the entry itself — moving the lever out of the shared model — would have been a change to the country contract, and this is the same result without one.

Bioenergy — what the land supplies

Stage C of the land module, and the last of the four first-order objects the module replaces. Three threshold rows — biogas 70/150, biofuels 40/50, wood 80/120 — were game rules: numbers the teaching team chose so the game would be playable, declared as such, and argued over in the controversy table because a resource limit that nobody sourced is a resource limit nobody has to believe. They are now computed, from the same land account, the same herd and the same forest the rest of this module already builds. What that changes is not the difficulty but the kind of statement the band makes. A player who breaches the biogas band is no longer over a rule; they are asking the country for more methane than its manure, its cover crops and its straw can make, and the panel can say which of the three would have to move. Push civeArea and the supply rises and so does the band. Push forestHarvest and the wood band rises while the forest sink falls, in the same scenario, from one identity — which is the whole reason the land account was built first. Three things a reader should know before quoting a number from here. The biogas supply carries a calibrated residual, biogas_other, which is 78% of the base year and is the module's largest declared hole; every build prints it. The residue pool is genuinely shared — a tonne of straw is either methane or a second-generation liquid and cannot be both — and residue_to_biogas_share splits it exhaustively, which a test asserts. And the good band is the domestic supply: bioImports moves the warning band and never the target, so a scenario that meets its liquid demand on imports is amber by construction.

NameFormulaUnitNotes and sources
bioenergy_setting_civeland_module_active * civeArea + (1 - land_module_active) * cive_area_baseMha

The switch idiom the whole module uses: where land_module_active is 1 the lever is read, where it is 0 the base-year value is, and both branches always evaluate so nothing about the arithmetic depends on which country is being built.

bioenergy_setting_residuesland_module_active * residueMobilisation + (1 - land_module_active) * residue_mobilisation_basefraction of the residue pool—
bioenergy_setting_energy_cropland_module_active * energyCropArea + (1 - land_module_active) * energy_crop_area_baseMha—
bioenergy_setting_energy_maizeland_module_active * energyMaizeArea + (1 - land_module_active) * energy_maize_area_baseMha

The main crop grown for a digester, on the same switch. It is a separate lever from civeArea because the two are separate facts about the land: a cover crop grows in the gap between two main crops and costs no hectare, while a field of silage maize cut for methane is that field's whole season and is booked in arable_needed as such. Where a country's digesters run on manure and cover crops alone the area is zero and every term it enters is unchanged.

bioenergy_setting_importsland_module_active * bioImports + (1 - land_module_active) * bio_imports_baseTWh/y—
manure_dm_collectablemanure_dm_per_cattle_head * cattle_heads + manure_dm_per_pig_head * pig_herdMt DM/y

The manure a digester could actually take, from the herd the food module sizes. Cattle and pigs only: poultry litter and sheep manure are outside every source's own accounting of the feedstock, and adding them at an invented coefficient would have been inventing a number. Cattle carry about nine tenths of it. A tonne of dry matter times a megawatt-hour per tonne is a terawatt-hour, so the units below need no conversion factor — that is not a coincidence but it is worth stating, because a stray thousand is the easiest error to make here.

biogas_from_manuremanure_dm_collectable * food_setting_manure * biomass_biogas_yieldTWh/y

One lever, two effects. manureMethanised removes part of the methane a manure store would have released — that is livestock_row_manure in the food module — and produces the methane a digester makes, which is this. The abatement is provisional and the supply is not: the yield per tonne is measured, the split between enteric and manure methane that the abatement rests on is not.

biogas_from_civebioenergy_setting_cive * cive_dm_yield * cive_biogas_yieldTWh/y—
biogas_from_energy_maizebioenergy_setting_energy_maize * energy_maize_dm_yield * cive_biogas_yieldTWh/y

Area × dry-matter yield × the same methane yield a tonne of green matter gives a digester. It is the largest single feedstock of the German fleet and the reason the German biogas residual is a sixth of the base year rather than three quarters of it — the feedstock is published as an area and a tonnage, so the module can build it instead of calibrating it away.

residue_dm_poolland_arable * residue_dm_yieldMt DM/y

Straw and stubble the arable area produces, whether or not anybody takes it. It follows land_arable, so ploughing grassland raises it and building on cropland lowers it — the residue supply is a consequence of the land account rather than a parameter beside it.

residue_dm_mobilisedresidue_dm_pool * bioenergy_setting_residuesMt DM/y—
biogas_from_residuesresidue_dm_mobilised * residue_to_biogas_share * biomass_biogas_yieldTWh/y—
biogas_supplybiogas_from_manure + biogas_from_cive + biogas_from_energy_maize + biogas_from_residues + biogas_otherTWh/y

Manure, cover crops, straw and a residual. The residual is 19 TWh and the base year's whole biogas consumption was 24.25, so at the base year this equation is three quarters an admission that the feedstock split is not published. At the reference the three built terms are worth about 51 TWh and the residual is unchanged, which is the right way round — the module grows what it can account for and leaves the hole the size it was.

wood_material_shareforest_material_share_base + land_setting_long_lived - hwp_long_lived_share_basefraction of the harvest

The share of the harvest that leaves the forest as material — sawn timber, panels, pulp, packaging — and therefore does not arrive at a boiler as a log. It starts at the base year's 53.3% and moves one-for-one with harvestToProducts, because a strategy that puts more of the cut into long-lived products is taking it out of the fuel pile and out of nowhere else. It is reported rather than clamped, on the land account's own rule. Inside the declared sliders it stays between 0.458 and 0.658, so neither term below can go negative; a country that widened either lever would see that in the supply before it saw it here.

wood_direct_supplyland_setting_harvest * (1 - wood_material_share - forest_unutilised_share_base) * wood_energy_per_m3TWh/y

The part of the cut that goes straight to energy: commercial fuelwood, and the firewood cut and never sold, which is about a quarter of the French harvest and is estimated by difference.

wood_byproduct_supplywood_byproduct_share * land_setting_harvest * wood_material_share * wood_energy_per_m3TWh/y

What comes back from the material half: sawmill offcuts and bark, panel residues and black liquor. It is 58% of the material harvest and about 35 TWh at the base year — bigger than the direct fuelwood in every scenario where the material share is above a half, which is every scenario the sliders reach.

wood_supplywood_direct_supply + wood_byproduct_supply + non_forest_wood + waste_woodTWh/y

The forest, plus two terms it does not produce: hedges and orchards, and end-of-life wood. Those two are 31.8 TWh and fixed, so a quarter of the wood supply answers to no lever in this game at all. There is no import line. France imports a few terawatt-hours of pellets and chips and exports about half as much again, and both are small enough beside 120 that adding a lever for them would have been decoration.

biofuel_1g_supplybioenergy_setting_energy_crop * biofuel_1g_yieldTWh/y

Area times the mix's average yield. The mix is held fixed while the area moves, which is the simplification worth naming: a sugar-beet hectare yields three times an oilseed hectare, so a scenario that wanted more beet would get a different answer from the same hectares.

biofuel_2g_supplyresidue_dm_mobilised * (1 - residue_to_biogas_share) * residue_liquid_yieldTWh/y

The other half of the residue pool, at the same 2.0 MWh a tonne the digester gets. The two are exclusive and the split is exhaustive: residue_to_biogas_share and its complement are the only claims on residue_dm_mobilised, so raising the mobilisation lever raises both bands together and nothing can be counted twice. A test asserts that the two terms add back to the pool exactly.

biofuel_domestic_supplybiofuel_1g_supply + biofuel_2g_supply + waste_fats_supplyTWh/y

Crops, straw and waste fats — everything the country's own land and bins produce. This is the good band.

biofuel_supplybiofuel_domestic_supply + bioenergy_setting_importsTWh/y

Domestic supply plus the import allowance. This is the warning band, and it is the only place in the three pools where an import appears: wood imports are small and left at zero, and no French study publishes a biomethane import at all.

biogas_headroombiogas_supply - biogas_demandTWh/y

Supply less demand, so a negative number is a scenario asking for more than the country can make. At the reference it is about −238 TWh, and that is the single most important thing this module surfaces: the game's methane demand is 308 TWh against a supply near 70. Part of it is an artefact worth naming — some 23 TWh of international air-freight fuel the source workbook classes as gas — and a large part is the methane a steam reformer turns into hydrogen. Most of it is neither, and is simply a scenario that has not electrified.

biofuel_headroombiofuel_supply - biofuel_demandTWh/y—
biofuel_domestic_headroombiofuel_domestic_supply - biofuel_demandTWh/y

The same against the domestic supply alone, which is the band the score reads. The difference between the two is exactly bioImports.

wood_headroomwood_supply - wood_demandTWh/y—
cive_headroomcive_land_ceiling - bioenergy_setting_civeMha

Cover crops against the land that could carry one. A cover crop occupies the same hectare as the spring crop that follows it, so it takes nothing from the food chain and moves no class of the land account — what limits it is how much spring cropping there is. Reported, never clamped: at the slider's maximum of 3.0 Mha against a ceiling of 4.0 it is a diagnostic and stays positive.

band_biogas_goodland_module_active * biogas_supply + (1 - land_module_active) * threshold["biogas"].goodTWh/y

The domestic biogas supply, and there is no import allowance above it — no French study publishes a biomethane import — so the warning band equals it and a scenario over the supply is straight into the red. That is deliberate: an amber band nothing can buy would be a suggestion that something can.

band_biogas_warningland_module_active * biogas_supply + (1 - land_module_active) * threshold["biogas"].warningTWh/y—
band_biofuel_goodland_module_active * biofuel_domestic_supply + (1 - land_module_active) * threshold["biofuel"].goodTWh/y

The domestic liquid supply — crops, straw and waste fats — and not the imports. This is where bioImports earns its why: it buys the amber band and never the green one.

band_biofuel_warningland_module_active * biofuel_supply + (1 - land_module_active) * threshold["biofuel"].warningTWh/y—
band_wood_goodland_module_active * wood_supply + (1 - land_module_active) * threshold["biomass"].goodTWh/y

The wood supply, and the one band that rises when the forest sink falls. Cutting more wood feeds the boiler and costs the sink, in the same scenario and from the same cubic metres, which is the coupling the whole module was built to show.

band_wood_warningland_module_active * wood_supply + (1 - land_module_active) * threshold["biomass"].warningTWh/y—
manure_dm_collectable_2024manure_dm_per_cattle_head * cattle_base_heads + manure_dm_per_pig_head * livestock["pig"].heads_2024Mt DM/y

The same pool on the published herd rather than on the modelled one. Cattle and pigs, as above.

residue_dm_pool_2024land_class["arable"].area_2023 * residue_dm_yieldMt DM/y

The residue pool on the land account's own base-year arable area. It is 57.0 Mt DM by construction — residue_dm_yield is derived as the published national tonnage over exactly this area — so what the equation shows is that the two definitions were reconciled rather than carried across.

biogas_supply_2024manure_dm_collectable_2024 * manure_methanised_2024 * biomass_biogas_yield + cive_area_base * cive_dm_yield * cive_biogas_yield + energy_maize_area_base * energy_maize_dm_yield * cive_biogas_yield + residue_dm_pool_2024 * residue_mobilisation_base * residue_to_biogas_share * biomass_biogas_yield + biogas_otherTWh/y

The base-year herd, the base-year cover-crop area, the base-year arable and the base-year mobilisation — and biogas_other, which is fitted so this closes. It therefore closes by construction, and the check below is zero by construction, which is worth saying rather than presenting as a result: what this equation demonstrates is the size of the residual, not the quality of the coefficients.

biogas_check_2024biogas_supply_2024 - sdes_biogas_2024TWh/y—
biogas_other_share_2024biogas_other / sdes_biogas_2024fraction of the base-year total

The number gap 3 exists to make impossible to forget. The share of the base year's biogas that this module cannot account for: 78%. The build prints it, the annex carries it in the residual's own why, and a test asserts that the printed figure and the model's are the same.

wood_supply_2024forest_harvest_base * (1 - forest_material_share_base - forest_unutilised_share_base) * wood_energy_per_m3 + wood_byproduct_share * forest_harvest_base * forest_material_share_base * wood_energy_per_m3 + non_forest_wood + waste_woodTWh/y

The base-year harvest at the base-year material share. Unlike the biogas one this is a real check: wood_byproduct_share is the only fitted term in it, and it is fitted on this identity, so what the residual below measures is how much the other four terms — the harvest, the material share, the conversion factor and the two fixed waste terms — miss the observed total by once the fitted one has done its work. It lands at +0.009 TWh.

wood_check_2024wood_supply_2024 - sdes_wood_2024TWh/y—
biofuel_domestic_2024energy_crop_area_base * biofuel_1g_yield + residue_dm_pool_2024 * residue_mobilisation_base * (1 - residue_to_biogas_share) * residue_liquid_yield + waste_fats_supplyTWh/y—
biofuel_supply_2024biofuel_domestic_2024 + bio_imports_baseTWh/y

The only one of the three base-year checks that nothing was fitted to. The 1G yield is the published crop areas times published yields, the 2G term shares the residue pool with the biogas one, the waste fats are observed and the imports are derived from the trade balance. It lands 0.05 TWh under the 41.7 the statistician observes — a tenth of a per cent — which is the closest thing this module has to independent evidence that the liquid coefficients are right.

biofuel_check_2024biofuel_supply_2024 - sdes_biofuel_2024TWh/y—

National reconciliation

Since v0.11.0 the game and the inventory share an accounting scope, and this module has much less to do. Both are scope 1: emissions are booked where the combustion happens, so a power station's emissions belong to the power station and not to everyone who used a kilowatt-hour. One difference remains, and it is real rather than conventional: the game includes international aviation and shipping, which the inventory reports as a memo item outside the national total. That is subtracted as its own named line. What is left is the perimeter the model does not cover at all — refining, fugitive emissions, and the sub-sectors nobody has modelled — and it stays visible rather than being divided away.

NameFormulaUnitNotes and sources
footprint_electricitysum(post.emissions_electricity)MtCO₂/y

Zero since v0.11.0, and kept as a line so the change is visible rather than silent. The game used to charge every sector the life-cycle emissions of its electricity, and this memo undid that to reach the inventory's basis. Now that the game books electricity where it is burned, there is nothing left to undo.

bunker_liquidsum(passenger.passenger_energy, passenger.in_inventory == 0) + sum(freight.freight_energy, freight.in_inventory == 0 and freight.vector == "liquid")TWh/y

International aviation and maritime shipping. Computed from the same rows the game already models, so the exclusion is a consequence of the data rather than an assertion.

bunker_gassum(freight.freight_energy, freight.in_inventory == 0 and freight.vector == "gas")TWh/y—
bunker_emissions_combustion(bunker_liquid * biofuelShare * efLiquid + bunker_gas * efGas) / 1000MtCO₂/y—
transport_combustionsum(post.emissions_combustion, post.sector == "transport")MtCO₂/y—
building_combustionsum(post.emissions_combustion, post.sector == "building")MtCO₂/y—
industry_combustionsum(post.emissions_combustion, post.sector == "industry")MtCO₂/y—
national_transporttransport_combustion - bunker_emissions_combustionMtCO₂e/y

Domestic transport only, on a combustion basis, comparable with SECTEN.

national_buildingbuilding_combustionMtCO₂e/y—
industry_perimeter_differenceofficial_industry_2024 - industry_covered_2020MtCO₂e/y

A diagnostic, not a term of the total. Until the rest of industry was modelled this was a hole in the account and had to be added back; now that all seventeen remaining manufacturing branches are in the model, what is left is a difference of perimeter and of year, and it is shown rather than absorbed. A positive value means the inventory sector is larger than what the model represents — construction and refining sit in SECTEN's industry and not in the manufacturing survey the model is built from, while the survey is a 2019 base compared with a 2024 inventory.

national_industryindustry_combustionMtCO₂e/y

No residual is added any more: every manufacturing branch is in the post table, so the sector total is a sum of the model and nothing else. See industry_perimeter_difference for what still separates it from the inventory sector.

national_agricultureland_module_active * agriculture_emissions + (1 - land_module_active) * (official_agriculture_2024 + (official_agriculture_2050 - official_agriculture_2024) * agriPathway)MtCO₂e/y

Which of the two it reads is land_module_active, the same switch the natural sink is behind. Where the food module is carried, agriculture is a sum of the post table filtered on the sector — three constructive rows, a herd, a nitrogen balance and a fuel line — and the agriPathway slider is retired and hidden; where it is not, the slider is the model exactly as it was, sliding between the observed year and the strategy's horizon. Both sides always evaluate: the switch is arithmetic and never a branch. No perimeter line is needed on either side. Agriculture has no electricity worth the detour and no international bunkers, so the game's basis and the inventory's coincide here — which is why this module lost a line when the food block arrived rather than gaining one.

national_wasteofficial_waste_2024 + (official_waste_2050 - official_waste_2024) * wastePathwayMtCO₂e/y—
national_energysum(post.emissions_combustion, post.sector == "energy")MtCO₂e/y

Computed, not taken from the SNBC. It is what the chosen electricity mix actually burns, at the emission factors the rest of the model uses — so a mix without combustion lands near zero and one leaning on biomass or methane does not. Until v0.11.0 this was a first-order trajectory sliding between two published values, which meant the sector the whole electrification story pushes emissions into was the one sector the player could not affect. What it omits. The inventory's energy branch is power generation plus refining, fugitive emissions and the rest of energy industry transformation; this is power generation alone, because that is all the model has. Expect it to sit below the published figure for that reason and not because the mix is clean.

national_grossnational_transport + national_building + national_industry + national_agriculture + national_waste + national_energyMtCO₂e/y—
national_natural_sink-(land_module_active * land_sink_total + (1 - land_module_active) * naturalSink)MtCO₂e/y

Negated here: both of the things it can read are a magnitude absorbed, so a slider runs the way a reader expects, and the sign is applied once, where the account needs it. Which of the two it reads is land_module_active. Where the land module is carried, the natural sink is computed — seven land classes, six inventory pools and a forest identity in cubic metres — and the naturalSink slider is retired and hidden. Where it is not, the slider is the model, exactly as it was, and the computed side contributes nothing. Both sides always evaluate: the switch is arithmetic and not a branch, so the browser engine, the Python evaluator and the solver see one expression and cannot take different paths through it.

national_technological_sink-techSinkMtCO₂e/y—
national_total_sinknational_natural_sink + national_technological_sinkMtCO₂e/y

The two sinks added up, because what a net-zero claim rests on is the total and not either half. They are very different objects, though, and the dashboard keeps them visible separately: the natural sink is a forest that the official pathway expects to weaken, while the technological one is a closure residual rather than a published target.

sink_reliance-national_natural_sinkMtCO₂e/y absorbed

How much of net zero this scenario buys with the land: the natural sink as a magnitude, so it can be read against the trajectory the country's own strategy publishes for it. Scored on a line of its own, and not only inside the net, for two reasons. The two sinks are different objects — one is a forest, reversible, exposed to drought, fire and pests, and expected by the official pathways themselves to weaken; the other is a closure residual — which is the High Council on Climate's case for budgeting reversible sequestration and permanent removals separately. And the net line is hinged at zero: once a scenario crosses it, it stops reading either sink, so a player could buy the last megatonnes by cutting less wood and see no score move at all. This line has no hinge.

national_netnational_gross + national_natural_sink + national_technological_sinkMtCO₂e/y—
snbc_gross_gapnational_gross - snbc_gross_2050MtCO₂e/y

The number that matters: how far the scenario sits from the published SNBC 3 gross total. It is not zero by construction, and it is not meant to be — a large gap tells you where the scenario or the model disagrees with the national strategy.

Annualised cost layer

Real euros, no inflation, no subsidy or transfer, at full utilisation of installed capacity. For every asset the annualised cost is CAPEX × CRF(rate, lifetime) + fixed O&M + Σ(input intensity × price) + on-site CO₂ × carbon price. The governing principle is that the cost layer prices the quantities the game already shows: it never substitutes a different intensity, so where the physical description of a chain is incomplete its cost is understated by the same amount.

NameFormulaUnitNotes and sources
route_annuity
per row of cost_route
row.capex * crf(discountIndustry, row.life) + row.fixed€/t of capacity/y—
price_methane_mwhprice_methane_per_tonne / lhv_methane€/MWh—
price_coal_mwhprice_coal_per_tonne / lhv_coal€/MWh—
cost_hydrogen_electrolyticcost_route["electrolyser"].route_annuity / lhv_hydrogen + elecPriceIndustry / efficiency_electricity_to_h2€/MWh

Electrolyser annuity spread over its hydrogen output, plus the electricity it consumes at the workbook's 60% efficiency rather than the 74% POMMES uses. Hydrogen is therefore about 40% dearer here than a POMMES-native calculation gives, and everything hydrogen-based inherits that.

cost_hydrogen_smr(cost_route["smr"].route_annuity + smr_methane_per_tonne_h2 * price_methane_per_tonne + smr_electricity_per_tonne_h2 * elecPriceIndustry + smr_emission_per_tonne_h2 * carbonPrice) / lhv_hydrogen€/MWh—
cost_hydrogen_atr_ccscost_route["smr"].route_annuity / lhv_hydrogen + hydrogen_route["atr_ccs"].methane * price_methane_mwh + hydrogen_route["atr_ccs"].electricity * elecPriceIndustry + carbon_in_methane * hydrogen_route["atr_ccs"].methane * (1 - hydrogen_route["atr_ccs"].carbon_captured) * carbonPrice / 1000000€/MWh

The reformer's own cost plus the capture: no separate plant cost is declared for the capture train, so this uses the SMR annuity and adds the methane an ATR needs, which understates the capital. The carbon price applies only to what escapes.

cost_hydrogen_blendedhydrogen_route["electrolysis"].route_share * cost_hydrogen_electrolytic + hydrogen_route["smr"].route_share * cost_hydrogen_smr + hydrogen_route["atr_ccs"].route_share * cost_hydrogen_atr_ccs€/MWh

What a tonne of hydrogen costs on average, given the mix. Everything that buys hydrogen buys it at this price, which is what makes the route choice show up in the cost of steel and ammonia alike.

chain_cost_capital
per row of industry_chain
steel_bf: cost_route["steel_bf"].route_annuity
steel_dri: cost_route["steel_dri"].route_annuity
steel_eaf: cost_route["steel_eaf"].route_annuity
ammonia: cost_route["haber_bosch"].route_annuity
olefins: cost_route["methanol_to_olefins"].route_annuity + cost_route["methanol"].route_annuity * methanol_per_olefin
cement: cost_route["cement_kiln"].route_annuity * (1 - carbonCapture) + cost_route["cement_kiln_ccs"].route_annuity * carbonCapture
€/t of product—
chain_cost_variable
per row of industry_chain
steel_bf: row.coal * price_coal_mwh + row.gas * price_methane_mwh + row.electricity * elecPriceIndustry + iron_ore_per_steel_bf * price_iron_ore
steel_dri: row.hydrogen * cost_hydrogen_electrolytic + row.gas * price_methane_mwh + row.electricity * elecPriceIndustry + iron_ore_per_steel_dri * price_iron_ore
steel_eaf: row.electricity * elecPriceIndustry + scrap_per_steel_eaf * price_scrap
ammonia: industry_chain["ammonia"].electricity * elecPriceIndustry + industry_chain["ammonia"].hydrogen * cost_hydrogen_blended
olefins: row.electricity * elecPriceIndustry + row.hydrogen * cost_hydrogen_electrolytic
cement: kiln_heat_per_clinker * coal_per_kiln_heat * price_coal_per_tonne + limestone_per_clinker * price_limestone + (row.electricity + cement_capture_extra_electricity * carbonCapture) * elecPriceIndustry
€/t of product

Energy and feedstock. Ammonia buys its hydrogen at the mix's blended price rather than at one route's, because since v0.12.0 it no longer owns a route: the same reformers and electrolysers serve steel and everything else.

chain_cost_carbon
per row of industry_chain
row.chain_emissions_per_tonne * carbonPrice€/t of product—
chain_cost_total
per row of industry_chain
row.chain_cost_capital + row.chain_cost_variable + row.chain_cost_carbon€/t of product—
steel_outputsum(industry_chain.chain_production, industry_chain.subpost == "steel")kt/y—
steel_cost_blendedsumproduct(industry_chain.chain_production, industry_chain.chain_cost_total, industry_chain.subpost == "steel") / max(1, steel_output)€/t—
industry_cost_chainssumproduct(industry_chain.chain_production, industry_chain.chain_cost_total) / 1000M€/y—
industry_cost_food_energyfood_gas * price_methane_mwh + food_electricity * elecPriceIndustryM€/y

Food-industry heat is priced on its energy alone: the workbook does not describe its equipment, so no annuity can be attached to it.

industry_cost_totalindustry_cost_chains + industry_cost_food_energyM€/y—
retrofit_deep_equivalentmin(1, bldgRetrofit / deep_retrofit_saving)fraction of the stock

The average stock improvement expressed as an equivalent number of deep renovations, capped at the whole stock.

retrofit_investmentbuilding_surface_2020 * retrofit_deep_equivalent * retrofitCost * renovation_vatM€—
retrofit_annualretrofit_investment * crf(discountResidential, retrofit_life)M€/y—
heat_pump_investmentheat_pump_surface_added * heat_pump_cost_per_m2M€

Priced on the surface that actually gains a heat pump between 2020 and 2050, which the stock model now knows. The aggregate module could only charge the whole electrically heated stock, equipment already installed included.

heat_pump_annualheat_pump_investment * crf(discountResidential, heat_pump_life)M€/y—
building_energy_costbuilding_electricity * price_household_electricity + building_gas * price_household_gas + building_wood * price_woodM€/y—
building_cost_totalretrofit_annual + heat_pump_annual + building_energy_costM€/y—
building_cost_per_m2building_cost_total / building_surface_2020€/m²/y—
residential_areabuilding_surface_residentialMm²

The model's own heated surface, 3 654.9 Mm², rather than the 4 200 Mm² of total floor area ADEME reports after CEREN: the stock segments only what is heated by one of the eight systems. Cost and energy now share one denominator, which they did not before.

tertiary_areabuilding_surface_2020 - building_surface_residentialMm²—
residential_energy_costbuilding_electricity_residential * price_household_electricity + building_gas_residential * price_household_gas + building_wood_residential * price_woodM€/y

The split is now counted, not assumed: every segment carries its building type, so each vector is divided where it is actually used. The residential stock takes most of the wood and about half the gas, and a floor-area split would have misstated both. The retrofit and equipment annuities are still split by area, because one retrofit lever drives the whole stock.

tertiary_energy_costbuilding_energy_cost - residential_energy_costM€/y—
residential_cost_total(retrofit_annual + heat_pump_annual) * residential_area / building_surface_2020 + residential_energy_costM€/y—
tertiary_cost_totalbuilding_cost_total - residential_cost_totalM€/y—
residential_cost_per_m2residential_cost_total / residential_area€/m²/y—
tertiary_cost_per_m2tertiary_cost_total / tertiary_area€/m²/y—
car_vehicle_kmsum(passenger.passenger_demand / passenger.occupancy, passenger.id == "car_fuel" or passenger.id == "car_gas" or passenger.id == "car_electric")Gvkm/y—
car_fleetcar_vehicle_km * 1000000000 / km_per_car_per_yearcars—
car_fleet_ratiocar_fleet / reference_car_fleetratio—
car_ownership_costcar_ownership_reference * car_fleet_ratio€/household/y

Purchase, insurance and maintenance are deliberately technology-neutral: the electric-versus-thermal purchase premium and maintenance saving are not sourced, so they are excluded rather than guessed. Only the size of the fleet moves this block.

car_electricitysum(passenger.passenger_energy, passenger.id == "car_electric")TWh/y—
car_moleculessum(passenger.passenger_energy, passenger.id == "car_fuel" or passenger.id == "car_gas")TWh/y—
car_energy_cost(car_electricity * price_household_electricity + car_molecules * liquidFuelPrice) / households€/household/y—
transport_cost_per_householdcar_ownership_cost + car_energy_cost€/household/y—

Aviation — the price of a ticket

What decarbonised flying costs the passenger. The fuel side is computed from the same energy the emissions account charges, at a synthetic-fuel price the player sets; everything else — aircraft, crew, airport charges, maintenance — is derived from today's ticket through the fuel share of airline operating cost and held constant. That last assumption is the weak one, and it is stated rather than buried: a 2050 airline may have a different cost structure and nothing here models it.

NameFormulaUnitNotes and sources
jet_price_per_mwh_todayjet_fuel_price_2023 / lhv_kerosene€/MWh—
saf_price_per_tonnebiofuelShare * safBioPrice + (1 - biofuelShare) * safEfuelPrice€/t

The same biofuel/e-fuel split the transport module applies to every litre of liquid fuel, so the ticket and the emissions account describe the same fuel.

saf_price_per_mwhsaf_price_per_tonne / lhv_kerosene€/MWh—
flight_distance
per row of flight_type
row.pkt_2023 / row.pax_2023 * 1000km

Passenger-kilometres divided by passengers, one way.

flight_energy_today
per row of flight_type
row.flight_distance * passenger[row.game_row].unit_consumption / passenger[row.game_row].occupancy / 100kWh per passenger—
flight_energy_2050
per row of flight_type
row.flight_distance * passenger[row.game_row].unit_consumption_2050 / passenger[row.game_row].occupancy / 100kWh per passenger—
flight_fuel_cost_today
per row of flight_type
row.flight_energy_today / 1000 * jet_price_per_mwh_today€ per passenger—
flight_ticket_today
per row of flight_type
row.flight_fuel_cost_today / fuelShareOperating€ per passenger

Not an observed fare: the fuel bill grossed up by the fuel share of operating cost. It carries no margin, no tax and no yield management, so it is a cost, not a price, and it will sit below what a traveller actually pays on a route with high margins and above it on a route sold at a loss.

flight_non_fuel_cost
per row of flight_type
row.flight_ticket_today - row.flight_fuel_cost_today€ per passenger—
flight_fuel_cost_2050
per row of flight_type
row.flight_energy_2050 / 1000 * saf_price_per_mwh€ per passenger—
flight_ticket_2050
per row of flight_type
row.flight_non_fuel_cost + row.flight_fuel_cost_2050€ per passenger—
flight_ticket_ratio
per row of flight_type
row.flight_ticket_2050 / row.flight_ticket_today×—
flight_co2_today
per row of flight_type
row.flight_energy_today / 1000 / lhv_kerosene * co2_per_tonne_kerosene * 1000kgCO₂ per passenger

Combustion of the kerosene only. It excludes the upstream fuel chain and the non-CO₂ effects of aviation — contrails and nitrogen oxides — which several studies put at the same order of magnitude again.

flight_co2_2050
per row of flight_type
row.flight_energy_2050 * efLiquid / 1000kgCO₂ per passenger—
aviation_energysum(passenger.passenger_energy, passenger.aviation == 1)TWh/y—
aviation_fuel_billaviation_energy * saf_price_per_mwhM€/y

What the scenario's aviation fuel costs the sector as a whole, at the same price the tickets use.

Building usages other than heating

Space heating is about half of what a building consumes. This is the other half: hot water, cooking, air conditioning, and the specific electrical uses — lighting, appliances, screens, and the servers behind them. It carries no stock and no technology choice; each usage is its observed energy carried to 2050 and moved by an efficiency lever, a growth lever, or both. That is a weaker model than the heating one and deliberately so: the alternative was to leave 240 TWh of building energy out of the account entirely, which is what the model did until 0.8.0.

NameFormulaUnitNotes and sources
usage_factor
per row of building_usage
dhw_residential: 1 - usageDhwEfficiency
dhw_tertiary: 1 - usageDhwEfficiency
cooking_residential: 1 - usageCookingEfficiency
cooking_tertiary: 1 - usageCookingEfficiency
cooling_residential: 1 + usageCoolingGrowth
cooling_tertiary: 1 + usageCoolingGrowth
specific_residential: (1 - usageSpecificEfficiency) * (1 + usageSpecificGrowth)
specific_tertiary: (1 - usageSpecificEfficiency) * (1 + usageSpecificGrowth)
other_tertiary: 1
multiple of the observed year

Efficiency and growth act on the same usage and pull against each other, which is the point of carrying both. Cooking and hot water get efficiency only; cooling gets growth only, because nothing suggests a French air-conditioning stock that shrinks.

usage_electric_efficiency
per row of building_usage
dhw_residential: dhw_efficiency_electric
dhw_tertiary: dhw_efficiency_electric
cooking_residential: cooking_efficiency_electric
cooking_tertiary: cooking_efficiency_electric
default: 1
service per MWh—
usage_fuel_efficiency
per row of building_usage
dhw_residential: dhw_efficiency_fuel
dhw_tertiary: dhw_efficiency_fuel
cooking_residential: cooking_efficiency_fuel
cooking_tertiary: cooking_efficiency_fuel
default: 1
service per MWh—
usage_electric_target
per row of building_usage
dhw_residential: usageDhwElectric
dhw_tertiary: usageDhwElectric
cooking_residential: usageCookingElectric
cooking_tertiary: usageCookingElectric
default: -1
fraction of the service

Only hot water and cooking can be switched. Cooling and the specific electrical uses are already electric, and the tertiary "other" row is too heterogeneous to claim anything about.

usage_fuel_base
per row of building_usage
row.gas + row.heat + row.liquid + row.woodTWh/y—
usage_service
per row of building_usage
(row.electricity * row.usage_electric_efficiency + row.usage_fuel_base * row.usage_fuel_efficiency) * row.usage_factorservice units

What the usage actually delivers — hot water, hot pans — rather than what it consumes. Efficiency and growth act here, before the choice of carrier.

usage_electricity
per row of building_usage
row.usage_service * row.usage_electric_target / row.usage_electric_efficiency if row.usage_electric_target >= 0 else row.electricity * row.usage_factorTWh/y

Where a target exists, the electric share of the service divided by the electric route's efficiency. Where it does not, the observed electricity carried forward.

usage_fuel_energy
per row of building_usage
row.usage_service * (1 - row.usage_electric_target) / row.usage_fuel_efficiency if row.usage_electric_target >= 0 else row.usage_fuel_base * row.usage_factorTWh/y

The service left to the fuels, at the fuel route's efficiency.

usage_fuel_scale
per row of building_usage
row.usage_fuel_energy / row.usage_fuel_base if row.usage_fuel_base > 0 else 0multiple of the observed fuel mix

What is left to the fuels keeps the proportions it has today — gas, oil and LPG in the ratio observed — because nothing here says which of them goes first.

usage_gas
per row of building_usage
(row.gas + row.heat) * row.usage_fuel_scaleTWh/y

District heat is folded in here. The model has no heat carrier outside the heating module, and its networks are majority gas, so this is the least wrong home for 2.8 TWh — stated rather than buried.

usage_liquid
per row of building_usage
row.liquid * row.usage_fuel_scaleTWh/y—
usage_wood
per row of building_usage
row.wood * row.usage_fuel_scaleTWh/y—
usage_energy
per row of building_usage
row.usage_electricity + row.usage_gas + row.usage_liquid + row.usage_woodTWh/y—
usages_electricity_residentialsum(building_usage.usage_electricity, building_usage.segment == "residential")TWh/y—
usages_electricity_tertiarysum(building_usage.usage_electricity, building_usage.segment == "tertiary")TWh/y—
usages_gas_residentialsum(building_usage.usage_gas, building_usage.segment == "residential")TWh/y—
usages_gas_tertiarysum(building_usage.usage_gas, building_usage.segment == "tertiary")TWh/y—
usages_liquid_residentialsum(building_usage.usage_liquid, building_usage.segment == "residential")TWh/y—
usages_liquid_tertiarysum(building_usage.usage_liquid, building_usage.segment == "tertiary")TWh/y—
usages_wood_residentialsum(building_usage.usage_wood, building_usage.segment == "residential")TWh/y—
usages_wood_tertiarysum(building_usage.usage_wood, building_usage.segment == "tertiary")TWh/y—
usages_energy_totalsum(building_usage.usage_energy)TWh/y—
usages_energy_dhwsum(building_usage.usage_energy, building_usage.usage == "dhw")TWh/y—
usages_energy_cookingsum(building_usage.usage_energy, building_usage.usage == "cooking")TWh/y—
usages_energy_coolingsum(building_usage.usage_energy, building_usage.usage == "cooling")TWh/y—
usages_energy_specificsum(building_usage.usage_energy, building_usage.usage == "specific")TWh/y—

Electricity supply

The mix follows the demand rather than standing beside it: whatever electricity the rest of the model turns out to need is served by the share structure of one of RTE's six 2050 scenarios. Choosing a scenario answers "with what", never "how much". Capacity follows from energy through a load factor, and what has to be built each year follows from capacity through a lifetime — a fleet of that size has to be renewed at that rate, and it is the build rate rather than the standing fleet that consumes materials. The result feeds the material account, which is why the seven build-rate sliders it used to carry are gone. This does not check that the mix works. There is no hourly balance, no adequacy calculation and no storage: a 100%-renewable share structure is applied here exactly as a nuclear-heavy one is. The winter peak the building module computes is still a demand-side number that nothing on this side has to meet.

NameFormulaUnitNotes and sources
generation_share
per row of generation_technology
nuclear: sum(rte_scenario.nuclear, rte_scenario.scenario_index == rteScenario)
pv_ground: sum(rte_scenario.pv_ground, rte_scenario.scenario_index == rteScenario)
pv_roof: sum(rte_scenario.pv_roof, rte_scenario.scenario_index == rteScenario)
wind_onshore: sum(rte_scenario.wind_onshore, rte_scenario.scenario_index == rteScenario)
wind_offshore_fixed: sum(rte_scenario.wind_offshore_fixed, rte_scenario.scenario_index == rteScenario)
wind_offshore_floating: sum(rte_scenario.wind_offshore_floating, rte_scenario.scenario_index == rteScenario)
hydro: sum(rte_scenario.hydro, rte_scenario.scenario_index == rteScenario)
bioenergy: sum(rte_scenario.bioenergy, rte_scenario.scenario_index == rteScenario)
gas_turbine: sum(rte_scenario.gas_turbine, rte_scenario.scenario_index == rteScenario)
combined_cycle: sum(rte_scenario.combined_cycle, rte_scenario.scenario_index == rteScenario)
fraction of supply

The selected scenario's row, picked by a filtered sum over the one row whose index matches the lever.

generation_share_totalsum(generation_technology.generation_share)fraction

The declared shares are rounded, so they sum to one only to about six decimals. Dividing by their own total makes supply equal demand exactly rather than nearly, which is the difference between an identity a test can assert and one it can only approximate.

generation_share_thermal_gas
per row of generation_technology
row.generation_share / generation_share_total / row.thermal_efficiency if row.thermal_efficiency > 0 and row.fuel_carrier == "gas" else 0fraction of demand, per unit of fuel

Share of supply divided by thermal efficiency: how much fuel each gas plant needs per unit of national demand. Zero for anything that burns no gas.

generation_energy
per row of generation_technology
electricity_demand * row.generation_share / generation_share_total if generation_share_total > 0 else 0TWh/y—
generation_capacity
per row of generation_technology
row.generation_energy / row.load_factor / 8.76 if row.load_factor > 0 else 0GW

Energy divided by a load factor and by the 8 760 hours in a year. The load factors are RTE's own, read back out of its capacity and generation tables, and they barely move between scenarios — onshore wind 23%, offshore 41%, solar 14%.

generation_build
per row of generation_technology
row.generation_capacity * 1000 / row.lifetimeMW/y

A fleet of this size has to be renewed at this rate. It is the steady-state build, which understates the years when the fleet is still growing and overstates them once it is not — a build rate rather than a build programme, and the material account reads it as such.

generation_fuel
per row of generation_technology
row.generation_energy / row.thermal_efficiency if row.thermal_efficiency > 0 else 0TWh/y

Electricity out divided by thermal efficiency gives fuel in. Zero for everything that burns nothing, which in these scenarios is all of it bar the biomass plants and a sliver of combined cycle.

generation_switchable_fuelsum(generation_technology.generation_fuel, generation_technology.fuel_carrier == "gas")TWh/y

Every gas-fired plant. The model does not distinguish a combined cycle from an open-cycle turbine from a gas engine — RTE's categories are fuels, not machines — so it cannot claim that one of them can burn hydrogen and another cannot. A plant that burns biogas burns it in a turbine, and that turbine is as convertible as any other.

generation_gas_fuelgeneration_switchable_fuel * (1 - gasPlantHydrogen)TWh/y—
generation_hydrogen_fuelgeneration_switchable_fuel * gasPlantHydrogenTWh/y—
generation_hydrogen_electricitygeneration_hydrogen_fuel / efficiency_electricity_to_h2TWh/y

What the electrolysers would draw. It is not added to the electricity the mix has to serve: demand sets the mix and the mix would then set demand, which is a fixed point this compiler cannot express. It is reported rather than hidden. Because the switch reaches the combined cycle alone, and RTE keeps barely a percent of supply there, the number is around one TWh — small enough that leaving it out of the demand changes nothing a reader would notice.

generation_wood_fuelsum(generation_technology.generation_fuel, generation_technology.fuel_carrier == "wood")TWh/y

Biomass electricity at 25% efficiency needs four units of wood for one of power, so this is large — and it competes for the same resource the buildings burn. The scoreboard counts it.

generation_fuel_costgeneration_gas_fuel * price_methane_mwh + generation_hydrogen_fuel * cost_hydrogen_electrolyticM€/y

What the combustion plants burn, priced. Hydrogen is much the dearer of the two and the model charges it at the electrolytic price the industry module already computes — which is the point of the switch being a lever rather than an assumption.

generation_annual_cost
per row of generation_technology
row.generation_capacity * (row.capex_per_kw * crf(discountResidential, row.lifetime) + row.opex_per_kw_year)M€/y

Capital recovered over the technology's own life at the residential discount rate, plus fixed operating cost. No fuel, no carbon, no network, no storage — this is the plant, and it is the floor of what a mix costs rather than its price.

generation_total_capacitysum(generation_technology.generation_capacity)GW—
generation_total_costsum(generation_technology.generation_annual_cost) + generation_fuel_costM€/y

Plant plus fuel. Still no carbon, no network and no storage.

generation_cost_per_mwhgeneration_total_cost / electricity_demand€/MWh—
grid_emission_factornational_energy / electricity_demand * 1000 if electricity_demand > 0 else 0gCO₂/kWh

What a kilowatt-hour actually carries, derived from the fuel the mix burns rather than declared. It replaced a 40 gCO₂/kWh lever in v0.11.0: under a scope-1 account the number is a result of the generation choice, and letting a player set it independently of the mix they had just chosen was the inconsistency that prompted the whole change. It is a combustion figure, not a life-cycle one — no construction, no fuel chain, no decommissioning — which is why it lands near zero for a mix that burns almost nothing, and why it is not comparable with the 80-ish gCO₂/kWh a life-cycle study reports for the same grid.

generation_renewable_sharesum(generation_technology.generation_share, generation_technology.renewable == 1)fraction—

Materials of the transition

A satellite account, and deliberately a one-way one: it reads the scenario, nothing reads it back. The steel a wind farm needs is not charged to the steel industry the model already has, the concrete is not charged to cement, and none of it emits. Wiring it back would double-count against an industry module whose output is set by its own levers, so the honest thing is to compute the demand and put it beside the supply rather than inside it. What it is for: a decarbonisation pathway is usually argued in TWh and MtCO2. This says what the same pathway weighs. Three of the numbers are worth reading against the industry module directly — the transition's steel against French steel output, its concrete against French cement.

NameFormulaUnitNotes and sources
vehicle_electric_share
per row of vehicle_type
car: carElectric
truck: truckElectric
default: row.electric_share
fraction of production

Cars and trucks follow the player's own electrification levers, which is the whole point of a satellite account that reacts to the scenario. The rest keep the share derived from the source's battery-capacity row. Note the levers are shares of demand rather than of production; over a thirty-year horizon the two converge, and the approximation is stated rather than hidden.

vehicle_battery_capacity
per row of vehicle_type
row.production_2050 * row.vehicle_electric_share * row.battery_kwh / 1000000GWh/y—
battery_capacity_vehiclessum(vehicle_type.vehicle_battery_capacity)GWh/y—
battery_capacity_totalbattery_capacity_vehiclesGWh/y

Vehicle batteries only. Grid storage had its own slider until the supply mix started following demand; at the rate the source scenario built it — 1 GWh a year against 159 in vehicles — it was rounding, and carrying a lever for it implied a precision the model does not have.

vehicle_steelsumproduct(vehicle_type.production_2050, vehicle_type.steel) / 1000000kt/y

Kilogrammes per vehicle times units per year, so 10^6 carries kg to kt.

vehicle_aluminiumsumproduct(vehicle_type.production_2050, vehicle_type.aluminium) / 1000000kt/y—
generation_steelsumproduct(generation_technology.generation_build, generation_technology.steel) / 1000kt/y—
generation_concretesumproduct(generation_technology.generation_build, generation_technology.concrete) / 1000kt/y—
generation_aluminiumsumproduct(generation_technology.generation_build, generation_technology.aluminium) / 1000kt/y—
generation_coppersumproduct(generation_technology.generation_build, generation_technology.copper) / 1000kt/y—
generation_lithiumsumproduct(generation_technology.generation_build, generation_technology.lithium) / 1000kt/y—
generation_cobaltsumproduct(generation_technology.generation_build, generation_technology.cobalt) / 1000kt/y—
generation_nickelsumproduct(generation_technology.generation_build, generation_technology.nickel) / 1000kt/y—
generation_rare_earthsumproduct(generation_technology.generation_build, generation_technology.rare_earth) / 1000kt/y—
battery_intensity_steelbattery_chemistry["lfp"].steel * batteryLfpShare + battery_chemistry["nmc_811"].steel * (1 - batteryLfpShare)t per MWh—
battery_intensity_aluminiumbattery_chemistry["lfp"].aluminium * batteryLfpShare + battery_chemistry["nmc_811"].aluminium * (1 - batteryLfpShare)t per MWh—
battery_intensity_copperbattery_chemistry["lfp"].copper * batteryLfpShare + battery_chemistry["nmc_811"].copper * (1 - batteryLfpShare)t per MWh—
battery_intensity_lithiumbattery_chemistry["lfp"].lithium * batteryLfpShare + battery_chemistry["nmc_811"].lithium * (1 - batteryLfpShare)t per MWh—
battery_intensity_cobaltbattery_chemistry["lfp"].cobalt * batteryLfpShare + battery_chemistry["nmc_811"].cobalt * (1 - batteryLfpShare)t per MWh—
battery_intensity_nickelbattery_chemistry["lfp"].nickel * batteryLfpShare + battery_chemistry["nmc_811"].nickel * (1 - batteryLfpShare)t per MWh—
battery_steelbattery_capacity_total * battery_intensity_steelkt/y—
battery_aluminiumbattery_capacity_total * battery_intensity_aluminiumkt/y—
battery_copperbattery_capacity_total * battery_intensity_copperkt/y—
battery_lithiumbattery_capacity_total * battery_intensity_lithiumkt/y—
battery_cobaltbattery_capacity_total * battery_intensity_cobaltkt/y—
battery_nickelbattery_capacity_total * battery_intensity_nickelkt/y—
construction_concrete(sum(construction_use.construction_use_cement, construction_use.cement_intensity > 0) - construction_cement_saved) / cement_per_concrete * concrete_densitykt/y

The concrete of the buildings the scenario puts up, from the cement the construction module says they carry. Converted at the cement content of a cubic metre and the density of concrete rather than at the whole-economy "béton équivalent" bookkeeping factor of 266 kg a cubic metre: that factor already absorbs mortars, renders and bagged cement, and pushing building cement through it inflates the answer by about seven tenths — enough to make a collective dwelling come out as 98% concrete by mass, which it is not.

material_steelgeneration_steel + vehicle_steel + battery_steel + construction_steel_demandkt/y—
material_concretegeneration_concrete + construction_concretekt/y—
material_aluminiumgeneration_aluminium + vehicle_aluminium + battery_aluminiumkt/y—
material_coppergeneration_copper + battery_copperkt/y—
material_lithiumgeneration_lithium + battery_lithiumkt/y—
material_cobaltgeneration_cobalt + battery_cobaltkt/y—
material_nickelgeneration_nickel + battery_nickelkt/y—
material_rare_earthgeneration_rare_earthkt/y—
french_steel_productionsum(industry_chain.chain_production, industry_chain.subpost == "steel")kt/y—
material_steel_share_of_french_steelmaterial_steel / french_steel_productionfraction

The transition's annual steel demand against what the scenario's own steel industry produces. Both move with the player, which is the comparison worth making: electrifying harder raises the steel needed and, if the output levers are left alone, does not raise the steel made.

material_concrete_vs_cementmaterial_concrete / sum(industry_chain.chain_production, industry_chain.subpost == "cement")fraction

Against clinker rather than concrete, because clinker is what the model produces and what carries the process CO2. A ratio above one is not an error: concrete is mostly aggregate, and a tonne of clinker makes several tonnes of concrete.

Cost layer — method and sources

The cost layer prices the physical flows the game already computes. It never uses a different quantity from the one shown in the emissions dashboard: if the physical description of a chain is incomplete, its cost is understated by the same amount, and that is stated rather than patched.

Convention

Real euros, no inflation, no subsidy or tax transfer. Annualised cost = CAPEX × CRF(rate, lifetime) + fixed O&M + Σ (input × price) + CO₂ × carbon price, with CRF(r, n) = r / (1 − (1+r)−n) and full utilisation of installed capacity. Two discount rates are exposed because an industrial investor and a household do not face the same cost of capital: moving the residential rate from 4% to 8% raises the building indicator by roughly a third, entirely through the retrofit annuity.

Where the cost numbers come from

Same four classes as the model annex, with one addition: Provisional means the value is plausible and widely quoted but no primary publication has been secured, so it is exposed as a slider rather than fixed.
ParameterValueProvenanceSource
Industrial CAPEX, lifetime, fixed O&M, feedstock intensities e.g. BF-BOF 442 €/t over 25 years, 53 €/t/y; electrolyser 1 125 €/t H₂ over 11.42 years Published POMMES-INDUSTRY, France 2050 — conversion_investment.csv, conversion_operation.csv, conversion_factor.csv
Commodity prices 2050: methane 561 €/t, coal 99, iron ore 100, scrap 180, limestone 20 €/t Converted to €/MWh with lower heating values 13.9, 7.5 and 33.33 MWh/t Published POMMES-INDUSTRY import_hourly.csv. The default 8% discount rate is the finance_rate of the same dataset
Carbon price, 150 €/tCO₂ by default End point of a linear trajectory from 2021 Published POMMES-INDUSTRY carbon.csv
Household energy prices: electricity 260 €/MWh, gas 134 €/MWh incl. tax First half of 2025 Published SDES, gas and electricity prices, H1 2025
Wood pellets, 77.5 €/MWh Bulk pellets, 7.75 c€/kWh Published Propellet energy price index, Q2 2025
Floor area, 4 200 Mm² of which 77% residential Denominator of the €/m² indicator Published ADEME BatiZoom, after CEREN
Household car budget, 3 803 €/y: purchase 1 459, fuel 1 110, insurance 518, maintenance 564 Average household, 2017. Dispersion: 21.3% of disposable income in the lowest decile against 11.5% in the highest Published INSEE Première 1855, Budget de famille 2017
31.377 million households; 11 600 km per car per year Denominator and fleet conversion Published INSEE Focus 332 (1 January 2024) and SDES, Chiffres clés des transports 2026
VAT on renovation, 5.5% Applied to retrofit works Published Reduced rate, as used in the CSTB OptoBat cost chain
Deep-retrofit cost, 550 €/m² by default Adjustable between 200 and 900 €/m² Provisional ADEME / Batiprix order of magnitude. The primary publication has not been identified: every figure in circulation is a secondary citation. Exposed as a slider for that reason
Heat pump, 80 €/m² incl. tax over 17 years Applied to the heat-pump share of electrically heated area Provisional ADEME air-water heat pump, quoted at 60–100 €/m². The boiler it replaces is not netted out, so this overstates the incremental cost
Liquid fuel at the pump, 200 €/MWh by default Applied to biofuel, e-fuel and vehicle gas alike Provisional No 2050 source secured. This is the weakest number in the layer and it drives the household energy block directly
One deep renovation saves 60% of demand Converts the retrofit slider into a renovated floor area Game rule Needed because the building lever is an average demand reduction, not a share of the stock. At the default 30% lever this implies half the stock deeply renovated
Purchase, insurance and maintenance are technology-neutral Only fleet size moves them Game rule Explicit decision: the electric-versus-thermal purchase premium and maintenance saving are not yet sourced, so they are excluded rather than guessed

Two deliberate inconsistencies with POMMES

Electrolysis efficiency. POMMES uses 45 MWh of electricity per tonne of hydrogen, about 74%. The workbook uses 60%, and the cost layer follows the workbook so that the cost and the electricity KPI describe the same hydrogen. This makes hydrogen here roughly 40% more expensive than a POMMES-native calculation would give, and it is the single assumption to which the H₂-DRI steel and electrolytic ammonia figures are most sensitive.

Grey ammonia. The workbook gives grey ammonia a gas consumption of 0.91 MWh/t, an order of magnitude below the roughly 9 MWh/t of an SMR-based plant. That figure is kept in the energy balance for continuity but is not used for cost: the SMR-hydrogen ammonia row is priced from the POMMES reforming route instead. The workbook value should be reviewed.

Cross-check

At the reference settings the retrofit block implies about 1 220 bn€ of investment. Spread over the twenty-five years to 2050 that is close to 49 bn€ per year, against the 50 bn€ per year that I4CE's Panorama des financements climat (2025 edition) estimates is needed for building renovation by 2030. The two are built from completely different data, so the agreement is a genuine check rather than a construction.

What the cost layer omits

Freight, aviation and public transport; grid reinforcement; CO₂ transport, storage and the cost of the CO₂ feedstock for synthetic olefins; equipment for food-industry heat; cement kiln-fuel CO₂, which the physical model does not count either. Price base years are mixed — 2017 for the mobility budget, 2025 for household energy, 2050 for industrial commodities — with no deflator. Compare deltas across scenarios, not levels across sectors.

Build information and model limitations

This page is a self-contained artefact generated by Python: no server, external library or connection is required. The live calculation engine runs in the browser.

Transport and industry reproduce the workbook relationships algebraically. Building heating is an aggregate calibrated model because the workbook computes the stock bottom-up. Reference outputs are covered by automated regression tests.

The calculation is not written in this page. It is compiled from app/model/technology.yaml, app/model/countries/<CC>/<CC>.yaml and app/model/equations.yaml, which also generate the sources annex — so a value shown and a value used are the same value. A Python evaluator runs the same specification, and the test suite fails if the two ever disagree.

Three accounting defects inherited from the workbook have been corrected here and not yet at source, so the Excel edition and this page currently disagree: the blast furnace's coal was counted both as energy and inside its process factor; gas used by steel and grey ammonia was counted as a resource but charged no emissions; and two legacy transport aggregations (Transport parc 2050!J40 and General hypotheses!F22) added subtotals already counted elsewhere, inventing about 32 TWh of electricity.