Methodology
This page is the fine print: what the model assumes, where it breaks down, and where the numbers come from.
What the optimizer actually does
For each simulated year and region, a Nelder-Mead numerical optimizer chooses how much new capacity to add for each of six sources (solar, wind, nuclear, gas, coal, battery), bounded by that source’s maximum build rate. It minimizes total system cost — financed capital + fixed O&M for everything installed, variable O&M + CO₂ cost + mortality cost for everything generated, plus a steep penalty for any unmet demand (“outage”) — subject to meeting demand in every one of the ~8,760 hours in the year. The optimizer re-runs with progressively tighter tolerances until two consecutive runs agree within 1%, so the answer is a close numerical approximation, not a proven global optimum.
Mortality — the second externality
Alongside CO₂, the optimizer prices mortality. Each source carries a death rate in deaths per TWh (mining and drilling accidents, plus air-pollution and radiation deaths downwind); the objective adds one linear term, generation × death-rate × mortality-price, structurally identical to the CO₂ term. A mortality price of zero reproduces the original model exactly, so the feature is strictly opt-in.
- Coefficients come from Level. They are imported, not re-derived, as a low/central/high band per source, and every figure links back to its Level source page. Battery carries no direct rate — its harm is embodied in the electricity it stores.
- The band is uncertainty, not rounding. Each source’s low–central–high spans genuine disagreement in the epidemiological literature (coal’s from air-pollution exposure modeling; hydro’s high bound from the 1975 Banqiao failure). Deaths sum those ranges across the mix; a priced-mortality cost adds the VSL range on top, so it is reported as a band, never a point.
- Value of a statistical life (VSL). The price per death uses HHS’s 2026 published range ($6.6M / $14.1M / $21.5M, constant 2025 dollars), optionally escalated ~1.1%/yr in real terms. Presented as published values, never as endorsement.
- Deaths are production-based. They’re attributed to the region that generated the power. The model holds inter-regional transmission at its historical level rather than modeling the flows, so it reports a single figure. A distinct consumption-based account — reallocating deaths along inter-regional flows to the regions that actually used the power — would require an explicit flow dataset (EIA-930), and re-optimizing those flows would change every result on the site, not just the mortality ones.
- Mortality only. Morbidity, water, land, minerals, and equity-weighting are out of scope.
The band is scientific uncertainty, not rounding. Each source's death rate is a central estimate with a much higher upper bound — coal's depends on how air-pollution exposure is modeled; hydro's high bound includes the 1975 Banqiao dam failure, its central figure excludes it. Reported deaths carry those ranges across the mix, so a mortality figure is a band skewed upward, never a single number. Pricing a death adds a second range (the VSL is itself low/central/high), so any priced-mortality cost inherits both.
Counted deaths are recorded accidents — a mine-shaft collapse, a rig fire. Modeled deaths are air-pollution and radiation attributions from epidemiological models — a fatal heart attack months after chronic particulate exposure, which no coroner labels “coal.” They're shown distinctly (solid vs hatched) throughout.
Deaths are an accounting attribution to the generating region, not an atmospheric model — real pollution crosses regional boundaries, harming people on both sides of a border. The uncertainty band propagates into any priced-mortality cost, so a priced total is a band, not a single number.
Assigning a dollar value to a death is a moral choice you are making, not a technical parameter the model resolves. The VSL figures are HHS's published range, shown as published values — never as endorsement.
The full framing lives on the Safety & mortality page.
Assumptions and limitations
- Historical supply is treated as demand. The EIA data records what was generated, not what was needed; the model assumes those were equal. That holds in normal operation but breaks during a forced outage: in Winter Storm Uri (February 2021), the Texas grid failed and over 4.5 million people lost power for days, so recorded supply fell far below the demand people actually had. The model treats that suppressed supply as demand and can’t see the shortfall.
- Transmission held at historical levels. Each of the 13 regions is optimized on its own — the model treats each region’s historical generation as its demand and doesn’t re-optimize power flows between regions, so whatever net transfers happened in 2020–2025 are frozen in. A region can’t newlyimport cheap wind from its neighbor at 3am, but it isn’t cut off from the transfers it historically relied on either.
- Hydro, oil, and “other” aren’t optimized. They’re assumed to scale with demand growth exactly as historically observed, and are excluded from the build/dispatch decision entirely.
- One battery, grid-scale. Storage is modeled as a single aggregate battery per region (round-trip efficiency and hours-at-rated-power from
Specs.csv), not specific technologies, siting, or transmission-level constraints. - Historical weather repeats. Each simulated year reuses the same 2020–2025 hourly capacity-factor patterns for solar and wind. The model doesn’t project future weather, climate change effects on renewable output, or extreme-weather grid stress.
- No sub-hourly dynamics. Frequency regulation, ramping constraints, and anything faster than an hourly time step are out of scope.
- Straight-line demand growth. Demand grows by a constant yearly multiplier — there’s no explicit modeling of electrification (EVs, heat pumps) as a distinct demand driver, though a higher growth rate can stand in for it.
Land use: total area vs. land actually occupied
Land is where the renewables face their real siting constraint — and where a single number misleads. A wind farm spans a large area, but its turbines, pads and roads occupy only a sliver of it; the rest stays farm or rangeland. Reported as total enclosed area, wind looks land-hungry; reported as land actually occupied, it uses far less than solar. Both figures are real; quoting only the first overstates the footprint by roughly 100×.
Reporting only the total area overstates solar (pv)’s footprint by 1.2×. Fixed-tilt utility PV. Panels cover most of the enclosed site, so total and occupied area are close. (Ong et al. 2013 (NREL/TP-6A2-56290))
Reporting only the total area overstates wind’s footprint by 98×. Turbine spacing makes the enclosed area large, but pads, roads and substations occupy only ~1%; the rest stays farmable. (Denholm et al. 2009 (NREL/TP-6A2-45834))
Faint bar = total area enclosed, solid = land actually occupied (km² per TWh/yr). By total area wind spans far more than solar; by land it actually uses, it needs far less — the gap is turbine spacing, which stays farm or rangeland. Thermal plants (coal, gas, nuclear) are left out: their on-site footprint is small but their land use is dominated by off-site mining and drilling, which has no single defensible per-MWh figure.
This dimension is reported, not priced. Thermal plants are omitted on purpose — see the note above.
Cost and data sources
- Hourly generation data: US Energy Information Administration (EIA) API, per-region hourly fuel-type generation, January 2020–December 2025.
- Capital costs: EIA Annual Energy Outlook 2025 capital cost assumptions, cross-checked against the IEA/NEA Projected Costs of Generating Electricity 2020 report.
- Plant lifetimes, fixed/variable O&M, and per-source build-rate caps are maintained in the underlying engine’s spec sheet and applied identically across all 13 regions.
- CO₂ intensity: per-source emissions factors (tonnes CO₂ per MWh) come from the engine’s
Specs.csvspec sheet, applied identically across all 13 regions. These per-MWh intensities are consistent with published lifecycle emission ranges (e.g. IPCC AR5, EIA), though we don’t claim an exact one-to-one derivation from any single published source.
Determinism and versioning
Every pre-computed result records the engine version, spec-sheet version, and EIA data version it was generated with. Comparing two scenarios generated under different versions of any of the three may reflect a change in assumptions, not just the policy knobs you changed — the Compare view is only an apples-to-apples comparison when those versions match.
Source and license
This site is built around the modeling engine and data pipeline from cliffgold/Optimize. As of this writing, that repository does not specify an open source license; treat the underlying model and data accordingly.