The World Energy Model: Structure, Weights, and Behaviour

This report describes a model of the world energy system. The model has 86,622 nodes and 197,068 weighted links. It shows how a change at one point in the system travels to every other point.


1. What the model does

The model answers one question. If something changes here, what changes elsewhere, by how much, and how soon?

A node is one part of the system: a price benchmark, a national grid, a power station, a household group, or a recorded disaster.

A link connects two nodes. Each link carries a weight, and the weight says how strongly a change at the first node moves the second.

A change is applied at one or more nodes. The model then calculates the effect at every other node.


2. What the model contains

Node typeCountWhat one node is
Power station34,936One real United States plant, with its coordinates
Consumer group35,207Households or industry in one district
Fuel supply725One fuel in one country
District571One part of a national grid
Historical event9,259One recorded disaster, with its real damage cost
National grid3,546The power system of one country
Price benchmark6One traded price, such as Brent crude
Behaviour channel6One psychological effect on demand
Climate system2Carbon dioxide level and temperature anomaly
Total86,622

3. Where the numbers come from

SourceWhat it gives the modelSize
Energy Institute Statistical ReviewFuel mix and electricity demand for each country299,321 rows, 1965 to 2025
Our World in DataFuel shares for 182 more countries11,285 country-years
WRI Global Power Plant Database v1.3Every generating unit in the world database, at its recorded coordinate, with capacity and fuel34,936 units, 167 countries
GeoNames cities15000Settlements above fifteen thousand people, and the population and concentration of each administrative division34,068 settlements, 2,786 divisions
USGS earthquake catalogueEarthquakes of magnitude 5.5 and above that reach infrastructure8,733 wired events
NGA World Port IndexPorts2,896
FREDDaily price histories9 series, 38,633 observations
EM-DATRecorded disasters with damage costs27,727 events; 14,057 energy-relevant
NOAA Mauna LoaCarbon dioxide level820 months
NASA GISTEMPGlobal temperature anomaly146 years
LASP LISIRD, NRLTSI2Total solar irradiance, the solar constant the space layer runs on44 years, with uncertainties
NOAA CPC, Oceanic Niño IndexEl Niño and La Niña917 overlapping seasons, 1950 on
NOAA CPC, standardised NAOThe North Atlantic Oscillation917 months, 1950 on
Orbital geometryAnnual mean insolation by latitude. Computed, not measured, and checked against S0/418 bands
Allen Brain AtlasBrain structures for the behaviour nodes6 channels matched
FAOSTATNitrogen fertilizer use12,734 area-years

The complete data set is 11.5 GB. It is stored in 13 folders by subject.

One group of values is not measured. The consumer response values come from published studies. These are the only assumed parameters in the model, and they are marked as assumed in the provenance report.


4. How the model calculates

4.1 The state of a node

Each node holds one number. This number is the effect. An effect of 0 means no change. A positive effect means more stress or a higher price. A negative effect means relief or a lower price. The effect stays between -1 and +1.

4.2 Which way a link carries

Most couplings in this system run both ways. A grid and the plants feeding it move together, and so do a price benchmark and the supplies priced against it. Two layers are different. An earthquake acts on a grid and no grid causes an earthquake, and the same holds for the climate.

So the layers carry a rank: climate 0, events 1, everything else 2. A link between equal ranks carries in both directions. A link that crosses a rank carries one way only, from the lower rank to the higher. The exogenous layers drive and are not driven.

4.3 How a node weighs its drivers

Each link is divided by the number of links arriving at the same node from the same layer. A layer therefore speaks once however many members it has, and the members split that one voice between them. What remains is divided by the node's total incoming weight, so a node's inflow is the weighted mean of what its drivers are carrying.

The mean rather than the sum is the load-bearing choice. A national grid carries thousands of plants, and a node that added what its drivers carried would multiply a change by its own degree instead of distributing it.

4.4 The calculation

The model repeats these steps until the numbers stop moving:

  1. For each node, take the weighted mean of the effects arriving along its links, using the coefficients from 4.3.
  2. Multiply that inflow by (1 − inertia) for that node.
  3. Add the applied change at that node, if any.
  4. Apply the tanh function. This keeps the result between -1 and +1.
  5. Move the node most of the way to this new value.

The model stops when no node moves more than 0.00001 in one step, and gives up at sixty steps. Nothing in this write-up reaches sixty.

5. How the model is weighted

5.1 Link weights

There are 197,068 links, with weights between -0.670 and +1.000. Of these, 1,144 are negative. A negative link carries relief rather than stress.

LinkWeightWhere the weight comes from
Climate system → temperature0.85Fixed. The temperature follows the forcing closely.
Oil price → related prices0.70 to 0.80Observed price correlation
Fuel supply → national grid0.55 × fuel shareThe real share of that fuel in that country's power
Price benchmark → fuel supply0.35 + 0.40 × shareHigher where the country depends more on that fuel
National grid → district0.60Fixed. Districts are parts of the grid.
District → consumer group0.50Fixed.
Historical event → grid0.05 to 0.50log10 of the real damage cost in dollars
Temperature → national grid0.30Heating and cooling demand
Temperature → gas and power price0.15 to 0.20Heating and cooling demand
Consumer group → districtnegativeDemand response. Consumers use less when costs rise.
Power station → grid0.45 ÷ plant countNormalised. See section 5.3.

5.2 Node inertia

Inertia says how strongly a node resists change. A value of 0 means the node reacts at once. A value of 1 means the node almost never moves.

Node typeInertiaReason
Historical event0.15An event happens at once.
Price benchmark0.09 to 0.30Set by the real volatility of that price series. A more volatile price reacts faster.
National grid0.30A grid must balance in seconds.
Fuel supply, district0.35Supply chains take weeks.
Consumer group, power station0.45People and plants change slowly.
Climate system0.45 to 0.55The climate is a slow variable.
Behaviour channel0.75Habits change very slowly.

5.3 Fan-in normalisation

A grid has thousands of plants connected to it. If each plant sent its full link weight, China's 4,235 plants would together send 1,042, and the grid would saturate for any change at all.

The model divides each link by the number of links reaching the same node from the same layer, so a layer's total influence does not grow with its membership. Adding more plants therefore improves the detail of the model. It does not make the grid more sensitive.

The rule keeps the layers commensurable. The Chinese grid hears its plants at 0.246, its markets at 0.265, the climate at 0.300, its fuel supplies at 0.108 and the disaster record at 0.500, so a change in the country's coal supply moves it and a change at one of its 4,235 plants does not.

6. How the model behaves

Kind of changeWidest in that kindNodes that changed
Universe & Earth, exogenousA step in climate forcing77,669
Climate goal meetingsParis, fully met76,165
Country policy changesThe United States retires coal13,969
Natural disastersA major California earthquake13,969
Technology improvement & buildoutFusion arrives at scale6,983
WarsA war of 1939-45 scale5,478
Energy makeup evolutionRenewables pass half of world power5,121
People & cognitionFear becomes salient3,004
Global pandemicsThe Black Death, at today's scale2,744

7. How to run the model

There are three ways. All three use the same calculation.

MethodCommandUse
Juliajulia run.jlFastest. No packages needed.
Terminal applicationpython3 energy_terminal.pyInteractive. Browse, shock, trace routes.
Chartspython3 make_chart.pyProduces the summary figures.

The Julia version and the Python version give the same numbers, node by node. The check file is calibrate/out/parity_target.json.


Figures from this model

Routes through the model from the climate to behaviour

The routes through the system, computed from the link weights. All figures.