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:
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 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: 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 name: str | tuple [Required]
field operational_capacity: ts.NumericTimeseries | None = None
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 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: 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 vintage_parent_group: str | None = None
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

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/thermal'
property fuel_names_string: str

This property concatenates the keys in the candidate_fuels dictionary for results reporting.

Inherited Data Fields & Formulation
class GenericResource

Bases: Asset

Fields:
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:
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 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: 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 name: str | tuple [Required]
field operational_capacity: ts.NumericTimeseries | None = None
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 retired_capacity: ts.NumericTimeseries | None = None
field selected_capacity: float | None = None
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 vintage_parent_group: str | None = None
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

revalidate()

Validate that there is at least one candidate fuel linked to the thermal UC resource.

SAVE_PATH: ClassVar[str] = 'resources/thermal'
Inherited Data Fields & Formulation
class GenericResource
Fields:
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.