Curtailment Output
Contents
Overview | Columns | Calculation | Configuration | Assumptions | Examples | See Also
Overview
File: curtailment.csv
curtailment.csv records the curtailed generation for every VRE (Variable Renewable Energy) asset at every representative time step. Curtailment is the difference between the maximum available generation (capacity × availability factor) and the actual generation (flow). It represents renewable energy that could have been produced but was not dispatched.
Only assets of type VRE produce rows in this file. If the system has no VRE assets, the file will not be written.
Curtailment is not an optimization variable — it is computed from the optimal capacity and flow values after the solve. A value of 0.0 means the VRE asset was fully utilized at that time step.
Columns
| Column | Type | Description |
|---|---|---|
commodity | String | Commodity type generated by the VRE asset (typically Electricity) |
zone | String | Zone (location) where the VRE asset is installed |
resource_id | String | Unique identifier of the parent VRE asset |
component_id | String | Unique identifier of the VRE edge component |
resource_type | String | Asset type (always VRE for this output) |
component_type | String | Type of the edge (e.g., UnidirectionalEdge{Electricity}) |
variable | String | Always "curtailment" |
time | Int | Representative time step index (1-based integer, matches time in other output files) |
value | Float64 | Curtailed power at this time step, in the same units as capacity (default: MW) |
Calculation
Curtailment at time step $t$ is calculated as:
\[\text{curtailment}(t) = \max\!\Big(0,\; \text{capacity} \times \text{availability}(t) - \text{flow}(t)\Big)\]
where:
capacityis the optimal total installed capacity of the VRE edge (MW), fromcapacity.csvavailability(t)is the capacity factor at time step $t$ (a value between 0 and 1), from the VRE asset's availability time series inputflow(t)is the actual generation dispatched at time step $t$, fromflows.csv
The max(0, ...) ensures curtailment is always non-negative. In practice, the optimizer will only curtail when it is optimal to do so (e.g., when electricity supply exceeds demand and storage is full).
To compute total annual curtailed energy for an asset, multiply value(t) × weight(t) and sum over all time steps, where weight(t) comes from time_weights.csv:
Annual curtailment (MWh) = Σ_t curtailment(t) × weight(t) × hours_per_timestepConfiguration
| Setting | File | Default | Effect |
|---|---|---|---|
OutputLayout (or OutputLayout.Curtailment) | macro_settings.json | "long" | Set to "wide" to pivot time steps into columns. |
WriteFullTimeseries | case_settings.json | false | When true and TDR is active, also write full-year curtailment to full_time_series/curtailment.csv. |
Assumptions
- VRE assets only. Only assets of type
VREare included. Other asset types (e.g.,ThermalPower,Battery) do not produce curtailment rows. - Requires
has_capacity = true(true by default). Curtailment is only meaningful when the VRE edge has capacity variables enabled. If the user setshas_capacity = false, the availability × capacity term is zero and curtailment will be0.0. - Availability time series. The availability (capacity factor) profile is typically specified in the VRE asset's input data as a time series of values in [0, 1] for each representative time step. Note that if no availability time series is provided, Macro defaults to full availability (1.0) at all time steps.
- File not written if empty. If the system has no VRE assets, or all VRE edges have
has_capacity = false, thecurtailment.csvfile will not be written. Note: if VRE assets exist but the optimizer assigns them zero capacity, the file is still written (with all-zero values).
Examples
Default Long Format (example rows)
| commodity | zone | resource_id | component_id | resource_type | component_type | variable | time | value |
|---|---|---|---|---|---|---|---|---|
| Electricity | NE | NE_offshorewind_1 | NE_offshorewind_1_edge | VRE | UnidirectionalEdge{Electricity} | curtailment | 1 | 0.0 |
| Electricity | NE | NE_offshorewind_1 | NE_offshorewind_1_edge | VRE | UnidirectionalEdge{Electricity} | curtailment | 2 | 45.2 |
| Electricity | NE | NE_offshorewind_1 | NE_offshorewind_1_edge | VRE | UnidirectionalEdge{Electricity} | curtailment | 3 | 0.0 |
Computing Annual Curtailment
using CSV, DataFrames
curtailment = CSV.read("results/curtailment.csv", DataFrame)
weights = CSV.read("results/time_weights.csv", DataFrame)
# Join and compute annual curtailment per asset
df = leftjoin(curtailment, weights, on=:time)
df.annual_MWh = df.value .* df.weight
# Group by asset to get total annual curtailment per VRE asset
annual_by_asset = combine(groupby(df, :resource_id), :annual_MWh => sum => :annual_curtailment_MWh)See Also
- Outputs Overview — overview of all output files and settings
- Flows Output — actual generation flows that curtailment is derived from
- Capacity Output — installed VRE capacity used in the curtailment calculation
- Full Time Series Output — 8760-hour expanded curtailment
- Time Weights Output — weights for annualizing curtailment values