← Back to Explore
Explore · The open model · Results

What the open model returns

The open model

DNA-PyPSA

The study verified its main model, cGrid, independently with PyPSA, an open-source framework for optimising power systems. The PyPSA model built for the study is open source, for transparency and for work beyond the report.

These two explorers show that model’s own files: what it is given, and what it returns. Every number links to the file and line it comes from.

Zones
17 bidding zones. Capacity is optimised in DK1 and DK2 only; the other 15 zones have fixed fleets.
Weather
One weather year, 1991, in 8,760 hourly steps (timestamped 2050).
Method
Capacity expansion, then dispatch adjusted step by step until prices and capacities settle (“iterate” mode).
Licence
MIT: free to use, change and share.

What the model builds, scenario by scenario

In each scenario the model chooses Denmark’s generating capacity for 2050, within the options and limits on the Inputs page, then runs the year hour by hour. Denmark as a whole; all seven scenarios.

Installed capacity
Generation in the year
DKBalancedOffshore Bal.OffshoreSolar Bal.SolarNuclear Bal.Nuclear
Demand TWh101.9101.8101.8101.9101.9101.9101.9
Net exports TWh11.76.85.67.76.812.816.9
Curtailment TWh0.000.040.100.010.020.000.00
Unserved demand GWh0.10.233.00.20.00.20.2
Average price €/MWh818910487928075
Hours at or below 0 €/MWh h9991,2291,4021,1261,265964625
Hours above 500 €/MWh h14026647320128713096
Capture rate, wind onshore %67553760586773
Capture rate, wind offshore nearshore %72665067647379
Capture rate, wind offshore %75644769677680
Capture rate, solar residential %48535054524743
Capture rate, nuclear %114119–118–114112
Capacity factor, nuclear %8282–81–8283
Capacity factor, biomass %38414242413937
Capacity factor, waste %87838284848788
Capacity factor, wind offshore nearshore %50494949495051
Capacity factor, wind offshore %52525252525252
Capacity factor, wind onshore %38383838383838
Capacity factor, solar utility %––888––
Capacity factor, solar residential %8889889

Capture rate: the average price a technology earns per MWh, as a share of the average price. Capacity factor: the year’s generation as a share of what the installed capacity could produce running flat out all year. Unserved demand is met by the model’s emergency supply at 3,000 €/MWh.

Danish capacities here are those of the report’s Figure 54 (p.114) (PyPSA) in all seven scenarios. How they compare with cGrid: PyPSA and cGrid compared.

The year, hour by hour

Supply above zero, by source; exports, storage charging and curtailment below it; demand as the green line. Wind and solar produce whatever the 1991 weather gives them; the rest follows the price. Any zone of the model can be shown: outside Denmark the fleets are fixed, but their dispatch is solved with Denmark’s in every scenario.

These are DNA-PyPSA’s own hourly results for one weather year, 1991; the report’s results come from cGrid across 33 weather years. The report compares the two models’ capacity, annual generation and trade (§5.9 Model comparisons (p.111)), not their hourly dispatch.

Resolution
Balanced · Denmark (DK1 + DK2)
Daily averages. Top: where the power comes from and goes; bottom: the price in DK1 and DK2. Zoom with the slider, or pinch or Ctrl-scroll on the chart.
Loading the year’s hours…
Every hour of Denmark (DK1 + DK2) in Balanced, as drawn here.Solved network ↗

Trade with the neighbours

Energy exported to and imported from each neighbouring zone over the year, measured at the Danish border; trade between DK1 and DK2 is left out. This is DNA-PyPSA’s trade for one weather year, 1991, not the report’s cGrid results. The report compares Denmark’s net transmission by neighbour in the two models (Figure 58 (p.118)): PyPSA exports 5.5 to 14.9 TWh less than cGrid, depending on the scenario.

Balanced · Denmark (DK1 + DK2)

DE: Germany · NO125: Norway South/West · GB: Great Britain · SE4: Sweden South · NL: Netherlands · SE3: Sweden South-Central.

Take the results with you

Open a scenario in PyPSA
# pip install pypsa — then, in the cloned repository:
import pypsa
n = pypsa.Network("publication_results/reference/pypsa/pypsa_network")
n.statistics.energy_balance()
n.buses_t.marginal_price[["DK1", "DK2"]].describe()

Prepared from DNA-PyPSA commit f0f1761 by scripts/build_pypsa_data.py in this site’s repository, which checks that supply and demand balance in every hour.