Emissions
Six emitting sectors, plus natural and technological carbon sinks.
Teaching model · United Kingdom 2050 · PROVISIONAL EDITION · v0.36.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 the DESNZ 1990-2024 greenhouse gas inventory and the Climate Change Committee's Seventh Carbon Budget Balanced Pathway. Provisional edition: twenty model inputs are still French placeholders — see the package notes.
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.
Not carried in this edition. The floor area a country starts each year, the cement and the structural steel it carries, and the timber frame that displaces part of them are the reference edition's. This package declares no construction intensities, so its cement volume rests on the intensity slider alone, and the four controls this paragraph introduces are not drawn.
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 edition the methane is mostly fossil: the gas emission factor starts at 200 gCO₂/kWh, built from the Seventh Carbon Budget's 168 TWh of 2050 methane demand against NESO's 21 TWh of biogas — a 12.5% biogenic share, against 227 for the fossil molecule. The colour of the hydrogen follows the colour of the gas, and the reformer competes for the same pool the buildings and the power stations want. Only the biogenic eighth goes carbon-negative with capture, which is real physics and the most contested line in the model. Read the Controversy tab before leaning on it.
The manufacturing branches the game does not model as value chains, grouped into five: non-ferrous metals and vehicles, glass and other minerals, the rest of chemistry, paper, and a diverse remainder that also carries textiles and non-road mobile machinery. Together about 220 TWh of final energy, 70 of it electricity. Output and processes move separately, because the Seventh Carbon Budget's demand path 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.
Not carried in this edition. The artificialisation flow, the land account it moves hectares inside, and the legal path this edition would compare it with are the reference edition's. This package keeps a natural-sink slider and a published agriculture pathway instead, and the tab this paragraph belongs to is not drawn.
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 base-year values, for comparison: electricity 79 (a French placeholder — the British generation-basis figure is 117.9 gCO₂/kWh and is not the same quantity), 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. The horizon-year factors are British scenario values and differ sharply from the French ones: 200 gCO₂/kWh for methane and 175 for liquid fuel, because no published UK pathway makes the 2050 gas and liquid system fully biogenic.
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 NESO's four 2050 pathways, from Holistic Transition to Falling Behind — which does not reach net zero and is here because NESO publishes it, not because it is a choice. 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. Offshore wind is 45-52% of supply in every one of them, which is the single biggest structural difference from the French edition. 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, 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. The currency here is mixed, and nothing is converted. The British prices — industrial electricity, household electricity and gas, retrofit, pump fuel, wood — are in pounds, which is what this package declares; the plant costs, the commodity prices and the carbon price are the euro figures of the shared model. No exchange rate is applied anywhere, because inventing one would bury a scenario assumption in a lookup, so a level below is a sum of two currencies whatever symbol it prints, and must not be compared with another edition's. The deltas are still readable.
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 |
|---|
A capture plant takes every molecule up the stack, so it is powered and paid for on the fossil and the biogenic tonnes alike, while only the fossil ones lower the total. The last column divides the whole bill by the fossil tonnes alone: it is what a tonne off the national total costs through each lever.
| Where | Fossil captured (Mt/y) | Biogenic captured (Mt/y) | Electricity (TWh/y) | Cost (M€/y) | € per fossil tonne |
|---|
These flight categories are still French. `flight_type` is the one table of this package that could not be ported at all: it is built on the CAA's French counterpart's route categories, including three that exist only because France has overseas departments. The ticket module therefore prices British fuel for French routes. Read it as a worked example of the method, not as a British result.
| 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 pathway, side by side with the sectors the model does not compute. Note what the pathway is: the Climate Change Act sets a net-zero duty for 2050 and five-year carbon budgets, and says nothing about sectors — the sector split is the Climate Change Committee's advice, not a government target. The reconciliation that connects it 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 CCC Balanced Pathway's 2050 level. These are inputs, not results: at 100% agriculture, waste and energy production sit exactly on the Balanced Pathway value, so three of the six national rows are a recopy of the pathway they are being compared with. Read them as an assumption about the rest of the economy, not as an answer. Agriculture is the row to watch: it falls by only 43% by 2050 and is then the largest emitting sector in the country by a factor of seven, balanced not by abatement but by a land-use sink that has to cross zero to get there.
The consolidated 2024 values come from DESNZ's final UK greenhouse gas emissions statistics 1990 to 2024, on the UK territorial perimeter, excluding the Crown Dependencies and the Overseas Territories.
The 2030 and 2050 sector columns come from the Climate Change Committee's Seventh Carbon Budget Balanced Pathway, taken from its companion dataset on the Territorial Emissions Sectors classification — the same sector cut DESNZ uses, so the observed and target columns are on one perimeter. The CCC's own sector table (surface transport, aviation, shipping, F-gases) is a different cut and would not close against the inventory.
Three perimeters are in play, not two. The inventory total excludes international aviation and shipping; the carbon budgets from CB6 onwards include them; the game's own footprint is a third thing again. Never compare a budget level with a sector row.
The technological sink is published here rather than inferred: the CCC models engineered removals explicitly and gives −35.8 MtCO₂e for 2050, where the French edition carries a closure residual. The natural sink is the line to read twice — British land use emits +0.3 MtCO₂e today and the pathway takes it to −29.9 by 2050, so it has to cross zero inside the horizon of this game.
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 English or in French, whichever you prefer. Bugs, remarks, a figure you disagree with, or a source we should have used and did not — and for this provisional British edition, any of the twenty placeholders you can replace with a UK source.
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 NESO'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 CB7 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 36 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 ECUK'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 the DESNZ inventory and the Seventh Carbon Budget 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 NESO'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 — NESO'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 NESO'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 Seventh Carbon Budget 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 the United Kingdom 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 the Carbon Trust. 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 country’s 2020 route volumes. The coefficient is used as 1 + g: +30% means a multiplier of 1.30, while −20% means 0.80.
H-DRI steel share splits primary steel between the BF-BOF and hydrogen direct-reduction routes. Recycled EAF steel is scaled by the same production-change coefficient.
Green ammonia is entered in kt/y. The workbook reference also contains 200 kt/y of grey ammonia; its treatment is documented as an accounting limitation.
CO₂ + H₂ olefins combines a new production-route share with plastic-demand reduction and an optional biogenic-CO₂ credit.
Clinker ratio and capture separately affect cement production-process emissions — the decarbonation of the limestone, about 0.53 tCO₂ per tonne of clinker. The kiln burns 1.064 MWh a tonne on top of it, and waste-derived fuel sets how much of that heat is waste, about half of it biomass. Capture takes the whole fossil stack, calcination and fuel; the biogenic CO₂ of the waste goes up the same stack and is not credited.
Not carried in this edition. The seven-class land account, the forest identity in cubic metres and the six sink pools are the reference edition's, built on its own land survey and its own forest inventory. This package declares land_module_active: 0, so its natural carbon sink is the slider it always was, its land levers are hidden and provably inert, and the Land & food tab is not drawn. Porting the module means answering two national tables and about forty national constants from this country's own statistics; app/model/README.md says which, and make porting-checklist lists them one by one.
Not carried in this edition. The diet, herd, nitrogen and ammonia chain is the reference edition's, calibrated on its own inventory and its own farm survey. This package declares land_module_active: 0: agriculture is still a position on a published pathway between the observed year and the horizon, the eleven food levers are hidden and provably inert, and the absolute ammonia lever it replaced is still the one this page uses. The two tables and the national constants it needs carry the reference edition's shapes as labelled placeholders so that this build closes, and nothing reads them.
Not carried in this edition. The three biomass bands on this page are the threshold table's own teaching figures, not a supply computed from this country's land: no herd sizes the manure, no forest sizes the harvest, and no arable area sizes the cover crops. This package declares land_module_active: 0 and the five bioenergy levers are hidden and provably inert. A card here therefore says “target ≤” where the reference edition says “within what the land supplies”, and the difference is the point rather than a rendering detail.
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 the DESNZ inventory and the Seventh Carbon Budget 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, one of which — ammonia — is zero for the United Kingdom. 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 the Seventh Carbon Budget 2050 order of magnitude. At 100% they sit exactly on the Seventh Carbon Budget value, so those three rows are an input, not a result.
Carbon sinks. Natural and technological sinks are separate, and both are published rather than inferred. The CCC gives −29.9 MtCO₂e of net land use and −35.8 MtCO₂e of engineered removals in 2050. The land-use line is the one to read twice: it is a net source of +0.3 MtCO₂e today, so it crosses zero somewhere between 2035 and 2040.
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 CAA's 2023 traffic statistics for flights departing the United Kingdom: 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 British 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 CAA 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, the Carbon Trust, 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 — NESO puts the electricity-efficiency potential at 9.0% for paper to 31.1% for chemistry at long payback, and the Carbon Trust 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.
the Carbon Trust'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 the Carbon Trust study is industrial. Glass is listed by the Carbon Trust 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.
NESO, after ECUK, 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. NESO 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/GB/GB.yaml and model/equations.yaml — so what is documented here and what the engine executes are the same thing. The model has 121 levers, 233 constants, 25 data tables and 591 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 | Provisional | PLACEHOLDER — French value carried, not British data: 10% is the French teaching workbook's horizon share for gas-fuelled cars. There is effectively no British CNG car fleet, so the honest British figure is close to zero, and this package's own
|
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 | — |
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 | — |
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 | 6 TWh/y | 0 … 40 | Published | A target in the unit the resource constraint is written in. 6 TWh is where the CCC's Balanced Pathway puts bioenergy in British homes in 2050 — 6.165 TWh of final demand — and it is a seventh of the French default. The reason is not that Britain has less forest: it is that the pathway sends its biomass to power stations with carbon capture (38.2 TWh) and to making hydrogen and synthetic fuel (41.7 TWh) instead of to boilers. A British player who drags this lever up is taking wood away from the removals that make the national account balance, which is the competition the lever exists to show. The maximum is 40 rather than France's 120 because 40 TWh is already a third of the CCC's entire 2050 bioenergy envelope for the whole economy.
|
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 | 2 TWh/y | 0 … 20 | Provisional | PLACEHOLDER — French value carried, not UK data: the French 13 TWh is scaled to the size of the British heat-network sector and nothing more. UK heat networks deliver roughly 2.5% of building heat against France's 6%, and FES gives 899 734 GB dwellings on communal or low-carbon district heating consuming 6.117 TWh in 2024 — so a 2050 network burning 13 TWh of wood is not a British quantity. 2 TWh is the French default cut in the ratio of the two sectors' 2050 sizes, which is arithmetic, not a source. What would close it: DESNZ Heat networks statistics, which publishes heat delivered by fuel, together with the Government's Heat Network Zoning programme's 2050 projections.
|
Recovered and waste heatdistrictWasteTwh | 0 TWh/y | 0 … 20 | Game rule | Recovered industrial heat, energy from waste and geothermal in heat networks. Zero by default, as in France, and with a smaller maximum for the same reason as |
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. |
Temperature-related sufficiencybldgSobriety | 5% | 0 … 25 | Game rule | — |
New housing builtnewHousingHidden | 0 Mm²/y | 0 … 36 | 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. Hidden and inert: this edition carries no cement intensity per square metre, so no floor area can reach its cement. Zero rather than the observed rate, because a number that moves nothing would invite a reader to quote it. |
New non-residential builtnewNonResidentialHidden | 0 Mm²/y | 0 … 36 | 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. Hidden and inert, for the same reason as |
Built in timbertimberShareHidden | 0% | 0 … 80 | 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. Hidden and inert: with no floor area reaching cement, a timber share has nothing to displace. |
Roads, networks and civil workscivilWorksVolumeHidden | 100% | 50 … 130 | 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. Hidden and inert: this edition's cement is all in the residual row, which no lever drives, so there is no civil-works tonnage for this index to multiply. |
H-DRI steel sharesteelDRI | 50% | 0 … 100 | Game rule | — |
Steel production changesteelGrowth | 30% | -40 … 50 | Game rule | — |
Ammonia productionammoniaProduction | 0 kt/y | 0 … 1 400 | Published | Zero. The United Kingdom has not made ammonia since July 2023, when CF Fertilisers permanently closed the Billingham unit — the last one in the country — and switched to importing ammonia to make ammonium nitrate on the same site. This is not a rounding-down: the chain is gone. It is also the most interesting thing this file has to teach. In the French game ammonia is a slider a player moves to argue about industrial hydrogen. Here the honest default is zero and the argument becomes a different one: whether a decarbonising country should re-shore an energy-intensive chain it has already lost, and what the imported ammonia costs somebody else. The range is kept at 0-1400 so that question can still be asked.
|
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, since 0.28.0, the plastic the country's incinerators burn — which is where most of its effect now lies, and why it finally lowers emissions rather than raising them. 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, which since 0.33.0 is read on
|
Plastic kept out of the incinerators by recyclingplasticRecycling | 0% | 0 … 75 | Game rule | The share of the plastic that reaches the incinerators in the base year which is sorted out and recycled instead. It is how the French reference scenarios express plastics: ADEME's Transition(s) 2050 and négaWatt both carry an 80% recycling rate, against 20% for all French plastic waste in 2022. If what is not recycled is burned, going from 20% to 80% leaves a quarter of today's burned plastic, which is 75 on this slider; the default, 0, is today's rate. Applied after
|
Capture on incineratorswteCapture | 0% | 0 … 90 | Game rule | The share of an incinerator's stack CO₂ that is captured and stored. A capture plant does not sort the molecules, so it takes the fossil and the biogenic CO₂ together — and about 60% of what leaves a French incinerator is biogenic. Capturing on an incinerator is therefore mostly bioenergy with carbon capture, which is the point worth teaching. Only the fossil part lowers the national total here. The biogenic part is shown and not counted: a captured biogenic tonne is a removal, and removals are what
|
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 | 70% | 35 … 90 | Game rule | THE UNITED KINGDOM STARTS OUTSIDE THE FRENCH SLIDER. The observed UK clinker-to-cement ratio in 2024 is 0.877 — 6.4 Mt of clinker in 7.3 Mt of cement — against a French slider that stops at 0.78. The maximum is raised to 90 so the country's own present can be represented; the minimum stays at 35 so the
|
CO₂ capturecarbonCapture | 20% | 0 … 95 | Game rule | The share of a cement kiln's fossil stack that is captured: the decarbonation of the limestone and, since 0.29.0, the fossil part of the kiln fuel, because a capture plant on a cement stack does not sort the molecules. The biogenic CO₂ of the waste the kiln burns goes up the same stack and would be captured too; it is not credited, for the reason |
Waste-derived fuel in cement kilnskilnAltFuel | 85% | 0 … 95 | Published | The share of a kiln's heat that comes from waste rather than from petroleum coke and coal. French kilns were at 38% in 2015, 44% in 2021 and 52% in 2023, burning over a million tonnes of waste a year; the sector's roadmap takes it to 80% in 2030 and 85% in 2050, the default. About half of that waste is biomass, so the lever cuts the kiln's fossil CO₂ roughly half as fast as it moves: at 0% the whole heat is fossil, at 85% still 56% of it is. It does not take waste from the incinerators, and since 0.33.0 that is a finding rather than a gap. The refuse-derived fuel French kilns burn is made from the refuse of sorting lines — commercial waste, separate collection, bulky waste — and French policy keeps residual household waste out of it. Its alternative is landfill, not the incinerators, which are full and turned away half a million tonnes in 2022. The two would compete for the same tonne only once landfill is close to zero.
|
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.
|
Less output from the rest of industryotherIndustrySobriety | 0% | 0 … 40 | Provisional | Less of everything the rest of industry makes, branch by branch in the same proportion — metals, minerals, chemistry, paper and the rest — with its fuel, its electricity and its process emissions going down together. Added in 0.30 after students found that the rest of industry could only grow:
|
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. |
Methane (biogas), 2050efGas | 200 gCO₂/kWh | 0 … 250 | Provisional | THE SINGLE BIGGEST SCENARIO DIFFERENCE BETWEEN THIS FILE AND THE FRENCH ONE. France assumes every molecule of 2050 methane is biomethane and carries 25 gCO₂/kWh. No published UK pathway describes that. The arithmetic, shown so it can be argued with: the CCC's Balanced Pathway has 168.06 TWh of gross methane demand in the UK in 2050, and NESO's most biomethane-rich net-zero pathway supplies 21.04 TWh of biogas. That is a 12.5% biogenic share, so 0.125 × 25 + 0.875 × 227 = 202 gCO₂/kWh, rounded to the slider's step of 5. Dragging this lever down to 25 is the British version of the French question, and it is a much bigger move here: it asks for six times the biomethane any UK study has costed.
|
Liquid fuel (bio and e-fuel), 2050efLiquid | 175 gCO₂/kWh | 0 … 300 | Provisional | Same construction as
|
Wood, 2050efWood | 27 gCO₂/kWh | 0 … 60 | Provisional | PLACEHOLDER — French value carried, not UK data: 27 gCO₂/kWh is the French workbook's own observation of the fossil energy in the FRENCH wood chain, and the British chain is not the French one. A large share of UK wood energy is imported North-American pellets, shipped; the CCC recommends halting imported biomass for BECCS by 2050; and NESO's most electrified pathway is also its most import-dependent, at 31.4% of bioenergy supply imported against 4.1% in its hydrogen pathway. Carrying 27 understates exactly the thing that is contested in the United Kingdom. What would close it: the DESNZ/DEFRA greenhouse gas conversion factors for company reporting, which publish a well-to-tank factor for wood pellets, split between domestic and imported chains.
|
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. |
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.
|
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 positionagriPathway | 100% | 0 … 100 | Game rule | 0% is the observed inventory year, 100% the CCC Balanced Pathway's 2050 level: 46.5 MtCO₂e falling to 26.4, a reduction of only 43%. The British reading is different from the French one and the interface says so. In 2050 UK agriculture is the largest emitting sector in the country by a factor of seven, and the CCC does not abate it — it balances it against a land-use sink of −29.9 MtCO₂e. The two lines have to be read together, and a player who drags this lever past 100 is asking for something no published UK pathway contains. |
Waste pathway positionwastePathway | 100% | 0 … 100 | Game rule | 0% is 21.4 MtCO₂e observed in 2024, 100% the Balanced Pathway's 4.5 in 2050 — a 79% fall. What is left is legacy landfill methane, which keeps being emitted long after the last tonne is buried, so the bottom of this lever's range is not reachable by any waste policy. |
Natural carbon sinknaturalSink | 30 MtCO₂e/y absorbed | -10 … 40 | Published | THE MINIMUM IS NEGATIVE, AND IT HAS TO BE. UK land use is a net SOURCE of greenhouse gases: +10.3 MtCO₂e in 1990 and +0.3 in 2024, which on this lever's signed convention is −0.3. A slider whose minimum is France's +5 cannot express the country's present. The range runs to −10 so that a player can also ask what happens if peatland restoration stalls and the land goes back to emitting, which is a live British argument. The default of 30 is the Balanced Pathway's 2050 figure, −29.892147 MtCO₂e of net emissions, i.e. 29.9 absorbed. Britain's land-use line has to CROSS ZERO between now and then — it is still +1.24 in 2035 and −1.87 in 2040 — through afforestation, peatland restoration and taking land out of agriculture. Every French sentence about a weakening forest sink is simply false here, and the interface prose says the opposite.
|
Technological carbon sinktechSink | 36 MtCO₂e/y absorbed | 0 … 60 | Published | Unlike France's, this is not a closure residual. The CCC models engineered removals explicitly — bioenergy with carbon capture, direct air capture, enhanced weathering and biochar, and wood in construction — and publishes 35.816752 MtCO₂e for 2050. That makes the British version of the game's most contested line strictly better sourced than the French one, and it changes the argument: not "where did this number come from" but "should this much land and biomass be used this way". For scale: it is larger than the residual emissions of five of the six game sectors put together, and it is what takes the UK total slightly net negative in 2050. NESO's three net-zero pathways all assume at least 25 MtCO₂e, which is the cross-check. The minimum is 0 rather than France's 5 so a player can ask what net zero looks like without any of it.
Flagged above 20 MtCO₂e/y absorbed. Twenty megatonnes a year, for the United Kingdom alone, is around half of everything the planet currently captures and stores, across every facility in operation. The CCC's own Balanced Pathway asks for 36 and NESO's pathways for at least 25, so the default sits inside the mark rather than outside it: the British argument is not where the number came from — it is sourced — but whether this much land, biomass and storage should be used this way. Nothing in this model builds the plant, supplies the electricity the capture consumes, or pays for either. |
Land taken for buildingartificialisationRateHidden | 12 kha/y | 0 … 52 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not UK data: the rate at which land is built on, in thousand hectares a year. Inert in this edition, and drawn nowhere, because
|
New forest plantedafforestationRateHidden | 15 kha/y | 0 … 90 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not UK data: the rate at which new forest is planted, in thousand hectares a year. Inert in this edition, and drawn nowhere, because
|
Grassland to cropsgrasslandConversionHidden | 0 kha/y | -50 … 100 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not UK data: the net rate at which permanent grassland is ploughed into arable land. Inert in this edition, and drawn nowhere, because
|
Store carbon in the soilsoilCarbonPracticesHidden | 30% | 0 … 100 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not UK data: the share of the identified agricultural soil-carbon potential taken. Inert in this edition, and drawn nowhere, because
|
Wood harvestedforestHarvestHidden | 60 Mm³/y | 40 … 75 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not UK data: the volume of wood removed a year, informal firewood included. Inert in this edition, and drawn nowhere, because
|
Wood into long-lived productsharvestToProductsHidden | 30% | 15 … 35 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not UK data: the share of the harvest that becomes sawn timber and panels. Inert in this edition, and drawn nowhere, because
|
Drained peatland rewettedpeatRewettingHidden | 0% | 0 … 100 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the share of the drained organic soil put back under water. Inert in this edition, and drawn nowhere, because
|
Climate effect on the forestforestClimateHidden | 2 | 1 … 3 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not UK data: which of three published climate cases the forest lives through. Inert in this edition, and drawn nowhere, because
|
Red meat eatendietRedMeatHidden | 40 kgec/cap/y | 15 … 60 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: red meat eaten per person, in carcass-weight equivalent. Inert in this edition, and drawn nowhere, because
|
Poultry eatendietPoultryHidden | 28 kgec/cap/y | 10 … 35 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: poultry eaten per person, in carcass-weight equivalent. Inert in this edition, and drawn nowhere, because
|
Dairy eatendietDairyHidden | 90% | 50 … 110 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: dairy eaten per person, as an index on the base year. Inert in this edition, and drawn nowhere, because
|
Cut edible food wastefoodWasteHidden | 0% | 0 … 50 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: how much of today's edible food waste is cut. Inert in this edition, and drawn nowhere, because
|
Livestock exportslivestockExportHidden | 100% | 0 … 150 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: animal produce exported, as an index on base-year volumes. Inert in this edition, and drawn nowhere, because
|
Crop exportscropExportHidden | 100% | 0 … 150 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: arable crops exported, as an index on the base-year volume. Inert in this edition, and drawn nowhere, because
|
Mineral nitrogennIntensityHidden | 70% | 40 … 110 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: mineral nitrogen delivered to the fields, as a share of the base year. Inert in this edition, and drawn nowhere, because
|
Legumes in the rotationlegumeAreaHidden | 2.7 Mha | 1 … 3 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: legumes in the rotation, in million hectares. Inert in this edition, and drawn nowhere, because
|
Organic farmingorganicShareHidden | 25% | 0 … 50 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the organic share of the arable area. Inert in this edition, and drawn nowhere, because
|
Cattle on low-methane rationsentericMitigationHidden | 82% | 0 … 100 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the share of cattle on a low-methane ration. Inert in this edition, and drawn nowhere, because
|
Manure to digestersmanureMethanisedHidden | 0% | 0 … 80 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the share of manure sent to a digester rather than to a store. Inert in this edition, and drawn nowhere, because
|
Get fossil fuel off the farmagriFuelSwitchHidden | 100% | 0 … 100 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the fossil fuel taken off the farm. Inert in this edition, and drawn nowhere, because
|
Nitrogen made at homeammoniaDomesticShareHidden | 34% | 0 … 100 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the share of mineral nitrogen made inside the country. Inert in this edition, and drawn nowhere, because
|
Winter energy cover cropsciveAreaHidden | 2.5 Mha | 0 … 3 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the area of winter cover crop grown for a digester, in million hectares. Inert in this edition, and drawn nowhere, because
|
Crop residues taken off the fieldresidueMobilisationHidden | 16% | 0 … 30 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the share of crop residues carried off the field for energy. Inert in this edition, and drawn nowhere, because
|
Land growing fuelenergyCropAreaHidden | 0.62 Mha | 0 … 1.7 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the arable area growing a first-generation biofuel crop, in million hectares. Inert in this edition, and drawn nowhere, because
|
Land growing methaneenergyMaizeAreaHidden | 0 Mha | 0 … 0 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the arable area growing a main crop for a digester, in million hectares. Inert in this edition, and drawn nowhere, because
|
Imported biofuel allowedbioImportsHidden | 20 TWh/y | 0 … 40 | Provisional | Not shown in this edition. This country's package hides the control; the model reads the lever at the default in the next column. PLACEHOLDER — French bounds carried, not national data: the liquid biofuel the scenario allows itself to import, in TWh a year. Inert in this edition, and drawn nowhere, because
|
Hot-water efficiencyusageDhwEfficiency | 0% | 0 … 40 | Game rule | — |
Cooking efficiencyusageCookingEfficiency | 0% | 0 … 40 | Game rule | — |
Hot water on electricityusageDhwElectric | 14% | 0 … 100 | Derived | 14%, against France's 68%. Nearly nine tenths of British hot water comes out of the same gas boiler that heats the house, and the electric tenth is mostly immersion heaters in flats. This is a share of the SERVICE, not of the energy, computed exactly as the French entry describes: electricity ×
|
Cooking on electricityusageCookingElectric | 61% | 0 … 100 | Derived | 60.75% of the cooking service is electric, computed the same way with
|
Air-conditioning growthusageCoolingGrowth | 0% | 0 … 300 | Game rule | 11.14 TWh, and every kilowatt-hour of it is non-domestic: ECUK publishes no domestic cooling end use at all, because British homes have almost no air conditioning and what there is sits inside the appliances line. So this lever acts on one row rather than two. The growth question is sharper here than in France for the reason the French text does not have to mention: British dwellings are built to retain heat, they already overheat, and the English Housing Survey now publishes an overheating table. Domestic cooling is a demand that does not yet exist and could appear quickly, which is exactly what a model with a zero denominator cannot represent. Flagged, not fixed. The asymmetry France declares applies here too: cooling makes a summer peak and the only peak constraint in this model is a winter one.
|
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. |
NESO FES 2025 pathwayrteScenario | 1 | 1 … 4 | Published | Which of NESO's four 2050 pathways the scenario is built on. It selects a set of shares, not a quantity: the mix is scaled to whatever electricity the rest of the model needs, so choosing here answers "with what" and never "how much". The default is Holistic Transition, NESO's balanced net-zero case and the only one of the four that is neither the most electrified nor the most hydrogen-led. ONE WARNING THE SHARED DECLARATION CANNOT CARRY. Row 4 is Falling Behind, NESO's deliberate FAILURE case: it does not reach net zero and it burns 51 TWh of unabated gas in 2050. France has no equivalent, so the model has no field that says "this row is not a choice". The
|
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 | 210 £/MWh | 20 … 300 | Published | 209.3 GBP/MWh — 20.93 p/kWh — is the 2025 price paid by the largest British industrial consumers, excluding the Climate Change Levy; the "very large" band pays 21.65 p/kWh and the all-consumer average 23.81. British industrial electricity is among the dearest in the IEA and it is a live policy question, so France's 70 €/MWh would erase the single most cited cause of British industrial decline. Note the range: the observed British price is above the whole French slider, which is the same structural finding as
|
Deep-retrofit costretrofitCost | 550 £/m² | 200 … 900 | Provisional | PLACEHOLDER — French value carried, not British data: 550 is an ADEME order of magnitude with no primary publication behind it even in France, and it is carried here as 550 POUNDS. That is a currency substitution as well as a country one — the same convention this package uses for
|
Liquid fuel at the pumpliquidFuelPrice | 200 £/MWh | 80 … 400 | Provisional | PLACEHOLDER — French value carried, not British data: 200 is an unsourced French 2050 pump price for biofuel and e-fuel, taxes included, carried here as 200 POUNDS. Currency substitution as well as country substitution, declared rather than converted, exactly as
|
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, hidden | 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. 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, hidden | 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. 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, hidden | 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. 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 takes Moving this control from 0% to 100% moves, in step and in proportion:
|
Fertilise lesssimpleFertiliseLessCoarse control, hidden | 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. 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, hidden | 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. 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 | Provisional | PLACEHOLDER — French value carried, not UK data: 79 gCO₂/kWh is the French workbook's LIFE-CYCLE factor and no life-cycle factor was secured for the British grid. Two British anchors exist and NEITHER is a substitute, because both are generation-basis, combustion-only figures and this constant is life-cycle: NESO gives 117.85 gCO₂/kWh for GB generation in 2024, and Carbon Brief 124 for the UK including net imports. Putting a combustion figure here would roughly halve the gap the game is built to show. A SECOND TRAP, worth recording before anyone fills this in from FES: the FES 2050 carbon intensity of GB generation is NEGATIVE — −25.45 gCO₂/kWh in Holistic Transition, −36.67 in Electric Engagement — because BECCS is booked inside the power sector. A negative emission factor on the electricity carrier would break every constructive account in this model. The excluding-BECCS series (+1.23 and +1.46) is the one to use, with the removals booked in
|
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 | Provisional | PLACEHOLDER — French value carried, not UK data: the same problem as the |
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 | 2 868 | kt/y | Published | 4.0 Mt of UK crude steel in 2024, of which 71.7% by the oxygen route. The year straddles the closure of the Port Talbot blast furnaces in September 2024, so it is the last year in which Britain had a primary steel industry at all and it is already only a third of France's. A 2025 figure would be close to zero on this row.
|
steel_eaf_base_production | 1 132 | kt/y | Published | 4000 × 0.283. From 2025 this is effectively the whole of British steel: the electric arc furnace at Port Talbot is due in 2027-28 and until it arrives the country is an importer of primary steel.
|
steel_bf_direct_intensity | 1.76 | tCO₂ per tonne of steel | Published | The total direct intensity of the integrated route — every source on site, not a process term. It was inherited from the teaching workbook as "the blast furnace's process figure", and under that name it had been counted on top of the coal it mostly is. Re-sourced in 0.27.0, it holds: the IPCC Tier 1 defaults summed over the chain give 1.87 tCO₂/t (1.46 for the converter, which already includes the blast furnace, plus 0.56 per tonne of coke and 0.20 per tonne of sinter); the EU ETS benchmarks, set on the best tenth of European plants, chain to about 1.4; and ArcelorMittal Dunkerque, at 6.8 Mt of steel and about 12 MtCO₂ a year, is at 1.76. The model charges the route's coal its own published factor, so this figure is never booked as such:
|
steel_eaf_process_per_tonne | 0.08 | tCO₂ per tonne of steel | Published | What an electric furnace emits on site besides its electricity: the graphite electrodes it burns and the carbon charged to foam the slag and carburise the melt. The IPCC's Tier 1 default, and the floor of the published range — the EU ETS benchmark for carbon steel is 0.215, because it also covers the gas burners and the ladle furnace. It applies to both electric routes, from scrap and from hydrogen-reduced iron, since both end in the same furnace. Until 0.27.0 the model gave these two rows no direct term at all, so the only steel that emitted on site was the blast furnace's. |
olefin_base_production | 1 200 | kt/y | Provisional | PLACEHOLDER — French value carried, not UK data: no UK olefin production statistic was secured. 1 200 kt is an order-of-magnitude figure for UK ethylene plus propylene capacity — the crackers at Grangemouth and on Teesside — and it is roughly a third of France's 3 656 kt, which is the right direction and not a measurement. The value is left where it was when 0.23.0 corrected the French anchor: it was never derived from it, only compared with it, so there was no arithmetic to redo. It is the weakest number in this file after
|
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 | 7 300 | kt/y | Provisional | 7.3 Mt of cement in 2024 — the lowest since 1950 — with 6.4 Mt of clinker, a clinker factor of 0.877. Imports were 32% of sales. The figure is the Mineral Products Association's, reported in the trade press rather than taken from an MPA publication, which is why it is provisional and not published.
|
cement_process_per_tonne | 0.527 | tCO₂ per tonne of clinker | Published | The decarbonation of the limestone, and nothing else: 6 193 ktCO₂ of calcination in the French inventory for 11 759 kt of clinker in 2020. The neighbouring years give 0.524 (2019) and 0.531 (2021), and it is what stoichiometry predicts: the IPCC's 0.51 × 1.02 for kiln dust = 0.52 for a 65%-lime clinker, 0.53 at 67%. No change of kiln fuel can remove it — only capture, or less clinker. It was 0.7925, and that was a total wearing the wrong name. The old value was 10.2 MtCO₂ over 12.87 Mt of clinker. 10.2 Mt is not the calcination line for any year France has published — that line ran 6.19 to 6.81 over 2015–2021 — but it is inside the range of the whole cement industry's CO₂, calcination and kiln fuel. And 12.87 Mt was not an observation: it is 16 500 × 0.78, this model's own cement anchor times the top of its own
|
kiln_heat_per_tonne | 1.064 | MWh per tonne of clinker | Published | What a French kiln burns to make a tonne of clinker: 3 830 MJ in 2021, down from 3 942 in 2015. It closes against the roadmap's own statement that the sector burned 13 TWh of heat in 2021 for 12 222 kt of clinker — three published quantities, one identity, no residual. The sector aims at 3 600 MJ in 2030 and 3 500 in 2050, which is the 9% the industrial efficiency lever can take off. It replaced 0.700 in 0.29.0, the teaching workbook's figure, a third short. |
kiln_waste_biomass_share | 0.52 | fraction of the waste-derived heat | Published | The biomass share of the waste a French kiln burns: 52% in 2021, from 49% in 2015 — animal meal, wood waste, sludge — where the rest is tyres, solvents, oils and plastic-rich refuse-derived fuel. The biomass half is charged to the wood carrier; the fossil half goes with the coke and the coal, whose emission factor it shares within a few per cent. The sector aims at 60% by 2050; this keeps the observed share, because a higher one needs a biomass supply the model would have to find somewhere. |
wte_fossil_co2_base | 7.068 | MtCO₂/y | Published | 7.1 MtCO₂ of fossil carbon in 2024: the non-biomass fraction of the municipal waste burned in energy-from-waste plants, which the inventory books under power stations, 1A1ai, and keeps out of the waste sector. 63 plants burned 16.8 Mt that year; municipal waste is a fifth of electricity-supply emissions. The operators' own reports add up to 7.6 Mt, 8% more, by a different method; the inventory is kept. The plastic share of it is not published, and the French 95% is carried across.
|
wte_plastic_fossil_share | 0.95 | fraction | Derived | How much of an incinerator's fossil CO₂ is plastic: 95%. French residual household waste is 14.7% plastic by mass, 2 410 kt a year (ADEME, MODECOM 2017). At the IPCC's defaults — plastics are 75% carbon and all of it fossil — that is 6.63 MtCO₂. Everything else in the bin that carries fossil carbon adds 0.35: textiles 0.15 (20% of their carbon is fossil), nappies and other hygiene products 0.12, shoes and leather 0.06, soiled paper 0.02. 6.63 / 6.98 = 0.95. It is what makes
|
wte_biogenic_share | 0.546 | fraction of the stack CO₂ | Published | The average biogenic content the British plants reported for 2024, measured by radiocarbon at sixteen of them: 54.6%, in a range of 41.5 to 68%.
|
plastic_fossil_co2_per_tonne | 2.75 | tCO₂ per tonne of plastic | Published | The fossil CO₂ a tonne of plastic releases when it burns: 75% carbon, all of it fossil, times 44/12. It converts the plastic part of the incinerators' CO₂ back into tonnes, which is what a recycling line receives and draws its electricity on. |
plastic_recycling_electricity | 0.5 | MWh per tonne of plastic recycled | Published | Sorting, washing, extruding: the JRC gives 0.3 to 0.7 MWh of electricity a tonne for mechanical recycling and next to no heat. The middle is taken. Chemical recycling by pyrolysis would need more, and no inventory of it is public.
|
food_steam_demand | 19.687 | TWh/y | Provisional | Steam demand of the UK food, drink and tobacco industry, taken as ECUK's LOW-TEMPERATURE PROCESS end use: 1 692.79 ktoe = 19.687 TWh in 2024, against France's 21.876. The two food industries are of comparable size. Provisional because the number is published and the MAPPING is mine: ECUK has no "steam" category, and low-temperature process heat in food is overwhelmingly raised as steam but not entirely. A second caveat travels with any ECUK end-use figure: Table U4's splits are modelled proportions applied to the sub-sector fuel totals, published in Table U7.
|
food_direct_heat_demand | 2.252 | TWh/y | Provisional | Direct (non-steam) process heat, taken as ECUK's DRYING/SEPARATION plus HIGH-TEMPERATURE PROCESS end uses. 2.252 TWh against France's 10.693. READ THIS BEFORE USING IT. The British steam-to-direct-heat ratio comes out at 8.7 against France's 2.05, and that is a classification artefact as much as a real difference: ECUK books the UK food industry's high-temperature process heat as ZERO and puts nearly everything into low temperature process, so any direct-fired oven or fryer below ECUK's threshold is inside
|
food_heat_pump_cop | 3 | MWh heat per MWh electricity | Workbook | — |
food_hydrogen | 0.138 | TWh/y | Provisional | PLACEHOLDER — French value carried, not UK data: a residual hydrogen use in the food industry, unaffected by any lever. The CCC's Balanced Pathway gives the UK food and drink sector 0.003 TWh of hydrogen in 2050 and none in 2025, so the true British base-year figure is probably nearer zero than 0.138 — but "probably nearer zero" is not a measurement. The quantity is too small to change any result.
|
building_need_calibration | 1 | fraction | Calibrated | 1.0, and that is a statement about how the British stock table was built rather than a coincidence. France's 0.6528 exists because the workbook's surfacic needs are theoretical pre-retrofit needs whose sum overstates observed consumption by half. The British
|
building_peak_2020 | 5.208 | GW | Published | The winter power drawn by electric SPACE HEATING at the average-cold-spell system peak, on the game's building perimeter (residential + tertiary): 2.945 GW residential plus 2.263 GW commercial. Against France's 40 GW. That ratio is not an error and it is the most important single number in this package. France heats about 40% of its dwellings with electric resistance; the United Kingdom heats 82.5% of its with a gas boiler and only 8.4% with anything electric. The British winter peak is a GAS peak — NESO reports a 1-in-20 gas peak of 5 214 GWh/day beside a 58 GW electricity peak — which is why the British electricity system has room for heat pumps that the French one does not, and why the same lever teaches a different lesson on the two sides of the Channel. OTHER_COUNTRIES.md and this package's own first pass both called this unbuildable, on the ground that NESO publishes the SYSTEM peak and not the electric-heating part of it. That was right about the Winter Outlook and wrong about the data workbook: sheet ED7 carries a
|
official_transport_2024 | 110.4 | MtCO₂e/y | Published | Domestic transport: road, rail, domestic aviation, domestic and military shipping. Down only 11% on 1990 and the largest emitting sector since 2015, at 30% of the UK total. Road vehicles are 90% of it. |
official_building_2024 | 81.8 | MtCO₂e/y | Published | Buildings and product uses. Down 25% on 1990 but UP 4% on 2023. Of the total, 66% residential, 16% commercial, 11% public sector and 6% product uses — the last being F-gases from air conditioning, aerosols and inhalers, which is the one place this sector is wider than fuel combustion in buildings. |
official_industry_2024 | 46.5 | MtCO₂e/y | Published | Down 70% on 1990 and 7% on 2023 alone, largely because the Port Talbot blast furnaces closed in September 2024. A game built on this baseline is playing an industry that has already had most of its heavy end removed, which is a different starting position from France's. |
official_industry_2050 | 3.80398 | MtCO₂e/y | Published | The CCC Balanced Pathway, on the same Territorial Emissions Sectors cut as the 2024 figure above, so the two are comparable without a perimeter break. 92% below 2024. The CCC gets there with 9.2 MtCO₂ a year captured and stored and 73% of industrial energy electric. |
official_agriculture_2024 | 46.5 | MtCO₂e/y | Published | Down only 15% on 1990. In 2024 agriculture emissions equalled industry's for the first time in the series — the two lines are both 46.5 and they crossed this year. |
official_agriculture_2050 | 26.3899 | MtCO₂e/y | Published | Down only 43% on 2024. By 2050 agriculture is the largest emitting sector in the United Kingdom by a factor of seven, and the CCC balances it against the land-use sink rather than abating it. |
official_waste_2024 | 21.4 | MtCO₂e/y | Published | |
official_waste_2050 | 4.52742 | MtCO₂e/y | Published | Down 79% on 2024. What is left is legacy landfill methane. |
official_energy_2024 | 66.5 | MtCO₂e/y | Published | Electricity supply 37.7 plus fuel supply 28.8. Down 76% on 1990. The last coal-fired power station closed in September 2024.
|
official_energy_2050 | 3.15862 | MtCO₂e/y | Published | Electricity supply 1.586060 plus fuel supply 1.572558. Note what it implies: about 3 MtCO₂e for the whole energy branch against roughly 760-820 TWh of generation, i.e. around 4 gCO₂/kWh at the stack — far below any life-cycle factor. That contrast is the point of the national reconciliation panel. |
official_natural_sink_2024 | 0.3 | MtCO₂e/y | Published | POSITIVE, which on this file's convention means a net SOURCE. This is the number that surprises anyone porting the French interface: UK land use emits, and has in almost every year since 1990. Peatland is the largest source and forestry the dominant sink, and the two roughly cancel. France's line is −52 MtCO₂e; Britain's is +0.3. It is also the most uncertain sector in the inventory, with a 95% confidence interval that spans zero. |
official_natural_sink_2050 | -29.8921 | MtCO₂e/y | Published | NEGATIVE, i.e. a net sink, and the line has to CROSS ZERO to get there: +1.24 in 2035, −1.87 in 2040, −29.89 in 2050. Afforestation, peatland restoration and taking land out of agriculture. |
official_technological_sink_2050 | -35.8168 | MtCO₂e/y | Published | Engineered removals. Unlike France's −43, which is a closure residual, this is a published pathway variable: BECCS, direct air capture, enhanced weathering and biochar, and wood in construction. |
snbc_gross_2050 | 42.973 | MtCO₂e/y | Derived | The strategy's GROSS national total at the horizon: the six sectors of the Balanced Pathway summed — 3.158618 + 3.803978 + 2.968872 + 2.124239 + 26.389872 + 4.527421 = 42.973 MtCO₂e. The British analogue of France's 63. The constant's name is French and the interface calls it "the strategy". For the United Kingdom it is ADVICE, not law: the Climate Change Act sets a net-zero duty for 2050 and five-year budgets, and says nothing about sectors. The sector split is the Climate Change Committee's recommendation, and the prose says so in both languages. Adding the Balanced Pathway's LULUCF (−29.892), engineered removals (−35.817) and international aviation and shipping (+21.629) gives −1.107, the CCC's published net total of −1.1 (Table 3.4, p.73).
|
industry_covered_2020 | 51.5 | MtCO₂e/y | Derived | What the model represents of British industry on the inventory's combustion-plus-process basis, used only as a diagnostic against the inventory's own 46.5 MtCO₂e industry line. It is larger than the inventory's figure, as France's is, and for the same two reasons plus one British one. The model's industry perimeter is the five value chains plus the CCC's ten industrial sub-sectors less the three the chains already cover; the CCC's industrial energy total for 2025 is 280 TWh where ECUK's observed 2024 manufacturing total is 227 TWh, because the CCC's "Industry" also carries non-road mobile machinery and refinery own-use. The British extra is Port Talbot: the inventory's 46.5 is a 2024 average that already contains the closure, and the model's steel chain runs a full year of blast-furnace production. This is a rounded diagnostic and there is no exact formula behind it; the shared file's |
fuel_efficiency_ceiling | 0.19792 | fraction of fuel saved | Provisional | PLACEHOLDER — French value carried, not UK data: the fraction of industrial fuel a national efficiency study finds recoverable, measured by RTE after CEREN on French industry. It is a ratio rather than a stock, so it travels better than most of the French numbers here, but it is still measured on one country's industry and British industry is not French industry — it is smaller, less energy-intensive per unit of value added, and at a fifty-year low. What would close it: the industrial energy-efficiency potential in DESNZ's Industrial Decarbonisation Strategy evidence base, or the CCC's own energy-efficiency abatement wedge for industry, which the Balanced Pathway quantifies but does not publish as a ceiling.
|
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 | 26 | years | Derived | 2050 minus the 2024 base year of the service-demand data. |
aviation_horizon_years | 26 | years | Derived | 2050 minus the 2024 base year of the traffic and efficiency statistics. |
observed_kerosene_per_pkm_2024 | 29.28 | g of kerosene per passenger-kilometre | Provisional | PLACEHOLDER — French value carried, not UK data: the French statistic for kerosene burned per passenger-kilometre in 2024, freight in the holds included. The CCC publishes the British counterpart in a different unit — 0.42 kWh per passenger-kilometre of fossil fuel intensity in 2023, down from 0.76 in 1990 — which is about 35 g/pkm at the model's own lower heating value, so the British figure is HIGHER than the French one and carrying 29.28 flatters the UK. It was not converted here because the two statistics do not have the same treatment of freight and load factor, and a conversion that hides that is worse than a labelled placeholder. What would close it: DfT's aviation statistics (AVI) with UK passenger-kilometres and fuel uplift on a stated basis.
|
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 | 257.5 | £/MWh incl. VAT | Published | UK average domestic electricity unit price, all payment methods, calendar year 2025: £0.25746/kWh. Against France's 260 €/MWh, British households pay 15-20% more per kilowatt-hour at any plausible rate — and that is the SMALLER of the two differences that matter. What the unit price leaves out: a standing charge of £193.98 a year for electricity and £115.82 for gas, about £310 before a single kilowatt-hour. The model has no slot for it, so anything it prints as a household saving is an overestimate.
|
price_household_gas | 64.2 | £/MWh GCV incl. VAT | Published | UK average domestic gas unit price, all payment methods, 2025: £0.06417/kWh on a gross calorific basis, which is how British gas is metered and billed and is the same convention as the French figure. Against France's 134 €/MWh. THIS is the difference that matters. British gas is roughly half the price of French gas, and the ratio of electricity to gas at the British meter is 4.0 against about 1.9 in France. That single ratio explains most of what is hard about British building decarbonisation and it belongs on the screen beside the heat-pump levers: a heat pump with a seasonal COP of 3 saves a French household money and loses a British one money, before any capital cost — not because the physics differs but because Britain loads policy costs onto electricity and not onto gas. Any cost result that does not reproduce that has a bug.
|
price_wood | 77.5 | £/MWh | Provisional | PLACEHOLDER — French value carried, not UK data: 77.5 is Propellet's French bulk-pellet index in euros per MWh, carried across and relabelled as pounds, which is a currency substitution as well as a country one. British pellet prices are quoted by the Wood Heat Association and are typically higher, because a larger share of the fuel is imported. What would close it: the Wood Heat Association / REA pellet price index, or DESNZ's Non-domestic and domestic RHI fuel price evidence. |
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 | What an amine capture plant on a cement stack draws, per tonne of clinker, when it captures 95% of the stack: the heat that regenerates the solvent, raised electrically, plus the compression and the fans. Per tonne captured it is 0.54 / (0.95 × 0.86) = 0.66 MWh, which is where the published figures put it: an advanced solvent needs 2.3 to 3.3 GJ of heat a tonne at the reboiler, and compression to 150 bar another 132 kWh. A cement works has no steam to spare, unlike an incinerator, so the heat has to be raised, and since 0.32.0 the model raises it with electricity the power system has to supply. The capture plant treats the whole stack, the biogenic CO₂ of the kiln's waste included, so this is charged per tonne of clinker rather than per fossil tonne.
|
cement_capture_reference_rate | 0.95 | fraction of the stack | Published | The capture rate at which
|
kiln_biomass_co2 | 0.36 | tCO₂ per MWh of biomass burned | Published | The biogenic CO₂ the biomass half of a kiln's waste releases — animal meal, wood waste, sludge — at the IPCC's default for "other primary solid biomass", 100 t a terajoule. It is never counted in the emissions; it is the tonnage a capture plant takes with the fossil, and so what the transport and storage of cement capture are charged on. |
wte_capture_electricity | 0.315 | MWh per tonne of CO₂ captured | Published | What capture costs an incinerator in electricity, per tonne captured, fossil and biogenic alike. The plant has its own steam: the IEAGHG's two reference plants, 20 MWe each, extract 40 to 45% of the turbine's steam at 6 bar to regenerate the solvent at 3 GJ a tonne, which costs them 6.0 and 6.8 MWe, and compression and liquefaction take 2.8 and 3.2 MWe more. Over 27.9 and 31.8 t captured an hour, both come to 0.315 MWh a tonne, and both halve the plant's net output. The electricity an incinerator no longer exports is electricity the mix has to produce, so the model books it as a demand. Where the plant feeds a heat network a heat pump can win back part of it; the IEAGHG's third case does, and this does not. |
wte_capture_cost | 100 | € per tonne of CO₂ captured | Provisional | The capture plant on an incinerator — its capital and the running costs that are not energy — per tonne captured. The energy is charged apart, at the industrial electricity price, and so are transport and storage. Provisional, and the evidence is thin at both ends. The one techno-economic study of a retrofit gives a cost of capture of 90 to 156 € a tonne for plants of 3 to 12 kt a year, a tenth of a French incinerator. The one plant being built, Oslo's Klemetsrud, budgets 8.4 billion kroner at P50 for 350 kt a year, about 720 M€: at this model's 8% over 25 years that is close to 200 € a tonne in capital alone, for a first of its kind with its own harbour terminal. The cement plant in this model costs under 50 € a tonne on the same basis, from a gas twice as concentrated. 100 sits between them.
|
co2_transport_storage_cost | 50 | € per tonne of CO₂ stored | Published | Shipping or piping a captured tonne to a storage site and injecting it. 50 € is the figure France Stratégie retains for French industry. Models that assume a shared network at scale go lower — 17 to 21 € in the IND-OPT study — and the one French cluster costed so far, Dunkirk, comes out at 120 to 160 €, because the CO₂ leaves by ship for a reservoir in the North Sea. Charged on every tonne stored, biogenic ones included, since a ship does not sort them either.
|
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 | 3 646.72 | Mm² | Derived | Residential 2 847.22 Mm² plus tertiary 799.50 Mm², from the |
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. VAT | Provisional | PLACEHOLDER — French value carried, not UK data: 80 €/m² relabelled as £/m². British evidence points higher — the CCC's Balanced Pathway costs a typical air-source heat pump installation at several thousand pounds before the Boiler Upgrade Scheme grant, and the grant itself is £7 500, which is a statement about the underlying cost. Carrying the French figure understates the capital side of British heat-pump scenarios. What would close it: the CCC's own heat-pump unit costs in the Seventh Carbon Budget cost annex, or DESNZ's heat-pump cost evidence for the Boiler Upgrade Scheme.
|
renovation_vat | 1 | multiplier | Published | 1.0, and for a better reason than France's 1.055. The United Kingdom ZERO-RATES the installation of energy-saving materials in residential accommodation — insulation, heat pumps, solar panels, heat-network connections — under VAT Notice 708/6, a relief that runs to 31 March 2027 and then reverts to the reduced rate of 5%. So retrofit work of the kind this model prices carries no VAT at all today, and the multiplier is one. Two caveats worth putting in front of a player. The zero rate applies to the INSTALLATION of qualifying materials, not to a whole-house renovation: general building work stays at the standard 20%. And the relief expires inside the horizon of this game, so a 2050 scenario priced at 1.0 is assuming a policy that is currently legislated to end.
|
households | 28.6 | million | Published | UK households in 2024. Households, not dwellings: England's dwelling stock alone was 25.6 million at 31 March 2024 and the UK dwelling stock is larger than the household count because of vacants and second homes. The French constant counts main residences, which is the same idea.
|
car_ownership_reference | 2 541 | £/household/y | Provisional | PLACEHOLDER — French value carried, not UK data: INSEE's French household budget for owning a car, relabelled as pounds. The British counterpart is published — ONS Family spending in the UK gives weekly household expenditure on the purchase and running of vehicles — and it was not retrieved in this pass. What would close it: ONS Family spending in the UK, Table A1, transport (COICOP division 7), split between vehicle purchase and operation.
|
car_transport_reference | 3 803 | £/household/y | Provisional | PLACEHOLDER — French value carried, not UK data: the same INSEE budget for all transport, relabelled. Same source would close it.
|
km_per_car_per_year | 11 426 | km | Published | 7 100 miles a year, the National Travel Survey's 2024 figure for all cars, converted at 1.609344 km per mile. It is 3% below the French 11 600 and it has been falling for twenty years: 9 200 miles in 2002, 7 600 in 2019, 7 100 in 2024. Battery-electric cars are driven further than average (8 900 miles) and petrol cars less (6 200), which matters to any scenario that electrifies by vehicle count rather than by distance.
|
reference_car_fleet | 3.61127e+07 | cars | Derived | The car fleet the model computes at this country's reference scenario. It is a PINNED MODEL OUTPUT, not a statistic: run the reference once, read it back, record it here. It is pinned, and
|
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 | 0 | Game rule | This edition does not carry the land module. The natural sink is the | |
land_horizon_years | 26 | years | Derived | 2024 to 2050 — the horizon of this edition, counted from the year after the land survey the account would be written on. Derived rather than a placeholder: it follows this edition's own horizon and nothing else. |
forest_production | 5.4 | m³/ha/y | Provisional | PLACEHOLDER — French value carried, not UK data: gross biological production per hectare. Inert, because
|
forest_mortality | 1 | m³/ha/y | Provisional | PLACEHOLDER — French value carried, not UK data: mortality per hectare. Inert, because
|
forest_production_area | 16.6 | Mha | Provisional | PLACEHOLDER — French value carried, not UK data: forest area available for wood production. Inert, because
|
forest_standing_volume | 2 827 | Mm³ | Provisional | PLACEHOLDER — French value carried, not UK data: standing live volume. Inert, because
|
forest_harvest_base | 53.1 | Mm³/y | Provisional | PLACEHOLDER — French value carried, not UK data: base-year removals of live trees. Inert, because
|
forest_carbon_k | 1.5 | tCO₂/m³ | Provisional | PLACEHOLDER — French value carried, not UK data: what a cubic metre leaving the living stock takes with it. Inert, because
|
forest_carbon_ratio_base | 2 | tCO₂/m³ | Provisional | PLACEHOLDER — French value carried, not UK data: the inventory's sink over its balance at the base year. Inert, because
|
forest_dead_wood_coefficient | 0.6024 | tCO₂ per m³ of annual mortality | Provisional | PLACEHOLDER — French value carried, not UK data: the dead-wood pool per cubic metre of mortality. Inert, because
|
forest_dead_wood_half_life | 10 | years | Provisional | PLACEHOLDER — French value carried, not UK data: the half-life of carbon in dead wood. Inert, because
|
forest_litter_soil_sink | 4.62 | MtCO₂/y | Provisional | PLACEHOLDER — French value carried, not UK data: litter and forest soil on land-use change. Inert, because
|
forest_overseas_sink | 10 | MtCO₂/y | Provisional | PLACEHOLDER — French value carried, not UK data: forest outside the land account's territory. Inert, because
|
forest_harvest_sawlogs | 18.3 | Mm³/y | Provisional | PLACEHOLDER — French value carried, not UK data: sawlogs in the base-year harvest. Inert, because
|
forest_harvest_industrial | 10 | Mm³/y | Provisional | PLACEHOLDER — French value carried, not UK data: industrial wood in the base-year harvest. Inert, because
|
forest_harvest_energy_commercial | 9.7 | Mm³/y | Provisional | PLACEHOLDER — French value carried, not UK data: energy wood sold, in the base-year harvest. Inert, because
|
forest_informal_firewood | 15.1 | Mm³/y | Provisional | PLACEHOLDER — French value carried, not UK data: firewood cut and never sold. Inert, because
|
forest_harvest_unutilised | 0 | Mm³/y | Provisional | PLACEHOLDER — French value carried, not national data: wood felled and left in the forest, in million cubic metres a year. Inert, because
|
forest_harvest_volume_factor | 1 | m³ of standing stock per m³ of the harvest statistic | Provisional | PLACEHOLDER — French value carried, not national data: standing-stock volume per cubic metre of the harvest statistic. Inert, because
|
hwp_coefficient | 0.562 | tCO₂/m³ | Provisional | PLACEHOLDER — French value carried, not UK data: the wood-products pool per cubic metre a year. Inert, because
|
hwp_long_lived_share_base | 0.225 | fraction | Provisional | PLACEHOLDER — French value carried, not UK data: the base-year long-lived share of the harvest. Inert, because
|
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 | fraction | Game rule | Zero, matching the hidden |
hwp_base_sink | -0.4 | MtCO₂/y | Provisional | PLACEHOLDER — French value carried, not UK data: the base-year wood-products balance. Inert, because
|
hwp_carbon_per_m3 | 0.8373 | tCO₂/m³ | Provisional | PLACEHOLDER — French value carried, not national data: carbon carried into the wood-products pool per cubic metre of long-lived harvest. Inert, because
|
hwp_half_life | 28.87 | years | Provisional | PLACEHOLDER — French value carried, not national data: the half-life of the long-lived wood-products pool. Inert, because
|
hwp_stock_nir_2021 | 359.4 | MtCO₂ | Provisional | PLACEHOLDER — French value carried, not national data: the wood-products stock the national inventory report implies. Inert, because
|
grassland_sink_coefficient | 0.6237 | tCO₂/ha/y | Provisional | PLACEHOLDER — French value carried, not UK data: absorption per hectare of permanent grassland. Inert, because
|
cropland_source_coefficient | 0.6777 | tCO₂/ha/y | Provisional | PLACEHOLDER — French value carried, not UK data: emission per hectare of arable land. Inert, because
|
artificialisation_carbon_content | 96.2 | tCO₂ per ha/y of flow | Provisional | PLACEHOLDER — French value carried, not UK data: emission per unit of annual artificialisation. Inert, because
|
wetland_other_source | 1.2 | MtCO₂/y | Provisional | PLACEHOLDER — French value carried, not UK data: wetlands, other land and dams. Inert, because
|
peat_rewetted_emission | 5 | tCO₂e/ha/y | Provisional | PLACEHOLDER — French value carried, not national data: what a rewetted hectare of organic soil still emits, in tCO₂e a year. Inert, because
|
peat_rewetting_base | 0 | fraction of the drained organic soil | Provisional | PLACEHOLDER — French value carried, not national data: the share of the drained organic soil already rewetted in the base year. Inert, because
|
peat_agri_n2o_ef | 0 | tCO₂e/ha/y | Provisional | PLACEHOLDER — French value carried, not national data: the N₂O of a drained hectare of agricultural organic soil, in tCO₂e a year. Inert, because
|
soil_practice_potential_arable | 14.777 | MtCO₂/y | Provisional | PLACEHOLDER — French value carried, not UK data: the soil-carbon potential on arable land. Inert, because
|
soil_practice_potential_grassland | 2.53 | MtCO₂/y | Provisional | PLACEHOLDER — French value carried, not UK data: the soil-carbon potential on grassland. Inert, because
|
artificialisation_to_arable_share | 0.75 | fraction | Provisional | PLACEHOLDER — French value carried, not UK data: the share of artificialised land taken from arable land. Inert, because
|
artificialisation_to_grassland_share | 0 | fraction | Provisional | PLACEHOLDER — French value carried, not national data: the share of artificialised land taken from permanent grassland. Inert, because
|
artificialisation_to_forest_share | 0 | fraction | Provisional | PLACEHOLDER — French value carried, not national data: the share of artificialised land taken from forest. Inert, because
|
artificialisation_rate_base | 52 | kha/y | Provisional | PLACEHOLDER — French value carried, not UK data: the observed artificialisation rate. Inert, because
|
afforestation_rate_base | 0 | kha/y | Provisional | PLACEHOLDER — French value carried, not UK data: deliberate afforestation in the base year. Inert, because
|
grassland_conversion_base | 0 | kha/y | Provisional | PLACEHOLDER — French value carried, not UK data: net grassland conversion in the base year. Inert, because
|
soil_practice_base | 0 | fraction | Provisional | PLACEHOLDER — French value carried, not UK data: the share of the soil-carbon potential already taken. Inert, because
|
secten_sink_forest_2024 | -64.5 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not UK data: the inventory's observed forest line. Inert, because
|
secten_sink_hwp_2024 | 0.4 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not UK data: the inventory's observed wood-products line. Inert, because
|
secten_sink_grassland_2024 | -5.7 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not UK data: the inventory's observed grassland line. Inert, because
|
secten_sink_cropland_2024 | 11.7 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not UK data: the inventory's observed cropland line. Inert, because
|
secten_sink_artificial_2024 | 5 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not UK data: the inventory's observed artificial-areas line. Inert, because
|
secten_sink_wetland_2024 | 1.2 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not UK data: the inventory's observed wetlands line. Inert, because
|
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 | Provisional | PLACEHOLDER — French value carried, not national data: population in the base year. Inert, because
|
population_horizon | 69.21 | million people | Provisional | PLACEHOLDER — French value carried, not national data: population at the horizon. Inert, because
|
diet_red_meat_base | 53.5 | kgec/cap/y | Provisional | PLACEHOLDER — French value carried, not national data: observed red meat eaten per person. Inert, because
|
diet_poultry_base | 30.8 | kgec/cap/y | Provisional | PLACEHOLDER — French value carried, not national data: observed poultry eaten per person. Inert, because
|
food_waste_base | 0.07 | fraction of the food supply | Provisional | PLACEHOLDER — French value carried, not national data: the edible share of the food supply that is thrown away. Inert, because
|
dairy_beef_coupling_share | 0.4 | fraction of beef production | Provisional | PLACEHOLDER — French value carried, not national data: the share of beef that is a by-product of the dairy herd. Inert, because
|
enteric_lipid_effect | 0.14 | fraction of enteric methane removed | Provisional | PLACEHOLDER — French value carried, not national data: the enteric methane a low-methane ration removes. Inert, because
|
methanisation_abatement | 0.6 | fraction of manure methane removed | Provisional | PLACEHOLDER — French value carried, not national data: the manure methane a digester avoids. Inert, because
|
refrigerants_fixed | 0.02 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not national data: refrigerant leakage on farms. Inert, because
|
mineral_n_base | 1 817 | kt N/y | Provisional | PLACEHOLDER — French value carried, not national data: mineral nitrogen delivered in the base year. Inert, because
|
manure_n_spread_base | 735 | kt N/y | Provisional | PLACEHOLDER — French value carried, not national data: nitrogen in the manure collected and spread. Inert, because
|
manure_n_grazing_base | 727 | kt N/y | Provisional | PLACEHOLDER — French value carried, not national data: nitrogen deposited at pasture. Inert, because
|
fixation_n_base | 364.6 | kt N/y | Provisional | PLACEHOLDER — French value carried, not national data: nitrogen fixed biologically by legumes. Inert, because
|
fixation_gain | 0.6 | fraction of base-year fixation | Provisional | PLACEHOLDER — French value carried, not national data: the fixation added over the legume credit's span. Inert, because
|
legume_area_base | 1 | Mha | Provisional | PLACEHOLDER — French value carried, not national data: legume area in the base year. Inert, because
|
legume_n_credit | 128 | kt N/y | Provisional | PLACEHOLDER — French value carried, not national data: the mineral nitrogen a larger legume area replaces. Inert, because
|
legume_credit_span | 1.7 | Mha | Provisional | PLACEHOLDER — French value carried, not national data: the increase in legume area that credit was booked over. Inert, because
|
organic_share_base | 0.056 | fraction of the arable area | Provisional | PLACEHOLDER — French value carried, not national data: the organic share of the arable area in the base year. Inert, because
|
organic_yield_ratio | 0.65 | fraction of the conventional yield | Provisional | PLACEHOLDER — French value carried, not national data: the organic yield as a fraction of the conventional one. Inert, because
|
n_yield_plateau | 0.9 | index, base-year dose = 1 | Provisional | PLACEHOLDER — French value carried, not national data: the dose, as a fraction of the base year's, down to which a conventional hectare keeps its yield. Inert, because
|
crop_nue_base | 0.67 | fraction of the nitrogen input | Provisional | PLACEHOLDER — French value carried, not national data: the nitrogen use efficiency of cropland, which sets how fast the yield falls below the plateau. Inert, because
|
crop_food_waste_share | 0.222 | fraction of the supply | Provisional | PLACEHOLDER — French value carried, not national data: the edible share of the plant-food supply wasted downstream of the farm. Inert, because
|
arable_share_food | 0.2696 | fraction of the non-energy arable area | Provisional | PLACEHOLDER — French value carried, not national data: the share of the non-energy arable area growing plant food. Inert, because
|
arable_share_feed | 0.4049 | fraction of the non-energy arable area | Provisional | PLACEHOLDER — French value carried, not national data: the share growing feed. Inert, because
|
arable_share_export | 0.2306 | fraction of the non-energy arable area | Provisional | PLACEHOLDER — French value carried, not national data: the share growing export crops. Inert, because
|
arable_share_other | 0.0949 | fraction of the non-energy arable area | Provisional | PLACEHOLDER — French value carried, not national data: fallow, seed and the rest. Inert, because
|
feed_forage_share | 0.576 | fraction of the feed area | Provisional | PLACEHOLDER — French value carried, not national data: the forage part of the feed area. Inert, because
|
energy_maize_area_base | 0 | Mha | Provisional | PLACEHOLDER — French value carried, not national data: the arable area growing a main crop for a digester in the base year, in million hectares. Inert, because
|
energy_maize_dm_yield | 0 | t DM/ha | Provisional | PLACEHOLDER — French value carried, not national data: dry matter a hectare of that main crop yields, in tonnes. Inert, because
|
energy_maize_digestate_ef | 0 | tCO₂e/ha/y | Provisional | PLACEHOLDER — French value carried, not national data: the digester and digestate emissions per hectare of that main crop, in tCO₂e a year. Inert, because
|
compound_feed_share_poultry | 0.426 | fraction of compound feed | Provisional | PLACEHOLDER — French value carried, not national data: poultry's share of compound feed. Inert, because
|
compound_feed_share_cattle | 0.272 | fraction of compound feed | Provisional | PLACEHOLDER — French value carried, not national data: cattle's share of compound feed. Inert, because
|
compound_feed_share_pig | 0.225 | fraction of compound feed | Provisional | PLACEHOLDER — French value carried, not national data: pigs' share of compound feed. Inert, because
|
ef_mineral_n2o | 4.21024 | tCO₂e per t N | Provisional | PLACEHOLDER — French value carried, not national data: the N₂O per tonne of mineral nitrogen. Inert, because
|
ef_mineral_co2 | 1.2328 | tCO₂e per t N | Provisional | PLACEHOLDER — French value carried, not national data: the urea and liming CO₂ per tonne of mineral nitrogen. Inert, because
|
crop_carbon_fixed | 0 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not national data: agricultural CO₂ the nitrogen dose does not drive — liming and the other carbon-containing fertilisers. Inert, because
|
ef_organic_n2o | 2.01361 | tCO₂e per t N | Provisional | PLACEHOLDER — French value carried, not national data: the N₂O per tonne of nitrogen in spread manure. Inert, because
|
ef_grazing_n2o | 1.9945 | tCO₂e per t N | Provisional | PLACEHOLDER — French value carried, not national data: the N₂O per tonne of nitrogen deposited at pasture. Inert, because
|
ef_other_crop_n2o | 2.26424 | tCO₂e per t N of total input | Provisional | PLACEHOLDER — French value carried, not national data: the remaining crop N₂O per tonne of nitrogen input. Inert, because
|
residue_burning_fixed | 0.02 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not national data: field burning of crop residues. Inert, because
|
farm_fuel_2024 | 10.73 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not national data: the combustion emissions of farm and forestry engines. Inert, because
|
grassland_rough | 1.38846 | Mha | Provisional | PLACEHOLDER — French value carried, not national data: the rough grazing the farm survey and the land survey disagree about. Inert, because
|
ammonia_non_fertiliser | 148.6 | kt NH₃/y | Provisional | PLACEHOLDER — French value carried, not national data: the ammonia the chemical industry makes for something else. Inert, because
|
ammonia_domestic_share_base | 0.34 | fraction | Provisional | PLACEHOLDER — French value carried, not national data: the base-year share of nitrogen made inside the country. Inert, because
|
citepa_livestock_2024 | 45.7 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not national data: the inventory's observed livestock line. Inert, because
|
citepa_crops_2024 | 21.1 | MtCO₂e/y | Provisional | PLACEHOLDER — French value carried, not national data: the inventory's observed crops-and-soils line. Inert, because
|
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 | Provisional | PLACEHOLDER — French value carried, not national data: collectable manure dry matter per head of cattle, in tonnes a year. Inert, because
|
manure_dm_per_pig_head | 0.08 | t DM per head per year | Provisional | PLACEHOLDER — French value carried, not national data: the same per pig. Inert, because
|
manure_methanised_2024 | 0.1 | fraction of collectable manure | Provisional | PLACEHOLDER — French value carried, not national data: the share of collectable manure that reached a digester in the base year. Inert, because
|
cive_dm_yield | 6 | t DM per hectare | Provisional | PLACEHOLDER — French value carried, not national data: dry matter a hectare of winter cover crop yields, in tonnes. Inert, because
|
cive_area_base | 0.15 | Mha | Provisional | PLACEHOLDER — French value carried, not national data: the cover-crop area in the base year, in million hectares. Inert, because
|
cive_land_ceiling | 4 | Mha | Provisional | PLACEHOLDER — French value carried, not national data: the spring-crop area that could carry a cover crop at all. Inert, because
|
residue_dm_yield | 3.3015 | t DM per hectare | Provisional | PLACEHOLDER — French value carried, not national data: crop residues an arable hectare produces, in tonnes of dry matter. Inert, because
|
residue_mobilisation_base | 0.01 | fraction of the residue pool | Provisional | PLACEHOLDER — French value carried, not national data: the share of them already carried off the field in the base year. Inert, because
|
residue_to_biogas_share | 0.5 | fraction of mobilised residues | Provisional | PLACEHOLDER — French value carried, not national data: how the mobilised residues split between a digester and a 2G liquid plant. Inert, because
|
biogas_other | 18.9947 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: the biogas feedstock the module does not build — biowaste, sludge, landfill gas. Inert, because
|
wood_byproduct_share | 0.581 | fraction of the material harvest | Provisional | PLACEHOLDER — French value carried, not national data: the share of the material harvest that comes back as sawmill and pulp-mill fuel. Inert, because
|
non_forest_wood | 22.8 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: wood energy from hedges, orchards and trees outside woodland, in TWh. Inert, because
|
waste_wood | 9 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: end-of-life wood burned for energy, in TWh. Inert, because
|
biofuel_1g_yield | 18.899 | MWh per hectare | Provisional | PLACEHOLDER — French value carried, not national data: fuel a hectare of first-generation energy crop yields, in MWh. Inert, because
|
energy_crop_area_base | 0.618 | Mha | Provisional | PLACEHOLDER — French value carried, not national data: the first-generation energy-crop area in the base year, in million hectares. Inert, because
|
waste_fats_supply | 3 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: used cooking oil and animal fats made into liquid fuel, in TWh. Inert, because
|
bio_imports_base | 26.4 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: liquid biofuel and feedstock imported in the base year, in TWh. Inert, because
|
sdes_wood_2024 | 120.05 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: observed primary consumption of wood energy in the base year, in TWh. Inert, because
|
sdes_biogas_2024 | 24.25 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: observed primary consumption of biogas in the base year, in TWh. Inert, because
|
sdes_biofuel_2024 | 41.7 | TWh/y | Provisional | PLACEHOLDER — French value carried, not national data: observed primary consumption of liquid biofuel in the base year, in TWh. Inert, because
|
The categories the model iterates over. Every row is addressed by its identifier, which is what the formulas in the next section refer to.
Service demand in billion passenger-kilometres, GREAT BRITAIN, 2024, from the Department for Transport's own series. Unit consumption and occupancy are the shared workbook's; only the demand column is British, and the three things that are structurally different from France are worth reading before the numbers. (1) TSGB reports "cars, vans and taxis" as ONE mode, 687.707 Gpkm, and publishes no fuel split of passenger-kilometres. All of it sits on car_fuel with the gas and electric rows at zero, which overstates the fossil starting point by roughly the electric share of car mileage — about 5% on the National Travel Survey's own mileage weighting. The distortion is conservative for the player (there is more to decarbonise than reality holds) and the utility-vehicle rows are consequently empty, because vans are inside the car figure. (2) There is no overseas aviation. The French row exists for the Outre-mer and Britain's equivalent journeys are ordinary international flights. (3) British domestic aviation is TINY — 8.5 Gpkm — and British international aviation is very large. The domesticAviationRail lever moves almost nothing here, and the British aviation lesson is entirely about international flying. International aviation demand is derived rather than read: the CCC gives 5 781 passenger-km flown per capita per year in 2025 and ONS gives a UK population of 69 281 400, so total aviation demand is 400.5 Gpkm and the international part is that less the 8.5 of domestic.
| Row | vector | unit_consumption | occupancy | demand_2020 | in_inventory | aviation |
|---|---|---|---|---|---|---|
Fuel car, van and taxicar_fuel | liquid | 65 | 1.5 | 687.707 | 1 | 0 |
Biogas carcar_gas | gas | 65 | 1.5 | 0 | 1 | 0 |
Electric carcar_electric | electricity | 20 | 1.5 | 0 | 1 | 0 |
Fuel utility vehicleutility_fuel | liquid | 85 | 1.8 | 0 | 1 | 0 |
Gas utility vehicleutility_gas | gas | 85 | 1.8 | 0 | 1 | 0 |
Electric utility vehicleutility_electric | electricity | 20 | 1.8 | 0 | 1 | 0 |
Fuel motorcycletwo_wheeler_fuel | liquid | 50 | 1.01 | 5.061 | 1 | 0 |
Electric motorcycletwo_wheeler_electric | electricity | 15 | 1.01 | 0 | 1 | 0 |
Fuel bus and coachbus_fuel | liquid | 284 | 14.27 | 28.851 | 1 | 0 |
Gas busbus_gas | gas | 280 | 14.27 | 0 | 1 | 0 |
Electric busbus_electric | electricity | 75 | 14.27 | 0 | 1 | 0 |
Hydrogen busbus_h2 | hydrogen | 200 | 14.27 | 0 | 1 | 0 |
Long-distance traintrain_long | electricity | 1 859 | 457.992 | 45.36 | 1 | 0 |
Short-distance traintrain_short | electricity | 975 | 85.2181 | 31.879 | 1 | 0 |
Domestic aviationaviation_domestic | liquid | 2 160 | 90 | 8.512 | 1 | 1 |
Overseas aviationaviation_overseas | liquid | 3 500 | 180 | 0 | 1 | 1 |
International aviationaviation_international | liquid | 3 500 | 180 | 392.031 | 0 | 1 |
PLACEHOLDER — French value carried, not UK data: where base-year passenger demand goes at the horizon. Most of this table is a game convention rather than a national datum — the rows a lever drives are overridden in the equations — but three of the fixed shares are French scenario choices and they are carried unchanged: utility vehicles going 10% gas and 90% electric, and buses going 20% gas, 50% electric and 30% hydrogen. Britain's bus fleet is going electric far faster than that and hydrogen buses have largely been abandoned outside a few city trials, so the bus row in particular should be re-argued before this package is taught from. The utility rows carry no demand in the British table anyway, because vans are inside the car figure.
| 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 |
Service demand in billion tonne-kilometres, GREAT BRITAIN, 2024: road 168, water 21, rail 17, total 206. Unit consumption is the shared workbook's. ONE ROW MEANS SOMETHING DIFFERENT FROM ITS FRENCH COUNTERPART, and it changes what the maritime lever does. France's maritime row is INTERNATIONAL shipping, 700 Gtkm, outside the national inventory. The British figure available here is DOMESTIC and coastwise water freight, 21 Gtkm, which IS inside the inventory — so in_inventory is 1 where France has 0, and the freightAviationSea lever moves air freight onto a domestic mode rather than an international one. UK international shipping tonne-kilometres are not published in TSGB; what is published is the fuel, 5.04 MtCO₂e of bunkers in 2024, which this table has no column for. Air freight carries the workbook's gas vector, which is a French convention with a real consequence: about 3 TWh of what the scoreboard calls "biogas" is in fact air-freight fuel.
| Row | vector | unit_consumption | demand_2020 | in_inventory |
|---|---|---|---|---|
Hydrogen trucktruck_h2 | hydrogen | 50 | 0 | 1 |
Fuel trucktruck_fuel | liquid | 50 | 168 | 1 |
Electric trucktruck_electric | electricity | 20 | 0 | 1 |
Rail freightrail_freight | electricity | 3.2 | 17 | 1 |
Domestic and coastwise water freightmaritime | liquid | 0.6 | 21 | 1 |
International air freightair_freight | gas | 245 | 12 | 0 |
PLACEHOLDER — French value carried, not UK data: where base-year freight demand goes at the horizon. Every share here is either driven by a lever or a workbook convention; none of them is a British measurement.
| 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 |
PLACEHOLDER — French value carried, not UK data: only for the TERTIARY floor-area intensity and the flat/house floor-area assumption. Everything else in this table is British, and the mixture is worth stating precisely because this is the table the whole building module rests on. BRITISH, from four published sources. The heating-system mix: 29 624 527 GB dwellings by system, from NESO FES 2025 sheet ED7. The energy each system delivers, same sheet. The apartment/house split of each system, from ONS's main-fuel-by-property-type percentages crossed with the English Housing Survey's dwelling counts — which is why 72% of electrically heated British homes and 94% of community-heated ones are flats against 14% of gas-heated ones, a real and very British feature of the stock that no French ratio would have produced. And the mean useful floor area, 96.11 m², EHS 2024-25 table AT1.6, all tenures, England. FRENCH. No UK source gives non-domestic floor area by heating system — the Valuation Office Agency's floorspace collection URL 404s — so the tertiary surface is British heat need divided by the FRENCH calibrated tertiary intensity of 111.91 kWh/m²/y. Change that number and every tertiary surface here moves in proportion. SIMPLIFIED, and stated. One mean floor area for flats and houses alike: flats are smaller, so flat surface is overstated and house surface understated while the residential total stays right. One surfacic need per system, the same for its flats and its houses: the French table differentiates them and importing that ratio would gain nothing. HOW THE NEEDS WERE BUILT. FES ED7 is space heating PLUS hot water, and the game's stock is space heating only — hot water lives in building_usage — so each sector's delivered energy is scaled by ECUK's space-heating share, 0.78018 residential and 0.87508 tertiary. Skipping that step would double count 68 TWh. Need is then delivered energy times the system's seasonal efficiency from building_vector, and surfacic need is need over surface. So building_need_calibration is 1.0 by construction and BRITISH SURFACIC NEEDS ARE NOT COMPARABLE WITH FRENCH ONES: 83.7 kWh/m²/y for a gas-heated British home is a calibrated need, where the French table's 159 is a theoretical one that the model then scales by 0.6528. WHAT THE TABLE SAYS. 20.9 million gas-heated British houses at 83.7 kWh/m²/y are 168 TWh of the country's 234 TWh of residential heat need — 72% of the problem in one row. France's largest single row is 30%.
| Row | system | building_type | surface_2020 | surfacic_need | dwellings |
|---|---|---|---|---|---|
Biomass, apartmentbiomass_apartment | biomass | apartment | 1.07806e+06 | 100.367 | 11 217 |
Fuel boiler, apartmentfuel_apartment | fuel | apartment | 408 951 | 112.761 | 4 255 |
Gas boiler, apartmentgas_apartment | gas | apartment | 3.40454e+08 | 83.7287 | 3 542 323 |
Electric resistance, apartmentresistance_apartment | resistance | apartment | 1.71889e+08 | 65.0887 | 1 788 451 |
District heating, apartmentdistrict_apartment | district | apartment | 8.14064e+07 | 46.9104 | 847 010 |
Air-air heat pump, apartmentair_air_apartment | air_air | apartment | 6.42398e+06 | 61.6745 | 66 840 |
Air-water heat pump, apartmentair_water_apartment | air_water | apartment | 959 112 | 54.6613 | 9 979 |
Hybrid heat pump, apartmenthybrid_apartment | hybrid | apartment | 122 210 | 76.7902 | 1 272 |
Biomass, housebiomass_house | biomass | house | 3.83116e+06 | 100.367 | 39 862 |
Fuel boiler, housefuel_house | fuel | house | 1.31511e+08 | 112.761 | 1 368 330 |
Gas boiler, housegas_house | gas | house | 2.00912e+09 | 83.7287 | 20 904 351 |
Electric resistance, houseresistance_house | resistance | house | 6.77442e+07 | 65.0887 | 704 858 |
District heating, housedistrict_house | district | house | 5.06736e+06 | 46.9104 | 52 724 |
Air-air heat pump, houseair_air_house | air_air | house | 2.28291e+07 | 61.6745 | 237 530 |
Air-water heat pump, houseair_water_house | air_water | house | 3.40843e+06 | 54.6613 | 35 464 |
Hybrid heat pump, househybrid_house | hybrid | house | 967 008 | 76.7902 | 10 061 |
Biomass, tertiarybiomass_tertiary | biomass | tertiary | 1.31534e+07 | 111.914 | 0 |
Fuel boiler, tertiaryfuel_tertiary | fuel | tertiary | 1.27772e+08 | 111.914 | 0 |
Gas boiler, tertiarygas_tertiary | gas | tertiary | 5.60726e+08 | 111.914 | 0 |
Electric resistance, tertiaryresistance_tertiary | resistance | tertiary | 7.36038e+07 | 111.914 | 0 |
District heating, tertiarydistrict_tertiary | district | tertiary | 5.96189e+06 | 111.914 | 0 |
Air-air heat pump, tertiaryair_air_tertiary | air_air | tertiary | 8.38629e+06 | 111.914 | 0 |
Air-water heat pump, tertiaryair_water_tertiary | air_water | tertiary | 5.72379e+06 | 111.914 | 0 |
Hybrid heat pump, tertiaryhybrid_tertiary | hybrid | tertiary | 4.16882e+06 | 111.914 | 0 |
PLACEHOLDER — French value carried, not UK data: the unit_2020 and unit_2050 columns, which are the fuel mix a HEAT NETWORK runs on. The efficiency columns are technology and travel; the network mix is national and does not. The French mix has British district heating running 35.2% on gas, 23.8% on wood, 3.7% on coal and 36.8% on "other" in the base year, and 60% gas / 30% wood / 10% heat pump in 2050. The British reality is different in a way that matters: UK heat networks are overwhelmingly gas-CHP and energy-from-waste, wood barely features, and coal does not exist. FES distinguishes only "fossil fuel communal heating" (725 583 dwellings) from "low carbon district heating" (174 151), which is a 81/19 split and not a six-fuel one, so it cannot fill this table's shape either. What would close it: DESNZ Heat networks statistics, which publishes heat delivered by fuel for the UK network fleet.
| 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 |
Not ported. No end-use map of the United Kingdom's cement has been assembled for this edition, so the whole base-year tonnage sits in the residual row and the two new-build rows carry zero intensity. The module's arithmetic then returns 7300 kt unchanged, which is exactly what the cement chain read before the module existed — and a test asserts that every one of the four construction levers moves no output at all here. What a port needs is in the French file: an end-use split between new build, civil engineering and the rest; a cement and a steel intensity per square metre; and the floor area built each year. The French version of this table also shows that the two published maps of a country's cement are unlikely to reconcile, and where to keep the difference.
| Row | cement_intensity | steel_intensity | cement_2024 | steel_2024 | floor_2024 | driver |
|---|---|---|---|---|---|---|
New housinghousing_new | 0 | 0 | 0 | 0 | 0 | none |
New non-residentialother_new | 0 | 0 | 0 | 0 | 0 | none |
Roads, networks and civil workscivil_works | 0 | 0 | 0 | 0 | 0 | none |
All of it, unattributedunattributed | 0 | 0 | 7 300 | 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. The kiln row carries its electricity and nothing else since 0.29.0. Its fuel was 0.700 MWh a tonne of clinker in gas and "liquid", which a French kiln does not burn; it is now computed from kiln_heat_per_tonne and kilnAltFuel — petroleum coke, coal and the fossil half of the waste on the coal carrier, the biomass half on the wood carrier — because how much of it is waste is a choice the player makes, and a static row cannot carry a choice.
| 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 | 0 | 0 | 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 |
PLACEHOLDER — French value carried, not UK data: eight DGAC route categories with French traffic, including three that exist only because France has overseas departments. Nothing about this table is British and the whole of it has to be rebuilt rather than translated. The British categories are the Civil Aviation Authority's — UK airports by terminal passengers, and DfT's international-versus-domestic split — and the British shape is different in kind: 295 million terminal passengers passed through UK airports in 2024 against a domestic aviation market of 8.5 Gpkm, so a British ticket table would be almost entirely international. Carrying the French rows makes the aviation cost module report French flights with British prices. This is the table to disable rather than display in a British edition until it is rebuilt.
| 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 |
OTHER_COUNTRIES.md ranks this the hardest block to port and scores the UK red on it. It is filled, and not from the source that study named. WHY NOT ECUK. ECUK Table C2 is an excellent OBSERVED corner and is used below as the cross-check. But it cannot separate cement from "mineral products", and cement is one of the five value chains the game models separately, so an ECUK-based minerals row would double count it. ECUK also has no 2050, and this table needs four corners of an (output × process) surface. WHY THE CCC DATASET. The Seventh Carbon Budget's companion dataset publishes gross energy demand by carrier, year by year to 2050, for ten industrial sub-sectors — and three of them are exactly the three game value chains that overlap this table: Iron and steel, Cement and lime, Food and drink. Removing them is a SELECTION, not an estimate. GROUP MAPPING, and where it differs from France's. metals_machinery ← Non-ferrous metals + Vehicles; minerals ← Glass and other minerals; chemicals_other ← Chemicals; paper ← Paper; other_industries ← Other industry + Non-road mobile machinery. The French metals group also holds mechanical and electrical engineering and the French "other" holds textiles; the CCC leaves both inside "Other industry". So the British other_industries is wider than France's and metals_machinery narrower, which matters because post attaches a waste-heat share and an electrification ceiling to each group. The British "other" also carries 21.6 TWh of non-road mobile machinery, which is why its oil row is 33 TWh where France's is 0.8. HOW e10 AND e01 WERE BUILT — THIS AFFECTS RESULTS. Only e00 and e11 are published. The other two corners are constructed on the proportionality the bilinear form already assumes: e10 = e00 × 1.267327 and e01 = e11 / 1.267327, where 1.267327 is the CCC's index of industrial gross value added at 2050 over 2025 (128/101). It is a single economy-wide index applied to five very different branches, where the French table measures a per-branch one; GVA is not physical output; and the CCC itself says the index "does not take account of the effect of the resource efficiency measures in our pathway". That is why the whole table is provisional even though half of it is published. WHAT IS NOT HERE. No steam rows: the CCC books purchased heat inside the carrier that produced it, so a steam column would double count (ECUK shows the size of it — 7.1 TWh across all UK industry in 2024). No process rows: the sub-sector sheet publishes emissions only as a total, so process CO₂ cannot be separated from combustion CO₂. France carries 1.99 MtCO₂ on minerals and 0.56 on chemicals; the British equivalents are missing, DESNZ Annex 2 would close them, and until it does the otherIndustryProcess lever moves energy and not process emissions. ONE UNRESOLVED OVERLAP. The CCC's "Chemicals" still contains the OLEFIN chain, which the game models separately, so chemicals_other double counts it. Ammonia, the other chemical chain, is genuinely zero in the United Kingdom since 2023 and causes no overlap — the one place where losing an industry simplifies a model. CLOSURE, and it is the strongest check on the group mapping: e00 plus the three excluded chains is 220.190 + 12.189 + 9.023 + 38.315 = 279.717 TWh against the 280 TWh the CCC prints for 2025 total industrial energy use, and e11 plus the same chains is 196.024 against 196 for 2050. Nothing has been dropped or counted twice.
| Row | group | carrier | e00 | e10 | e01 | e11 |
|---|---|---|---|---|---|---|
Metals and machinery — coalmetals_machinery__coal | metals_machinery | coal | 0.3073 | 0.3895 | 0.1454 | 0.1843 |
Metals and machinery — oilmetals_machinery__oil | metals_machinery | oil | 0.2715 | 0.344 | 0 | 0 |
Metals and machinery — gasmetals_machinery__gas | metals_machinery | gas | 8.1291 | 10.3022 | 0 | 0 |
Metals and machinery — biomassmetals_machinery__biomass | metals_machinery | biomass | 0.0952 | 0.1206 | 0.1454 | 0.1843 |
Metals and machinery — electricitymetals_machinery__electricity | metals_machinery | electricity | 7.2005 | 9.1254 | 10.4669 | 13.265 |
Minerals and building materials — coalminerals__coal | minerals | coal | 0.1088 | 0.1379 | 0 | 0 |
Minerals and building materials — oilminerals__oil | minerals | oil | 0.2541 | 0.322 | 0 | 0 |
Minerals and building materials — gasminerals__gas | minerals | gas | 13.3186 | 16.879 | 0 | 0 |
Minerals and building materials — biomassminerals__biomass | minerals | biomass | 0.7786 | 0.9868 | 0.014 | 0.0177 |
Minerals and building materials — electricityminerals__electricity | minerals | electricity | 4.5673 | 5.7882 | 5.5571 | 7.0427 |
Minerals and building materials — hydrogenminerals__hydrogen | minerals | hydrogen | 0 | 0 | 5.4543 | 6.9123 |
Chemicals, other — coalchemicals_other__coal | chemicals_other | coal | 0.0713 | 0.0903 | 0 | 0 |
Chemicals, other — oilchemicals_other__oil | chemicals_other | oil | 2.9952 | 3.7959 | 0.0842 | 0.1067 |
Chemicals, other — gaschemicals_other__gas | chemicals_other | gas | 24.6563 | 31.2475 | 9.9568 | 12.6185 |
Chemicals, other — biomasschemicals_other__biomass | chemicals_other | biomass | 3.4844 | 4.4159 | 0.9647 | 1.2226 |
Chemicals, other — electricitychemicals_other__electricity | chemicals_other | electricity | 15.3489 | 19.4521 | 25.9352 | 32.8684 |
Chemicals, other — hydrogenchemicals_other__hydrogen | chemicals_other | hydrogen | 0 | 0 | 3.1234 | 3.9583 |
Paper and board — coalpaper__coal | paper | coal | 0.756 | 0.9581 | 0.2101 | 0.2663 |
Paper and board — oilpaper__oil | paper | oil | 0.2862 | 0.3627 | 0.1989 | 0.2521 |
Paper and board — gaspaper__gas | paper | gas | 6.8988 | 8.7431 | 0 | 0 |
Paper and board — biomasspaper__biomass | paper | biomass | 2.1839 | 2.7677 | 0 | 0 |
Paper and board — electricitypaper__electricity | paper | electricity | 8.2441 | 10.448 | 8.5716 | 10.863 |
Other industries — coalother_industries__coal | other_industries | coal | 5.91 | 7.4899 | 1.6346 | 2.0716 |
Other industries — oilother_industries__oil | other_industries | oil | 33.0249 | 41.8534 | 1.3047 | 1.6535 |
Other industries — gasother_industries__gas | other_industries | gas | 32.4541 | 41.1299 | 0 | 0 |
Other industries — biomassother_industries__biomass | other_industries | biomass | 14.622 | 18.5309 | 7.0473 | 8.9312 |
Other industries — electricityother_industries__electricity | other_industries | electricity | 34.2227 | 43.3713 | 44.5618 | 56.4743 |
Other industries — hydrogenother_industries__hydrogen | other_industries | hydrogen | 0 | 0 | 2.2377 | 2.8359 |
Final energy by usage and carrier, ECUK 2024, UNITED KINGDOM. Residential is Table U3 and tertiary Table U5 (services excluding agriculture, sub-sector Total). Unlike France there is no need to mix two vintages: Britain's 2020 problem is a Covid problem and 2024 is clean for both segments. ECUK publishes ktoe; everything here is TWh at 1 ktoe = 0.01163. Space heating is deliberately absent, as in France: it is the stock model's business. For the record ECUK 2024 gives 242.35 TWh domestic and 114.40 TWh services. FIVE CARRIER DECISIONS, ALL DECLARED. (1) ECUK's domestic solid fuel has no column here; it is 0.063 TWh of water heating and nothing else, and it is added to liquid, whose emission factor is the closest of the five to coal's. (2) ECUK's services "other" is solid fuel plus bioenergy and waste and is put on wood; that is the one materially uncertain assignment, 1.51 TWh of hot water and 2.52 of other uses. (3) heat is district heat, folded into gas by the equations — the same treatment as France and more defensible here, because British networks are majority gas-CHP. (4) THERE IS NO RESIDENTIAL COOLING ROW, and that is a real difference rather than a gap: ECUK publishes no domestic cooling end use, British homes have almost no air conditioning, and what there is sits inside appliances and therefore inside specific_residential. The row is kept at zero to preserve the fixed row set, and usageCoolingGrowth consequently acts on one row in Britain rather than two. (5) specific is lighting plus appliances for residential and computing plus lighting for tertiary. ONE COMPARISON NOT TO MAKE. Tertiary specific electricity is 25.9 TWh here against France's 70.3, and the two are not measuring the same thing: ECUK books far more of the British services sector's electricity under "other uses" (25.0 TWh) than CEREN does for France (2.1 TWh).
| Row | usage | segment | electricity | gas | liquid | wood | heat |
|---|---|---|---|---|---|---|---|
Hot water, residentialdhw_residential | dhw | residential | 3.8299 | 55.5598 | 5.3431 | 3.549 | 0 |
Hot water, tertiarydhw_tertiary | dhw | tertiary | 1.5914 | 9.0897 | 3.9359 | 1.5145 | 0.1961 |
Cooking, residentialcooking_residential | cooking | residential | 6.724 | 7.8808 | 0 | 0 | 0 |
Catering, tertiarycooking_tertiary | cooking | tertiary | 7.475 | 6.6477 | 4.7367 | 0 | 0 |
Air conditioning, residentialcooling_residential | cooling | residential | 0 | 0 | 0 | 0 | 0 |
Cooling and ventilation, tertiarycooling_tertiary | cooling | tertiary | 10.4469 | 0.0285 | 0.6675 | 0 | 0 |
Specific electricity, residentialspecific_residential | specific | residential | 70.1136 | 0 | 0 | 0 | 0 |
Specific electricity, tertiaryspecific_tertiary | specific | tertiary | 25.8979 | 0 | 0 | 0 | 0 |
Other uses, tertiaryother_tertiary | other | tertiary | 25.0026 | 6.9548 | 0.7868 | 2.522 | 0.4492 |
Each row is one of NESO's four 2050 pathways reduced to shares of total generation, so it can be applied to whatever electricity this model's own demand turns out to be. The axis NESO varies is not nuclear-versus-renewables, as RTE's is, but ELECTRIFICATION-versus-HYDROGEN with a consumer-engagement dimension across it — so the controversy this table stages is not the one the French game stages. THE SHAPE OF THE BRITISH MIX, IN ONE LINE. Offshore wind is 45-52% of generation in every 2050 pathway. Nothing in the French table is remotely like it: RTE's largest single technology in any scenario is nuclear at 50% in N03, and its offshore wind never passes 31%. A British player is arguing about one resource, not about a portfolio. FOUR CONVENTIONS, ALL OF WHICH CHANGE RESULTS. (1) Storage discharge is NOT generation: FES reports battery, pumped-hydro, compressed-air and liquid-air output under "Generation (TWh)" and counting it would double-count the electricity that charged it, so 22-62 TWh per pathway is excluded from numerator and denominator, as are interconnector imports. (2) gas_turbine and combined_cycle are read by FUEL, not by plant name, because that is what the shared generation_technology table means by them — gas_turbine has fuel_carrier: none because every RTE 2050 scenario runs it on hydrogen. So British gas_turbine is FES Hydrogen + Hydrogen CHP + Hydrogen Peaking, and combined_cycle is CCS Gas + CCGT + OCGT + the gas CHP and reciprocating rows. WATCH OUT: almost all of the 2050 British methane fleet is gas CCS — 42 of 42 TWh in Holistic Transition — and the shared row applies an unabated emission factor to it, so this column overstates British power-sector CO₂ until generation_technology grows a capture rate. (3) Solar is split by connection size, not 50/50: FES sheet ES3 defines "Distributed - Micro" as generation below 1 MW, which for solar is essentially all rooftop. That is a measurement where France used a convention. (4) wind_offshore_floating is ZERO in every row, and that is a GAP, not a result: the string "floating" does not occur anywhere in the FES 2025 workbook, and TYNDP 2024 also gives GB offshore wind as one line. All of it is booked as fixed-bottom, which understates the steel and concrete of the build — 480 t/MW floating against 250 fixed. Marine (tidal stream and range) and geothermal CHP have no column in the shared schema and are carried in hydro, the closest physical analogue, at under 1% of supply. In Electric Engagement, where marine is largest, hydro is 11.4 TWh of which 6.7 is marine, so read that row as "water". Shares are rounded to six decimals; where that left a residual of 1e−6 it was absorbed on wind_offshore_fixed, the largest column, so every row sums to one exactly. ROW 4 IS A FAILURE CASE. "Falling Behind" does not reach net zero: no hydrogen generation at all and 19% of supply from methane, of which 51 TWh is UNABATED CCGT against zero in Holistic Transition. It is here because NESO publishes it and a player should be able to see it; the rteScenario lever's help says what it is.
| Row | scenario_index | nuclear | pv_ground | pv_roof | wind_onshore | wind_offshore_fixed | wind_offshore_floating | hydro | bioenergy | gas_turbine | combined_cycle |
|---|---|---|---|---|---|---|---|---|---|---|---|
Holistic Transition — balanced net zeroholistic_transition | 1 | 0.123258 | 0.072055 | 0.037723 | 0.125748 | 0.523478 | 0 | 0.008415 | 0.039753 | 0.013713 | 0.055857 |
Electric Engagement — most electrifiedelectric_engagement | 2 | 0.174359 | 0.067683 | 0.040884 | 0.128553 | 0.448093 | 0 | 0.013804 | 0.051669 | 0.014234 | 0.060721 |
Hydrogen Evolution — molecules over electronshydrogen_evolution | 3 | 0.090653 | 0.078241 | 0.029603 | 0.127126 | 0.476764 | 0 | 0.00597 | 0.024633 | 0.044251 | 0.122759 |
Falling Behind — does NOT reach net zerofalling_behind | 4 | 0.107556 | 0.0606 | 0.026651 | 0.112178 | 0.468542 | 0 | 0.006714 | 0.027061 | 0 | 0.190698 |
PLACEHOLDER — French value carried, not UK data: every column except load_factor. Tonnes of material per MW, lifetimes, CAPEX and OPEX are technology and the shared file's own note says they can be carried where a country has nothing better; the United Kingdom has nothing better here. Only the load factors are British, and they are the country's wind and sun. THE LOAD FACTORS ARE OBSERVED 2025, NOT 2050 ASSUMPTIONS, and that must travel with them. The French column is RTE's forward assumption for a 2050 fleet (offshore 0.41, thermal 0.114); these are what the existing British fleet actually did in calendar 2025. Comparing them as if they measured the same thing is wrong in both directions: new British offshore wind is contracted well above 36%, and British CCGTs run at 30% today because they are being pushed off the merit order, not because 30% is a target. For reference, FES 2050 implies nuclear 0.75, onshore 0.23, offshore 0.43, solar 0.10, bioenergy 0.57, hydrogen plant 0.05 and methane plant 0.22 in Holistic Transition — the numbers to use if the column is ever redefined as a 2050 assumption. Two rows are not observations and say so in their own right. Floating offshore wind takes the fixed-bottom value because there is no British floating fleet large enough for DUKES to publish one, which is conservative in the wrong direction — floating sites are windier. The hydrogen peaking row (gas_turbine) takes the FES 2050 implied 0.05, because DUKES cannot give a load factor for a plant type that does not exist yet and its nearest line, "conventional thermal and other stations" at 38.59%, is dominated by oil, waste and biomass.
| 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.6404 | 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.1108 | 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.1108 | 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.2402 | 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.3612 | 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.3612 | 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.3234 | 0 | none | 0 | 70 | 1 000 | 15 | 98 | 21 | 0.52 | 0.18 | 1.9e-07 | 0.00014 | 0 | 9e-05 |
Bioenergybioenergy | 1 | 0.63 | 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.05 | 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.2966 | 0.6 | gas | 1 | 30 | 1 100 | 48 | 29 | 36 | 1.1 | 1.2 | 3.6e-08 | 0.0018 | 0 | 2e-05 |
PLACEHOLDER — French value carried, not UK data: 2050 vehicle production and the material each vehicle carries. The mass columns are technology and travel; production_2050 and electric_share are a national industrial scenario and do not. Britain built 779 000 cars in 2024, its lowest output since 1954 and about half France's, so carrying the French production figures overstates the British material account by roughly a factor of two. The direction is knowable and the number is not. What would close it: SMMT's Motor Industry Facts annual vehicle production series, plus a 2050 assumption — which for the UK is a political question rather than a published trajectory.
| 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 |
PLACEHOLDER — French areas carried, not UK data. The seven class ids are the model's and are fixed; the areas are France's, and they add up to France's territory rather than to the United Kingdom's. Nothing reads them: land_module_active is 0. A national land-cover survey with one nomenclature and a published national total is what replaces them, and the areas have to be declared at the survey's own precision because the account's closure is asserted on their sum.
| 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 |
PLACEHOLDER — French factors carried, not UK data. Three cases, mildest first, as factors on the base-year production and mortality at the horizon. A national forest-sector projection with named climate cases is what replaces them; the number of rows may differ, and the forestClimate lever's range follows it automatically. Nothing reads them: land_module_active is 0.
| 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.6 |
PLACEHOLDER — French values carried, not national data. The six category ids are the model's and are fixed; the herd, the emission factors and the grassland requirement are France's. A national farm survey for the herd and the national inventory's own livestock lines for the factors are what replace them, and the per-head factors have to be re-calibrated on the national total or the base-year check will not close. Nothing reads them: land_module_active is 0.
| 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 |
PLACEHOLDER — French values carried, not national data. The five product ids are the model's and are fixed; the consumption, the trade position and the production are France's. A national food balance sheet and farm survey replace them, and the export volumes have to be derived from the other three so the base year closes exactly. Nothing reads them: land_module_active is 0.
| 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. Four of the eight are now anchored on a published British pathway rather than chosen, which is more than the French file can say, and the other four are teaching rules and are marked as such below. PERIMETER, and it is the thing to get right. The four emission bands are on the GAME perimeter — a life-cycle footprint that charges every sector the full emissions of its electricity and that INCLUDES international aviation and shipping — and not on the DESNZ inventory the sector cards show. For the United Kingdom there are three perimeters in play, not two: the inventory total excludes international aviation and shipping, the carbon budgets from CB6 onwards include them, and the game's footprint is a third thing again. Scoring one against another's band would be meaningless. The four emission bands are the CCC Balanced Pathway's 2050 sector levels plus international aviation and shipping where the sector carries it, and the warning band is 1.5 × good throughout — the French file's ratio, carried because nothing in the British data suggests a different one. It is the only teaching rule left inside a published band. THE PEAK BAND IS FES'S OWN 2050 RANGE for electric heating at the average-cold-spell peak: 43.6 GW in Holistic Transition (good) and 53.0 in Electric Engagement (warning). Falling Behind's 28.2 GW is deliberately NOT the good band — it is low because the country failed to electrify, and rewarding it would invert the lesson. IT DOES NOT BIND AT THE REFERENCE, AND THAT IS THE BRITISH FINDING. The model's own reference scenario puts the British heating peak at 12.0 GW against a French 50.6, because Britain starts at 5.2 GW of electric heating where France starts at 40. Across the building levers' full range the British figure runs from 12 to 62 GW, so the band does bite — but only for a scenario that actually electrifies. Britain has headroom France does not, and a peak indicator that stayed green throughout would have hidden the one place the two countries genuinely differ. THE THREE BIOENERGY BANDS ARE RESOURCE CEILINGS, AND THEIR LABELS SAY SO. The French rows are called "biogas", "biofuels" and "wood energy" because the French scenario assumes every 2050 molecule is biogenic, so the demand and the resource are the same quantity. The British scenario does not assume that — efGas is 200 gCO₂/kWh, not 25 — so the quantity the scoreboard measures is METHANE BURNED and the band it is measured against is BIOMETHANE AVAILABLE. The British labels are rewritten to say that, because a row reading "biogas: 428 TWh against a target of 21" would otherwise look like a unit error rather than the finding it is: Britain's default scenario burns seven to twenty times more methane than any British study says the country can make biogenic. The numbers. biogas spans NESO's own disagreement with itself: FES sheet F.70 gives 21.04 TWh of biogas feedstock in 2050 and sheet F.22 gives 5.85 bcm of biomethane supply, which is 64.4 TWh at the workbook's own 1 bcm = 11 TWh. Rather than pick one, good is the low reading and warning the high one. biofuel is the CCC's own 53.45 TWh of sustainable aviation fuel in 2050, plus a margin to 70 for the road biofuel and the synthetic share. biomass is NESO's 2050 solid-biomass supply, 117.30 TWh in Holistic Transition and 143.61 in Electric Engagement — and note what the second of those means: NESO's most electrified pathway is also its most import-dependent, at 31% of bioenergy imported against 4% in its hydrogen pathway. The band cannot express that, and the controversy table does. agriculture IS DECLARED AND IS NOT SCORED HERE. This edition switches the land and food module off (land_module_active: 0), so the three agriculture rows of the post table are empty by construction and the scoreboard omits the line rather than showing a free green zero. The band is declared so the table has one shape in every edition: good 26 is the CB7 Balanced Pathway's 2050 agriculture level of 26.4 MtCO2e rounded, and warning is 1.5 x good, the same ratio the four emission bands above use. sink IS THE BALANCED PATHWAY'S OWN 2050 LULUCF FIGURE, added in 0.26.0: −29.892 MtCO₂e (official_natural_sink_2050), rounded to 30 — the naturalSink slider's step and its default — so that the reference is not charged a third of a point for a rounding. It scores the land sink as a magnitude, because the net line is hinged at zero and stops charging a scenario for leaning on the land the moment it crosses; the French file gives the full argument. In Britain the direction is the opposite of France's — the land has to become a sink at all — so the band reads as a ceiling on how much of that a scenario may bank, not as a forest the player is being told to spare. warning 40 is the top of the slider, a teaching rule. techsink IS THE BALANCED PATHWAY'S OWN ENGINEERED REMOVALS, added in 0.31.0: 35.817 MtCO₂e (official_technological_sink_2050), rounded to 36, the slider's step and its default. It is scored the way the net line is, against gross emissions: a megatonne of engineered removal beyond the pathway costs exactly what it buys on the net line, so dragging techSink past 36 buys nothing and a scenario past it cannot win. Britain is the one edition where this line has a modelled, published figure behind it rather than a residual or a projection. warning 60 is the top of the slider.
| Row | good | warning |
|---|---|---|
Total emissions, game perimetertotal | 64.6 | 96.9 |
Transport emissionstransport | 24.6 | 36.9 |
Building emissionsbuilding | 2.1 | 3.2 |
Industry emissionsindustry | 3.8 | 5.7 |
Agriculture emissionsagriculture | 26 | 39 |
Winter electricity peakpeak | 43.6 | 53 |
Methane burned, against UK biomethane supplybiogas | 21 | 64 |
Liquid low-carbon fuel, against UK sustainable supplybiofuel | 53 | 70 |
Wood energy, against UK biomass supplybiomass | 117 | 145 |
Land sink reliancesink | 30 | 40 |
Engineered removalstechsink | 36 | 60 |
A model that shows its sources still hides which of them are argued over. This table names them, for the United Kingdom. Three of the eight rows are British arguments that France does not have — imported wood pellets, the electricity-to-gas price ratio, and a land-use balance that has to cross zero — and one French argument has no British counterpart: nobody in Britain is asking whether to build fifty per cent nuclear.
| Row | topic | weight | position | contested | settles_it |
|---|---|---|---|---|---|
Whose forest is the wood from?wood_imports | emission factors | high | 27 gCO₂/kWh, the French value, because no British figure was secured — and the British chain is not the French one. | A large share of British wood energy is pellets shipped from North America. The biogenic convention books the CO₂ against the forest that regrew, not the boiler, and says nothing about the ocean crossing or about whether a Louisiana pine plantation regrows on the timescale the convention assumes. The CCC recommends halting imported biomass for BECCS by 2050; NESO's most electrified pathway imports 31% of its bioenergy. This model charges none of that. | A well-to-tank factor for imported pellets, and a carbon-debt payback period for the forests they come from. The first is a lookup in the DESNZ/DEFRA conversion factors; the second is a live scientific argument. |
36 MtCO₂ a year of capture that nothing here buildstechnological_sink | carbon sinks | high | 36 MtCO₂e, the CCC Balanced Pathway's own 2050 figure — a published variable rather than the closure residual the French edition carries. | Better sourced than France's and no cheaper to move: nothing here builds the capture plant, powers it, or pays for it. It is larger than the residual emissions of five of the six sectors put together, and it is what takes the British total net negative in 2050. Around 60% of it exists to offset aviation, which is a political statement disguised as an accounting one. | Costing it — in pounds and in the energy capture itself consumes — and charging that back to the scenario. Not modelled. |
British land emits. Can it be made to absorb?natural_sink | carbon sinks | high | +30 MtCO₂e absorbed in 2050, where the Balanced Pathway lands — from a land use that emits +0.3 today. | The British land-use balance has to CROSS ZERO inside the game's own horizon: it is still a source in 2035 and a sink of 30 by 2050. That means afforestation at a rate Britain has never achieved, peatland restoration on a scale nobody has costed, and taking land out of agriculture in a country that imports half its food. It is also the most uncertain line in the inventory: the 95% confidence interval on today's +0.3 spans zero. | Peatland condition surveys and a woodland-creation rate that has actually been delivered. Neither exists at the scale the pathway assumes. |
Is 53 GW the right red line?peak_limit | system constraints | medium | Target 43.6 GW, limit 53.0, on the electric-heating contribution to the winter peak alone — NESO's own 2050 range. | The band is NESO's, which is better than a teaching rule, but the model has no supply-side balance to check it against. And in Britain the peak is not a fixed physical constraint at all: NESO's pathways move it by tens of gigawatts through demand-side flexibility — smart charging, vehicle-to-grid and heat-pump shifting — which this model has no lever for. Britain's failure pathway has the LOWEST heating peak of the four, because the country never electrified. | An adequacy study, and a flexibility lever. The model has neither. |
Electricity costs four times gas at the British meterelectricity_gas_price | costs | high | 257.5 £/MWh of electricity against 64.2 of gas — a ratio of 4.0, against about 1.9 in France. Both are observed 2025 prices. | Not the numbers — they are DESNZ's — but what the model does with them. At that ratio a heat pump with a seasonal COP of 3 LOSES a British household money before any capital cost, which is most of the explanation for why British heat-pump uptake trails the rest of Europe. The ratio is a policy choice: Britain loads legacy policy costs onto electricity and not onto gas. The model holds today's prices fixed to 2050 and so assumes that choice is never revisited. | A policy-cost rebalancing scenario, which is a government decision and not a measurement. |
Aviation is the whole British transport problem in 2050aviation_residual | transport | high | Surface transport falls to 1.1 MtCO₂e by 2050 and aviation to 22.7 — twenty times larger. Both are the CCC's own figures. | The pathway offsets the residual with engineered removals rather than abating it, and the CCC says so: around 60% of all British engineered removals in 2050 exist to cancel flights. Meanwhile the flight table in this package is still French, so the ticket module prices British fuel for French routes. A British edition that leaves aviation as a fixed block is teaching the wrong lesson about the country. | Rebuilding `flight_type` on CAA and DfT categories, and a demand-side aviation lever. Both are work, not lookups. |
One bioenergy envelope, three scoreboard bandsbiomass_ceiling | resources | medium | Bands of 21 TWh of biogas, 7 of biofuel and 117 of wood, in the proportions NESO's 2050 supply table gives. | The CCC publishes ONE envelope — 118.88 TWh of bioenergy for the whole economy in 2050 — and the game wants it split three ways. NESO's own two sheets do split it and disagree with each other by a factor of three on biomethane. And the deeper question the bands cannot express is whether the wood is British: imports are 4% of NESO's bioenergy in one pathway and 31% in another. | Reconciling FES sheets F.22 and F.70, and a GB potential from JRC ENSPRESO on a stated perimeter. |
Twenty entries in this package are still Frenchplaceholders | accounting | high | A provisional edition. Every placeholder is labelled in its own `why` and listed in the package's NOTES.md. The stage-A land block is a placeholder throughout and is *not* among the twenty: it is switched off here, it reaches no result, and it draws no control. | Not contested — declared. The heat-network fuel mix, the flight categories, the vehicle production, the waste-heat ratios, the life-cycle electricity factor, the wood price and the household transport budgets are French numbers wearing British labels. They are here because a `todo` stops the build and a labelled placeholder does not, and because a half-finished package that is readable is worth more than one that does not load. Do not quote a number out of this package without reading its entry first. | The sources named in each placeholder's `why`, and in bibliopdf/todownload.md. |
PLACEHOLDER — French value carried, not UK data: waste_heat_share, waste_heat_hot_share and elec_efficiency_ceiling, which come from ADEME's chaleur fatale study and from RTE's per-branch electrification ceilings. They are RATIOS per unit of fuel burned rather than stocks, so they are the most structurally portable French numbers in this file — heat that is a by-product of combustion disappears when the combustion does, wherever the boiler is. Two reasons to distrust them here anyway. The British branch groups are not the French ones — the CCC leaves mechanical engineering, electrical engineering and textiles inside "other industry", so other_diverse carries a wider and differently-shaped set of processes than ADEME measured. And other_diverse in this package also holds 21.6 TWh of non-road mobile machinery, which is diesel in construction plant and has no recoverable waste heat at all. What would close it: a British industrial waste-heat assessment. There is no direct equivalent of the ADEME study; the nearest is the Industrial Energy Efficiency Accelerator and the heat-network zoning evidence base.
| 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 |
Waste to energywaste_to_energy | 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 | No chain burns liquid fuel since 0.29.0: the cement kiln's 0.358 MWh a tonne of "liquid" was the teaching workbook's, and a French kiln burns petroleum coke, coal and waste instead. Kept so the account stays constructive. |
chain_hydrogenper row of industry_chain | row.chain_production * row.hydrogen / 1000 | TWh/y | — |
kiln_heat | cement_production * kiln_heat_per_tonne / 1000 | TWh/y | What the cement kilns burn: clinker times the French fleet's 1.064 MWh a tonne. Split below between what is fossil and what is biomass, because the carriers the model has are fuels and a kiln burns a mix of them that the player chooses with |
kiln_fossil_heat | kiln_heat * (1 - kilnAltFuel * kiln_waste_biomass_share) | TWh/y | Petroleum coke, coal and the fossil half of the waste, all on the coal carrier. At 2020's mix — 43% waste, half of it biomass — this gives 0.281 t of fuel CO₂ a tonne of clinker, against the 0.284 the French kilns were observed at: the fossil half of the waste burns within a few per cent of coal's factor, so one carrier carries both honestly. |
kiln_biomass_heat | kiln_heat * kilnAltFuel * kiln_waste_biomass_share | TWh/y | The biomass half of the waste — animal meal, wood waste, sludge — on the wood carrier, where it draws on the wood pool the land supplies. Not all of it is wood, and the pool is the nearest one the model has. |
kiln_fuel_co2_per_tonne | kiln_heat_per_tonne * (1 - kilnAltFuel * kiln_waste_biomass_share) * sum(post.efficiency_fuel_factor, post.id == "cement") * ef_coal / 1000 | tCO₂ per tonne of clinker | The fossil CO₂ of the kiln fuel per tonne of clinker, after the industrial efficiency lever, so that capture and the carbon price can reach it. The same quantity the coal carrier books for the cement post, read per tonne. |
kiln_biomass_co2_per_tonne | kiln_heat_per_tonne * kilnAltFuel * kiln_waste_biomass_share * sum(post.efficiency_fuel_factor, post.id == "cement") * kiln_biomass_co2 | tCO₂ per tonne of clinker | The biogenic CO₂ of the kiln's waste, per tonne of clinker. Never counted as an emission; it goes up the same stack as the fossil, so a capture plant takes it too, and the CO₂ has to be shipped and stored whatever its origin. |
cement_captured_fossil | cement_production * (cement_process_per_tonne + kiln_fuel_co2_per_tonne) * carbonCapture / 1000 | MtCO₂/y | What |
cement_captured_biogenic | cement_production * kiln_biomass_co2_per_tonne * carbonCapture / 1000 | MtCO₂/y | Shown, not counted, for the reason |
cement_capture_power | cement_production * cement_capture_extra_electricity * carbonCapture / cement_capture_reference_rate / 1000 | TWh/y | The electricity the cement capture plants draw. It is added to the cement post after the industrial efficiency lever, which was sized on the grinding mills and cannot shave a solvent's regeneration heat. |
steel_bf_process_residual | steel_bf_direct_intensity - industry_chain["steel_bf"].coal * ef_coal / 1000 | tCO₂ per tonne of steel | A remainder, not a measurement. The route's direct total, |
chain_process_per_tonneper row of industry_chain | steel_bf: steel_bf_process_residualsteel_dri: steel_eaf_process_per_tonnesteel_eaf: steel_eaf_process_per_tonneolefins: -olefin_carbon_per_tonne * biogenicCO2cement: cement_process_per_tonne * (1 - carbonCapture) - carbonCapture * kiln_fuel_co2_per_tonnedefault: 0 | tCO₂ per tonne of product | Emissions no change of fuel can remove: the limestone carbon in cement, the carbon locked into synthetic olefins — a credit, hence negative — the blast-furnace residue left once its coal has been counted as energy, and, since 0.27.0, the electrodes and charge carbon of the two electric-furnace routes. |
chain_emissions_per_tonneper row of industry_chain | row.coal * ef_coal / 1000 + row.chain_process_per_tonne + (kiln_fuel_co2_per_tonne if row.id == "cement" else 0) | 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) * (1 - otherIndustrySobriety) | 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. Then the whole block is scaled by |
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: 0waste_to_energy: 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_totalwaste_to_energy: 0steel: 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_fuelcement: kiln_biomass_heatother_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") + kiln_fossil_heatresidential_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_efficientper row of post | row.energy_electricity_direct_raw * row.efficiency_elec_factor | TWh/y | — |
energy_electricity_addedper row of post | cement: cement_capture_powerwaste_to_energy: wte_capture_power + plastic_recycling_powerdefault: 0 | TWh/y | What the two capture levers draw, since 0.32.0, and the plastic recycling lines, since 0.33.0. Outside the efficiency lever and inside the direct demand, so the mix has to produce it. |
energy_electricity_directper row of post | row.energy_electricity_efficient + row.energy_electricity_added | 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_capturedwaste_to_energy: wte_fossil_co2livestock: 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 | — |
The incinerators that turn residual waste into heat and power. The inventory books their fossil CO₂ to the energy sector, not to waste, and until 0.28.0 this model booked it nowhere: national_waste slides between two published waste totals that exclude it by construction, and the power sector here is the electricity mix alone.
| Name | Formula | Unit | Notes and sources |
|---|---|---|---|
wte_fossil_co2 | wte_fossil_burned * (1 - wteCapture) | MtCO₂/y | The base year's fossil CO₂, of which the plastic share follows plastic demand: |
wte_fossil_burned | wte_fossil_co2_base * (1 - wte_plastic_fossil_share + wte_plastic_fossil_share * (1 - plasticReduction) * (1 - plasticRecycling)) | MtCO₂/y | The fossil CO₂ the incinerators release before any capture. The plastic part follows what is consumed, |
plastic_recycled | wte_fossil_co2_base * wte_plastic_fossil_share * (1 - plasticReduction) * plasticRecycling / plastic_fossil_co2_per_tonne | Mt/y | The tonnes of plastic the recycling lever takes away from the incinerators, read back from their CO₂ at 2.75 t a tonne. |
plastic_recycling_power | plastic_recycled * plastic_recycling_electricity | TWh/y | What the recycling lines draw, booked on the waste-to-energy post for want of a post of their own. |
wte_fossil_captured | wte_fossil_burned * wteCapture | MtCO₂/y | The fossil CO₂ the capture plants take, which is what lowers the total. |
wte_biogenic_captured | wte_fossil_co2_base * wte_biogenic_share / (1 - wte_biogenic_share) * wteCapture | MtCO₂/y | Shown, not counted. The biogenic CO₂ the same capture plants take with the fossil: 1.5 tonnes for every fossil tonne of the base year in France, one in Germany, and it does not fall with plastic demand, because it is the food, paper and wood in the bin. It would be a removal, and removals are what |
wte_capture_power | (wte_fossil_captured + wte_biogenic_captured) * wte_capture_electricity | TWh/y | The electricity the incinerators stop exporting to run their capture plants, booked as a demand on their own post: every tonne captured, fossil or biogenic, at 0.315 MWh. Since 60% of what French plants capture is biogenic, 0.79 MWh of it is spent for each fossil tonne the total loses, and more once plastic sobriety has thinned the fossil part. |
| 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_efficient) + 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. |
forest_volume_balance_2024 | (forest_production - forest_mortality) * forest_production_area - forest_harvest_base * forest_harvest_volume_factor | Mm³/y | The same balance on base-year quantities: no climate factor, and the inventory's own harvest — 19.9 Mm³/y in France, against the +19.5 IGN measures. It is the point the living-biomass line is anchored at: the inventory's pair sets the level there, and the marginal coefficient carries it to 2050. Its quantities are IGN's 2014–2022 means, so the point is the campaign's median year, 2018, under the base year's label: the inventory's 2024, extrapolated on a mortality still rising, splits the same total differently ( |
forest_carbon_growth | forest_carbon_k + (forest_carbon_ratio_base - forest_carbon_k) * forest_volume_balance_2024 / (forest_production * forest_production_area) | tCO₂/m³ | What a cubic metre of gross production stores in the living trees. It is derived, not declared: the marginal |
land_sink_forest_biomass | forest_carbon_k * forest_volume_balance + (forest_carbon_growth - forest_carbon_k) * forest_production_2050 * forest_production_area | MtCO₂/y absorbed |
|
land_sink_forest_dead_wood_2024 | forest_dead_wood_coefficient * forest_mortality * forest_production_area | MtCO₂/y absorbed | The dead-wood sink of the base year: what the inventory added to the forest line in its 2025 edition, when it began to model dead wood explicitly from the observed mortality, and what the pool is calibrated on. |
forest_dead_wood_retention | land_module_active * 0.5 ** (land_horizon_years / forest_dead_wood_half_life) + (1 - land_module_active) | fraction | What is left at the horizon of a tonne of dead wood from the base year: |
land_sink_forest_dead_wood | forest_dead_wood_retention * (land_sink_forest_dead_wood_2024 + forest_carbon_k * (forest_mortality_2050 - forest_mortality) * forest_production_area) | MtCO₂/y absorbed | Dead wood as a first-order stock, in the closed form of the wood-products pool: with a constant inflow from the base year on, the horizon flux is |
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_ratio_base * forest_volume_balance_2024 + land_sink_forest_dead_wood_2024 + forest_litter_soil_sink + forest_overseas_sink - land_peat_forest_2024 | MtCO₂/y absorbed | The same lines on base-year quantities, with no climate factor and no afforestation term: the living biomass at the inventory's own pair, the dead wood at its base-year flux, and a standing forest that already contains everything planted before the base year, which the inventory's forest line already counts. 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. Two dates under one label, in France. The living biomass and the dead wood are read at the IGN campaign's median year, 2018, because that is where the production, mortality and removals come from; the total they are closed on, and so the litter-and-soil residual and the French Guiana line, is the inventory's 2024. The inventory splits the same total at its own 2024, after six more years of mortality: 25.5 of living biomass and 22.56 of dead wood. Re-anchoring the two pools there was measured in stage C and not taken: it would move the 2050 natural sink by −2.2 to +2.2 MtCO₂e depending on the cubic metre the inventory's mortality is converted at, which no source fixes, against a reference margin of 2.63 under its band and a pinned winner's of 2.04 ( |
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 goes negative inside the declared ranges only in one corner — the harvest at its floor and the timber share at its top, −0.2 Mm³, or −6.2 with the long-lived share at its minimum too — and where it is positive 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. That is also why |
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 and, since 0.28.0, the fossil carbon of the incinerators, 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. |
sink_reliance | -national_natural_sink | MtCO₂e/y absorbed | How much of net zero this scenario buys with the land: the natural sink as a magnitude, so it can be read against the trajectory the country's own strategy publishes for it. Scored on a line of its own, and not only inside the net, for two reasons. The two sinks are different objects — one is a forest, reversible, exposed to drought, fire and pests, and expected by the official pathways themselves to weaken; the other is a closure residual — which is the High Council on Climate's case for budgeting reversible sequestration and permanent removals separately. And the net line is hinged at zero: once a scenario crosses it, it stops reading either sink, so a player could buy the last megatonnes by cutting less wood and see no score move at all. This line has no hinge. |
tech_sink_reliance | -national_technological_sink | MtCO₂e/y absorbed | The engineered removals a scenario counts on, as a magnitude, so they can be read against the volume the country's own strategy plans. The natural sink has its own line; this is the other half of the High Council on Climate's recommendation to budget the two apart. Scored the way the net line is, against gross emissions and not as a percentage of its band, because the published volumes run from zero to forty-odd megatonnes and a percentage of nothing is undefined. |
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 / cement_capture_reference_rate) * elecPriceIndustry + carbonCapture * (cement_process_per_tonne + kiln_fuel_co2_per_tonne + kiln_biomass_co2_per_tonne) * co2_transport_storage_cost | €/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 | — |
cement_capture_cost | cement_production * carbonCapture * (cost_route["cement_kiln_ccs"].route_annuity - cost_route["cement_kiln"].route_annuity + cement_capture_extra_electricity / cement_capture_reference_rate * elecPriceIndustry) / 1000 + (cement_captured_fossil + cement_captured_biogenic) * co2_transport_storage_cost | M€/y | What |
wte_capture_cost_total | (wte_fossil_captured + wte_biogenic_captured) * (wte_capture_cost + co2_transport_storage_cost) + wte_capture_power * elecPriceIndustry | M€/y | What |
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 pounds, 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, the United Kingdom 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 | the Wood Heat Association energy price index, Q2 2025 |
| Floor area, 4 200 Mm² of which 77% residential | Denominator of the £/m² indicator | Published | the Carbon Trust BatiZoom, after ECUK |
| 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 | the ONS Première 1855, Budget de famille 2017 |
| 31.377 million households; 11 600 km per car per year | Denominator and fleet conversion | Published | the ONS 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 | the Carbon Trust / SPON's 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 | the Carbon Trust 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.