Thermal
Basic Thermal Resources
Warning
Docs are still missing variables, since those are defined on formulation_block
and not class-level attributes.
Data Fields & Formulation
- class ThermalResource
Bases:
GenericResource
Fuel-burning resource.
- Fields:
allow_inter_period_sharing (Annotated[bool, Metadata(category=FieldCategory.OPERATIONS)])
asset_groups (Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')])
build_year (Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)])
can_build_new (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
can_retire (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
candidate_fuels (dict[str, new_modeling_toolkit.core.linkage.CandidateFuelToResource])
elcc_surfaces (Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')])
erm_policies (Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')])
include (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
min_operational_capacity (Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)])
outage_profile__type (Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)])
physical_lifetime (Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)])
potential (Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)])
prm_policies (Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')])
ptc_term (Annotated[int | None, Metadata(units=units.years, excel_short_title='PTC Term')])
random_seed (Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)])
stochastic_outage_rate (Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)])
- field allow_inter_period_sharing: Annotated[bool, Metadata(category=FieldCategory.OPERATIONS)] = False
For resources & fuel storage resources that have chronological energy storage capability, enable inter-period energy/state-of-charge tracking. For resources with ramp rates, enable inter-period tracking of ramp constraints.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field annual_energy_policies: Annotated[dict[str, linkage.AnnualEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field annualized_capital_cost: Annotated[float, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Capital Cost', warning_bounds=(0, 1000))] = 0
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Capital Cost
warning_bounds = (0, 1000)
show_year_headers = True
default_exclude = False
- field annualized_fixed_om_cost: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Fixed O&M', warning_bounds=(0, 100))] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Fixed O&M
warning_bounds = (0, 100)
show_year_headers = True
default_exclude = False
- field asset_groups: Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field attr_path: str | pathlib.Path | None = PosixPath('/home/docs/checkouts/readthedocs.org/user_builds/e3-resolve/checkouts/latest/docs/source')
the path to the attributes file
- field build_year: Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)] = Timestamp('2000-01-01 00:00:00') (alias 'commission_date')
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field caiso_tx_constraints: Annotated[dict[str, linkage.AssetToCaisoTxConstraint], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field can_build_new: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be expanded (for now only linear capacity expansion).
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field can_retire: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be retired. By default, resources cannot be retired.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field candidate_fuels: dict[str, CandidateFuelToResource] = {}
String Input. This input links a specified candidate_fuels to this ThermalResource . (e.g. Natural_Gas to gas_CCGT).
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = from
default_exclude = False
- field custom_constraints: Annotated[dict[str, CustomConstraintLinkage], Metadata(linkage_order=3, default_exclude=True)] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = 3
default_exclude = True
- field elcc_surfaces: Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field emissions_policies: Annotated[dict[str, linkage.EmissionsContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field energy_budget_annual: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.year, excel_short_title='Annual')] = None
Annual fraction of energy capacity allowed for annual dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / year
excel_short_title = Annual
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_daily: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.day, excel_short_title='Daily')] = None
Daily fraction of energy capacity allowed for daily dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / day
excel_short_title = Daily
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_monthly: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.month, excel_short_title='Monthly')] = None
Monthly fraction of energy capacity allowed for monthly dispatch]
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / month
excel_short_title = Monthly
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field erm_policies: Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field fuel_burn_slope: float | None = None (alias 'average_heat_rate')
Fuel burn slope (MMBTU/MWh). Aka average heat rate. The average heat rate = average fuel consumption per unit of output over a certain range of output levels. It is calculated by dividing the total fuel consumption by the total output over that range (a(x) = f(x) / x). It provides a measure of the overall efficiency of the power generation system over a given period of time or output range. Required when resource is an operational group or does not belong to one.
- Constraints:
ge = 0
category = FieldCategory.OPERATIONS
units = MMBtu / megawatt_hour
excel_short_title =
warning_bounds = (0, 17)
show_year_headers = True
default_exclude = False
- field hourly_energy_policies: Annotated[dict[str, linkage.HourlyEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field include: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = True
Include component in system.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field integer_build_increment: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = None
If not None, consider integer (rather than linear) build decisions. If set equal to potential, this will force an all or nothing choice. Otherwise, this can be used to build certain increments of assets
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field mean_time_to_repair: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY, units=units.hour)] = None
Mean time to repair
- Constraints:
category = FieldCategory.RELIABILITY
units = hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field min_operational_capacity: Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)] = None
These three attributes are outputs, not inputs. They are initialized to None and are updated to their chosen optimal values after the RESOLVE model is solved. The attributes are used to give build and retirement decisions to a model run in production simulation mode.
Minimum required operational capacity (planned+selected) by model year for this asset
- Constraints:
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field outage_distributions: Annotated[dict[str, linkage.ResourceToOutageDistribution], Metadata(linkage_order='to')] [Optional]
This input links resources to a specific OutageDistribution component. When a random or planned outage occurs, the outage distribution dictates what the possible outage state are for each resource. For example, if a unit is either on or offline, then it’s outage distribution is 0,1.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field outage_profile: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, units=units.unitless, excel_short_title='Outage', default_exclude=True)] [Optional]
Fixed profile of simulated outages, where a value of 1.0 represents availability of full nameplate capacity and a value less than 1.0 represents a partial outage.
- Constraints:
category = FieldCategory.OPERATIONS
units = unitless
excel_short_title = Outage
warning_bounds = (None, None)
show_year_headers = True
default_exclude = True
- field outage_profile__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Whether the outage_profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field physical_lifetime: Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)] = 100
Number of years after commission date that asset is operational.
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = year
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field planned_capacity: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field potential: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = inf
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Max Output Profile')] [Optional] (alias 'provide_power_potential_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Max Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Whether the power_output_max profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Min Output Profile')] [Optional] (alias 'provide_power_min_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Min Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Whether the power_output_min profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field prm_policies: Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field production_tax_credit: Annotated[float | None, Metadata(units=units.dollar / units.MWh, excel_short_title='PTC')] = None
- Constraints:
units = dollar / megawatt_hour
excel_short_title = PTC
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ptc_term: Annotated[int | None, Metadata(units=units.years, excel_short_title='PTC Term')] = None
- Constraints:
units = year
excel_short_title = PTC Term
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_1_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour)] = None
Single-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_2_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 2)] = None
Two-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.5 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_3_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 3)] = None
Three-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.3333333333333333 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_4_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 4)] = None
Four-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.25 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field random_seed: Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Random seed
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field reserves: Annotated[dict[str, linkage.ResourceToReserve], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] [Optional]
This input links the resource to a specific reserve type that it can contribute to. For example, Storage can provide both regulation up and down, but might not provide non-spin reserves.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field resource_groups: Annotated[dict[str, linkage.ResourceToResourceGroup], Metadata(linkage_order='to')] [Optional]
This gives each resource a group for RECAP. Depending on the Resource class, the upsampling method could change. For example, with Solar and Wind, these will be upsampled using a day draw methodology.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field stochastic_outage_rate: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Stochastic forced outage rate
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field variable_cost_power_output: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.OPERATIONS, units=units.dollar / units.MWh, excel_short_title='VO&M Out')] [Optional] (alias 'variable_cost_provide_power')
Variable O&M cost per MWh charged.
- Constraints:
category = FieldCategory.OPERATIONS
units = dollar / megawatt_hour
excel_short_title = VO&M Out
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field zones: Annotated[dict[str, linkage.ResourceToZone], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- _resource_fuel_consumption_constraint(block, modeled_year: Timestamp, dispatch_window: Timestamp, timestamp: Timestamp)
The sum of the power provided by a resource’s candidate fuels should equal the resource’s total power_output multiplied by the resource’s heat rate :param block: The block object associated with the constraint :param modeled_year: The timestamp representing the modeled year :type modeled_year: pd.Timestamp :param dispatch_window: The timestamp representing the dispatch window :type dispatch_window: pd.Timestamp :param timestamp: The timestamp for which the constraint is being evaluated :type timestamp: pd.Timestamp
- Returns:
pyo.Constraint
Inherited Data Fields & Formulation
- class GenericResource
Bases:
Asset
- Fields:
asset_groups (Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')])
build_year (Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)])
can_build_new (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
can_retire (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
elcc_surfaces (Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')])
energy_budget_annual (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries | None)
energy_budget_daily (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries | None)
energy_budget_monthly (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries | None)
erm_policies (Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')])
include (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
min_operational_capacity (Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)])
outage_distributions (dict[str, new_modeling_toolkit.core.linkage.ResourceToOutageDistribution])
outage_profile (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)
outage_profile__type (new_modeling_toolkit.core.temporal.timeseries.TimeseriesType | None)
physical_lifetime (Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)])
potential (Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)])
power_output_max (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)
power_output_max__type (new_modeling_toolkit.core.temporal.timeseries.TimeseriesType | None)
power_output_min (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)
power_output_min__type (new_modeling_toolkit.core.temporal.timeseries.TimeseriesType | None)
prm_policies (Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')])
random_seed (Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)])
reserves (dict[str, new_modeling_toolkit.core.linkage.ResourceToReserve])
resource_groups (dict[str, new_modeling_toolkit.core.linkage.ResourceToResourceGroup])
stochastic_outage_rate (Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)])
variable_cost_power_output (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries)
zones (dict[str, new_modeling_toolkit.core.linkage.ResourceToZone])
- field allow_inter_period_sharing: bool = False
For resources & fuel storage resources that have chronological energy storage capability, enable inter-period energy/state-of-charge tracking. For resources with ramp rates, enable inter-period tracking of ramp constraints.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field annual_energy_policies: Annotated[dict[str, linkage.AnnualEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field annualized_capital_cost: Annotated[float, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Capital Cost', warning_bounds=(0, 1000))] = 0
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Capital Cost
warning_bounds = (0, 1000)
show_year_headers = True
default_exclude = False
- field annualized_fixed_om_cost: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Fixed O&M', warning_bounds=(0, 100))] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Fixed O&M
warning_bounds = (0, 100)
show_year_headers = True
default_exclude = False
- field asset_groups: Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field attr_path: str | pathlib.Path | None = PosixPath('/home/docs/checkouts/readthedocs.org/user_builds/e3-resolve/checkouts/latest/docs/source')
the path to the attributes file
- field build_year: Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)] = Timestamp('2000-01-01 00:00:00') (alias 'commission_date')
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field caiso_tx_constraints: Annotated[dict[str, linkage.AssetToCaisoTxConstraint], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field can_build_new: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be expanded (for now only linear capacity expansion).
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field can_retire: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be retired. By default, resources cannot be retired.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field class_name: str | None = None
- field cumulative_retired_capacity: ts.NumericTimeseries | None = None
- field custom_constraints: Annotated[dict[str, CustomConstraintLinkage], Metadata(linkage_order=3, default_exclude=True)] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = 3
default_exclude = True
- field elcc_surfaces: Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field emissions_policies: Annotated[dict[str, linkage.EmissionsContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field energy_budget_annual: FractionalTimeseries | None = None
Annual fraction of energy capacity allowed for annual dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / year
excel_short_title = Annual
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_daily: FractionalTimeseries | None = None
Daily fraction of energy capacity allowed for daily dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / day
excel_short_title = Daily
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_monthly: FractionalTimeseries | None = None
Monthly fraction of energy capacity allowed for monthly dispatch]
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / month
excel_short_title = Monthly
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field erm_policies: Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field hourly_energy_policies: Annotated[dict[str, linkage.HourlyEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field include: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = True
Include component in system.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field integer_build_increment: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = None
If not None, consider integer (rather than linear) build decisions. If set equal to potential, this will force an all or nothing choice. Otherwise, this can be used to build certain increments of assets
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field mean_time_to_repair: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY, units=units.hour)] = None
Mean time to repair
- Constraints:
category = FieldCategory.RELIABILITY
units = hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field min_operational_capacity: Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)] = None
These three attributes are outputs, not inputs. They are initialized to None and are updated to their chosen optimal values after the RESOLVE model is solved. The attributes are used to give build and retirement decisions to a model run in production simulation mode.
Minimum required operational capacity (planned+selected) by model year for this asset
- Constraints:
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field name: str | tuple [Required]
- field operational_capacity: ts.NumericTimeseries | None = None
- field outage_distributions: dict[str, ResourceToOutageDistribution] [Optional]
This input links resources to a specific OutageDistribution component. When a random or planned outage occurs, the outage distribution dictates what the possible outage state are for each resource. For example, if a unit is either on or offline, then it’s outage distribution is 0,1.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field outage_profile: FractionalTimeseries [Optional]
Fixed profile of simulated outages, where a value of 1.0 represents availability of full nameplate capacity and a value less than 1.0 represents a partial outage.
- Constraints:
category = FieldCategory.OPERATIONS
units = unitless
excel_short_title = Outage
warning_bounds = (None, None)
show_year_headers = True
default_exclude = True
- field outage_profile__type: TimeseriesType | None = None
Whether the outage_profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field physical_lifetime: Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)] = 100
Number of years after commission date that asset is operational.
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = year
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field planned_capacity: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field potential: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = inf
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max: FractionalTimeseries [Optional] (alias 'provide_power_potential_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Max Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max__type: TimeseriesType | None = None
Whether the power_output_max profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min: FractionalTimeseries [Optional] (alias 'provide_power_min_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Min Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min__type: TimeseriesType | None = None
Whether the power_output_min profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field prm_policies: Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field production_tax_credit: float | None = None
- Constraints:
units = dollar / megawatt_hour
excel_short_title = PTC
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ptc_term: int | None = None
- Constraints:
units = year
excel_short_title = PTC Term
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_1_hour: float | None = None
Single-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_2_hour: float | None = None
Two-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.5 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_3_hour: float | None = None
Three-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.3333333333333333 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_4_hour: float | None = None
Four-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.25 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field random_seed: Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Random seed
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field reserves: dict[str, ResourceToReserve] [Optional]
This input links the resource to a specific reserve type that it can contribute to. For example, Storage can provide both regulation up and down, but might not provide non-spin reserves.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field resource_groups: dict[str, ResourceToResourceGroup] [Optional]
This gives each resource a group for RECAP. Depending on the Resource class, the upsampling method could change. For example, with Solar and Wind, these will be upsampled using a day draw methodology.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field retired_capacity: ts.NumericTimeseries | None = None
- field selected_capacity: float | None = None
- field stochastic_outage_rate: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Stochastic forced outage rate
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field variable_cost_power_output: NumericTimeseries [Optional] (alias 'variable_cost_provide_power')
Variable O&M cost per MWh charged.
- Constraints:
category = FieldCategory.OPERATIONS
units = dollar / megawatt_hour
excel_short_title = VO&M Out
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field vintage_parent_group: str | None = None
- field zones: dict[str, ResourceToZone] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- clear_calculated_properties()
Clear the property cache so scaled profiles are recalculated after rescaling
- get_ramp_MW(modeled_year: Timestamp, timepoint_1: Tuple[Timestamp, Timestamp], timepoint_2: Tuple[Timestamp, Timestamp])
Change in output MW between two timepoints
- revalidate()
Abstract method to run additional validations after Linkage.announce_linkage_to_instances.
- SAVE_PATH: ClassVar[str] = 'resources/generic'
- property annual_results_column_order
This property defines the ordering of columns in the Asset annual results summary out of Resolve.
- property has_energy_budget: bool
- property outage_distribution: OutageDistribution | None
- property pmax_profile: Series
- property pmin_profile: Series
- property production_tax_credit_ts: NumericTimeseries
- property resource_group: ResourceGroup | None
- property results_reporting_category
- property results_reporting_folder
- property scaled_annual_energy_budget
- property scaled_daily_energy_budget
- property scaled_monthly_energy_budget
- property scaled_pmax_profile: Dict[int, Series]
- property scaled_pmin_profile
Reliability Dispatch in Recap
The ThermalResources class is for resources that can be dispatched without energy limits (e.g. firm resources, dispatchable resources, etc.). We model the availability of dispatchable generation based on “net dependable capacity” or “hourly available capacity”. Hourly available capacity is modeled by simulating maintenance & forced outages from the OutageDistribution component. Using the forced outage rate of each generator, random outages are introduced to create a stochastic set of available generators.
Thermal Unit Commitment
Data Fields & Formulation
- class ThermalUnitCommitmentResource
- Fields:
allow_inter_period_sharing (Annotated[bool, Metadata(category=FieldCategory.OPERATIONS)])
asset_groups (Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')])
build_year (Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)])
can_build_new (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
can_retire (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
elcc_surfaces (Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')])
erm_policies (Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')])
include (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
initial_committed_units (Annotated[pd.Series | None, Metadata(category=FieldCategory.OPERATIONS)])
min_down_time (Annotated[PositiveInt | None, Metadata(category=FieldCategory.OPERATIONS)])
min_operational_capacity (Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)])
min_stable_level (Annotated[float, Metadata(category=FieldCategory.OPERATIONS)])
min_up_time (Annotated[PositiveInt | None, Metadata(category=FieldCategory.OPERATIONS)])
outage_profile__type (Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)])
physical_lifetime (Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)])
potential (Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)])
prm_policies (Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')])
ptc_term (Annotated[int | None, Metadata(units=units.years, excel_short_title='PTC Term')])
random_seed (Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)])
shutdown_cost (Annotated[NonNegativeFloat, Metadata(category=FieldCategory.OPERATIONS)])
start_cost (Annotated[NonNegativeFloat, Metadata(category=FieldCategory.OPERATIONS)])
stochastic_outage_rate (Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)])
unit_commitment_mode (Annotated[UnitCommitmentMethod, Metadata(category=FieldCategory.OPERATIONS)])
unit_size (Annotated[PositiveFloat, Metadata(category=FieldCategory.OPERATIONS)])
- field addition_to_load: float = 0
Synchronous condenser addition to load. Multiplier to commited capacity. Default 0.
- Constraints:
ge = 0
- field allow_inter_period_sharing: Annotated[bool, Metadata(category=FieldCategory.OPERATIONS)] = False
For resources & fuel storage resources that have chronological energy storage capability, enable inter-period energy/state-of-charge tracking. For resources with ramp rates, enable inter-period tracking of ramp constraints.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field annual_energy_policies: Annotated[dict[str, linkage.AnnualEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field annualized_capital_cost: Annotated[float, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Capital Cost', warning_bounds=(0, 1000))] = 0
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Capital Cost
warning_bounds = (0, 1000)
show_year_headers = True
default_exclude = False
- field annualized_fixed_om_cost: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Fixed O&M', warning_bounds=(0, 100))] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Fixed O&M
warning_bounds = (0, 100)
show_year_headers = True
default_exclude = False
- field asset_groups: Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field attr_path: str | pathlib.Path | None = PosixPath('/home/docs/checkouts/readthedocs.org/user_builds/e3-resolve/checkouts/latest/docs/source')
the path to the attributes file
- field build_year: Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)] = Timestamp('2000-01-01 00:00:00') (alias 'commission_date')
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field caiso_tx_constraints: Annotated[dict[str, linkage.AssetToCaisoTxConstraint], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field can_build_new: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be expanded (for now only linear capacity expansion).
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field can_retire: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be retired. By default, resources cannot be retired.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field candidate_fuels: Annotated[dict[str, CandidateFuelToResource], Metadata(linkage_order='from', category=FieldCategory.OPERATIONS)] = {}
String Input. This input links a specified candidate_fuels to this ThermalResource . (e.g. Natural_Gas to gas_CCGT).
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = from
default_exclude = False
- field custom_constraints: Annotated[dict[str, CustomConstraintLinkage], Metadata(linkage_order=3, default_exclude=True)] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = 3
default_exclude = True
- field elcc_surfaces: Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field emissions_policies: Annotated[dict[str, linkage.EmissionsContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field energy_budget_annual: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.year, excel_short_title='Annual')] = None
Annual fraction of energy capacity allowed for annual dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / year
excel_short_title = Annual
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_daily: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.day, excel_short_title='Daily')] = None
Daily fraction of energy capacity allowed for daily dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / day
excel_short_title = Daily
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_monthly: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.month, excel_short_title='Monthly')] = None
Monthly fraction of energy capacity allowed for monthly dispatch]
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / month
excel_short_title = Monthly
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field erm_policies: Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field fuel_burn_intercept: float | None = None
Fuel burn intercept per generating unit. Represents the minimum amount of fuel used when a unit is on. Required when resource is an operational group or does not belong to one.
- Constraints:
category = FieldCategory.OPERATIONS
units = MMBtu / hour
excel_short_title =
warning_bounds = (0, 1000)
show_year_headers = True
default_exclude = False
- field fuel_burn_slope: float | None = None (alias 'marginal_heat_rate')
The marginal heat rate represents the rate of change of fuel consumption with respect to the level of output. Mathematically, it is the derivative of the heat input function with respect to output level (m(x) = δy / δx). It tells us how much additional fuel is required to produce one more unit of output (megawatt hour). Required when resource is an operational group or does not belong to one.
- Constraints:
ge = 0
category = FieldCategory.OPERATIONS
units = MMBtu / megawatt_hour
excel_short_title =
warning_bounds = (0, 17)
show_year_headers = True
default_exclude = False
- field hourly_energy_policies: Annotated[dict[str, linkage.HourlyEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field include: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = True
Include component in system.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field initial_committed_units: Annotated[pd.Series | None, Metadata(category=FieldCategory.OPERATIONS)] = None
For fixed initial condition, how many units are already committed/on
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field integer_build_increment: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = None
If not None, consider integer (rather than linear) build decisions. If set equal to potential, this will force an all or nothing choice. Otherwise, this can be used to build certain increments of assets
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field mean_time_to_repair: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY, units=units.hour)] = None
Mean time to repair
- Constraints:
category = FieldCategory.RELIABILITY
units = hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field min_down_time: Annotated[PositiveInt | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Minimum downtime between commitments (hours).
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field min_operational_capacity: Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)] = None
These three attributes are outputs, not inputs. They are initialized to None and are updated to their chosen optimal values after the RESOLVE model is solved. The attributes are used to give build and retirement decisions to a model run in production simulation mode.
Minimum required operational capacity (planned+selected) by model year for this asset
- Constraints:
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field min_stable_level: Annotated[float, Metadata(category=FieldCategory.OPERATIONS)] = 0
Minimum stable level when committed
- Constraints:
ge = 0
le = 1
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field min_up_time: Annotated[PositiveInt | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Minimum uptime during a commitment (hours).
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field outage_distributions: Annotated[dict[str, linkage.ResourceToOutageDistribution], Metadata(linkage_order='to')] [Optional]
This input links resources to a specific OutageDistribution component. When a random or planned outage occurs, the outage distribution dictates what the possible outage state are for each resource. For example, if a unit is either on or offline, then it’s outage distribution is 0,1.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field outage_profile: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, units=units.unitless, excel_short_title='Outage', default_exclude=True)] [Optional]
Fixed profile of simulated outages, where a value of 1.0 represents availability of full nameplate capacity and a value less than 1.0 represents a partial outage.
- Constraints:
category = FieldCategory.OPERATIONS
units = unitless
excel_short_title = Outage
warning_bounds = (None, None)
show_year_headers = True
default_exclude = True
- field outage_profile__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Whether the outage_profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field physical_lifetime: Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)] = 100
Number of years after commission date that asset is operational.
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = year
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field planned_capacity: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field potential: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = inf
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Max Output Profile')] [Optional] (alias 'provide_power_potential_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Max Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Whether the power_output_max profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Min Output Profile')] [Optional] (alias 'provide_power_min_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Min Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None
Whether the power_output_min profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field prm_policies: Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field production_tax_credit: Annotated[float | None, Metadata(units=units.dollar / units.MWh, excel_short_title='PTC')] = None
- Constraints:
units = dollar / megawatt_hour
excel_short_title = PTC
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ptc_term: Annotated[int | None, Metadata(units=units.years, excel_short_title='PTC Term')] = None
- Constraints:
units = year
excel_short_title = PTC Term
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_1_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour)] = None
Single-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_2_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 2)] = None
Two-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.5 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_3_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 3)] = None
Three-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.3333333333333333 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_4_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 4)] = None
Four-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.25 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field random_seed: Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Random seed
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field reserves: Annotated[dict[str, linkage.ResourceToReserve], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] [Optional]
This input links the resource to a specific reserve type that it can contribute to. For example, Storage can provide both regulation up and down, but might not provide non-spin reserves.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field resource_groups: Annotated[dict[str, linkage.ResourceToResourceGroup], Metadata(linkage_order='to')] [Optional]
This gives each resource a group for RECAP. Depending on the Resource class, the upsampling method could change. For example, with Solar and Wind, these will be upsampled using a day draw methodology.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field shutdown_cost: Annotated[NonNegativeFloat, Metadata(category=FieldCategory.OPERATIONS)] = 0.0
Cost for each unit shutdown ($/unit shutdown). If using linearized UC, this cost will be linearized as well.
- Constraints:
ge = 0
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field start_cost: Annotated[NonNegativeFloat, Metadata(category=FieldCategory.OPERATIONS)] = 0.0
Cost for each unit startup ($/unit start). If using linearized UC, this cost will be linearized as well.
- Constraints:
ge = 0
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field start_fuel_use: float = 0
[UC] Amount of fuel used per unit start [MMBTU/start]
- Constraints:
ge = 0
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field stochastic_outage_rate: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Stochastic forced outage rate
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field unit_commitment_mode: Annotated[UnitCommitmentMethod, Metadata(category=FieldCategory.OPERATIONS)] = UnitCommitmentMethod.LINEAR
To strictly the number of shift events, set to integer. Otherwise, the default is ‘linear’ and does not fully limit the number of events. Linear is the default, because this is a much simpler optimization problem and you will see minimal increase in run time. This is an acceptable assumption for many projects if you are modeling a large area which could have several Demand Response programs in different locations, each with their own call limits. When modeling smaller geographic areas, or if the project needs strict call limits set the unit_commitment attribute to ‘integer’. Note that this will increase the run time. How much will vary depending on the model complexity, but a good rule of thumb is to assume 1.5x the run time if the variables were linear.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field unit_size: Annotated[PositiveFloat, Metadata(category=FieldCategory.OPERATIONS)] = 0.0 (alias 'unit_size_mw')
Size of each unit that can be independently committed, in MW.
- Constraints:
gt = 0
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field variable_cost_power_output: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.OPERATIONS, units=units.dollar / units.MWh, excel_short_title='VO&M Out')] [Optional] (alias 'variable_cost_provide_power')
Variable O&M cost per MWh charged.
- Constraints:
category = FieldCategory.OPERATIONS
units = dollar / megawatt_hour
excel_short_title = VO&M Out
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field zones: Annotated[dict[str, linkage.ResourceToZone], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- _resource_fuel_consumption_constraint(block, modeled_year: Timestamp, dispatch_window, timestamp: Timestamp)
Fuel consumption is represented by a simplified linear equation: fuel_consumption = (marginal_heat_rate[MMBtu/MWh] * power_output[MWh]) + (committed_units * min_fuel_burn[MMBTU/committed_unit]) + (start_units * start_fuel_use[MMBTU/start_unit])
- Parameters:
block – The block object associated with the constraint.
modeled_year (pd.Timestamp) – The timestamp representing the modeled year.
dispatch_window (pd.Timestamp) – The timestamp representing the dispatch window.
timestamp (pd.Timestamp) – The timestamp for which the constraint is being evaluated.
Returns: pyo.Constraint. The sum of fuel consumption of a resource’s candidate fuels == the resource’s total fuel burn
Inherited Data Fields & Formulation
- class GenericResource
- Fields:
asset_groups (Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')])
build_year (Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)])
can_build_new (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
can_retire (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
elcc_surfaces (Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')])
energy_budget_annual (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries | None)
energy_budget_daily (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries | None)
energy_budget_monthly (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries | None)
erm_policies (Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')])
include (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
min_operational_capacity (Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)])
outage_distributions (dict[str, new_modeling_toolkit.core.linkage.ResourceToOutageDistribution])
outage_profile (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)
outage_profile__type (new_modeling_toolkit.core.temporal.timeseries.TimeseriesType | None)
physical_lifetime (Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)])
potential (Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)])
power_output_max (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)
power_output_max__type (new_modeling_toolkit.core.temporal.timeseries.TimeseriesType | None)
power_output_min (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)
power_output_min__type (new_modeling_toolkit.core.temporal.timeseries.TimeseriesType | None)
prm_policies (Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')])
random_seed (Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)])
reserves (dict[str, new_modeling_toolkit.core.linkage.ResourceToReserve])
resource_groups (dict[str, new_modeling_toolkit.core.linkage.ResourceToResourceGroup])
stochastic_outage_rate (Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)])
variable_cost_power_output (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries)
zones (dict[str, new_modeling_toolkit.core.linkage.ResourceToZone])
- field allow_inter_period_sharing: bool = False
For resources & fuel storage resources that have chronological energy storage capability, enable inter-period energy/state-of-charge tracking. For resources with ramp rates, enable inter-period tracking of ramp constraints.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field annual_energy_policies: Annotated[dict[str, linkage.AnnualEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field annualized_capital_cost: Annotated[float, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Capital Cost', warning_bounds=(0, 1000))] = 0
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Capital Cost
warning_bounds = (0, 1000)
show_year_headers = True
default_exclude = False
- field annualized_fixed_om_cost: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Fixed O&M', warning_bounds=(0, 100))] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = dollar / kiloW_year
excel_short_title = Fixed O&M
warning_bounds = (0, 100)
show_year_headers = True
default_exclude = False
- field asset_groups: Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field attr_path: str | pathlib.Path | None = PosixPath('/home/docs/checkouts/readthedocs.org/user_builds/e3-resolve/checkouts/latest/docs/source')
the path to the attributes file
- field build_year: Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)] = Timestamp('2000-01-01 00:00:00') (alias 'commission_date')
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field caiso_tx_constraints: Annotated[dict[str, linkage.AssetToCaisoTxConstraint], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field can_build_new: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be expanded (for now only linear capacity expansion).
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field can_retire: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False
Whether resource can be retired. By default, resources cannot be retired.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field class_name: str | None = None
- field cumulative_retired_capacity: ts.NumericTimeseries | None = None
- field custom_constraints: Annotated[dict[str, CustomConstraintLinkage], Metadata(linkage_order=3, default_exclude=True)] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = 3
default_exclude = True
- field elcc_surfaces: Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field emissions_policies: Annotated[dict[str, linkage.EmissionsContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field energy_budget_annual: FractionalTimeseries | None = None
Annual fraction of energy capacity allowed for annual dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / year
excel_short_title = Annual
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_daily: FractionalTimeseries | None = None
Daily fraction of energy capacity allowed for daily dispatch.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / day
excel_short_title = Daily
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field energy_budget_monthly: FractionalTimeseries | None = None
Monthly fraction of energy capacity allowed for monthly dispatch]
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / month
excel_short_title = Monthly
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field erm_policies: Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field hourly_energy_policies: Annotated[dict[str, linkage.HourlyEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field include: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = True
Include component in system.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field integer_build_increment: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = None
If not None, consider integer (rather than linear) build decisions. If set equal to potential, this will force an all or nothing choice. Otherwise, this can be used to build certain increments of assets
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field mean_time_to_repair: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY, units=units.hour)] = None
Mean time to repair
- Constraints:
category = FieldCategory.RELIABILITY
units = hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field min_operational_capacity: Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)] = None
These three attributes are outputs, not inputs. They are initialized to None and are updated to their chosen optimal values after the RESOLVE model is solved. The attributes are used to give build and retirement decisions to a model run in production simulation mode.
Minimum required operational capacity (planned+selected) by model year for this asset
- Constraints:
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field name: str | tuple [Required]
- field operational_capacity: ts.NumericTimeseries | None = None
- field outage_distributions: dict[str, ResourceToOutageDistribution] [Optional]
This input links resources to a specific OutageDistribution component. When a random or planned outage occurs, the outage distribution dictates what the possible outage state are for each resource. For example, if a unit is either on or offline, then it’s outage distribution is 0,1.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field outage_profile: FractionalTimeseries [Optional]
Fixed profile of simulated outages, where a value of 1.0 represents availability of full nameplate capacity and a value less than 1.0 represents a partial outage.
- Constraints:
category = FieldCategory.OPERATIONS
units = unitless
excel_short_title = Outage
warning_bounds = (None, None)
show_year_headers = True
default_exclude = True
- field outage_profile__type: TimeseriesType | None = None
Whether the outage_profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field physical_lifetime: Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)] = 100
Number of years after commission date that asset is operational.
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = year
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field planned_capacity: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] [Optional]
- Constraints:
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field potential: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = inf
- Constraints:
ge = 0
category = FieldCategory.BUILD
units = megawatt
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max: FractionalTimeseries [Optional] (alias 'provide_power_potential_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Max Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_max__type: TimeseriesType | None = None
Whether the power_output_max profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min: FractionalTimeseries [Optional] (alias 'provide_power_min_profile')
Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with
new_modeling_toolkit.common.resource.Resource.curtailable
.- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Min Output Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field power_output_min__type: TimeseriesType | None = None
Whether the power_output_min profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field prm_policies: Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field production_tax_credit: float | None = None
- Constraints:
units = dollar / megawatt_hour
excel_short_title = PTC
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ptc_term: int | None = None
- Constraints:
units = year
excel_short_title = PTC Term
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_1_hour: float | None = None
Single-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 1 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_2_hour: float | None = None
Two-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.5 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_3_hour: float | None = None
Three-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.3333333333333333 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field ramp_rate_4_hour: float | None = None
Four-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.
- Constraints:
category = FieldCategory.OPERATIONS
units = 0.25 / hour
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field random_seed: Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Random seed
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field reserves: dict[str, ResourceToReserve] [Optional]
This input links the resource to a specific reserve type that it can contribute to. For example, Storage can provide both regulation up and down, but might not provide non-spin reserves.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field resource_groups: dict[str, ResourceToResourceGroup] [Optional]
This gives each resource a group for RECAP. Depending on the Resource class, the upsampling method could change. For example, with Solar and Wind, these will be upsampled using a day draw methodology.
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field retired_capacity: ts.NumericTimeseries | None = None
- field selected_capacity: float | None = None
- field stochastic_outage_rate: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)] = None
Stochastic forced outage rate
- Constraints:
category = FieldCategory.RELIABILITY
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field variable_cost_power_output: NumericTimeseries [Optional] (alias 'variable_cost_provide_power')
Variable O&M cost per MWh charged.
- Constraints:
category = FieldCategory.OPERATIONS
units = dollar / megawatt_hour
excel_short_title = VO&M Out
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field vintage_parent_group: str | None = None
- field zones: dict[str, ResourceToZone] = {}
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- clear_calculated_properties()
Clear the property cache so scaled profiles are recalculated after rescaling
- get_ramp_MW(modeled_year: Timestamp, timepoint_1: Tuple[Timestamp, Timestamp], timepoint_2: Tuple[Timestamp, Timestamp])
Change in output MW between two timepoints
- revalidate()
Abstract method to run additional validations after Linkage.announce_linkage_to_instances.
- SAVE_PATH: ClassVar[str] = 'resources/generic'
- property annual_results_column_order
This property defines the ordering of columns in the Asset annual results summary out of Resolve.
- property has_energy_budget: bool
- property outage_distribution: OutageDistribution | None
- property pmax_profile: Series
- property pmin_profile: Series
- property production_tax_credit_ts: NumericTimeseries
- property resource_group: ResourceGroup | None
- property results_reporting_category
- property results_reporting_folder
- property scaled_annual_energy_budget
- property scaled_daily_energy_budget
- property scaled_monthly_energy_budget
- property scaled_pmax_profile: Dict[int, Series]
- property scaled_pmin_profile
As of #465, the Resolve formulation now includes a basic, linearized unit commitment formulation based on [1].
While unit commitment constraints are primarily designed for thermal unit commitment dispatch, we are reusing the unit start/stop & minimum up-/down-time constraints for Shed Demand Response and Flexible Loads.
While this formulation differs from the formulation in previous versions of Resolve, it is significantly more compact and widely used in literature. As with the previous Resolve formulation, unit commitment constraints “wrap around” each representative period (in contrast to storage state-of-charge constraints that leverage the chronological periods to span across representative periods).
Note
While unit commitment constraints are primarily designed for thermal unit commitment dispatch, we are reusing the unit start/stop & minimum up-/down-time constraints for Shed Demand Response and Flexible Loads.