What good calibration looks like
A calibrated model should, for each base year:- Match installed capacity (GW) by technology to within ±5–10% of official statistics
- Match electricity generation (TWh) by technology to within ±5–10% of historical data
- Match total CO₂ emissions (MtCO₂) to within ±5–10% of a national inventory or IEA/IRENA baseline
Before you start: what to fix before calibration
Before touching any calibration lever, make sure the following inputs are already set correctly and will not change during calibration. Adjusting these during calibration risks invalidating earlier work.
Think of these as the structural assumptions of your model. Calibration is about fine-tuning around these, not changing them.
What you can adjust: the calibration levers
Calibration is done by adjusting a specific set of parameters. These are: Residual capacity — the amount of existing installed capacity inherited from the real world. Getting this right is foundational: if your model starts with the wrong amount of coal or solar capacity, every other output will be off. Availability factors — a constraint on how much of the time a technology can operate, expressed as a fraction of the year. For example, an availability factor of 0.7 means a plant can only generate during 70% of the year. This is used to reflect planned outages, seasonal constraints, or fuel supply limitations. There are two variants:availability_factor: the maximum fraction of time a technology can operate in any hour or timesliceavailability_factor_annual_min: the minimum fraction of time a technology must operate across the year (used to force a baseload level of generation)
capacity_additional_max and capacity_additional_max_floor to zero prevents expansion in those years.
Reserve margin settings — the reserve margin is the amount of spare generation capacity a power system is required to hold above peak demand. If the reserve margin is set too high, the model may build extra capacity that never generates, inflating the installed capacity figure. Check both the reserve margin level and which technologies are allowed to contribute to it.
The calibration process, step by step
Step 1: Set up residual capacity
Make sureresidual_capacity is correctly specified for all historical years for which you have calibration data. This is almost always the single most impactful thing you can do. Use official capacity statistics from national energy agencies, IEA, or IRENA as your source.
Once you have reliable residual capacity data, prevent the model from adding any new capacity in those years by setting capacity_additional_max and capacity_additional_max_floor to zero. This ensures the model is working with real-world capacity rather than optimising its own build.
Tip: Run only the years you are calibrating (e.g. 2023–2028) at first. This keeps run times short and makes the calibration loop faster.
Step 2: Investigate the data
Before adjusting anything, run the model once and compare its outputs to your historical data. Check:- Installed capacity by technology
- Generation by technology
- Emissions
Step 3: Fix any infeasibilities
If the model cannot find a solution at all, there is a constraint it cannot satisfy. Common causes:- A reserve margin that no available technology can meet
- A fuel supply limit that is too tight
- A technology with no available dispatchable capacity during some periods
Step 4: Calibrate to historical data
Work through technologies in merit order — from cheapest to most expensive to run — because that is the order in which the model will dispatch them.4a. Renewables first (solar, wind, hydro, geothermal)
Renewables sit at the top of the merit order and should always generate when the resource is available. Calibrate their generation usingcapacity_factor_scaling. If the model is generating too much solar, reduce the scaling factor; if too little, increase it.
4b. Baseload thermal (coal, nuclear)
These technologies run most of the time and provide a steady base of generation. Calibrate usingavailability_factor and/or availability_factor_annual_min. Use at most one of these constraints on a single technology at a time — applying both risks over-constraining the model and causing infeasibilities.
4c. Mid-merit and peaking thermal (gas, oil, biomass, waste)
These technologies fill in the gap between baseload and demand peaks. Calibrate in the same way as baseload thermal, usingavailability_factor and/or availability_factor_annual_min — again, one constraint per technology.
4d. Storage
Storage is the hardest to calibrate. In early calibration years there is often little price spread to incentivise charge/discharge cycles, so the model may not use storage at all even if it exists in reality. You can try forcing storage behaviour usingavailability_factor_annual_min, but watch carefully for what technology ends up charging the storage — forced storage behaviour can sometimes cause unrealistic generation patterns elsewhere. If this happens, it is often better to leave storage uncalibrated in the base years.
Step 5: Tapering constraints after the calibration period
Calibration constraints should not be active indefinitely — they are proxies for real-world conditions that will evolve. Apply the following taper:availability_factor: enforce up to 2030, then linearly increase to your default maximum (typically 0.80–0.90) by 2035availability_factor_annual_min: enforce up to 2030, then linearly reduce to zero by 2035
Step 6: Sense-check future results
Once the calibration period (e.g. 2023–2028) is clean, run the model to your full horizon (e.g. 2050) and check whether the future looks plausible. Red flags to look for:- A cliff-edge of retirements — if many plants were built in the same year and have the same lifetime, they will all retire at once, causing an implausible drop in capacity. Mitigate by spreading out
residual_capacityentries across years so retirements are more gradual. - Implausible technology buildout — a surge of a particular technology in a single year may indicate a reserve margin issue or a constraint that is unexpectedly binding at the end of the model horizon.
- Nuclear build inconsistent with policy — enforce national nuclear policy using
capacity_gross_max,capacity_additional_max, andcapacity_additional_max_floor. - Mismatch with a regional model — if you are building a national model that should mirror a regional one, differences usually come from averaged capacity factors or fuel prices. Use capacity-weighted means rather than simple averages for both.

