Emissions
Six emitting sectors, plus natural and technological carbon sinks.
Teaching model · France 2050 · v0.25.0
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
National view aligned with SECTEN 2026 and the current SNBC 3 sector pathway.
Six emitting sectors, plus natural and technological carbon sinks.
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.
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.
Allocation of passenger-kilometres currently supplied by fuel cars.
“Residual thermal” follows the classification convention used in the workbook.
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.
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.
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.
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.
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.
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.
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.
Algebraic port of the five value chains represented in Excel: steel, ammonia, olefins, food and cement.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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 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.
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.
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.
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.
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.
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.
| Technology | Share | TWh/y | GW | GW built/y | bn€/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.
The sharpest trade-off in the account, and there is no chemistry that is cheap in every metal at once.
| Material | Generation | Vehicles | Batteries | Buildings | Total |
|---|
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.
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.
The last two are flagged provisional: no primary source has been secured for them yet.
| Product and route | Output (kt/y) | Capital + fixed | Energy and feedstock | Carbon | Total €/t |
|---|
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.
| Flight | Distance | Cost today | of which fuel | Cost in 2050 | of which fuel | Change | kgCO₂ today | kgCO₂ 2050 |
|---|
| Component | Investment (bn€) | Annualised (bn€/y) | €/m²/y |
|---|
| Component | €/household/y | Basis |
|---|
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.
| Official sector | 1990 | Model coverage |
|---|
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 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.
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.
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:
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.
Sources are cited in the language they were published in. The generated tables — inputs, data, equations — follow the language switch; a row with no translation yet is shown in English.
Before you start
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.
Ask which services must grow, which can stabilise, and where efficiency or sufficiency can reduce energy before changing technologies.
Prioritise direct electricity where it is efficient, while watching the building-heating peak and electricity used indirectly for H₂ and e-fuels.
Biogas, biofuels and wood are limited pools. Consider which uses have few credible alternatives and which can switch to direct electricity.
Combine modal shift, renovation, process change, material efficiency and carbon capture rather than relying on one lever.
| Module | Coverage | What is recalculated | Main limitation |
|---|---|---|---|
| Transport | Detailed algebraic port | Needs, modal shifts, unit energy, fuel split, H₂/e-fuel electricity and emissions | Two legacy Excel double counts removed; the Excel edition still has them |
| Building heating | Stock, allocated by target | 24 segments give the heat need and the 2020 peak anchor; targets allocate it across five electric technologies, biomass, networks and a gas residual | One-shot 2020→2050, no conversion-rate trajectory |
| Building, other usages | Observed levels, moved by levers | Hot water, cooking, cooling and specific electricity, by carrier, with efficiency, growth and electrification | No stock and no technology detail; cooling makes a summer peak the model does not score |
| Industry | Detailed algebraic port | Five value chains plus seventeen branches, production routes, vector consumption, process emissions | Inherits some workbook accounting conventions |
| Hydrogen | Production mix | Electrolysis, steam reforming and autothermal reforming with capture, serving every consumer | No capture-train capital cost, no CO₂ transport or storage cost |
| Electricity supply | Mix follows demand | One of RTE's six 2050 scenarios sets shares; capacity, annual build, fuel and plant cost follow | No hourly balance, no storage, no adequacy check — a 100%-renewable mix is applied exactly as a nuclear-heavy one |
| Materials | Satellite account | Steel, concrete and critical metals for the generation build, vehicles and batteries | One-way: nothing reads it back. Heat pumps absent, nothing recycled |
| National inventory bridge | Scope 1, shared with the inventory | Six sectors, both carbon sinks, gross and net totals | International aviation and shipping are the one remaining difference |
| Agriculture and waste | First-order trajectories | Linear interpolation from observed 2024 to the SNBC3 2050 order of magnitude | No bottom-up physical drivers yet |
| Energy production | Computed from the mix | The fuel the chosen electricity mix burns, at the model's own emission factors | Power generation only — refining and fugitive emissions are outside the model |
| Carbon sinks | Set directly | Natural and technological absorptions, each on its own slider | The technological sink is 30 MtCO₂ a year that nothing here builds, powers or pays for, and the control is flagged above 20 |
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.
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 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.
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.
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 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.
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.
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.
Steel production change is the relative change in 2050 steel output compared with the workbook’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 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.6 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 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.
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.
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.
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.
| Carrier | 2020, observed | 2050, assumed | What the 2050 value assumes |
|---|---|---|---|
| Electricity | 79 gCO₂/kWh | derived | 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. |
| Methane | 227 gCO₂/kWh | 25 gCO₂/kWh | That all 2050 methane is biomethane. Raising the slider back towards 227 shows what a failure of that assumption costs. |
| Liquid fuel | 264 gCO₂/kWh | 25 gCO₂/kWh | That no fossil liquid fuel is left: every litre is biofuel or e-fuel. |
| Wood | 27 gCO₂/kWh | 0 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. |
| Coal | 340 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. | |
| Hydrogen | Derived, 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%. | |
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
| Post | Electricity ceiling | of which under 3 years |
|---|---|---|
| Steel | 11.4% | 68% |
| Metals and machinery | 15.5% | 73% |
| Paper and board | 19.3% | 47% |
| Other industries | 23.6% | 66% |
| Minerals, cement | 24.1% | 40% |
| Food industry | 25.0% | 60% |
| Chemistry, ammonia, olefins | 31.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.
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.
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.
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, 218 constants, 25 data tables and 566 equations.
| Lever | Default | Range | Provenance | Why, and where it comes from |
|---|---|---|---|---|
Fuel carcarFuel | 10% | 0 … 100 | Game 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 carcarGas | 10% | 0 … 100 | Game rule | — |
Electric carcarElectric | 70% | 0 … 100 | Game rule | — |
Shift to short-distance railcarRail | 10% | 0 … 100 | Game 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 reductionpassengerReduction | 0% | 0 … 45 | Game 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 → raildomesticAviationRail | 50% | 0 … 100 | Game rule | — |
Hydrogen trucktruckH2 | 20% | 0 … 100 | Game rule | — |
Residual thermaltruckThermal | 10% | 0 … 100 | Game rule | — |
Electric trucktruckElectric | 40% | 0 … 100 | Game rule | — |
Shift to rail freighttruckRail | 30% | 0 … 100 | Game rule | — |
Freight-demand reductionfreightReduction | 0% | 0 … 45 | Game 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 → maritimefreightAviationSea | 20% | 0 … 100 | Game rule | — |
Biofuel sharebiofuelShare | 40% | 0 … 100 | Game 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 electricitybldgElectricShare | 49% | 0 … 100 | Game 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 heatingbldgBiomassTwh | 46 TWh/y | 0 … 120 | Game 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 pumpbldgElecAirAir | 47% | 0 … 100 | Game rule | Seasonal COP 2.5, falling to 2.0 at peak. |
Air-water heat pumpbldgElecAirWater | 31% | 0 … 100 | Game rule | Seasonal COP 3.0, falling to 2.0 at peak. |
Electric resistancebldgElecResistance | 15% | 0 … 100 | Game 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 pumpbldgElecHybrid | 4% | 0 … 100 | Game rule | — |
Heat pump on a networkbldgElecDistrictHP | 3% | 0 … 100 | Game rule | — |
Wood in heat networksdistrictWoodTwh | 13 TWh/y | 0 … 80 | Game 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 heatdistrictWasteTwh | 0 TWh/y | 0 … 60 | Game 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 improvementbldgRetrofit | 30% | 0 … 65 | Game 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 sufficiencybldgSobriety | 5% | 0 … 25 | Game rule | — |
New housing builtnewHousing | 20.4 Mm²/y | 8 … 36 | Published | 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.
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 builtnewNonResidential | 19.9 Mm²/y | 8 … 36 | Published | 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
|
Built in timbertimberShare | 12% | 0 … 80 | Published | The default is the observed share, derived in
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 workscivilWorksVolume | 100% | 50 … 130 | Game 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.
|
H-DRI steel sharesteelDRI | 50% | 0 … 100 | Game rule | — |
Steel production changesteelGrowth | 30% | -40 … 50 | Game rule | — |
Ammonia productionammoniaProductionHidden | 900 kt/y | 0 … 1 400 | Workbook | 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
|
CO₂ + H₂ olefin routeolefinRoute | 50% | 0 … 100 | Game rule | — |
Biogenic CO₂ sharebiogenicCO2 | 10% | 0 … 50 | Game 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 reductionplasticReduction | 30% | 0 … 70 | Game 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.
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 |
Heat pumps for steamfoodHPSteam | 60% | 0 … 100 | Game rule | — |
Heat pumps for direct heatfoodHPDirect | 25% | 0 … 100 | Game rule | — |
Food-industry efficiencyfoodEfficiency | 20% | 0 … 50 | Game rule | — |
Less cement per unit of workscementReduction | 10% | 0 … 60 | Game rule | Renamed in v0.20, because it finally has a driver. Until then it was "cement-demand reduction" with no |
Clinker ratioclinkerRate | 60% | 35 … 78 | Game rule | 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₂ capturecarbonCapture | 20% | 0 … 95 | Game rule | 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 industryotherIndustryVolume | 0% | 0 … 100 | Published | 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 industryotherIndustryProcess | 100% | 0 … 100 | Published | 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.
|
Waste-heat recoverywasteHeatRecovery | 0% | 0 … 100 | Published | 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 effortindustryEfficiency | 0% of the identified potential | 0 … 100 | Published | 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), 2050efGas | 25 gCO₂/kWh | 0 … 250 | Workbook | 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), 2050efLiquid | 25 gCO₂/kWh | 0 … 300 | Workbook | 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
|
Wood, 2050efWood | 27 gCO₂/kWh | 0 … 60 | Workbook | 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.
|
Aviation efficiency gainaviationEfficiency | 0%/y | 0 … 2 | Published | 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 growthaviationDemandGrowth | 0%/y | -1.5 … 3.5 | Published | 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 fuelsafBioPrice | 2 000 €/t | 600 … 4 000 | Published | 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 €/t | 1 500 … 10 000 | Published | 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 costfuelShareOperating | 30% | 15 … 40 | Published | 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 positionagriPathwayHidden | 100% | 0 … 100 | Game 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 |
Waste pathway positionwastePathway | 100% | 0 … 100 | Game rule | — |
Natural carbon sinknaturalSinkHidden | 23 MtCO₂e/y absorbed | 5 … 40 | Game 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
|
Technological carbon sinktechSink | 30 MtCO₂e/y absorbed | 5 … 60 | Game 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
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 buildingartificialisationRate | 12 kha/y | 0 … 52 | Published | 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 plantedafforestationRate | 15 kha/y | 0 … 90 | Published | 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 cropsgrasslandConversion | 0 kha/y | -50 … 100 | Published | 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 soilsoilCarbonPractices | 30% | 0 … 100 | Published | 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 harvestedforestHarvest | 60 Mm³/y | 40 … 75 | Published | 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 below anything published and is there because "cut less" has to be reachable. Moving this lever moves the sink one for one at 2.0 tCO₂ per cubic metre, which is the point: until this module existed the game could burn as much wood as it liked and the forest never noticed.
Flagged below 50 Mm³/y. The sink follows the harvest one for one here, at 2.0 tCO₂ a cubic metre, so cutting fifteen million cubic metres less than the SNBC 3 asks for books thirty megatonnes a year of absorption and nothing else changes. Below 50 the scenario is also cutting less wood than IGN measures France cutting today — 53.1 Mm³, informal firewood included — and the wood that is no longer cut is replaced by nothing this model counts. |
Wood into long-lived productsharvestToProducts | 30% | 15 … 35 | Published | 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 rewettedpeatRewettingHidden | 0% | 0 … 100 | Game 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 |
Climate effect on the forestforestClimate | 2 | 1 … 3 | Published | 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 eatendietRedMeat | 40 kgec/cap/y | 15 … 60 | Published | 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 eatendietPoultry | 28 kgec/cap/y | 10 … 35 | Published | 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 eatendietDairy | 90% | 50 … 110 | Published | 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 wastefoodWaste | 0% | 0 … 50 | Published | 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 exportslivestockExport | 100% | 0 … 150 | Game 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 exportscropExport | 100% | 0 … 150 | Published | 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 |
Mineral nitrogennIntensity | 70% | 40 … 110 | Published | 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 (
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 rotationlegumeArea | 2.7 Mha | 1 … 3 | Published | 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 |
Organic farmingorganicShare | 25% | 0 … 50 | Published | 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
|
Cattle on low-methane rationsentericMitigation | 82% | 0 … 100 | Published | 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 digestersmanureMethanised | 0% | 0 … 80 | Game 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 |
Get fossil fuel off the farmagriFuelSwitch | 100% | 0 … 100 | Published | 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 |
Nitrogen made at homeammoniaDomesticShare | 34% | 0 … 100 | Published | 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 cropsciveArea | 2.5 Mha | 0 … 3 | Published | 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
|
Crop residues taken off the fieldresidueMobilisation | 16% | 0 … 30 | Published | 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 fuelenergyCropArea | 0.62 Mha | 0 … 1.7 | Published | 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 methaneenergyMaizeAreaHidden | 0 Mha | 0 … 0 | Published | 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 |
Imported biofuel allowedbioImports | 20 TWh/y | 0 … 40 | Published | 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
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 efficiencyusageDhwEfficiency | 0% | 0 … 40 | Game rule | — |
Cooking efficiencyusageCookingEfficiency | 0% | 0 … 40 | Game rule | — |
Hot water on electricityusageDhwElectric | 68% | 0 … 100 | Game 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 electricityusageCookingElectric | 61% | 0 … 100 | Game 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 growthusageCoolingGrowth | 0% | 0 … 300 | Game 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 |
Appliance efficiencyusageSpecificEfficiency | 0% | 0 … 50 | Game 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 growthusageSpecificGrowth | 0% | -20 … 150 | Game 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 hydrogengasPlantHydrogen | 0% | 0 … 100 | Game 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. |
Electrolysish2Electrolysis | 100% | 0 … 100 | Game 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 reformingh2Smr | 0% | 0 … 100 | Game 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 captureh2AtrCcs | 0% | 0 … 100 | Game 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 scenariorteScenario | 4 | 1 … 6 | Published | 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 batteriesbatteryLfpShare | 0% | 0 … 100 | Game 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 ratediscountIndustry | 8% | 2 … 15 | Published | |
Residential discount ratediscountResidential | 4% | 0 … 10 | Game 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 pricecarbonPrice | 150 €/tCO₂ | 0 … 300 | Published | |
Industrial electricity priceelecPriceIndustry | 70 €/MWh | 20 … 120 | Published | |
Deep-retrofit costretrofitCost | 550 €/m² | 200 … 900 | Provisional | 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.
|
Liquid fuel at the pumpliquidFuelPrice | 200 €/MWh | 80 … 400 | Provisional | 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.
|
Travel lesssimpleTravelLessCoarse control | 0% | 0 … 100 | Game 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:
|
Electric cars instead of fuel carssimpleCarElectricCoarse control | 0% | 0 … 100 | Game 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:
|
Get the diesel out of freightsimpleTruckCleanCoarse control | 0% | 0 … 100 | Game 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:
|
Off the plane — rail and sea insteadsimpleFlyLessCoarse control | 0% | 0 … 100 | Game 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:
|
Heat lesssimpleHeatLessCoarse control | 5% | 5 … 25 | Game 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:
|
Renovate the building stocksimpleRenovateCoarse control | 30% | 30 … 65 | Game 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:
|
Build less, and in timbersimpleBuildLessCoarse control | 0% | 0 … 100 | Game 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:
|
Heat pumps instead of boilerssimpleHeatPumpsCoarse control | 0% | 0 … 100 | Game 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:
|
Electrify hot water and cookingsimpleElectrifyUsagesCoarse control | 0% | 0 … 100 | Game 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:
|
Consume less materialsimpleConsumeLessCoarse control | 0% | 0 … 100 | Game 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:
|
Change the industrial processessimpleCleanProcessesCoarse control | 0% | 0 … 100 | Game 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:
|
Use less energy for the same outputsimpleIndustryEfficiencyCoarse control | 0% | 0 … 100 | Game 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:
|
Eat less meatsimpleEatLessCoarse control | 0% | 0 … 100 | Game 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:
|
Plant and protect the forestsimplePlantForestCoarse control | 0% | 0 … 100 | Game 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 Moving this control from 0% to 100% moves, in step and in proportion:
|
Fertilise lesssimpleFertiliseLessCoarse control | 0% | 0 … 100 | Game 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:
|
Grow energy on the fieldssimpleGrowEnergyCoarse control | 0% | 0 … 100 | Game 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: Moving this control from 0% to 100% moves, in step and in proportion:
|
| Constant | Value | Unit | Provenance | Why, and where it comes from |
|---|---|---|---|---|
efficiency_electricity_to_h2 | 0.6 | MWh H₂ per MWh electricity | Workbook | 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.
|
efficiency_electricity_to_efuel | 0.4 | MWh fuel per MWh electricity | Published | 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_2020 | 79 | gCO₂/kWh | Workbook |
|
dhw_efficiency_fuel | 0.85 | fraction of the energy delivered as hot water | Provisional | A gas or oil water heater, standing losses included.
|
dhw_efficiency_electric | 2 | MWh of hot water per MWh of electricity | Provisional | 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.
|
cooking_efficiency_fuel | 0.4 | fraction of the energy reaching the pan | Provisional |
|
cooking_efficiency_electric | 0.84 | fraction of the energy reaching the pan | Provisional | Induction. The gap with gas is the widest of any usage in the model.
|
carbon_in_methane | 202 | gCO₂ per kWh of methane | Published | The carbon actually in the molecule, released whether it is burned or reformed. Distinct from |
ef_gas_2020 | 227 | gCO₂/kWh | Workbook |
|
ef_liquid_2020 | 264 | gCO₂/kWh | Workbook |
|
ef_wood_2020 | 27 | gCO₂/kWh | Workbook |
|
ef_coal | 340 | gCO₂/kWh | Published | 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_production | 9 900 | kt/y | Workbook | Blast-furnace route volume in 2020, split by the H-DRI lever in 2050.
|
steel_eaf_base_production | 5 100 | kt/y | Workbook |
|
steel_bf_process_workbook | 1.76 | tCO₂ per tonne of steel | Workbook | The workbook's single direct-emission figure for the blast-furnace route. It is almost exactly the combustion of the 0.62 t of coal the same sheet charges per tonne of steel, which is why counting both was a double count. The model now subtracts the coal at the published coal factor and keeps only the remainder as a genuine process term.
|
olefin_base_production | 3 656 | kt/y | Published | 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 | 3.138 | tCO₂ per tonne of olefin | Derived | 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 (
|
cement_base_production | 16 500 | kt/y | Workbook | 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
|
cement_process_per_tonne | 0.792541 | tCO₂ per tonne of clinker | Workbook | 10.2 MtCO₂ of process emissions for 12.87 Mt of clinker in 2020. This is the decarbonation of the limestone, which no change of kiln fuel can remove — only capture or a lower clinker ratio.
|
food_steam_demand | 21.876 | TWh/y | Workbook |
|
food_direct_heat_demand | 10.693 | TWh/y | Workbook |
|
food_heat_pump_cop | 3 | MWh heat per MWh electricity | Workbook | — |
food_hydrogen | 0.138 | TWh/y | Workbook | Residual hydrogen use in the food industry, unaffected by any lever. |
building_need_calibration | 0.652836 | fraction | Calibrated | 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.
|
building_peak_2020 | 40 | GW | Workbook | 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.
|
official_transport_2024 | 125.35 | MtCO₂e/y | Published | |
official_building_2024 | 56.073 | MtCO₂e/y | Published | |
official_industry_2024 | 61.5895 | MtCO₂e/y | Published | |
official_industry_2050 | 5.60569 | MtCO₂e/y | Published | 4% of the 1990 level, the current SNBC 3 industry reduction. |
official_agriculture_2024 | 77.5259 | MtCO₂e/y | Published | |
official_agriculture_2050 | 43.6652 | MtCO₂e/y | Published | 47% of the 1990 level. |
official_waste_2024 | 15.2952 | MtCO₂e/y | Published | |
official_waste_2050 | 7.50194 | MtCO₂e/y | Published | 45% of the 1990 level. |
official_energy_2024 | 31.1849 | MtCO₂e/y | Published | |
official_energy_2050 | 3.15447 | MtCO₂e/y | Published | 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.9564 | MtCO₂e/y | Published | |
official_natural_sink_2050 | -23 | MtCO₂e/y | Published | The official pathway weakens the natural sink, it does not strengthen it. |
official_technological_sink_2050 | -43 | MtCO₂e/y | Game 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_2050 | 63 | MtCO₂e/y | Published | The published SNBC 3 gross national total for 2050, rounded. |
industry_covered_2020 | 68.9 | MtCO₂e/y | Derived | 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 45.3 — steel 18.8, cement 13.1, 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. Compared with the 61.6 MtCO₂e the inventory books, the model's perimeter is now slightly the larger of the two: the manufacturing survey it 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 no longer added to anything.
|
fuel_efficiency_ceiling | 0.19792 | fraction of fuel saved | Published | 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_kerosene | 11.9 | MWh per tonne | Published | 42.8 MJ/kg, the standard lower heating value of jet A-1.
|
jet_fuel_price_2023 | 816 | €/t | Published | 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_kerosene | 3.16 | tCO₂ per tonne of fuel | Published | Combustion only — neither the upstream chain nor non-CO₂ effects.
|
aviation_demand_horizon_years | 30 | years | Derived | 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_years | 26 | years | Derived | 2024, the latest year of the traffic series, to 2050. |
observed_kerosene_per_pkm_2024 | 29.28 | g of kerosene per passenger-kilometre | Published | 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.
|
lhv_coal | 7.5 | MWh per tonne | Published | Lower heating values, used to turn POMMES prices per tonne into prices per MWh.
|
lhv_methane | 13.9 | MWh per tonne | Published |
|
lhv_hydrogen | 33.33 | MWh per tonne | Published |
|
price_methane_per_tonne | 561 | €/t | Published | |
price_coal_per_tonne | 99 | €/t | Published | |
price_iron_ore | 100 | €/t | Published | |
price_scrap | 180 | €/t | Published | |
price_limestone | 20 | €/t | Published | |
price_household_electricity | 260 | €/MWh incl. tax | Published | |
price_household_gas | 134 | €/MWh GCV incl. tax | Published | |
price_wood | 77.5 | €/MWh | Published | 7.75 c€/kWh for bulk pellets. |
iron_ore_per_steel_bf | 1.8 | t per t of steel | Published | |
iron_ore_per_steel_dri | 1.6 | t per t of steel | Published | |
scrap_per_steel_eaf | 1 | t per t of steel | Published | |
cement_per_concrete | 300 | kg of cement per m³ of concrete | Provisional | 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.
|
concrete_density | 2 380 | kg/m³ | Published | Ordinary reinforced structural concrete. Presentation only, like the dosage above.
|
limestone_per_clinker | 1.6 | t per t of clinker | Published | |
kiln_heat_per_clinker | 0.888889 | MWh per t of clinker | Published | |
coal_per_kiln_heat | 0.11919 | t of coal per MWh of kiln heat | Published | 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_electricity | 0.54 | MWh per t of clinker | Published | reference_plant_CCS less reference_plant. |
smr_methane_per_tonne_h2 | 3.33 | t of methane per t of hydrogen | Published | |
smr_electricity_per_tonne_h2 | 0.58 | MWh per t of hydrogen | Published | |
smr_emission_per_tonne_h2 | 9.23 | tCO₂ per t of hydrogen | Published | |
methanol_per_olefin | 2.98837 | t of methanol per t of olefin | Published | |
floor_area_total | 4 200 | Mm² | 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 |
deep_retrofit_saving | 0.6 | fraction of demand removed | Provisional | Demand reduction achieved by one deep renovation, used to convert the average stock improvement into an equivalent number of deep renovations.
|
retrofit_life | 30 | years | Provisional |
|
heat_pump_life | 17 | years | Provisional |
|
heat_pump_cost_per_m2 | 80 | €/m² incl. tax | Provisional | Air-to-water heat pump, in the 60–100 €/m² range.
|
renovation_vat | 1.055 | multiplier | Published | Reduced VAT rate of 5.5% on renovation work.
|
households | 31.377 | million | Published | |
car_ownership_reference | 2 541 | €/household/y | Published | Net purchase 1 459 + insurance 518 + maintenance 564. |
car_transport_reference | 3 803 | €/household/y | Published | |
km_per_car_per_year | 11 600 | km | Published | |
reference_car_fleet | 2.88237e+07 | cars | Derived | 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_lag | 10 | years | Game 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_rate | 3 | tCO₂/ha/y | Published | 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_crop | 3.6667 | tCO₂/ha/y | Published | 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_grass | 1.8333 | tCO₂/ha/y | Published | 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_years | 20 | years | Published | 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_active | 1 | Game rule | France carries the land module, so the natural sink is computed and the | |
land_horizon_years | 26 | years | Game 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_production | 5.4 | m³/ha/y | Published | 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_mortality | 1 | m³/ha/y | Published | 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_area | 16.6 | Mha | Published | The forest available for wood production, out of a forest area of 17.5 Mha. It is not the |
forest_standing_volume | 2 827 | Mm³ | 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_base | 53.1 | Mm³/y | Published | 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_k | 2 | tCO₂/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, 2.0 tCO₂ per extra cubic metre harvested, 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. |
forest_dead_wood_coefficient | 0.6024 | tCO₂ per m³ of annual mortality | Calibrated | 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_sink | 4.62 | MtCO₂/y | Calibrated | 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_sink | 10 | MtCO₂/y | Provisional | 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_sawlogs | 18.3 | Mm³/y | Published | Sawlogs in the 2024 commercialised harvest, round wood over bark. |
forest_harvest_industrial | 10 | Mm³/y | Published | Industrial wood — pulp and panels — in the 2024 commercialised harvest. |
forest_harvest_energy_commercial | 9.7 | Mm³/y | Published | 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_firewood | 15.1 | Mm³/y | Derived | 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_unutilised | 0 | Mm³/y | Published | 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_harvest_volume_factor | 1 | m³ of standing stock per m³ of the harvest statistic | Published | One. |
hwp_coefficient | 0.562 | tCO₂/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_base | 0.225 | fraction | Published | Sawn timber 9.5% plus panels 13% of the harvest, the SNBC 3 draft's own base-year split. |
timber_cement_saving | 67 | kg cement per m² of floor framed in timber | Provisional | 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.
|
timber_steel_saving | 17 | kg steel per m² of floor framed in timber | Provisional | 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.
|
timber_wood_intensity | 0.189 | m³ of wood product per m² of floor framed in timber | Provisional | 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.
|
sawnwood_roundwood_factor | 2 | m³ of roundwood per m³ of sawn product | Provisional | 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.
|
timber_share_base | 0.12 | fraction | Published | 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.
|
hwp_base_sink | -0.4 | MtCO₂/y | Published | 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_m3 | 0.8373 | tCO₂/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_life | 28.87 | years | Derived | 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_2021 | 359.4 | MtCO₂ | 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 |
grassland_sink_coefficient | 0.6237 | tCO₂/ha/y | Derived | 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_coefficient | 0.6777 | tCO₂/ha/y | Derived | 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_content | 96.2 | tCO₂ per ha/y of flow | Derived | 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_source | 1.2 | MtCO₂/y | Published | 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_emission | 5 | tCO₂e/ha/y | Provisional | 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.
|
peat_rewetting_base | 0 | fraction of the drained organic soil | Published | Zero, and not an approximation: the drained area France declares is zero, so the share of it already rewetted is zero too.
|
peat_agri_n2o_ef | 0 | tCO₂e/ha/y | Published | 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 |
soil_practice_potential_arable | 14.777 | MtCO₂/y | Derived | 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_grassland | 2.53 | MtCO₂/y | Derived | 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_share | 0.75 | fraction | Published | 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_share | 0 | fraction | Published | 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_share | 0 | fraction | Published | 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_base | 52 | kha/y | Published | Teruti's 1982–2022 mean, and the rate |
afforestation_rate_base | 0 | kha/y | Published | 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_base | 0 | kha/y | Game 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.
|
soil_practice_base | 0 | fraction | Published | 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.5 | MtCO₂e/y | Published | 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_2024 | 0.4 | MtCO₂e/y | Published | A source in 2024, against −4.7 in 1990. |
secten_sink_grassland_2024 | -5.7 | MtCO₂e/y | Published | The second of the two lines that absorb, and it was −8.6 in 1990. |
secten_sink_cropland_2024 | 11.7 | MtCO₂e/y | Published | A source, and the largest one in the land account. +24.0 in 1990. |
secten_sink_artificial_2024 | 5 | MtCO₂e/y | Published | A source, and remarkably steady: between +4.2 and +5.5 every year since 1990. |
secten_sink_wetland_2024 | 1.2 | MtCO₂e/y | Published | 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 |
diet_dairy_index_base | 1 | index, base year = 1 | Game rule | One, by definition: |
food_waste_cut_base | 0 | fraction of edible waste removed | Game rule | Zero: the base year has cut none of its own waste, because the waste share is measured on it. |
livestock_export_base | 1 | index, base year = 1 | Game rule | One: the export volumes the table declares are the base year, so the index that scales them is one there. |
crop_export_base | 1 | index, base year = 1 | Game rule | One, like |
n_intensity_base | 1 | index, base year = 1 | Game rule | One: |
enteric_mitigation_base | 0 | fraction of cattle | Game 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_base | 0 | fraction of manure | Game rule | Zero, for the same reason as |
agri_fuel_switch_base | 0 | fraction of farm fuel | Game rule | Zero: the base year burns all of the fossil fuel the inventory measures on its farms. |
ef_liquid_fossil_observed | 264 | gCO₂/kWh | Workbook | The observed emission factor of fossil liquid fuel, the value |
ln_two | 0.693147 | Published | The natural logarithm of two, which turns a half-life into a first-order decay rate: | |
nh3_nitrogen_fraction | 0.822 | t 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.
|
population_base | 68.55 | million people | Derived | 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_horizon | 69.21 | million people | Published | 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_base | 53.5 | kgec/cap/y | Published | 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_base | 30.8 | kgec/cap/y | Derived | 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_base | 0.07 | fraction of the food supply | Published | 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_share | 0.4 | fraction of beef production | Provisional | 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_effect | 0.14 | fraction of enteric methane removed | Published | −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 |
methanisation_abatement | 0.6 | fraction of manure methane removed | Provisional | 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 |
refrigerants_fixed | 0.02 | MtCO₂e/y | Published | 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_base | 1 817 | kt N/y | Published | 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_base | 735 | kt N/y | Published | 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 |
manure_n_grazing_base | 727 | kt N/y | Published | 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_base | 364.6 | kt N/y | Published | 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_gain | 0.6 | fraction of base-year fixation | Provisional | 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.
|
legume_area_base | 1 | Mha | Published | 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_credit | 128 | kt N/y | Published | 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 |
legume_credit_span | 1.7 | Mha | Published | 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_base | 0.056 | fraction of the arable area | Published | 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_ratio | 0.65 | fraction of the conventional yield | Published | 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_plateau | 0.9 | index, base-year dose = 1 | Game 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_base | 0.67 | fraction of the nitrogen input | Published | 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_share | 0.222 | fraction of the supply | Derived | 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_food | 0.2696 | fraction of the non-energy arable area | Derived | 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_feed | 0.4049 | fraction of the non-energy arable area | Derived | 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_export | 0.2306 | fraction of the non-energy arable area | Derived | 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_other | 0.0949 | fraction of the non-energy arable area | Derived | 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_share | 0.576 | fraction of the feed area | Derived | 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_base | 0 | Mha | Published | 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 |
energy_maize_dm_yield | 0 | t DM/ha | Published | 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.
|
energy_maize_digestate_ef | 0 | tCO₂e/ha/y | Published | 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_poultry | 0.426 | fraction of compound feed | Published | 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_cattle | 0.272 | fraction of compound feed | Published | 1 304 of 4 801 kt, same note. |
compound_feed_share_pig | 0.225 | fraction of compound feed | Published | 1 081 of 4 801 kt, same note. |
ef_mineral_n2o | 4.21024 | tCO₂e per t N | Derived | 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_co2 | 1.2328 | tCO₂e per t N | Derived | 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_fixed | 0 | MtCO₂e/y | Published | Zero, because France charges its liming on nitrogen instead: the 1.2328 tCO₂e per tonne of mineral N in
|
ef_organic_n2o | 2.01361 | tCO₂e per t N | Derived | 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_n2o | 1.9945 | tCO₂e per t N | Derived | 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_n2o | 2.26424 | tCO₂e per t N of total input | Calibrated | 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_fixed | 0.02 | MtCO₂e/y | Published | 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_2024 | 10.73 | MtCO₂e/y | Published | 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 |
grassland_rough | 1.38846 | Mha | Derived | 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 |
ammonia_non_fertiliser | 148.6 | kt NH₃/y | Calibrated | 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 |
ammonia_domestic_share_base | 0.34 | fraction | Published | 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 |
citepa_livestock_2024 | 45.7 | MtCO₂e/y | Published | 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_2024 | 21.1 | MtCO₂e/y | Published | 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_yield | 2 | MWh PCI per t DM | Published | 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 | 2.8 | MWh PCI per t DM | Published | 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_yield | 2 | MWh per t DM | Published | 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_m3 | 2.14 | MWh 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 |
manure_dm_per_cattle_head | 0.6 | t DM per head per year | Derived | 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_head | 0.08 | t DM per head per year | Derived | 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_2024 | 0.1 | fraction of collectable manure | Provisional | 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
|
cive_dm_yield | 6 | t DM per hectare | Published | 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_base | 0.15 | Mha | Provisional | 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_ceiling | 4 | Mha | Published | 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:
|
residue_dm_yield | 3.3015 | t DM per hectare | Derived | 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_base | 0.01 | fraction of the residue pool | Provisional | 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_share | 0.5 | fraction of mobilised residues | Game 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_other | 18.9947 | TWh/y | Calibrated | 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_share | 0.581 | fraction of the material harvest | Calibrated | 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_wood | 22.8 | TWh/y | Published | 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
|
waste_wood | 9 | TWh/y | Published | 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_yield | 18.899 | MWh per hectare | Derived | 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_base | 0.618 | Mha | Published | 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_supply | 3 | TWh/y | Published | 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 |
bio_imports_base | 26.4 | TWh/y | Derived | 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 |
sdes_wood_2024 | 120.05 | TWh/y | Published | 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 |
sdes_biogas_2024 | 24.25 | TWh/y | Published | 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 |
sdes_biofuel_2024 | 41.7 | TWh/y | Published | 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. |
The categories the model iterates over. Every row is addressed by its identifier, which is what the formulas in the next section refer to.
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.
| Row | vector | unit_consumption | occupancy | demand_2020 | in_inventory | aviation |
|---|---|---|---|---|---|---|
Fuel carcar_fuel | liquid | 65 | 1.5 | 555 | 1 | 0 |
Biogas carcar_gas | gas | 65 | 1.5 | 0.8 | 1 | 0 |
Electric carcar_electric | electricity | 20 | 1.5 | 1.2332 | 1 | 0 |
Fuel utility vehicleutility_fuel | liquid | 85 | 1.8 | 162.012 | 1 | 0 |
Gas utility vehicleutility_gas | gas | 85 | 1.8 | 4.5 | 1 | 0 |
Electric utility vehicleutility_electric | electricity | 20 | 1.8 | 0.059868 | 1 | 0 |
Fuel two-wheelertwo_wheeler_fuel | liquid | 50 | 1.01 | 11 | 1 | 0 |
Electric two-wheelertwo_wheeler_electric | electricity | 15 | 1.01 | 0.10692 | 1 | 0 |
Fuel busbus_fuel | liquid | 284 | 14.27 | 46.4489 | 1 | 0 |
Gas busbus_gas | gas | 280 | 14.27 | 0.131284 | 1 | 0 |
Electric busbus_electric | electricity | 75 | 14.27 | 0.0262568 | 1 | 0 |
Hydrogen busbus_h2 | hydrogen | 200 | 14.27 | 0 | 1 | 0 |
Long-distance traintrain_long | electricity | 1 859 | 457.992 | 63.46 | 1 | 0 |
Short-distance traintrain_short | electricity | 975 | 85.2181 | 44.6 | 1 | 0 |
Domestic aviationaviation_domestic | liquid | 2 160 | 90 | 15.6 | 1 | 1 |
Overseas aviationaviation_overseas | liquid | 3 500 | 180 | 33.6 | 1 | 1 |
International aviationaviation_international | liquid | 3 500 | 180 | 364 | 0 | 1 |
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.
| Row | source | target | share |
|---|---|---|---|
car_to_fuelcar_to_fuel | car_fuel | car_fuel | 0 |
car_to_gascar_to_gas | car_fuel | car_gas | 0 |
car_to_electriccar_to_electric | car_fuel | car_electric | 0 |
car_to_railcar_to_rail | car_fuel | train_short | 0 |
gas_car_keepgas_car_keep | car_gas | car_gas | 1 |
electric_car_keepelectric_car_keep | car_electric | car_electric | 1 |
utility_to_fuelutility_to_fuel | utility_fuel | utility_fuel | 0 |
utility_to_gasutility_to_gas | utility_fuel | utility_gas | 0.1 |
utility_to_electricutility_to_electric | utility_fuel | utility_electric | 0.9 |
gas_utility_keepgas_utility_keep | utility_gas | utility_gas | 1 |
electric_utility_keepelectric_utility_keep | utility_electric | utility_electric | 1 |
two_wheeler_to_fueltwo_wheeler_to_fuel | two_wheeler_fuel | two_wheeler_fuel | 0 |
two_wheeler_to_electrictwo_wheeler_to_electric | two_wheeler_fuel | two_wheeler_electric | 1 |
electric_two_keepelectric_two_keep | two_wheeler_electric | two_wheeler_electric | 1 |
bus_to_fuelbus_to_fuel | bus_fuel | bus_fuel | 0 |
bus_to_gasbus_to_gas | bus_fuel | bus_gas | 0.2 |
bus_to_electricbus_to_electric | bus_fuel | bus_electric | 0.5 |
bus_to_h2bus_to_h2 | bus_fuel | bus_h2 | 0.3 |
gas_bus_keepgas_bus_keep | bus_gas | bus_gas | 1 |
electric_bus_keepelectric_bus_keep | bus_electric | bus_electric | 1 |
h2_bus_keeph2_bus_keep | bus_h2 | bus_h2 | 1 |
train_long_keeptrain_long_keep | train_long | train_long | 1 |
train_short_keeptrain_short_keep | train_short | train_short | 1 |
aviation_keepaviation_keep | aviation_domestic | aviation_domestic | 1 |
aviation_to_railaviation_to_rail | aviation_domestic | train_long | 0 |
overseas_keepoverseas_keep | aviation_overseas | aviation_overseas | 1 |
international_keepinternational_keep | aviation_international | aviation_international | 1 |
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.
| Row | vector | unit_consumption | demand_2020 | in_inventory |
|---|---|---|---|---|
Hydrogen trucktruck_h2 | hydrogen | 50 | 0 | 1 |
Fuel trucktruck_fuel | liquid | 50 | 300 | 1 |
Electric trucktruck_electric | electricity | 20 | 0 | 1 |
Rail freightrail_freight | electricity | 3.2 | 50 | 1 |
Maritimemaritime | liquid | 0.6 | 700 | 0 |
International air freightair_freight | gas | 245 | 12 | 0 |
| Row | source | target | share |
|---|---|---|---|
truck_to_h2truck_to_h2 | truck_fuel | truck_h2 | 0 |
truck_to_thermaltruck_to_thermal | truck_fuel | truck_fuel | 0 |
truck_to_electrictruck_to_electric | truck_fuel | truck_electric | 0 |
truck_to_railtruck_to_rail | truck_fuel | rail_freight | 0 |
h2_truck_keeph2_truck_keep | truck_h2 | truck_h2 | 1 |
electric_keepelectric_keep | truck_electric | truck_electric | 1 |
rail_keeprail_keep | rail_freight | rail_freight | 1 |
maritime_keepmaritime_keep | maritime | maritime | 1 |
air_to_seaair_to_sea | air_freight | maritime | 0 |
air_keepair_keep | air_freight | air_freight | 0 |
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.
| Row | is_destination | heat_pump |
|---|---|---|
Biomassbiomass | 1 | 0 |
Fuel boilerfuel | 0 | 0 |
Gas boilergas | 1 | 0 |
Electric resistanceresistance | 0 | 0 |
District heatingdistrict | 1 | 0 |
Air-air heat pumpair_air | 1 | 1 |
Air-water heat pumpair_water | 1 | 1 |
Hybrid heat pumphybrid | 1 | 1 |
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.
| Row | system | building_type | surface_2020 | surfacic_need | dwellings |
|---|---|---|---|---|---|
Biomass, apartmentbiomass_apartment | biomass | apartment | 2.14595e+07 | 160.745 | 320 487 |
Fuel boiler, apartmentfuel_apartment | fuel | apartment | 3.26277e+07 | 178.999 | 475 230 |
Gas boiler, apartmentgas_apartment | gas | apartment | 3.53574e+08 | 148.194 | 5 334 267 |
Electric resistance, apartmentresistance_apartment | resistance | apartment | 2.11641e+08 | 72.823 | 3 995 209 |
District heating, apartmentdistrict_apartment | district | apartment | 9.7389e+07 | 186.587 | 1 554 877 |
Air-air heat pump, apartmentair_air_apartment | air_air | apartment | 2.82849e+07 | 63.9689 | 636 490 |
Air-water heat pump, apartmentair_water_apartment | air_water | apartment | 1.5063e+06 | 14.7621 | 146 882 |
Hybrid heat pump, apartmenthybrid_apartment | hybrid | apartment | 0 | 14.7621 | 0 |
Biomass, housebiomass_house | biomass | house | 4.25995e+08 | 178.465 | 3 775 624 |
Fuel boiler, housefuel_house | fuel | house | 2.83748e+08 | 189.321 | 2 428 267 |
Gas boiler, housegas_house | gas | house | 5.64693e+08 | 159.064 | 5 168 802 |
Electric resistance, houseresistance_house | resistance | house | 4.69674e+08 | 81.0128 | 4 442 744 |
District heating, housedistrict_house | district | house | 1.15162e+06 | 186.848 | 13 311 |
Air-air heat pump, houseair_air_house | air_air | house | 3.38464e+07 | 63.7414 | 365 908 |
Air-water heat pump, houseair_water_house | air_water | house | 1.80247e+06 | 14.7096 | 84 440.2 |
Hybrid heat pump, househybrid_house | hybrid | house | 0 | 14.7096 | 0 |
Biomass, tertiarybiomass_tertiary | biomass | tertiary | 40 726 800 | 206.012 | 0 |
Fuel boiler, tertiaryfuel_tertiary | fuel | tertiary | 210 049 200 | 200.051 | 0 |
Gas boiler, tertiarygas_tertiary | gas | tertiary | 501 552 000 | 198.429 | 0 |
Electric resistance, tertiaryresistance_tertiary | resistance | tertiary | 204 120 000 | 95.5745 | 0 |
District heating, tertiarydistrict_tertiary | district | tertiary | 67 748 400 | 206.558 | 0 |
Air-air heat pump, tertiaryair_air_tertiary | air_air | tertiary | 13 996 800 | 91.6918 | 0 |
Air-water heat pump, tertiaryair_water_tertiary | air_water | tertiary | 89 326 800 | 96.1059 | 0 |
Hybrid heat pump, tertiaryhybrid_tertiary | hybrid | tertiary | 0 | 96.1059 | 0 |
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.
| Row | system | vector | seasonal_efficiency | peak_efficiency | peak_share | unit_2020 | unit_2050 |
|---|---|---|---|---|---|---|---|
Biomass, woodbiomass_wood | biomass | wood | 0.85 | 0.85 | 1 | 1 | 1 |
Fuel boiler, fuel oilfuel_liquid | fuel | liquid | 0.9 | 0.9 | 1 | 1 | 1 |
Gas boiler, gasgas_gas | gas | gas | 0.95 | 0.95 | 1 | 1 | 1 |
District heating, gasdistrict_gas | district | gas | 0.85 | 0.85 | 1 | 0.352 | 0.6 |
District heating, fuel oildistrict_liquid | district | liquid | 0.85 | 0.85 | 1 | 0.005 | 0 |
District heating, wooddistrict_wood | district | wood | 0.85 | 0.85 | 1 | 0.238 | 0.3 |
District heating, coaldistrict_coal | district | coal | 0.85 | 0.85 | 1 | 0.037 | 0 |
District heating, otherdistrict_other | district | other | 0.85 | 0.85 | 1 | 0.368 | 0 |
District heating, heat pumpdistrict_electricity | district | electricity | 2.5 | 1.5 | 1 | 0 | 0.1 |
Electric resistance, electricityresistance_electricity | resistance | electricity | 1 | 1 | 1 | 1 | 1 |
Air-air heat pump, electricityair_air_electricity | air_air | electricity | 2.5 | 2 | 1 | 1 | 1 |
Air-water heat pump, electricityair_water_electricity | air_water | electricity | 3 | 2 | 1 | 1 | 1 |
Hybrid heat pump, electricityhybrid_electricity | hybrid | electricity | 3 | 3 | 0.3 | 0.95 | 0.95 |
Hybrid heat pump, gashybrid_gas | hybrid | gas | 0.95 | 0.95 | 0.7 | 0.05 | 0.05 |
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.
| Row | cement_intensity | steel_intensity | cement_2024 | steel_2024 | floor_2024 | driver |
|---|---|---|---|---|---|---|
New housinghousing_new | 137 | 21 | 0 | 0 | 20.4 | newHousing |
New non-residentialother_new | 135 | 47 | 0 | 0 | 19.9 | newNonResidential |
Roads, networks and civil workscivil_works | 0 | 0 | 5 775 | 0 | 0 | civilWorksVolume |
Renovation, and what nobody attributesunattributed | 0 | 0 | 5 243.7 | 0 | 0 | none |
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.
| Row | subpost | electricity | gas | coal | liquid | hydrogen |
|---|---|---|---|---|---|---|
Steel — BF-BOFsteel_bf | steel | 0.194 | 0.62 | 5.04742 | 0 | 0 |
Steel — H₂-DR-EAFsteel_dri | steel | 1.231 | 0.55 | 0 | 0 | 1.683 |
Steel — EAF from scrapsteel_eaf | steel | 0.918 | 0 | 0 | 0 | 0 |
Ammoniaammonia | ammonia | 0.778 | 0 | 0 | 0 | 5.94 |
Olefins — CO₂ + H₂olefins | olefins | 5.9512 | 0 | 0 | 0 | 1.32 |
Cement clinkercement | cement | 0.1523 | 0.195 | 0.147 | 0.358 | 0 |
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.
| Row | capex | life | fixed |
|---|---|---|---|
Blast furnace + BOFsteel_bf | 442 | 25 | 53 |
H₂ direct reduction + EAFsteel_dri | 414 | 25 | 53 |
Electric arc furnacesteel_eaf | 184 | 25 | 53 |
Haber-Bosch ammoniahaber_bosch | 1 000 | 20 | 50 |
Water electrolyserelectrolyser | 1 125 | 11.42 | 16.87 |
Steam methane reformersmr | 3 243 | 25 | 546 |
Cement kilncement_kiln | 186 | 25 | 9.31 |
Cement kiln with capturecement_kiln_ccs | 456 | 25 | 22.81 |
Methanol synthesismethanol | 300 | 20 | 15 |
Methanol to olefinsmethanol_to_olefins | 1 000 | 20 | 63.7 |
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.
| Row | pax_2023 | pkt_2023 | game_row |
|---|---|---|---|
Paris ↔ provinceparis_province | 12.25 | 7.75 | aviation_domestic |
Province ↔ provinceprovince_province | 8.98 | 5.46 | aviation_domestic |
Paris ↔ internationalparis_international | 82.68 | 263.17 | aviation_international |
Province ↔ internationalprovince_international | 55.92 | 70.58 | aviation_international |
Paris ↔ Outre-merparis_overseas | 4.74 | 38.55 | aviation_overseas |
Province ↔ Outre-merprovince_overseas | 0.09 | 0.74 | aviation_overseas |
Outre-mer ↔ internationaloverseas_international | 2.45 | 6.68 | aviation_international |
Outre-mer ↔ Outre-meroverseas_overseas | 2.5 | 1.26 | aviation_domestic |
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.
| Row | group | carrier | e00 | e10 | e01 | e11 |
|---|---|---|---|---|---|---|
Metals and machinery — coalmetals_machinery__coal | metals_machinery | coal | 2.1981 | 2.6045 | 0 | 0 |
Metals and machinery — oilmetals_machinery__oil | metals_machinery | oil | 2.0343 | 2.4153 | 0 | 0 |
Metals and machinery — gasmetals_machinery__gas | metals_machinery | gas | 17.3054 | 23.0522 | 15.7942 | 17.815 |
Metals and machinery — biomassmetals_machinery__biomass | metals_machinery | biomass | 0 | 0 | 1.1741 | 1.2733 |
Metals and machinery — electricitymetals_machinery__electricity | metals_machinery | electricity | 28.319 | 39.2444 | 65.1398 | 84.1051 |
Metals and machinery — hydrogenmetals_machinery__hydrogen | metals_machinery | hydrogen | 0.0233 | 0.0481 | 0.0257 | 0.0257 |
Metals and machinery — steammetals_machinery__steam | metals_machinery | steam | 0.6397 | 0.7166 | 0.4797 | 0.5217 |
Minerals and building materials — coalminerals__coal | minerals | coal | 1.2444 | 1.2444 | 0 | 0 |
Minerals and building materials — oilminerals__oil | minerals | oil | 2.1632 | 2.3373 | 0 | 0 |
Minerals and building materials — gasminerals__gas | minerals | gas | 16.1308 | 16.4443 | 8.8888 | 8.9452 |
Minerals and building materials — biomassminerals__biomass | minerals | biomass | 0.4071 | 0.4071 | 0 | 0 |
Minerals and building materials — electricityminerals__electricity | minerals | electricity | 6.443 | 6.7565 | 12.4862 | 12.9326 |
Minerals and building materials — hydrogenminerals__hydrogen | minerals | hydrogen | 0 | 0 | 0.0582 | 0.1452 |
Minerals and building materials — processminerals__process | minerals | process | 1.9912 | 1.9912 | 1.943 | 1.943 |
Chemicals, other — coalchemicals_other__coal | chemicals_other | coal | 4.3177 | 2.2483 | 0 | 0 |
Chemicals, other — oilchemicals_other__oil | chemicals_other | oil | 2.9075 | 1.7804 | 0 | 0 |
Chemicals, other — gaschemicals_other__gas | chemicals_other | gas | 8.5248 | 6.858 | 2.0387 | 1.5872 |
Chemicals, other — biomasschemicals_other__biomass | chemicals_other | biomass | 0.868 | 0.4516 | 0.6346 | 0.3304 |
Chemicals, other — electricitychemicals_other__electricity | chemicals_other | electricity | 13.2233 | 9.8075 | 30.2861 | 20.5227 |
Chemicals, other — hydrogenchemicals_other__hydrogen | chemicals_other | hydrogen | 1.5352 | 0.8112 | 3.0602 | 1.6041 |
Chemicals, other — steamchemicals_other__steam | chemicals_other | steam | 5.7452 | 3.658 | 5.1554 | 2.7832 |
Chemicals, other — processchemicals_other__process | chemicals_other | process | 0.5559 | 0.2892 | 0 | 0 |
Paper and board — coalpaper__coal | paper | coal | 0.1279 | 0.1096 | 0 | 0 |
Paper and board — oilpaper__oil | paper | oil | 0.3722 | 0.3188 | 0 | 0 |
Paper and board — gaspaper__gas | paper | gas | 9.211 | 7.8904 | 7.1601 | 6.1336 |
Paper and board — biomasspaper__biomass | paper | biomass | 14.177 | 12.1445 | 13.7939 | 11.8164 |
Paper and board — electricitypaper__electricity | paper | electricity | 7.5362 | 6.4558 | 12.9577 | 11.1 |
Paper and board — steampaper__steam | paper | steam | 3.489 | 2.9888 | 3.9455 | 3.3798 |
Other industries — coalother_industries__coal | other_industries | coal | 0.0233 | 0.0429 | 0 | 0 |
Other industries — oilother_industries__oil | other_industries | oil | 0.8374 | 1.7883 | 0 | 0 |
Other industries — gasother_industries__gas | other_industries | gas | 6.9431 | 20.5083 | 1.5051 | 4.1839 |
Other industries — biomassother_industries__biomass | other_industries | biomass | 3.9775 | 7.3187 | 0.8488 | 1.5619 |
Other industries — electricityother_industries__electricity | other_industries | electricity | 12.4092 | 24.6472 | 16.7512 | 37.1683 |
Other industries — steamother_industries__steam | other_industries | steam | 0.7676 | 2.0037 | 0.1464 | 0.3741 |
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.
| Row | usage | segment | electricity | gas | liquid | wood | heat |
|---|---|---|---|---|---|---|---|
Hot water, residentialdhw_residential | dhw | residential | 24.34 | 13.51 | 3.32 | 0.66 | 1.24 |
Hot water, tertiarydhw_tertiary | dhw | tertiary | 7.23 | 11.75 | 3.08 | 0.14 | 1.55 |
Cooking, residentialcooking_residential | cooking | residential | 9.33 | 10.98 | 0 | 0 | 0 |
Cooking, tertiarycooking_tertiary | cooking | tertiary | 4.47 | 7.1 | 0.08 | 0.07 | 0 |
Air conditioning, residentialcooling_residential | cooling | residential | 2.59 | 0 | 0 | 0 | 0 |
Air conditioning, tertiarycooling_tertiary | cooling | tertiary | 21.66 | 0 | 0 | 0 | 0 |
Specific electricity, residentialspecific_residential | specific | residential | 67.15 | 0 | 0 | 0 | 0 |
Specific electricity, tertiaryspecific_tertiary | specific | tertiary | 70.3 | 0 | 0 | 0 | 0 |
Other uses, tertiaryother_tertiary | other | tertiary | 2.13 | 3.99 | 4.41 | 0.17 | 0 |
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.
| Row | scenario_index | nuclear | pv_ground | pv_roof | wind_onshore | wind_offshore_fixed | wind_offshore_floating | hydro | bioenergy | gas_turbine | combined_cycle |
|---|---|---|---|---|---|---|---|---|---|---|---|
M0 — 100% renewablem0 | 1 | 0 | 0.173082 | 0.173082 | 0.203074 | 0.151999 | 0.151999 | 0.108542 | 0.015778 | 0.021763 | 0.00068 |
M1 — renewables, distributedm1 | 2 | 0.124451 | 0.174877 | 0.174877 | 0.16287 | 0.111416 | 0.111416 | 0.109083 | 0.015917 | 0.014407 | 0.000686 |
M23 — renewables, large farmsm23 | 3 | 0.129422 | 0.10868 | 0.10868 | 0.206421 | 0.152934 | 0.152934 | 0.111095 | 0.01648 | 0.012644 | 0.00071 |
N1 — new nuclear, 4 EPR2n1 | 4 | 0.260149 | 0.103202 | 0.103202 | 0.167667 | 0.114494 | 0.114494 | 0.111349 | 0.016581 | 0.008148 | 0.000715 |
N2 — new nuclear, 8 EPR2n2 | 5 | 0.367823 | 0.080224 | 0.080224 | 0.151268 | 0.094069 | 0.094069 | 0.112066 | 0.016905 | 0.002769 | 0.000583 |
N03 — new nuclear, ~50% nuclearn03 | 6 | 0.501036 | 0.063425 | 0.063425 | 0.12833 | 0.057652 | 0.057652 | 0.111308 | 0.01717 | 0 | 0 |
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.
| Row | renewable | load_factor | thermal_efficiency | fuel_carrier | hydrogen_capable | lifetime | capex_per_kw | opex_per_kw_year | steel | concrete | aluminium | copper | lithium | cobalt | nickel | rare_earth |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Nuclearnuclear | 0 | 0.75 | 0 | none | 0 | 60 | 11 900 | 100 | 67 | 533 | 0.35 | 1.6 | 1.5e-07 | 3.8e-05 | 0 | 2.3e-05 |
Solar PV, groundpv_ground | 1 | 0.14 | 0 | none | 0 | 25 | 747 | 11 | 28.4706 | 35.1373 | 17.4 | 3.1 | 9.37e-07 | 0.00032 | 0 | 2.2235e-05 |
Solar PV, rooftoppv_roof | 1 | 0.14 | 0 | none | 0 | 25 | 747 | 11 | 16.1765 | 28.8627 | 12 | 3.1 | 8.7e-07 | 0.000313962 | 0 | 1.9765e-05 |
Wind, onshorewind_onshore | 1 | 0.23 | 0 | none | 0 | 25 | 1 300 | 40 | 200 | 450 | 0.69 | 2.6 | 7.1e-06 | 3.4e-05 | 0 | 4.2e-05 |
Wind, offshore fixedwind_offshore_fixed | 1 | 0.41 | 0 | none | 0 | 20 | 2 600 | 80 | 250 | 910 | 1 | 8.5 | 8.1e-06 | 3.65e-05 | 0 | 0.106674 |
Wind, offshore floatingwind_offshore_floating | 1 | 0.41 | 0 | none | 0 | 20 | 2 600 | 80 | 480 | 1 700 | 1.15 | 8.55 | 8.55e-06 | 4.8e-05 | 0 | 0.106676 |
Hydrohydro | 1 | 0.295 | 0 | none | 0 | 70 | 1 000 | 15 | 98 | 21 | 0.52 | 0.18 | 1.9e-07 | 0.00014 | 0 | 9e-05 |
Bioenergybioenergy | 1 | 0.589 | 0.25 | gas | 0 | 25 | 3 000 | 120 | 57 | 3.5 | 0.059 | 0.12 | 7.2e-07 | 5.4e-05 | 0 | 5.4e-06 |
Gas turbinegas_turbine | 0 | 0.114 | 0 | none | 0 | 25 | 800 | 48 | 6.3 | 41 | 0.75 | 0.79 | 1.5e-08 | 7.2e-06 | 0 | 6.4e-06 |
Combined cyclecombined_cycle | 0 | 0.114 | 0.6 | gas | 1 | 30 | 1 100 | 48 | 29 | 36 | 1.1 | 1.2 | 3.6e-08 | 0.0018 | 0 | 2e-05 |
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.
| Row | production_2050 | battery_kwh | electric_share | steel | aluminium |
|---|---|---|---|---|---|
Carcar | 2 500 004 | 45 | 0.9995 | 1 111 | 130 |
Utility vehiclevan | 500 004 | 80 | 0.995 | 990 | 52 |
Bus and coachbus | 15 783 | 400 | 0.9431 | 6 785 | 1 670 |
Trucktruck | 55 005 | 1 000 | 0.9 | 8 738 | 351 |
Motorcyclemotorcycle | 220 007 | 14 | 1 | 222 | 26 |
Mopedmoped | 110 002 | 8 | 1 | 222 | 26 |
Bicyclebicycle | 15 701 879 | 0.5 | 1 | 6 | 8 |
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.
| Row | steel | aluminium | copper | lithium | cobalt | nickel |
|---|---|---|---|---|---|---|
NMC 811nmc_811 | 1.9 | 1 | 1.8 | 0.111 | 0.027 | 0.75 |
LFPlfp | 2 | 1.3 | 1.6 | 0.49 | 6.8e-06 | 0.03 |
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.
| Row | methane | electricity | carbon_captured |
|---|---|---|---|
Electrolysiselectrolysis | 0 | 0 | 0 |
Steam methane reformingsmr | 1.39 | 0.0174 | 0 |
Autothermal reforming + captureatr_ccs | 1.45 | 0.03 | 0.94 |
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.
| Row | area_2023 | soil_carbon_stock | peat_area | peat_ef |
|---|---|---|---|---|
Arable landarable | 17.2648 | 51.6 | 0 | 0 |
Permanent grasslandgrassland | 9.13854 | 84.6 | 0 | 0 |
Vines and orchardsperm_crops | 1.27571 | 40.4 | 0 | 0 |
Forestforest | 17.5213 | 81 | 0 | 0 |
Heath, scrub and bare groundother_natural | 3.44427 | 79 | 0 | 0 |
Water and wetlandswater | 1.03458 | 0 | 0 | 0 |
Artificialisedartificial | 5.24006 | 30 | 0 | 0 |
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.
| Row | position | production_factor | mortality_factor |
|---|---|---|---|
C1 — mildc1 | 1 | 0.99 | 1.1 |
C2 — centralc2 | 2 | 0.88 | 1.4 |
C3 — severec3 | 3 | 0.75 | 1.8 |
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.
| Row | species_group | heads_2024 | emission_factor | enteric_mitigable | manure_ch4_share | manure_n_2024 | grassland_ha_per_head |
|---|---|---|---|---|---|---|---|
Dairy cowsdairy_cow | cattle | 3.076 | 3 697 | 1 | 0.2 | 300.39 | 0.765333 |
Suckler cowssuckler_cow | cattle | 3.675 | 3 128 | 1 | 0.06 | 358.89 | 0.765333 |
Other cattleother_cattle | cattle | 9.706 | 1 625 | 1 | 0.12 | 568.72 | 0.4592 |
Pigspig | pig | 11.902 | 207.528 | 0 | 0.95 | 78 | 0 |
Poultrypoultry | poultry | 272.724 | 0.84334 | 0 | 0.6 | 64 | 0 |
Sheep and goatssmall_ruminant | small_ruminant | 7.868 | 551.601 | 0 | 0.05 | 92 | 0.1148 |
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.
| Row | species | consumption_base | per_capita_2024 | import_share | export_base | production_2024 | waste_share |
|---|---|---|---|---|---|---|---|
Beef and vealbeef | suckler_cow | 1 424 | 20.8 | 0.255 | 206.12 | 1 267 | 0.088 |
Porkpork | pig | 2 116 | 30.6 | 0.3 | 617.8 | 2 099 | 0.088 |
Sheep meatsheep | small_ruminant | 145 | 2.1 | 0.58 | 42.1 | 103 | 0.088 |
Poultrypoultry | poultry | 2 133 | 30.8 | 0.46 | 540.18 | 1 692 | 0.191 |
Cow milkmilk | dairy_cow | 21 240 | 309.8 | 0.333 | 9 432.92 | 23 600 | 0.108 |
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 now sits above the warning line, at 77.07, and that is a statement about the reference rather than about the band — the SNBC 3's own agriculture is 43.67 and this module produces 46.38 at the strategy's own settings.
| Row | good | warning |
|---|---|---|
Total emissions, game perimetertotal | 50 | 75 |
Transport emissionstransport | 4 | 10 |
Building emissionsbuilding | 3 | 7 |
Industry emissionsindustry | 10 | 15 |
Agriculture emissionsagriculture | 44 | 60 |
Winter electricity peakpeak | 35 | 45 |
Biogasbiogas | 70 | 150 |
Biofuelsbiofuel | 40 | 50 |
Wood energybiomass | 80 | 120 |
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.
| Row | topic | weight | position | contested | settles_it |
|---|---|---|---|---|---|
Is burning wood carbon-neutral?wood_factor | emission factors | high | 27 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 is worth about thirty. | 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 buildstechnological_sink | carbon sinks | high | A 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 sinks | high | The 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.6 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**. 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.6 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. |
Is 45 GW the right red line?peak_limit | system constraints | medium | Target 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 supply | high | Neither. 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 | resources | medium | Since 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 land | high | Four 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 land | medium | The 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 accountland_competition | food and land | medium | The 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 sinks | medium | The 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 land | medium | An 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 land | high | A 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 negativebeccs | hydrogen and carbon removal | high | The 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 SNBCperimeter_gap | accounting | low | Reported 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 plasticplastic_carbon | accounting | high | The 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. |
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.
| Row | sector | kind | waste_heat_share | waste_heat_hot_share | elec_efficiency_ceiling |
|---|---|---|---|---|---|
Passenger mobilitypassenger_mobility | transport | mobility | 0 | 0 | 0 |
Freightfreight_mobility | transport | mobility | 0 | 0 | 0 |
Residential heatingresidential_heating | building | heat | 0 | 0 | 0 |
Tertiary heatingtertiary_heating | building | heat | 0 | 0 | 0 |
Residential, other usesresidential_uses | building | other | 0 | 0 | 0 |
Tertiary, other usestertiary_uses | building | other | 0 | 0 | 0 |
Electricity generationenergy_production | energy | other | 0 | 0 | 0 |
Hydrogen productionhydrogen_production | energy | other | 0 | 0 | 0 |
Steelsteel | industry | process | 0.01249 | 0.6449 | 0.11412 |
Ammoniaammonia | industry | process | 0.01831 | 0.4397 | 0.31091 |
Olefins and plasticsolefins | industry | process | 0.01831 | 0.4397 | 0.31091 |
Cementcement | industry | process | 0.08676 | 0.8354 | 0.24128 |
Food-industry heatfood_heat | industry | heat | 0.01643 | 0.3276 | 0.25011 |
Metals and machineryother_metals | industry | other | 0.06185 | 0.556 | 0.15539 |
Minerals and materialsother_minerals | industry | other | 0.08748 | 0.8283 | 0.24128 |
Chemicals, otherother_chemicals | industry | other | 0.01831 | 0.4397 | 0.31091 |
Paper and boardother_paper | industry | other | 0.3108 | 0.3348 | 0.19258 |
Other industriesother_diverse | industry | other | 0.1113 | 0.5412 | 0.23636 |
Livestocklivestock | agriculture | process | 0 | 0 | 0 |
Crops and soilscrops | agriculture | process | 0 | 0 | 0 |
Farm and forestry enginesfarm_machinery | agriculture | other | 0 | 0 | 0 |
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.
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
shift_shareper row of passenger_shift | car_to_fuel: carFuelcar_to_gas: carGascar_to_electric: carElectriccar_to_rail: carRailaviation_keep: 1 - domesticAviationRailaviation_to_rail: domesticAviationRaildefault: 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_years | multiple 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_shiftper 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_flowper row of passenger_shift | passenger[row.source].demand_2050_before_shift * (1 - passengerReduction) * row.shift_share | Gpkm/y | — |
passenger_demandper row of passenger | sum(passenger_shift.passenger_flow, passenger_shift.target == row.id) | Gpkm/y | — |
aviation_efficiency_factor | (1 - aviationEfficiency) ** aviation_horizon_years | fraction 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_2050per 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_energyper row of passenger | row.passenger_demand * row.unit_consumption_2050 / row.occupancy / 100 | TWh/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_shareper row of freight_shift | truck_to_h2: truckH2truck_to_thermal: truckThermaltruck_to_electric: truckElectrictruck_to_rail: truckRailair_to_sea: freightAviationSeaair_keep: 1 - freightAviationSeadefault: row.share | fraction | — |
freight_flowper row of freight_shift | freight[row.source].demand_2020 * (1 - freightReduction) * row.freight_shift_share | Gtkm/y | — |
freight_demandper row of freight | sum(freight_shift.freight_flow, freight_shift.target == row.id) | Gtkm/y | — |
freight_energyper row of freight | row.freight_demand * row.unit_consumption / 100 | TWh/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
passenger_liquid | sum(passenger.passenger_energy, passenger.vector == "liquid") | TWh/y | — |
passenger_gas | sum(passenger.passenger_energy, passenger.vector == "gas") | TWh/y | — |
passenger_electricity_direct | sum(passenger.passenger_energy, passenger.vector == "electricity") | TWh/y | — |
passenger_hydrogen | sum(passenger.passenger_energy, passenger.vector == "hydrogen") | TWh/y | — |
freight_liquid | sum(freight.freight_energy, freight.vector == "liquid") | TWh/y | — |
freight_gas | sum(freight.freight_energy, freight.vector == "gas") | TWh/y | — |
freight_electricity_direct | sum(freight.freight_energy, freight.vector == "electricity") | TWh/y | — |
freight_hydrogen | sum(freight.freight_energy, freight.vector == "hydrogen") | TWh/y | — |
passenger_biofuel | passenger_liquid * biofuelShare | TWh/y | — |
passenger_electricity_efuel | passenger_liquid * (1 - biofuelShare) / efficiency_electricity_to_efuel | TWh/y | — |
freight_biofuel | freight_liquid * biofuelShare | TWh/y | — |
freight_electricity_efuel | freight_liquid * (1 - biofuelShare) / efficiency_electricity_to_efuel | TWh/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
need_2020per row of building_segment | row.surface_2020 * row.surfacic_need / 1000000000 * building_need_calibration | TWh/y | Surface times surfacic need, scaled by the one stock-wide calibration that lands the 2020 account on the observed 359.34 TWh. |
need_2050per 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_need | sum(building_segment.need_2050) | TWh/y | — |
building_heat_need_residential | sum(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_share | building_heat_need_residential / building_heat_need | fraction | — |
vector_need_2020per row of building_vector | sum(building_segment.need_2020, building_segment.system == row.system) | TWh/y | — |
vector_peak_load_2020per row of building_vector | row.vector_need_2020 * row.unit_2020 / row.peak_efficiency * row.peak_share | TWh/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_2020 | sum(building_vector.vector_peak_load_2020, building_vector.vector == "electricity") | TWh/y equivalent | — |
heat_from_biomass | bldgBiomassTwh * building_vector["biomass_wood"].seasonal_efficiency | TWh/y | Wood burned times the boiler efficiency gives the heat delivered. |
heat_from_electricity | bldgElectricShare * building_heat_need | TWh/y | — |
heat_from_district_wood | districtWoodTwh * building_vector["district_wood"].seasonal_efficiency | TWh/y | — |
heat_from_district_waste | districtWasteTwh | TWh/y | Recovered heat is delivered as it is found; no conversion, no losses charged. |
heat_targeted | heat_from_biomass + heat_from_electricity + heat_from_district_wood + heat_from_district_waste | TWh/y | — |
heat_from_gas | max(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_surplus | max(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_total | bldgElecAirAir + bldgElecAirWater + bldgElecResistance + bldgElecHybrid + bldgElecDistrictHP | fraction | 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_air | heat_from_electricity * bldgElecAirAir / electric_split_total if electric_split_total > 0 else 0 | TWh/y | — |
heat_air_water | heat_from_electricity * bldgElecAirWater / electric_split_total if electric_split_total > 0 else 0 | TWh/y | — |
heat_resistance | heat_from_electricity * bldgElecResistance / electric_split_total if electric_split_total > 0 else 0 | TWh/y | — |
heat_hybrid | heat_from_electricity * bldgElecHybrid / electric_split_total if electric_split_total > 0 else 0 | TWh/y | — |
heat_district_hp | heat_from_electricity * bldgElecDistrictHP / electric_split_total if electric_split_total > 0 else 0 | TWh/y | — |
electricity_air_air | heat_air_air / building_vector["air_air_electricity"].seasonal_efficiency | TWh/y | — |
electricity_air_water | heat_air_water / building_vector["air_water_electricity"].seasonal_efficiency | TWh/y | — |
electricity_resistance | heat_resistance / building_vector["resistance_electricity"].seasonal_efficiency | TWh/y | — |
electricity_hybrid | heat_hybrid * building_vector["hybrid_electricity"].unit_2050 / building_vector["hybrid_electricity"].seasonal_efficiency | TWh/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_hybrid | heat_hybrid * building_vector["hybrid_gas"].unit_2050 / building_vector["hybrid_gas"].seasonal_efficiency | TWh/y | — |
electricity_district_hp | heat_district_hp / building_vector["district_electricity"].seasonal_efficiency | TWh/y | — |
building_electricity | electricity_air_air + electricity_air_water + electricity_resistance + electricity_hybrid + electricity_district_hp | TWh/y | — |
building_gas | heat_from_gas / building_vector["gas_gas"].seasonal_efficiency + gas_hybrid | TWh/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_wood | bldgBiomassTwh + districtWoodTwh | TWh/y | — |
building_waste_heat | districtWasteTwh | TWh/y | — |
building_liquid | 0 | TWh/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_coal | 0 | TWh/y | — |
building_electricity_residential | building_electricity * building_residential_share | TWh/y | — |
building_gas_residential | building_gas * building_residential_share | TWh/y | — |
building_wood_residential | building_wood * building_residential_share | TWh/y | — |
building_liquid_residential | building_liquid * building_residential_share | TWh/y | — |
building_coal_residential | building_coal * building_residential_share | TWh/y | — |
building_peak_load_2050 | heat_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_efficiency | TWh/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_peak | building_peak_2020 * building_peak_load_2050 / building_peak_load_2020 | GW | 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_2020 | sum(building_segment.surface_2020) / 1000000 | Mm² | — |
building_surface_residential | sum(building_segment.surface_2020, building_segment.building_type != "tertiary") / 1000000 | Mm² | — |
building_surface_coverage | building_surface_2020 / floor_area_total | fraction | 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_2050 | building_surface_2020 * (heat_air_air + heat_air_water + heat_hybrid) / building_heat_need | Mm² | 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_2020 | sum(building_segment.surface_2020, building_segment.system == "air_air" or building_segment.system == "air_water" or building_segment.system == "hybrid") / 1000000 | Mm² | — |
heat_pump_surface_added | max(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. |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
construction_floor_housing | newHousing | Mm²/y | — |
construction_floor_other | newNonResidential | Mm²/y | — |
construction_floor_total | construction_floor_housing + construction_floor_other | Mm²/y | — |
construction_timber_extra | construction_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_saved | construction_timber_extra * timber_cement_saving | kt/y | Megagrammes per square metre are kilotonnes per square megametre, so the unit carries itself: Mm² times kg/m² is kt. |
construction_steel_saved | construction_timber_extra * timber_steel_saving | kt/y | — |
construction_use_cementper row of construction_use | housing_new: construction_floor_housing * row.cement_intensityother_new: construction_floor_other * row.cement_intensitycivil_works: row.cement_2024 * civilWorksVolumeunattributed: 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_steelper row of construction_use | housing_new: construction_floor_housing * row.steel_intensityother_new: construction_floor_other * row.steel_intensitycivil_works: row.steel_2024unattributed: row.steel_2024 | kt/y | — |
cement_demand | max(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_demand | max(0, sum(construction_use.construction_use_steel) - construction_steel_saved) | kt/y | Structural and reinforcing steel for new buildings, computed and never read back: |
construction_timber_floor | construction_floor_total * timberShare | Mm²/y | — |
construction_timber_wood | construction_timber_floor * timber_wood_intensity | Mm³/y of sawn product | — |
construction_timber_roundwood | construction_timber_wood * sawnwood_roundwood_factor | Mm³/y | What the built square metres ask of the forest, in the standing-stock volume the harvest is written in. It is compared with |
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
steel_bf_production | steel_bf_base_production * (1 - steelDRI) * (1 + steelGrowth) | kt/y | — |
steel_dri_production | steel_bf_base_production * steelDRI * (1 + steelGrowth) | kt/y | — |
steel_eaf_production | steel_eaf_base_production * (1 + steelGrowth) | kt/y | — |
olefin_production | olefin_base_production * olefinRoute * (1 - plasticReduction) | kt/y | — |
cement_production | cement_demand * clinkerRate * (1 - cementReduction) | kt clinker/y | Demand now sets this, and it did not before v0.20. Until then the volume was |
chain_productionper row of industry_chain | steel_bf: steel_bf_productionsteel_dri: steel_dri_productionsteel_eaf: steel_eaf_productionammonia: chain_ammonia_productionolefins: olefin_productioncement: cement_production | kt/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
chain_electricityper row of industry_chain | row.chain_production * row.electricity / 1000 | TWh/y | — |
chain_gasper row of industry_chain | row.chain_production * row.gas / 1000 | TWh/y | — |
chain_coalper row of industry_chain | row.chain_production * row.coal / 1000 | TWh/y | — |
chain_liquidper row of industry_chain | row.chain_production * row.liquid / 1000 | TWh/y | Only the cement kiln burns liquid fuel among the five chains, and it burns more of it than of gas or coal. |
chain_hydrogenper row of industry_chain | row.chain_production * row.hydrogen / 1000 | TWh/y | — |
steel_bf_process_residual | steel_bf_process_workbook - industry_chain["steel_bf"].coal * ef_coal / 1000 | tCO₂ per tonne of steel | CORRECTION to the workbook. The workbook charges the blast furnace 1.76 tCO₂ per tonne of steel AND charges its coal an emission factor as well, so the coal carbon was counted twice. The 1.76 figure is almost exactly the combustion of the 0.62 t of coal the same sheet uses — 5.047 MWh/t at the published coking-coal factor gives 1.716 tCO₂/t. The model now counts the coal once, as energy, and keeps only the remainder here. That remainder, about 0.044 tCO₂/t, is the limestone flux and whatever else the workbook's single figure contained; a proper published split would replace it. |
chain_process_per_tonneper row of industry_chain | steel_bf: steel_bf_process_residualolefins: -olefin_carbon_per_tonne * biogenicCO2cement: 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 — and the blast-furnace residue left once its coal has been counted as energy. |
chain_emissions_per_tonneper row of industry_chain | row.coal * ef_coal / 1000 + row.chain_process_per_tonne | tCO₂ 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_processper row of industry_chain | row.chain_production * row.chain_process_per_tonne / 1000 | MtCO₂/y | — |
food_steam | food_steam_demand * (1 - foodEfficiency) | TWh/y | — |
food_direct_heat | food_direct_heat_demand * (1 - foodEfficiency) | TWh/y | — |
food_electricity | (food_steam * foodHPSteam + food_direct_heat * foodHPDirect) / food_heat_pump_cop | TWh/y | Heat delivered by heat pumps, divided by their coefficient of performance. |
food_gas | food_steam * (1 - foodHPSteam) + food_direct_heat * (1 - foodHPDirect) | TWh/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
other_energyper 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 * otherIndustryProcess | TWh/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_energy | sum(industry_other.other_energy, industry_other.carrier != "process") | TWh/y | — |
other_industry_electricity | sum(industry_other.other_energy, industry_other.carrier == "electricity") | TWh/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
energy_electricity_direct_rawper row of post | passenger_mobility: passenger_electricity_directfreight_mobility: freight_electricity_directresidential_heating: building_electricity_residentialtertiary_heating: building_electricity - building_electricity_residentialresidential_uses: usages_electricity_residentialtertiary_uses: usages_electricity_tertiarysteel: 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_electricityother_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: 0hydrogen_production: 0livestock: 0crops: 0farm_machinery: 0 | TWh/y | — |
energy_hydrogenper row of post | passenger_mobility: passenger_hydrogenfreight_mobility: freight_hydrogensteel: 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_hydrogenother_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_total | h2Electrolysis + h2Smr + h2AtrCcs if h2Electrolysis + h2Smr + h2AtrCcs > 0 else 1 | fraction | 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_total | sum(post.energy_hydrogen) | TWh/y | — |
route_shareper row of hydrogen_route | electrolysis: h2Electrolysis / hydrogen_mix_totalsmr: h2Smr / hydrogen_mix_totalatr_ccs: h2AtrCcs / hydrogen_mix_total | fraction | — |
route_hydrogenper row of hydrogen_route | hydrogen_demand_total * row.route_share | TWh/y | — |
route_electricity_per_mwhper row of hydrogen_route | electrolysis: 1 / efficiency_electricity_to_h2default: 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_methaneper row of hydrogen_route | row.route_hydrogen * row.methane | TWh/y | — |
route_captured_methaneper row of hydrogen_route | row.route_methane * row.carbon_captured | TWh/y | — |
hydrogen_electricity_total | sumproduct(hydrogen_route.route_hydrogen, hydrogen_route.route_electricity_per_mwh) | TWh/y | — |
hydrogen_methane_total | sum(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_captured | sum(hydrogen_route.route_captured_methane) * carbon_in_methane / 1000 | MtCO₂/y | The carbon in the reformed methane that ends underground. Charged against the physical carbon the methane carries, not against |
hydrogen_electricity_per_mwh | hydrogen_electricity_total / hydrogen_demand_total if hydrogen_demand_total > 0 else 0 | MWh 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_hydrogenper row of post | row.energy_hydrogen * hydrogen_electricity_per_mwh | TWh/y | — |
energy_electricity_efuelper row of post | passenger_mobility: passenger_electricity_efuelfreight_mobility: freight_electricity_efueldefault: 0 | TWh/y | — |
energy_gas_rawper row of post | passenger_mobility: passenger_gasfreight_mobility: freight_gasresidential_heating: building_gas_residentialtertiary_heating: building_gas - building_gas_residentialresidential_uses: usages_gas_residentialtertiary_uses: usages_gas_tertiaryenergy_production: generation_gas_fuelhydrogen_production: hydrogen_methane_totalsteel: 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_gasother_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: 0crops: 0farm_machinery: 0 | TWh/y | Before any waste heat is recovered against it. |
energy_biofuel_rawper row of post | passenger_mobility: passenger_biofuelfreight_mobility: freight_biofuelcement: sum(industry_chain.chain_liquid, industry_chain.subpost == "cement")residential_heating: building_liquid_residentialtertiary_heating: building_liquid - building_liquid_residentialresidential_uses: usages_liquid_residentialtertiary_uses: usages_liquid_tertiaryother_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_rawper row of post | residential_heating: building_wood_residentialtertiary_heating: building_wood - building_wood_residentialresidential_uses: usages_wood_residentialtertiary_uses: usages_wood_tertiaryenergy_production: generation_wood_fuelother_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_rawper 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_residentialtertiary_heating: building_coal - building_coal_residentialother_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_factorper row of post | 1 - industryEfficiency * row.elec_efficiency_ceiling | fraction 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_factorper 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_directper row of post | row.energy_electricity_direct_raw * row.efficiency_elec_factor | TWh/y | — |
energy_gas_grossper row of post | row.energy_gas_raw * row.efficiency_fuel_factor | TWh/y | — |
energy_coalper row of post | row.energy_coal_raw * row.efficiency_fuel_factor | TWh/y | — |
energy_biofuelper row of post | row.energy_biofuel_raw * row.efficiency_fuel_factor | TWh/y | — |
energy_woodper row of post | row.energy_wood_raw * row.efficiency_fuel_factor | TWh/y | — |
combustion_fuel_grossper row of post | row.energy_gas_gross + row.energy_coal + row.energy_biofuel + row.energy_wood | TWh/y | Everything burned, before recovery. ADEME expresses the waste-heat gisement against exactly this — fossil fuels and biomass together. |
waste_heat_potentialper row of post | row.combustion_fuel_gross * row.waste_heat_share | TWh/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_recoveredper 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_gasper row of post | row.energy_gas_gross - row.waste_heat_recovered | TWh/y | — |
energy_electricity_totalper row of post | row.energy_electricity_direct + row.energy_electricity_hydrogen + row.energy_electricity_efuel | TWh/y | — |
energy_totalper row of post | row.energy_electricity_total + row.energy_gas + row.energy_biofuel + row.energy_wood + row.energy_coal | TWh/y | — |
emissions_electricityper row of post | 0 | MtCO₂/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 |
emissions_gasper row of post | row.energy_gas * efGas / 1000 | MtCO₂/y | — |
emissions_biofuelper row of post | row.energy_biofuel * efLiquid / 1000 | MtCO₂/y | — |
emissions_woodper row of post | row.energy_wood * efWood / 1000 | MtCO₂/y | — |
emissions_coalper row of post | row.energy_coal * ef_coal / 1000 | MtCO₂/y | — |
emissions_processper 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_capturedlivestock: agriculture_livestock_postcrops: agriculture_crops_postfarm_machinery: agriculture_fuel_postdefault: 0 | MtCO₂/y | — |
emissions_combustionper row of post | row.emissions_gas + row.emissions_biofuel + row.emissions_wood + row.emissions_coal + row.emissions_process | MtCO₂/y | Everything except the electricity, which the inventory attributes elsewhere. |
emissions_totalper row of post | row.emissions_electricity + row.emissions_combustion | MtCO₂/y | — |
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
transport_emissions | sum(post.emissions_total, post.sector == "transport") | MtCO₂/y | — |
building_emissions | sum(post.emissions_total, post.sector == "building") | MtCO₂/y | — |
industry_emissions | sum(post.emissions_total, post.sector == "industry") | MtCO₂/y | — |
game_emissions | sum(post.emissions_total) | MtCO₂/y | — |
electricity_demand_before_power_hydrogen | sum(post.energy_electricity_total) | TWh/y | Everything the sectors consume, before the power system's own electrolysis. |
power_hydrogen_feedback | clamp(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_demand | electricity_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_demand | sum(post.energy_electricity_direct) | TWh/y | — |
electricity_hydrogen_demand | sum(post.energy_electricity_hydrogen) | TWh/y | — |
electricity_efuel_demand | sum(post.energy_electricity_efuel) | TWh/y | — |
biogas_demand | sum(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_demand | sum(post.energy_biofuel) | TWh/y | — |
wood_demand | sum(post.energy_wood) | TWh/y | — |
coal_demand | sum(post.energy_coal) | TWh/y | — |
efficiency_saving | sum(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_fuel | 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 | 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_total | sum(post.waste_heat_potential) | TWh/y | — |
waste_heat_recovered_total | sum(post.waste_heat_recovered) | TWh/y | — |
waste_heat_potential_hot | sumproduct(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_energy | sum(post.energy_total) | TWh/y | — |
electric_share | electricity_demand / total_final_energy | fraction | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
land_setting_artificialisation | land_module_active * artificialisationRate + (1 - land_module_active) * artificialisation_rate_base | kha/y | The module's switch applied to a lever. Where |
land_setting_afforestation | land_module_active * afforestationRate + (1 - land_module_active) * afforestation_rate_base | kha/y | — |
land_setting_grassland | land_module_active * grasslandConversion + (1 - land_module_active) * grassland_conversion_base | kha/y | — |
land_setting_soil_practices | land_module_active * soilCarbonPractices + (1 - land_module_active) * soil_practice_base | fraction of the identified potential | — |
land_setting_harvest | land_module_active * forestHarvest + (1 - land_module_active) * forest_harvest_base | Mm³/y | — |
land_setting_long_lived | land_module_active * harvestToProducts + (1 - land_module_active) * hwp_long_lived_share_base | fraction of the harvest | — |
land_setting_peat_rewetting | land_module_active * peatRewetting + (1 - land_module_active) * peat_rewetting_base | fraction 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 |
forest_production_factor | land_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_factor | land_module_active * sum(forest_climate.mortality_factor, forest_climate.position == forestClimate) + (1 - land_module_active) | factor on the base-year mortality | — |
land_flow_artificialised | land_setting_artificialisation * land_horizon_years / 1000 | Mha 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_afforested | land_setting_afforestation * land_horizon_years / 1000 | Mha over the horizon | — |
land_flow_grassland_to_arable | land_setting_grassland * land_horizon_years / 1000 | Mha 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_arable | land_class["arable"].area_2023 - land_flow_artificialised * artificialisation_to_arable_share + land_flow_grassland_to_arable | Mha | 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_grassland | land_class["grassland"].area_2023 - land_flow_grassland_to_arable - land_flow_artificialised * artificialisation_to_grassland_share | Mha | — |
land_perm_crops | land_class["perm_crops"].area_2023 | Mha | 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_forest | land_class["forest"].area_2023 + land_flow_afforested - land_flow_artificialised * artificialisation_to_forest_share | Mha | 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_natural | land_class["other_natural"].area_2023 - land_flow_artificialised * (1 - artificialisation_to_arable_share - artificialisation_to_grassland_share - artificialisation_to_forest_share) - land_flow_afforested | Mha | 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_water | land_class["water"].area_2023 | Mha | — |
land_artificial | land_class["artificial"].area_2023 + land_flow_artificialised | Mha | — |
land_area_2023per row of land_class | row.area_2023 | Mha | 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_2050per row of land_class | arable: land_arablegrassland: land_grasslandperm_crops: land_perm_cropsforest: land_forestother_natural: land_other_naturalwater: land_waterartificial: 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_peat_emissionper 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_peat_emission_2024per 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_arable | sum(land_class.land_peat_emission, land_class.id == "arable") | MtCO₂e/y emitted | — |
land_peat_grassland | sum(land_class.land_peat_emission, land_class.id == "grassland") | MtCO₂e/y emitted | — |
land_peat_forest | sum(land_class.land_peat_emission, land_class.id == "forest") | MtCO₂e/y emitted | — |
land_peat_water | sum(land_class.land_peat_emission, land_class.id == "water") | MtCO₂e/y emitted | — |
land_peat_artificial | sum(land_class.land_peat_emission, land_class.id == "artificial") | MtCO₂e/y emitted | — |
land_peat_total | sum(land_class.land_peat_emission) | MtCO₂e/y emitted | — |
land_peat_unbooked | land_peat_total - land_peat_arable - land_peat_grassland - land_peat_forest - land_peat_water - land_peat_artificial | MtCO₂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_total | sum(land_class.peat_area) | Mha | — |
land_peat_rewetted_area | land_peat_area_total * land_setting_peat_rewetting | Mha | 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_2023 | sum(land_class.area_2023) | Mha | — |
land_total_2050 | sum(land_class.land_area_2050) | Mha | — |
land_account_residual | land_total_2050 - land_total_2023 | Mha | 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_years | kha/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_2050 | forest_production * forest_production_factor | m³/ha/y | — |
forest_mortality_2050 | forest_mortality * forest_mortality_factor | m³/ha/y | — |
forest_volume_balance | (forest_production_2050 - forest_mortality_2050) * forest_production_area - land_setting_harvest * forest_harvest_volume_factor | Mm³/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_rate | land_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_biomass | forest_carbon_k * forest_volume_balance | MtCO₂/y absorbed |
|
land_sink_forest_dead_wood | forest_dead_wood_coefficient * forest_mortality_2050 * forest_production_area | MtCO₂/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_afforestation | afforestation_storage_rate * land_setting_afforestation * max(0, land_horizon_years - afforestation_lag) / 1000 | MtCO₂/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_forest | land_sink_forest_biomass + land_sink_forest_dead_wood + land_sink_forest_afforestation + forest_litter_soil_sink + forest_overseas_sink - land_peat_forest | MtCO₂/y absorbed | — |
hwp_inflow_2024 | forest_harvest_base * hwp_long_lived_share_base * hwp_carbon_per_m3 | MtCO₂/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_inflow | land_harvest_long_lived * hwp_carbon_per_m3 | MtCO₂/y | — |
hwp_decay_rate | ln_two / hwp_half_life | 1/y | — |
hwp_stock_2024 | (hwp_inflow_2024 - hwp_base_sink) / hwp_decay_rate | MtCO₂ | The stock the pool must hold for the base year to balance: a first-order pool releases |
hwp_retention | 0.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: |
hwp_stock_2050 | hwp_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 |
hwp_decay_2050 | hwp_decay_rate * hwp_stock_2050 | MtCO₂/y | — |
land_sink_hwp | hwp_inflow - hwp_decay_2050 | MtCO₂/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 |
hwp_flow_reading | hwp_coefficient * (land_setting_harvest * land_setting_long_lived - forest_harvest_base * hwp_long_lived_share_base) + hwp_base_sink | MtCO₂/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_check | hwp_stock_2024 - hwp_stock_nir_2021 | MtCO₂ | 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_practices | MtCO₂/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) / 1000 | MtCO₂/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 |
land_sink_grassland | grassland_sink_coefficient * land_grassland + soil_practice_potential_grassland * land_setting_soil_practices - land_peat_grassland | MtCO₂/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_arable | MtCO₂/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_artificial | MtCO₂/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_water | MtCO₂/y absorbed | — |
land_sink_total | land_sink_forest + land_sink_hwp + land_sink_grassland + land_sink_cropland + land_sink_artificial + land_sink_wetland | MtCO₂/y absorbed | The six pools, added up, positive for absorption — the module's own sign, which |
land_sink_forest_2024 | forest_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_2024 | MtCO₂/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_2024 | hwp_inflow_2024 - hwp_decay_rate * hwp_stock_2024 | MtCO₂/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_2024 | sum(land_class.land_peat_emission_2024, land_class.id == "arable") | MtCO₂e/y emitted | — |
land_peat_grassland_2024 | sum(land_class.land_peat_emission_2024, land_class.id == "grassland") | MtCO₂e/y emitted | — |
land_peat_forest_2024 | sum(land_class.land_peat_emission_2024, land_class.id == "forest") | MtCO₂e/y emitted | — |
land_peat_water_2024 | sum(land_class.land_peat_emission_2024, land_class.id == "water") | MtCO₂e/y emitted | — |
land_peat_artificial_2024 | sum(land_class.land_peat_emission_2024, land_class.id == "artificial") | MtCO₂e/y emitted | — |
land_peat_total_2024 | sum(land_class.land_peat_emission_2024) | MtCO₂e/y emitted | — |
land_sink_grassland_2024 | grassland_sink_coefficient * land_class["grassland"].area_2023 - land_peat_grassland_2024 | MtCO₂/y absorbed | — |
land_sink_cropland_2024 | -(cropland_source_coefficient * land_class["arable"].area_2023) - land_peat_arable_2024 | MtCO₂/y absorbed | — |
land_sink_artificial_2024 | -(artificialisation_carbon_content * artificialisation_rate_base / 1000) - land_peat_artificial_2024 | MtCO₂/y absorbed | — |
land_sink_wetland_2024 | -wetland_other_source - land_peat_water_2024 | MtCO₂/y absorbed | — |
land_sink_total_2024 | land_sink_forest_2024 + land_sink_hwp_2024 + land_sink_grassland_2024 + land_sink_cropland_2024 + land_sink_artificial_2024 + land_sink_wetland_2024 | MtCO₂/y absorbed | — |
land_sink_check_2024 | -land_sink_total_2024 - official_natural_sink_2024 | MtCO₂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_lived | land_setting_harvest * land_setting_long_lived | Mm³/y | — |
land_timber_headroom | land_harvest_long_lived - construction_timber_roundwood | Mm³/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_other | land_setting_harvest - land_harvest_long_lived | Mm³/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_base | fraction 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_base | forest_harvest_unutilised / forest_harvest_base | fraction 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_check | forest_harvest_sawlogs + forest_harvest_industrial + forest_harvest_energy_commercial + forest_informal_firewood + forest_harvest_unutilised - forest_harvest_base | Mm³/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. |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
food_setting_red_meat | land_module_active * dietRedMeat + (1 - land_module_active) * diet_red_meat_base | kgec/cap/y | The land module's switch applied to a lever, the same arithmetic the seven land levers use. Where |
food_setting_poultry | land_module_active * dietPoultry + (1 - land_module_active) * diet_poultry_base | kgec/cap/y | — |
food_setting_dairy | land_module_active * dietDairy + (1 - land_module_active) * diet_dairy_index_base | index, base year = 1 | — |
food_setting_waste | land_module_active * foodWaste + (1 - land_module_active) * food_waste_cut_base | fraction of edible waste removed | — |
food_setting_export | land_module_active * livestockExport + (1 - land_module_active) * livestock_export_base | index, base year = 1 | — |
food_setting_nitrogen | land_module_active * nIntensity + (1 - land_module_active) * n_intensity_base | index, base year = 1 | — |
food_setting_legume_area | land_module_active * legumeArea + (1 - land_module_active) * legume_area_base | Mha | — |
food_setting_enteric | land_module_active * entericMitigation + (1 - land_module_active) * enteric_mitigation_base | fraction of cattle | — |
food_setting_manure | land_module_active * manureMethanised + (1 - land_module_active) * manure_methanised_base | fraction of manure | — |
food_setting_farm_fuel | land_module_active * agriFuelSwitch + (1 - land_module_active) * agri_fuel_switch_base | fraction of farm fuel | — |
food_setting_ammonia_share | land_module_active * ammoniaDomesticShare + (1 - land_module_active) * ammonia_domestic_share_base | fraction | — |
food_setting_organic | land_module_active * organicShare + (1 - land_module_active) * organic_share_base | fraction of the arable area | — |
food_setting_crop_export | land_module_active * cropExport + (1 - land_module_active) * crop_export_base | index, 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. |
product_waste_factorper 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_share | sumproduct(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_ratio | population_horizon / population_base | factor 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_meat | food_setting_red_meat / diet_red_meat_base * population_ratio | index, 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_poultry | food_setting_poultry / diet_poultry_base * population_ratio | index, base year = 1 | — |
demand_index_dairy | food_setting_dairy / diet_dairy_index_base * population_ratio | index, base year = 1 | — |
product_demand_indexper row of animal_product | beef: demand_index_red_meat * row.product_waste_factorpork: demand_index_red_meat * row.product_waste_factorsheep: demand_index_red_meat * row.product_waste_factorpoultry: demand_index_poultry * row.product_waste_factormilk: 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 |
product_domestic_demandper row of animal_product | row.consumption_base * row.product_demand_index | kt/y | — |
product_productionper row of animal_product | row.consumption_base * row.product_demand_index * (1 - row.import_share) + row.export_base * food_setting_export | kt/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_sufficiencyper row of animal_product | row.product_production / row.product_domestic_demand if row.product_domestic_demand > 0 else 0 | fraction | 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_2024per row of animal_product | row.production_2024 | kt/y | — |
product_trade_checkper row of animal_product | row.consumption_base * (1 - row.import_share) + row.export_base - row.production_2024 | kt/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_production | sum(animal_product.product_production, animal_product.id == "milk") | kt/y | — |
beef_production | sum(animal_product.product_production, animal_product.id == "beef") | kt/y | — |
pork_production | sum(animal_product.product_production, animal_product.id == "pork") | kt/y | — |
poultry_production | sum(animal_product.product_production, animal_product.id == "poultry") | kt/y | — |
sheep_production | sum(animal_product.product_production, animal_product.id == "sheep") | kt/y | — |
milk_per_dairy_cow | animal_product["milk"].production_2024 / livestock["dairy_cow"].heads_2024 | kg/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_cow | dairy_beef_coupling_share * animal_product["beef"].production_2024 / livestock["dairy_cow"].heads_2024 | kg/head/y | The beef a dairy cow sends to market anyway — cull cows and the calves the dairy herd does not keep. It is |
beef_per_suckler_cow | (1 - dairy_beef_coupling_share) * animal_product["beef"].production_2024 / livestock["suckler_cow"].heads_2024 | kg/head/y | — |
other_cattle_per_cow | livestock["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_cows | milk_production / milk_per_dairy_cow | M head | — |
suckler_cows | max(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_cow | M head | — |
pig_herd | livestock["pig"].heads_2024 * pork_production / animal_product["pork"].production_2024 | M head | — |
poultry_heads | livestock["poultry"].heads_2024 * poultry_production / animal_product["poultry"].production_2024 | M head | — |
small_ruminant_herd | livestock["small_ruminant"].heads_2024 * sheep_production / animal_product["sheep"].production_2024 | M head | — |
livestock_headsper row of livestock | dairy_cow: dairy_cowssuckler_cow: suckler_cowsother_cattle: other_cattle_headspig: pig_herdpoultry: poultry_headssmall_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_heads_2024per row of livestock | row.heads_2024 | M 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_heads | sum(livestock.heads_2024, livestock.species_group == "cattle") | M head | — |
cattle_heads | sum(livestock.livestock_heads, livestock.species_group == "cattle") | M head | — |
cattle_index | cattle_heads / cattle_base_heads | index, 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. |
livestock_row_baseper 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; |
livestock_row_entericper row of livestock | row.livestock_row_base * (1 - row.manure_ch4_share) | MtCO₂e/y | — |
livestock_row_manureper 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 |
livestock_row_emissionsper row of livestock | row.livestock_row_enteric + row.livestock_row_manure | MtCO₂e/y | — |
livestock_enteric_emissions | sum(livestock.livestock_row_enteric) | MtCO₂e/y | — |
livestock_manure_emissions | sum(livestock.livestock_row_manure) | MtCO₂e/y | — |
livestock_emissions | livestock_enteric_emissions + livestock_manure_emissions + refrigerants_fixed | MtCO₂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_nper row of livestock | row.manure_n_2024 * row.livestock_heads / row.heads_2024 | kt N/y | — |
manure_nitrogen_excreted | sum(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_2024 | sum(livestock.manure_n_2024) | kt N/y | — |
livestock_row_grasslandper row of livestock | row.grassland_ha_per_head * row.livestock_heads | Mha | — |
grassland_required | sum(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_available | land_grassland + grassland_rough - land_class["grassland"].peat_area * land_setting_peat_rewetting | Mha | 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_released | grassland_available - grassland_required | Mha | 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_credit | legume_n_credit * (food_setting_legume_area - legume_area_base) / legume_credit_span | kt 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_nitrogen | max(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 |
|
nitrogen_manure_spread | manure_n_spread_base * cattle_index | kt N/y | — |
nitrogen_manure_grazing | manure_n_grazing_base * cattle_index | kt N/y | — |
nitrogen_fixation | fixation_n_base * (1 + fixation_gain * (food_setting_legume_area - legume_area_base) / legume_credit_span) | kt N/y | — |
nitrogen_input_total | mineral_nitrogen + nitrogen_manure_spread + nitrogen_manure_grazing + nitrogen_fixation | kt 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 |
agricultural_area | land_arable + land_perm_crops + grassland_available | Mha | — |
nitrogen_input_per_hectare | nitrogen_input_total / agricultural_area | kg 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) / 1000 | MtCO₂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_co2 | mineral_nitrogen * ef_mineral_co2 / 1000 | MtCO₂/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 |
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_emissions | bioenergy_setting_energy_maize * energy_maize_digestate_ef | MtCO₂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_2024 | energy_maize_area_base * energy_maize_digestate_ef | MtCO₂e/y | — |
crop_emissions | crop_soil_n2o + crop_fertiliser_co2 + residue_burning_fixed + crop_carbon_fixed + peat_agriculture_n2o + digestate_emissions | MtCO₂e/y | — |
arable_committed | food_setting_legume_area + bioenergy_setting_energy_crop + bioenergy_setting_energy_maize | Mha | 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, |
crop_mineral_input_share | mineral_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_input | 1 - 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 |
nitrogen_useful_dose | min(food_setting_nitrogen, n_yield_plateau) | fraction of the base-year dose | The conventional dose, capped at the plateau: above |
nitrogen_input_index | (1 - crop_mineral_input_share * (1 - nitrogen_useful_dose)) / nitrogen_plateau_input | index, 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_plateau | crop_nue_base / nitrogen_plateau_input | fraction 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_factor | nitrogen_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 |
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 |
organic_area | food_setting_organic * land_arable | Mha | — |
crop_food_index | population_ratio * plant_food_waste_factor | index, 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_index | poultry_heads / livestock["poultry"].heads_2024 | index, base year = 1 | — |
pig_index | pig_herd / livestock["pig"].heads_2024 | index, base year = 1 | — |
small_ruminant_index | small_ruminant_herd / livestock["small_ruminant"].heads_2024 | index, base year = 1 | — |
feed_grain_index | compound_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_index | index, 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_index | feed_forage_share * cattle_index + (1 - feed_forage_share) * feed_grain_index | index, base year = 1 | — |
arable_base_non_energy | land_class["arable"].area_2023 - energy_crop_area_base - energy_maize_area_base | Mha | 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_share_check | arable_share_food + arable_share_feed + arable_share_export + arable_share_other - 1 | fraction | Zero: the four use shares of the base-year arable area sum to one, so |
arable_need_energy | bioenergy_setting_energy_crop + bioenergy_setting_energy_maize | Mha | 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_food | arable_base_non_energy * arable_share_food * crop_food_index / crop_yield_index | Mha | — |
arable_need_feed | arable_base_non_energy * arable_share_feed * crop_feed_index / crop_yield_index | Mha | — |
arable_need_export | arable_base_non_energy * arable_share_export * food_setting_crop_export / crop_yield_index | Mha | — |
arable_need_other | arable_base_non_energy * arable_share_other | Mha | — |
arable_needed | arable_need_food + arable_need_feed + arable_need_export + arable_need_other + arable_need_energy | Mha | 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 |
arable_headroom | land_arable - arable_needed | Mha | 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 |
farm_fuel_emissions | farm_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: |
farm_fuel_energy_2024 | farm_fuel_2024 / ef_liquid_fossil_observed * 1000 | TWh/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_post | land_module_active * livestock_emissions | MtCO₂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_post | land_module_active * crop_emissions | MtCO₂e/y | — |
agriculture_fuel_post | land_module_active * farm_fuel_emissions | MtCO₂e/y | — |
agriculture_emissions | sum(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_2024 | sumproduct(livestock.heads_2024, livestock.emission_factor) / 1000 + refrigerants_fixed | MtCO₂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_2024 | mineral_n_base + manure_n_spread_base + manure_n_grazing_base + fixation_n_base | kt 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_2024 | MtCO₂e/y | — |
agriculture_emissions_2024 | livestock_emissions_2024 + crop_emissions_2024 + farm_fuel_2024 | MtCO₂e/y | — |
livestock_check_2024 | livestock_emissions_2024 - citepa_livestock_2024 | MtCO₂e/y | — |
crops_check_2024 | crop_emissions_2024 - citepa_crops_2024 | MtCO₂e/y | — |
agriculture_check_2024 | agriculture_emissions_2024 - official_agriculture_2024 | MtCO₂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_production | mineral_nitrogen * food_setting_ammonia_share / nh3_nitrogen_fraction + ammonia_non_fertiliser | kt 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_2024 | mineral_n_base * ammonia_domestic_share_base / nh3_nitrogen_fraction + ammonia_non_fertiliser | kt NH₃/y | — |
chain_ammonia_production | land_module_active * ammonia_production + (1 - land_module_active) * ammoniaProduction | kt 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 |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
bioenergy_setting_cive | land_module_active * civeArea + (1 - land_module_active) * cive_area_base | Mha | The switch idiom the whole module uses: where |
bioenergy_setting_residues | land_module_active * residueMobilisation + (1 - land_module_active) * residue_mobilisation_base | fraction of the residue pool | — |
bioenergy_setting_energy_crop | land_module_active * energyCropArea + (1 - land_module_active) * energy_crop_area_base | Mha | — |
bioenergy_setting_energy_maize | land_module_active * energyMaizeArea + (1 - land_module_active) * energy_maize_area_base | Mha | The main crop grown for a digester, on the same switch. It is a separate lever from |
bioenergy_setting_imports | land_module_active * bioImports + (1 - land_module_active) * bio_imports_base | TWh/y | — |
manure_dm_collectable | manure_dm_per_cattle_head * cattle_heads + manure_dm_per_pig_head * pig_herd | Mt 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_manure | manure_dm_collectable * food_setting_manure * biomass_biogas_yield | TWh/y | One lever, two effects. |
biogas_from_cive | bioenergy_setting_cive * cive_dm_yield * cive_biogas_yield | TWh/y | — |
biogas_from_energy_maize | bioenergy_setting_energy_maize * energy_maize_dm_yield * cive_biogas_yield | TWh/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_pool | land_arable * residue_dm_yield | Mt DM/y | Straw and stubble the arable area produces, whether or not anybody takes it. It follows |
residue_dm_mobilised | residue_dm_pool * bioenergy_setting_residues | Mt DM/y | — |
biogas_from_residues | residue_dm_mobilised * residue_to_biogas_share * biomass_biogas_yield | TWh/y | — |
biogas_supply | biogas_from_manure + biogas_from_cive + biogas_from_energy_maize + biogas_from_residues + biogas_other | TWh/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_share | forest_material_share_base + land_setting_long_lived - hwp_long_lived_share_base | fraction 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 |
wood_direct_supply | land_setting_harvest * (1 - wood_material_share - forest_unutilised_share_base) * wood_energy_per_m3 | TWh/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_supply | wood_byproduct_share * land_setting_harvest * wood_material_share * wood_energy_per_m3 | TWh/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_supply | wood_direct_supply + wood_byproduct_supply + non_forest_wood + waste_wood | TWh/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_supply | bioenergy_setting_energy_crop * biofuel_1g_yield | TWh/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_supply | residue_dm_mobilised * (1 - residue_to_biogas_share) * residue_liquid_yield | TWh/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: |
biofuel_domestic_supply | biofuel_1g_supply + biofuel_2g_supply + waste_fats_supply | TWh/y | Crops, straw and waste fats — everything the country's own land and bins produce. This is the |
biofuel_supply | biofuel_domestic_supply + bioenergy_setting_imports | TWh/y | Domestic supply plus the import allowance. This is the |
biogas_headroom | biogas_supply - biogas_demand | TWh/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_headroom | biofuel_supply - biofuel_demand | TWh/y | — |
biofuel_domestic_headroom | biofuel_domestic_supply - biofuel_demand | TWh/y | The same against the domestic supply alone, which is the band the score reads. The difference between the two is exactly |
wood_headroom | wood_supply - wood_demand | TWh/y | — |
cive_headroom | cive_land_ceiling - bioenergy_setting_cive | Mha | 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_good | land_module_active * biogas_supply + (1 - land_module_active) * threshold["biogas"].good | TWh/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_warning | land_module_active * biogas_supply + (1 - land_module_active) * threshold["biogas"].warning | TWh/y | — |
band_biofuel_good | land_module_active * biofuel_domestic_supply + (1 - land_module_active) * threshold["biofuel"].good | TWh/y | The domestic liquid supply — crops, straw and waste fats — and not the imports. This is where |
band_biofuel_warning | land_module_active * biofuel_supply + (1 - land_module_active) * threshold["biofuel"].warning | TWh/y | — |
band_wood_good | land_module_active * wood_supply + (1 - land_module_active) * threshold["biomass"].good | TWh/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_warning | land_module_active * wood_supply + (1 - land_module_active) * threshold["biomass"].warning | TWh/y | — |
manure_dm_collectable_2024 | manure_dm_per_cattle_head * cattle_base_heads + manure_dm_per_pig_head * livestock["pig"].heads_2024 | Mt DM/y | The same pool on the published herd rather than on the modelled one. Cattle and pigs, as above. |
residue_dm_pool_2024 | land_class["arable"].area_2023 * residue_dm_yield | Mt DM/y | The residue pool on the land account's own base-year arable area. It is 57.0 Mt DM by construction — |
biogas_supply_2024 | manure_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_other | TWh/y | The base-year herd, the base-year cover-crop area, the base-year arable and the base-year mobilisation — and |
biogas_check_2024 | biogas_supply_2024 - sdes_biogas_2024 | TWh/y | — |
biogas_other_share_2024 | biogas_other / sdes_biogas_2024 | fraction 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 |
wood_supply_2024 | forest_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_wood | TWh/y | The base-year harvest at the base-year material share. Unlike the biogas one this is a real check: |
wood_check_2024 | wood_supply_2024 - sdes_wood_2024 | TWh/y | — |
biofuel_domestic_2024 | energy_crop_area_base * biofuel_1g_yield + residue_dm_pool_2024 * residue_mobilisation_base * (1 - residue_to_biogas_share) * residue_liquid_yield + waste_fats_supply | TWh/y | — |
biofuel_supply_2024 | biofuel_domestic_2024 + bio_imports_base | TWh/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_2024 | biofuel_supply_2024 - sdes_biofuel_2024 | TWh/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
footprint_electricity | sum(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_liquid | sum(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_gas | sum(freight.freight_energy, freight.in_inventory == 0 and freight.vector == "gas") | TWh/y | — |
bunker_emissions_combustion | (bunker_liquid * biofuelShare * efLiquid + bunker_gas * efGas) / 1000 | MtCO₂/y | — |
transport_combustion | sum(post.emissions_combustion, post.sector == "transport") | MtCO₂/y | — |
building_combustion | sum(post.emissions_combustion, post.sector == "building") | MtCO₂/y | — |
industry_combustion | sum(post.emissions_combustion, post.sector == "industry") | MtCO₂/y | — |
national_transport | transport_combustion - bunker_emissions_combustion | MtCO₂e/y | Domestic transport only, on a combustion basis, comparable with SECTEN. |
national_building | building_combustion | MtCO₂e/y | — |
industry_perimeter_difference | official_industry_2024 - industry_covered_2020 | MtCO₂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_industry | industry_combustion | MtCO₂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_agriculture | land_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 |
national_waste | official_waste_2024 + (official_waste_2050 - official_waste_2024) * wastePathway | MtCO₂e/y | — |
national_energy | sum(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_gross | national_transport + national_building + national_industry + national_agriculture + national_waste + national_energy | MtCO₂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 |
national_technological_sink | -techSink | MtCO₂e/y | — |
national_total_sink | national_natural_sink + national_technological_sink | MtCO₂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. |
national_net | national_gross + national_natural_sink + national_technological_sink | MtCO₂e/y | — |
snbc_gross_gap | national_gross - snbc_gross_2050 | MtCO₂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. |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
route_annuityper row of cost_route | row.capex * crf(discountIndustry, row.life) + row.fixed | €/t of capacity/y | — |
price_methane_mwh | price_methane_per_tonne / lhv_methane | €/MWh | — |
price_coal_mwh | price_coal_per_tonne / lhv_coal | €/MWh | — |
cost_hydrogen_electrolytic | cost_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_ccs | cost_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_blended | hydrogen_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_capitalper row of industry_chain | steel_bf: cost_route["steel_bf"].route_annuitysteel_dri: cost_route["steel_dri"].route_annuitysteel_eaf: cost_route["steel_eaf"].route_annuityammonia: cost_route["haber_bosch"].route_annuityolefins: cost_route["methanol_to_olefins"].route_annuity + cost_route["methanol"].route_annuity * methanol_per_olefincement: cost_route["cement_kiln"].route_annuity * (1 - carbonCapture) + cost_route["cement_kiln_ccs"].route_annuity * carbonCapture | €/t of product | — |
chain_cost_variableper 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_oresteel_dri: row.hydrogen * cost_hydrogen_electrolytic + row.gas * price_methane_mwh + row.electricity * elecPriceIndustry + iron_ore_per_steel_dri * price_iron_oresteel_eaf: row.electricity * elecPriceIndustry + scrap_per_steel_eaf * price_scrapammonia: industry_chain["ammonia"].electricity * elecPriceIndustry + industry_chain["ammonia"].hydrogen * cost_hydrogen_blendedolefins: row.electricity * elecPriceIndustry + row.hydrogen * cost_hydrogen_electrolyticcement: 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_carbonper row of industry_chain | row.chain_emissions_per_tonne * carbonPrice | €/t of product | — |
chain_cost_totalper row of industry_chain | row.chain_cost_capital + row.chain_cost_variable + row.chain_cost_carbon | €/t of product | — |
steel_output | sum(industry_chain.chain_production, industry_chain.subpost == "steel") | kt/y | — |
steel_cost_blended | sumproduct(industry_chain.chain_production, industry_chain.chain_cost_total, industry_chain.subpost == "steel") / max(1, steel_output) | €/t | — |
industry_cost_chains | sumproduct(industry_chain.chain_production, industry_chain.chain_cost_total) / 1000 | M€/y | — |
industry_cost_food_energy | food_gas * price_methane_mwh + food_electricity * elecPriceIndustry | M€/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_total | industry_cost_chains + industry_cost_food_energy | M€/y | — |
retrofit_deep_equivalent | min(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_investment | building_surface_2020 * retrofit_deep_equivalent * retrofitCost * renovation_vat | M€ | — |
retrofit_annual | retrofit_investment * crf(discountResidential, retrofit_life) | M€/y | — |
heat_pump_investment | heat_pump_surface_added * heat_pump_cost_per_m2 | M€ | 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_annual | heat_pump_investment * crf(discountResidential, heat_pump_life) | M€/y | — |
building_energy_cost | building_electricity * price_household_electricity + building_gas * price_household_gas + building_wood * price_wood | M€/y | — |
building_cost_total | retrofit_annual + heat_pump_annual + building_energy_cost | M€/y | — |
building_cost_per_m2 | building_cost_total / building_surface_2020 | €/m²/y | — |
residential_area | building_surface_residential | Mm² | 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_area | building_surface_2020 - building_surface_residential | Mm² | — |
residential_energy_cost | building_electricity_residential * price_household_electricity + building_gas_residential * price_household_gas + building_wood_residential * price_wood | M€/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_cost | building_energy_cost - residential_energy_cost | M€/y | — |
residential_cost_total | (retrofit_annual + heat_pump_annual) * residential_area / building_surface_2020 + residential_energy_cost | M€/y | — |
tertiary_cost_total | building_cost_total - residential_cost_total | M€/y | — |
residential_cost_per_m2 | residential_cost_total / residential_area | €/m²/y | — |
tertiary_cost_per_m2 | tertiary_cost_total / tertiary_area | €/m²/y | — |
car_vehicle_km | sum(passenger.passenger_demand / passenger.occupancy, passenger.id == "car_fuel" or passenger.id == "car_gas" or passenger.id == "car_electric") | Gvkm/y | — |
car_fleet | car_vehicle_km * 1000000000 / km_per_car_per_year | cars | — |
car_fleet_ratio | car_fleet / reference_car_fleet | ratio | — |
car_ownership_cost | car_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_electricity | sum(passenger.passenger_energy, passenger.id == "car_electric") | TWh/y | — |
car_molecules | sum(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_household | car_ownership_cost + car_energy_cost | €/household/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
jet_price_per_mwh_today | jet_fuel_price_2023 / lhv_kerosene | €/MWh | — |
saf_price_per_tonne | biofuelShare * 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_mwh | saf_price_per_tonne / lhv_kerosene | €/MWh | — |
flight_distanceper row of flight_type | row.pkt_2023 / row.pax_2023 * 1000 | km | Passenger-kilometres divided by passengers, one way. |
flight_energy_todayper row of flight_type | row.flight_distance * passenger[row.game_row].unit_consumption / passenger[row.game_row].occupancy / 100 | kWh per passenger | — |
flight_energy_2050per row of flight_type | row.flight_distance * passenger[row.game_row].unit_consumption_2050 / passenger[row.game_row].occupancy / 100 | kWh per passenger | — |
flight_fuel_cost_todayper row of flight_type | row.flight_energy_today / 1000 * jet_price_per_mwh_today | € per passenger | — |
flight_ticket_todayper 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_costper row of flight_type | row.flight_ticket_today - row.flight_fuel_cost_today | € per passenger | — |
flight_fuel_cost_2050per row of flight_type | row.flight_energy_2050 / 1000 * saf_price_per_mwh | € per passenger | — |
flight_ticket_2050per row of flight_type | row.flight_non_fuel_cost + row.flight_fuel_cost_2050 | € per passenger | — |
flight_ticket_ratioper row of flight_type | row.flight_ticket_2050 / row.flight_ticket_today | × | — |
flight_co2_todayper row of flight_type | row.flight_energy_today / 1000 / lhv_kerosene * co2_per_tonne_kerosene * 1000 | kgCO₂ 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_2050per row of flight_type | row.flight_energy_2050 * efLiquid / 1000 | kgCO₂ per passenger | — |
aviation_energy | sum(passenger.passenger_energy, passenger.aviation == 1) | TWh/y | — |
aviation_fuel_bill | aviation_energy * saf_price_per_mwh | M€/y | What the scenario's aviation fuel costs the sector as a whole, at the same price the tickets use. |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
usage_factorper row of building_usage | dhw_residential: 1 - usageDhwEfficiencydhw_tertiary: 1 - usageDhwEfficiencycooking_residential: 1 - usageCookingEfficiencycooking_tertiary: 1 - usageCookingEfficiencycooling_residential: 1 + usageCoolingGrowthcooling_tertiary: 1 + usageCoolingGrowthspecific_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_efficiencyper row of building_usage | dhw_residential: dhw_efficiency_electricdhw_tertiary: dhw_efficiency_electriccooking_residential: cooking_efficiency_electriccooking_tertiary: cooking_efficiency_electricdefault: 1 | service per MWh | — |
usage_fuel_efficiencyper row of building_usage | dhw_residential: dhw_efficiency_fueldhw_tertiary: dhw_efficiency_fuelcooking_residential: cooking_efficiency_fuelcooking_tertiary: cooking_efficiency_fueldefault: 1 | service per MWh | — |
usage_electric_targetper row of building_usage | dhw_residential: usageDhwElectricdhw_tertiary: usageDhwElectriccooking_residential: usageCookingElectriccooking_tertiary: usageCookingElectricdefault: -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_baseper row of building_usage | row.gas + row.heat + row.liquid + row.wood | TWh/y | — |
usage_serviceper row of building_usage | (row.electricity * row.usage_electric_efficiency + row.usage_fuel_base * row.usage_fuel_efficiency) * row.usage_factor | service 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_electricityper 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_factor | TWh/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_energyper 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_factor | TWh/y | The service left to the fuels, at the fuel route's efficiency. |
usage_fuel_scaleper row of building_usage | row.usage_fuel_energy / row.usage_fuel_base if row.usage_fuel_base > 0 else 0 | multiple 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_gasper row of building_usage | (row.gas + row.heat) * row.usage_fuel_scale | TWh/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_liquidper row of building_usage | row.liquid * row.usage_fuel_scale | TWh/y | — |
usage_woodper row of building_usage | row.wood * row.usage_fuel_scale | TWh/y | — |
usage_energyper row of building_usage | row.usage_electricity + row.usage_gas + row.usage_liquid + row.usage_wood | TWh/y | — |
usages_electricity_residential | sum(building_usage.usage_electricity, building_usage.segment == "residential") | TWh/y | — |
usages_electricity_tertiary | sum(building_usage.usage_electricity, building_usage.segment == "tertiary") | TWh/y | — |
usages_gas_residential | sum(building_usage.usage_gas, building_usage.segment == "residential") | TWh/y | — |
usages_gas_tertiary | sum(building_usage.usage_gas, building_usage.segment == "tertiary") | TWh/y | — |
usages_liquid_residential | sum(building_usage.usage_liquid, building_usage.segment == "residential") | TWh/y | — |
usages_liquid_tertiary | sum(building_usage.usage_liquid, building_usage.segment == "tertiary") | TWh/y | — |
usages_wood_residential | sum(building_usage.usage_wood, building_usage.segment == "residential") | TWh/y | — |
usages_wood_tertiary | sum(building_usage.usage_wood, building_usage.segment == "tertiary") | TWh/y | — |
usages_energy_total | sum(building_usage.usage_energy) | TWh/y | — |
usages_energy_dhw | sum(building_usage.usage_energy, building_usage.usage == "dhw") | TWh/y | — |
usages_energy_cooking | sum(building_usage.usage_energy, building_usage.usage == "cooking") | TWh/y | — |
usages_energy_cooling | sum(building_usage.usage_energy, building_usage.usage == "cooling") | TWh/y | — |
usages_energy_specific | sum(building_usage.usage_energy, building_usage.usage == "specific") | TWh/y | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
generation_shareper 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_total | sum(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_gasper row of generation_technology | row.generation_share / generation_share_total / row.thermal_efficiency if row.thermal_efficiency > 0 and row.fuel_carrier == "gas" else 0 | fraction 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_energyper row of generation_technology | electricity_demand * row.generation_share / generation_share_total if generation_share_total > 0 else 0 | TWh/y | — |
generation_capacityper row of generation_technology | row.generation_energy / row.load_factor / 8.76 if row.load_factor > 0 else 0 | GW | 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_buildper row of generation_technology | row.generation_capacity * 1000 / row.lifetime | MW/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_fuelper row of generation_technology | row.generation_energy / row.thermal_efficiency if row.thermal_efficiency > 0 else 0 | TWh/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_fuel | sum(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_fuel | generation_switchable_fuel * (1 - gasPlantHydrogen) | TWh/y | — |
generation_hydrogen_fuel | generation_switchable_fuel * gasPlantHydrogen | TWh/y | — |
generation_hydrogen_electricity | generation_hydrogen_fuel / efficiency_electricity_to_h2 | TWh/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_fuel | sum(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_cost | generation_gas_fuel * price_methane_mwh + generation_hydrogen_fuel * cost_hydrogen_electrolytic | M€/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_costper 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_capacity | sum(generation_technology.generation_capacity) | GW | — |
generation_total_cost | sum(generation_technology.generation_annual_cost) + generation_fuel_cost | M€/y | Plant plus fuel. Still no carbon, no network and no storage. |
generation_cost_per_mwh | generation_total_cost / electricity_demand | €/MWh | — |
grid_emission_factor | national_energy / electricity_demand * 1000 if electricity_demand > 0 else 0 | gCO₂/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_share | sum(generation_technology.generation_share, generation_technology.renewable == 1) | fraction | — |
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.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
vehicle_electric_shareper row of vehicle_type | car: carElectrictruck: truckElectricdefault: 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_capacityper row of vehicle_type | row.production_2050 * row.vehicle_electric_share * row.battery_kwh / 1000000 | GWh/y | — |
battery_capacity_vehicles | sum(vehicle_type.vehicle_battery_capacity) | GWh/y | — |
battery_capacity_total | battery_capacity_vehicles | GWh/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_steel | sumproduct(vehicle_type.production_2050, vehicle_type.steel) / 1000000 | kt/y | Kilogrammes per vehicle times units per year, so 10^6 carries kg to kt. |
vehicle_aluminium | sumproduct(vehicle_type.production_2050, vehicle_type.aluminium) / 1000000 | kt/y | — |
generation_steel | sumproduct(generation_technology.generation_build, generation_technology.steel) / 1000 | kt/y | — |
generation_concrete | sumproduct(generation_technology.generation_build, generation_technology.concrete) / 1000 | kt/y | — |
generation_aluminium | sumproduct(generation_technology.generation_build, generation_technology.aluminium) / 1000 | kt/y | — |
generation_copper | sumproduct(generation_technology.generation_build, generation_technology.copper) / 1000 | kt/y | — |
generation_lithium | sumproduct(generation_technology.generation_build, generation_technology.lithium) / 1000 | kt/y | — |
generation_cobalt | sumproduct(generation_technology.generation_build, generation_technology.cobalt) / 1000 | kt/y | — |
generation_nickel | sumproduct(generation_technology.generation_build, generation_technology.nickel) / 1000 | kt/y | — |
generation_rare_earth | sumproduct(generation_technology.generation_build, generation_technology.rare_earth) / 1000 | kt/y | — |
battery_intensity_steel | battery_chemistry["lfp"].steel * batteryLfpShare + battery_chemistry["nmc_811"].steel * (1 - batteryLfpShare) | t per MWh | — |
battery_intensity_aluminium | battery_chemistry["lfp"].aluminium * batteryLfpShare + battery_chemistry["nmc_811"].aluminium * (1 - batteryLfpShare) | t per MWh | — |
battery_intensity_copper | battery_chemistry["lfp"].copper * batteryLfpShare + battery_chemistry["nmc_811"].copper * (1 - batteryLfpShare) | t per MWh | — |
battery_intensity_lithium | battery_chemistry["lfp"].lithium * batteryLfpShare + battery_chemistry["nmc_811"].lithium * (1 - batteryLfpShare) | t per MWh | — |
battery_intensity_cobalt | battery_chemistry["lfp"].cobalt * batteryLfpShare + battery_chemistry["nmc_811"].cobalt * (1 - batteryLfpShare) | t per MWh | — |
battery_intensity_nickel | battery_chemistry["lfp"].nickel * batteryLfpShare + battery_chemistry["nmc_811"].nickel * (1 - batteryLfpShare) | t per MWh | — |
battery_steel | battery_capacity_total * battery_intensity_steel | kt/y | — |
battery_aluminium | battery_capacity_total * battery_intensity_aluminium | kt/y | — |
battery_copper | battery_capacity_total * battery_intensity_copper | kt/y | — |
battery_lithium | battery_capacity_total * battery_intensity_lithium | kt/y | — |
battery_cobalt | battery_capacity_total * battery_intensity_cobalt | kt/y | — |
battery_nickel | battery_capacity_total * battery_intensity_nickel | kt/y | — |
construction_concrete | (sum(construction_use.construction_use_cement, construction_use.cement_intensity > 0) - construction_cement_saved) / cement_per_concrete * concrete_density | kt/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_steel | generation_steel + vehicle_steel + battery_steel + construction_steel_demand | kt/y | — |
material_concrete | generation_concrete + construction_concrete | kt/y | — |
material_aluminium | generation_aluminium + vehicle_aluminium + battery_aluminium | kt/y | — |
material_copper | generation_copper + battery_copper | kt/y | — |
material_lithium | generation_lithium + battery_lithium | kt/y | — |
material_cobalt | generation_cobalt + battery_cobalt | kt/y | — |
material_nickel | generation_nickel + battery_nickel | kt/y | — |
material_rare_earth | generation_rare_earth | kt/y | — |
french_steel_production | sum(industry_chain.chain_production, industry_chain.subpost == "steel") | kt/y | — |
material_steel_share_of_french_steel | material_steel / french_steel_production | fraction | 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_cement | material_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. |
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.
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.
| Parameter | Value | Provenance | Source |
|---|---|---|---|
| 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 |
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.
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.
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.
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.