new_modeling_toolkit.system package

Subpackages

Submodules

new_modeling_toolkit.system.asset module

class Asset

Bases: Component

An Asset is anything with a cost & quantity.

Fields:
field annual_energy_policies: dict[str, AnnualEnergyStandardContribution] = {}
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: float = 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: NumericTimeseries [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: dict[str, AssetToAssetGroup] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field build_year: Timestamp = 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: dict[str, AssetToCaisoTxConstraint] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field can_build_new: bool = 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: bool = 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 cumulative_retired_capacity: NumericTimeseries | None = None
field custom_constraints: dict[str, CustomConstraintLinkage] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = 3

  • default_exclude = True

field elcc_surfaces: dict[str, AssetToELCC] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field emissions_policies: dict[str, EmissionsContribution] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field erm_policies: dict[str, ERMContribution] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field hourly_energy_policies: dict[str, HourlyEnergyStandardContribution] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field integer_build_increment: float | None = 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: float | None = 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: NumericTimeseries | None = 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 operational_capacity: NumericTimeseries | None = None
field physical_lifetime: int = 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: NumericTimeseries [Optional]
Constraints:
  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field potential: float | None = inf
Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field prm_policies: dict[str, ReliabilityContribution] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field random_seed: int | None = None

Random seed

Constraints:
  • category = FieldCategory.RELIABILITY

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field retired_capacity: NumericTimeseries | None = None
field selected_capacity: float | None = None
field stochastic_outage_rate: float | None = 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 vintage_parent_group: str | None = None
field zones: dict[str, AssetToZone] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

check_if_operationally_equal(other: Asset, check_linkages: bool = True, fields_to_check: list[str] | None = None) β†’ bool

Check is this Asset is β€œoperationally equivalent” to another Asset.

This check is used when automatically grouping resources together in RESOLVE for the construction of operational constraints. See AssetGroup for more information.

Operational equivalence is defined by two categories. First, all the β€œoperational attributes” of the Assets (which are defined in a class variable) must be equal. Any attribute whose value may impact the optimal operational decisions for the assets have to be equal. For example, they must have equal power_output_max profiles, among other things. Second, they must have equivalent β€œoperational linkages” - see check_operational_linkages_are_equal for more information.

Parameters:
  • other – the Resource to compare to

  • check_linkages – whether linkages should be considered in determining operational equality

  • fields_to_check – an optional list of a subset of fields to check

Returns:

whether the two Resources are operationally equal

Return type:

bool

check_operational_linkages_are_equal(other: Asset) β†’ bool

Checks whether two Assets have equivalent β€œoperational linkages.”

In order for two Assets to be β€œoperationally equivalent,” one condition is that any linkages which may impact

the operational decisions of the resource must also be equal. For example, if a Resource is linked to an

AnnualEmissionsStandard, then its dispatch will be partially influenced by this emissions target, so the other Resource must also be linked to that policy.

Parameters:

other – the other Asset to compare against

Returns:

whether or not the two components have equivalent operational linkages

Return type:

equal

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

save_capacity_expansion_results()
save_cumulative_retired_capacity()

Save the resulting retired capacity after the RESOLVE model has been solved.

save_operational_capacity()

Save the resulting operational capacity after the RESOLVE model has been solved.

save_retired_capacity()

Save the resulting retired capacity after the RESOLVE model has been solved.

save_selected_capacity()

Save the resulting selected capacity after the RESOLVE model has been solved.

SAVE_PATH: ClassVar[str] = 'assets'
property annual_results_column_order

This property defines the ordering of columns in the Asset annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property has_operational_rules: bool

Property for whether this asset has operational rules (i.e., it is not a part of an operational group)

property non_operational_linkages
property operational_attributes
property operational_group: AssetGroup | None
property operational_group_name: str
property operational_linkages
property operational_three_way_linkages
property outage_distribution
property policies
property zone_names_string: str

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

class AssetCategory(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)

Bases: Enum

DEMAND_RESPONSE = 'dr'
FIRM = 'firm'
FLEXIBLE_LOAD = 'flexible_load'
HYBRID_STORAGE = 'hybrid_storage'
HYDRO = 'hydro'
STORAGE = 'storage'
THERMAL = 'thermal'
VARIABLE = 'variable'
class AssetGroup

Bases: Asset

AssetGroup combines multiple vintages of Assets, since Resolve and Recap treat these differently.

For Resolve, separate vintages For Recap, combine vintages

Fields:
field aggregate_operations: bool = False

Whether to enforce operational constraints across all assets in the group as if they were a single asset. This is only possible if all assets in the group are operationally equivalent to one another.

field annualized_capital_cost: NumericTimeseries [Optional]
field annualized_fixed_om_cost: NumericTimeseries [Optional]
field assets: dict[str, AssetToAssetGroup] [Optional]
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field build_year: None = None
Constraints:
  • func = <function _set_to_none at 0x72b1dfc4a160>

field cumulative_potential: NumericTimeseries | None = None

Cumulative build potential for planned and selected capacity by model year across all assets in the group

Constraints:
  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • default_exclude = False

field min_cumulative_new_build: NumericTimeseries | None = None

Cumulative minimum required selected capacity by model year across all assets in the group

Constraints:
  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field potential: NumericTimeseries | None = None

Build potential for planned and selected capacity by model year across all assets in the group

Constraints:
  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • default_exclude = False

field vintages_to_construct: BooleanTimeseries [Optional]
classmethod construct_operational_groups(assets: list[Asset], skip_single_member_groups: bool = False) β†’ tuple[dict[str, AnyOperationalGroup], dict[str, AnyResource]]

Takes a list of resources of the same type and returns a list of OperationalGroup objects containing the assets which are operationally equivalent to one another.

If skip_single_member_groups is True, any group that would have only one Asset in it is not created, and a dictionary of these resources will be returned along with a dictionary of OperationalGroup objects. If skip_single_member_groups is False, an empty dictionary will be returned along with the OperationalGroups.

Parameters:
  • assets – the list of Resources to create the groups from

  • skip_single_member_groups – whether to skip the creation of groups that would only have a single member

Returns:

a dictionary of constructed AssetGroup instances single_member_assets: if skip_single_member_groups is True, a dictionary of all Assets that were not

assigned to a group

Return type:

asset_groups

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

update_assets_with_results()

Allocates optimization model results to the linked Assets based on the fraction of total operational capacity in each modeled year that is represented by each asset.

SAVE_PATH: ClassVar[str] = 'assets/groups'
property annual_results_column_order

This property defines the ordering of columns in the Asset annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property asset_instances: dict[str, Asset]

Returns a dictionary of all Asset instances linked to the group. These can be Assets or other AssetGroups.

property build_assets

For build decisions, always use the individual asset instances. This is a recursive property that gets the Assets directly linked to this AssetGroup plus any Assets linked to AssetGroups linked to this AssetGroup.

property directly_linked_build_assets

For build decisions, always use the individual asset instances.

property earliest_build_year
property has_operational_rules: bool

Redefine has_operational_rules property based on aggregate_options attribute

property operational_assets

For operational decisions, whether we use an Asset or AssetGroup depends on whether AssetGroup has aggregate_operations==True.

new_modeling_toolkit.system.outage_distribution module

class OutageDistribution

Bases: Component

Fields:
field probability_mass_function: DataFrame | None = None
field resources: dict[str, Linkage] = {}
derate_checks(l_derate_prob, l_derate)
classmethod get_data_from_xlwings(wb: Book, sheet_name: str, fully_specified: bool = False, new_style: bool = False) β†’ DataFrame

Override Component.get_data_from_xlwings, because outage distribution points are special.

Currently, this class does not have any particular input attributes. All attributes are in the form of β€œderate_#” and β€œderate_prob_#”, so we cannot read directly from the Scenario Tool the way we would for standard component classes. This way of defining attributes works because in CustomModel we are allow extra attributes to be passed.

To accommodate the extra β€œindex”, we assume that the index named range (OutageDistribution) is two columns, where the second column is the distribution point.

get_random_derate_fraction_arr(size, seed)
set_pmf()
property PMF

Returns probability mass function for outages

SAVE_PATH: ClassVar[str] = 'outage_distributions'

new_modeling_toolkit.system.policy module

class AnnualEmissionsPolicy

Bases: Policy

Policy class for annual system emissions targets.

Depending on scope of governed items, this could be an electric sector-only or multi-sector emissions target.

Fields:
field candidate_fuels: dict[str, EmissionsContribution] = {}
field constraint_operator: ConstraintOperator = ConstraintOperator.LESS_THAN_OR_EQUAL_TO
field demands: dict[str, AllToPolicy] = {}
field final_fuels: dict[str, EmissionsContribution] = {}
field negative_emissions_technologies: dict[str, AllToPolicy] = {}
field plants: dict[str, AllToPolicy] = {}
field pollutants: dict[str, AllToPolicy] = {}
field resources: dict[str, EmissionsContribution] = {}
field target_basis: TargetBasis = TargetBasis.SYSTEM_LOAD
field target_units: TargetUnits = TargetUnits.ABSOLUTE
field transportations: dict[str, AllToPolicy] = {}
field tx_paths: dict[str, TxEmissionsContribution] = {}
field type: str = 'emissions'
revalidate()

Validate Resource β†’ Candidate Fuel β†’ Emissions Policy criteria are met.

  1. Resource β†’ Policy linkage or Candidate Fuel β†’ Policy linkage must have a multiplier for every resource linked.

  2. Cannot have a multiplier defined on both a Resource β†’ Policy and Candidate Fuel β†’ Policy

property assets
property governed_items
class AnnualEnergyStandard

Bases: Policy

Policy class for Renewable Portfolio Standard (RPS) or Clean Energy Standard (CES) type policies.

Fields:
field candidate_fuels: dict[str, AnnualEnergyStandardContribution] = {}
field constraint_operator: ConstraintOperator = ConstraintOperator.GREATER_THAN_OR_EQUAL_TO
field loads: dict[str, AnnualEnergyStandardContribution] = {}
field resources: dict[str, AnnualEnergyStandardContribution] = {}
field target_basis: None | TargetBasis = None
field target_units: TargetUnits = TargetUnits.ABSOLUTE
field type: str = 'energy'
property governed_items
class EnergyReserveMargin

Bases: Policy

Policy class for Energy Reserve Margin (ERM) type policies.

Fields:
field allow_inter_period_sharing: bool = True
field assets_: dict[str, ERMContribution] = {}
field constraint_operator: ConstraintOperator = ConstraintOperator.GREATER_THAN_OR_EQUAL_TO
field resources: dict[str, ERMContribution] = {}
field target: NumericTimeseries = None
field target_adjustment: NumericTimeseries | None [Optional]
field target_basis: None | TargetBasis = None
field target_units: TargetUnits = TargetUnits.ABSOLUTE
field tx_paths: dict[str, ERMContribution] = {}
field type: str = 'erm'
model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

update_targets_from_loads()

Update policy targets if loads are linked to policies

update_targets_to_weather_year_index(modeled_years: tuple[int, int], weather_years: tuple[int, int])
property assets
property governed_items
property other_resources
property resource_groups
property resource_instances
property shed_dr_resources
property storage_resources
class HourlyEnergyStandard

Bases: Policy

Ideally this would be merged with AnnualEnergyStandard, but to preserve backward compatibility for now, keeping separate.

Fields:
field candidate_fuels: dict[str, HourlyEnergyStandardContribution] = {}
field constraint_operator: ConstraintOperator = ConstraintOperator.GREATER_THAN_OR_EQUAL_TO
field resources: dict[str, HourlyEnergyStandardContribution] = {}
field slack_penalty: NumericTimeseries [Optional]
field type: str = 'energy'
check_constraint_violations(model: ConcreteModel)
model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

update_targets_from_loads()

Update policy targets if loads are linked to policies

class PlanningReserveMargin

Bases: Policy

Policy class for Planning Reserve Margin (PRM) type policies.

Assets can be assigned Effective Load Carrying Capability (ELCC) linkages or Net Qualifying Capacity (NQC) attributes to contribute toward PRM polices.

Fields:
field assets_: dict[str, ReliabilityContribution] = {}
field caiso_tx_constraints: dict[str, ReliabilityContribution] = {}
field constraint_operator: ConstraintOperator = ConstraintOperator.GREATER_THAN_OR_EQUAL_TO
field elcc_surfaces: dict[str, ELCCReliabilityContribution] = {}
field plants: dict[str, ReliabilityContribution] = {}
field reliability_event_length: NumericTimeseries [Optional]
field resources: dict[str, ReliabilityContribution] = {}
field target_basis: TargetBasis = TargetBasis.SYSTEM_LOAD
field tx_paths: dict[str, ReliabilityContribution] = {}
field type: str = 'prm'
revalidate()

Validate Asset β†’ ELCC β†’ PRM linkage criteria are met.

  1. Check that every asset linked to the reliability policy has at least an NQC or ELCC assigned

  2. There cannot be more than one ELCC surface for an asset-policy pair

  3. There cannot be both an ELCC and NQC for the same asset

property assets
property governed_items
class Policy

Bases: Component

Parent class for specific types of policy sub-classes.

This is a pseudo-abstract base class.

Fields:
field constraint_operator: ConstraintOperator [Required]
field custom_constraints: dict[str, CustomConstraintLinkage] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = 3

  • default_exclude = True

field loads: dict[str, AllToPolicy] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field price: NumericTimeseries | None = None
field slack_penalty: float = 1000000

Cost to model of relaxing policy ($)

field target: NumericTimeseries | None = None
field target_adjustment: NumericTimeseries | None [Optional]

Adjustment to the target. A positive adjustment would add the target, while a negative adjustment would be subtracted from the target.

field target_basis: TargetBasis [Required]

Basis of the target. Can be β€˜sales’ or β€˜system demand’. Sales-based policies, like California’s RPS, are based on the sales (before T&D losses). System-based policies consider total system load (i.e., sales * T&D losses).

field target_units: TargetUnits [Required]

Units of the target. Can be percentage or absolute. For example, policy targets for an GHG policy arelikely absolute while an RPS policy is a percentage of sales.

field type: Literal['emissions', 'energy', 'prm', 'erm'] [Required]

Type of policy. Can be related to energy, emissions, prm, erm

update_targets_from_loads()

Update policy targets if loads are linked to policies

SAVE_PATH: ClassVar[str] = 'policies'
property annual_results_column_order

This property defines the ordering of columns in the component’s annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property results_reporting_category
property results_reporting_folder
class TargetBasis(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)

Bases: Enum

HOURS = 'hours'
SALES = 'sales'
SYSTEM_LOAD = 'system load'
class TargetUnits(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)

Bases: Enum

ABSOLUTE = 'absolute'
RELATIVE = 'relative'

new_modeling_toolkit.system.pollutant module

new_modeling_toolkit.system.product module

new_modeling_toolkit.system.sector module

class Sector

Bases: Component

This class defines a Sector object and its methods.

Fields:
field building_shell_subsectors: Dict[str, Linkage] | None = None
field energy_demand_subsectors: dict[str, Linkage] = {}
field negative_emissions_technologies: dict[str, Linkage] = {}
field non_energy_subsectors: dict[str, Linkage] = {}
field sector_candidate_fuel_blending: dict[tuple[str, str] | str, ThreeWayLinkage] | None = None
field stock_rollover_subsectors: dict[str, Linkage] = {}
SAVE_PATH: ClassVar[str] = 'sectors'

Module contents

class AnnualEmissionsPolicy

Bases: Policy

Policy class for annual system emissions targets.

Depending on scope of governed items, this could be an electric sector-only or multi-sector emissions target.

Fields:
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 candidate_fuels: dict[str, EmissionsContribution] = {}
field class_name: str | None = None
field constraint_operator: ConstraintOperator = ConstraintOperator.LESS_THAN_OR_EQUAL_TO
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 demands: dict[str, AllToPolicy] = {}
field final_fuels: dict[str, EmissionsContribution] = {}
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 loads: Annotated[dict[str, linkage.AllToPolicy], Metadata(linkage_order='from')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field name: str | tuple [Required]
field negative_emissions_technologies: dict[str, AllToPolicy] = {}
field plants: dict[str, AllToPolicy] = {}
field pollutants: dict[str, AllToPolicy] = {}
field price: ts.NumericTimeseries | None = None
field resources: dict[str, EmissionsContribution] = {}
field slack_penalty: float = 1000000

Cost to model of relaxing policy ($)

field target: ts.NumericTimeseries | None = None
field target_adjustment: ts.NumericTimeseries | None [Optional]

Adjustment to the target. A positive adjustment would add the target, while a negative adjustment would be subtracted from the target.

field target_basis: TargetBasis = TargetBasis.SYSTEM_LOAD
field target_units: TargetUnits = TargetUnits.ABSOLUTE
field transportations: dict[str, AllToPolicy] = {}
field tx_paths: dict[str, TxEmissionsContribution] = {}
field type: str = 'emissions'
revalidate()

Validate Resource β†’ Candidate Fuel β†’ Emissions Policy criteria are met.

  1. Resource β†’ Policy linkage or Candidate Fuel β†’ Policy linkage must have a multiplier for every resource linked.

  2. Cannot have a multiplier defined on both a Resource β†’ Policy and Candidate Fuel β†’ Policy

property assets
property governed_items
class AnnualEnergyStandard

Bases: Policy

Policy class for Renewable Portfolio Standard (RPS) or Clean Energy Standard (CES) type policies.

Fields:
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 candidate_fuels: dict[str, AnnualEnergyStandardContribution] = {}
field class_name: str | None = None
field constraint_operator: ConstraintOperator = ConstraintOperator.GREATER_THAN_OR_EQUAL_TO
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 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 loads: dict[str, AnnualEnergyStandardContribution] = {}
field name: str | tuple [Required]
field price: ts.NumericTimeseries | None = None
field resources: dict[str, AnnualEnergyStandardContribution] = {}
field slack_penalty: float = 1000000

Cost to model of relaxing policy ($)

field target: ts.NumericTimeseries | None = None
field target_adjustment: ts.NumericTimeseries | None [Optional]

Adjustment to the target. A positive adjustment would add the target, while a negative adjustment would be subtracted from the target.

field target_basis: None | TargetBasis = None
field target_units: TargetUnits = TargetUnits.ABSOLUTE
field type: str = 'energy'
property governed_items
class Asset

Bases: Component

An Asset is anything with a cost & quantity.

Fields:
field annual_energy_policies: dict[str, AnnualEnergyStandardContribution] = {}
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: float = 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: NumericTimeseries [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: dict[str, AssetToAssetGroup] = {}
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: Timestamp = 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: dict[str, AssetToCaisoTxConstraint] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field can_build_new: bool = 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: bool = 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: NumericTimeseries | None = None
field custom_constraints: dict[str, CustomConstraintLinkage] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = 3

  • default_exclude = True

field elcc_surfaces: dict[str, AssetToELCC] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field emissions_policies: dict[str, EmissionsContribution] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field erm_policies: dict[str, ERMContribution] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field hourly_energy_policies: dict[str, HourlyEnergyStandardContribution] = {}
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: float | None = 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: float | None = 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: NumericTimeseries | None = 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: NumericTimeseries | None = None
field physical_lifetime: int = 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: NumericTimeseries [Optional]
Constraints:
  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field potential: float | None = inf
Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field prm_policies: dict[str, ReliabilityContribution] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field random_seed: int | None = None

Random seed

Constraints:
  • category = FieldCategory.RELIABILITY

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field retired_capacity: NumericTimeseries | None = None
field selected_capacity: float | None = None
field stochastic_outage_rate: float | None = 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 vintage_parent_group: str | None = None
field zones: dict[str, AssetToZone] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

check_if_operationally_equal(other: Asset, check_linkages: bool = True, fields_to_check: list[str] | None = None) β†’ bool

Check is this Asset is β€œoperationally equivalent” to another Asset.

This check is used when automatically grouping resources together in RESOLVE for the construction of operational constraints. See AssetGroup for more information.

Operational equivalence is defined by two categories. First, all the β€œoperational attributes” of the Assets (which are defined in a class variable) must be equal. Any attribute whose value may impact the optimal operational decisions for the assets have to be equal. For example, they must have equal power_output_max profiles, among other things. Second, they must have equivalent β€œoperational linkages” - see check_operational_linkages_are_equal for more information.

Parameters:
  • other – the Resource to compare to

  • check_linkages – whether linkages should be considered in determining operational equality

  • fields_to_check – an optional list of a subset of fields to check

Returns:

whether the two Resources are operationally equal

Return type:

bool

check_operational_linkages_are_equal(other: Asset) β†’ bool

Checks whether two Assets have equivalent β€œoperational linkages.”

In order for two Assets to be β€œoperationally equivalent,” one condition is that any linkages which may impact

the operational decisions of the resource must also be equal. For example, if a Resource is linked to an

AnnualEmissionsStandard, then its dispatch will be partially influenced by this emissions target, so the other Resource must also be linked to that policy.

Parameters:

other – the other Asset to compare against

Returns:

whether or not the two components have equivalent operational linkages

Return type:

equal

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

save_capacity_expansion_results()
save_cumulative_retired_capacity()

Save the resulting retired capacity after the RESOLVE model has been solved.

save_operational_capacity()

Save the resulting operational capacity after the RESOLVE model has been solved.

save_retired_capacity()

Save the resulting retired capacity after the RESOLVE model has been solved.

save_selected_capacity()

Save the resulting selected capacity after the RESOLVE model has been solved.

SAVE_PATH: ClassVar[str] = 'assets'
property annual_results_column_order

This property defines the ordering of columns in the Asset annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property has_operational_rules: bool

Property for whether this asset has operational rules (i.e., it is not a part of an operational group)

property non_operational_linkages
property operational_attributes
property operational_group: AssetGroup | None
property operational_group_name: str
property operational_linkages
property operational_three_way_linkages
property outage_distribution
property policies
property zone_names_string: str

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

class AssetGroup

Bases: Asset

AssetGroup combines multiple vintages of Assets, since Resolve and Recap treat these differently.

For Resolve, separate vintages For Recap, combine vintages

Fields:
field aggregate_operations: bool = False

Whether to enforce operational constraints across all assets in the group as if they were a single asset. This is only possible if all assets in the group are operationally equivalent to one another.

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: NumericTimeseries [Optional]
field annualized_fixed_om_cost: NumericTimeseries [Optional]
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 assets: dict[str, AssetToAssetGroup] [Optional]
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • 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: None = None
Constraints:
  • func = <function _set_to_none at 0x72b1dfc4a160>

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_potential: NumericTimeseries | None = None

Cumulative build potential for planned and selected capacity by model year across all assets in the group

Constraints:
  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • default_exclude = False

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 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_cumulative_new_build: NumericTimeseries | None = None

Cumulative minimum required selected capacity by model year across all assets in the group

Constraints:
  • units = megawatt

  • 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 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: NumericTimeseries | None = None

Build potential for planned and selected capacity by model year across all assets in the group

Constraints:
  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • 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 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 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 vintage_parent_group: str | None = None
field vintages_to_construct: BooleanTimeseries [Optional]
field zones: Annotated[dict[str, linkage.AssetToZone], 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

classmethod construct_operational_groups(assets: list[Asset], skip_single_member_groups: bool = False) β†’ tuple[dict[str, AnyOperationalGroup], dict[str, AnyResource]]

Takes a list of resources of the same type and returns a list of OperationalGroup objects containing the assets which are operationally equivalent to one another.

If skip_single_member_groups is True, any group that would have only one Asset in it is not created, and a dictionary of these resources will be returned along with a dictionary of OperationalGroup objects. If skip_single_member_groups is False, an empty dictionary will be returned along with the OperationalGroups.

Parameters:
  • assets – the list of Resources to create the groups from

  • skip_single_member_groups – whether to skip the creation of groups that would only have a single member

Returns:

a dictionary of constructed AssetGroup instances single_member_assets: if skip_single_member_groups is True, a dictionary of all Assets that were not

assigned to a group

Return type:

asset_groups

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

update_assets_with_results()

Allocates optimization model results to the linked Assets based on the fraction of total operational capacity in each modeled year that is represented by each asset.

SAVE_PATH: ClassVar[str] = 'assets/groups'
property annual_results_column_order

This property defines the ordering of columns in the Asset annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property asset_instances: dict[str, Asset]

Returns a dictionary of all Asset instances linked to the group. These can be Assets or other AssetGroups.

property build_assets

For build decisions, always use the individual asset instances. This is a recursive property that gets the Assets directly linked to this AssetGroup plus any Assets linked to AssetGroups linked to this AssetGroup.

property directly_linked_build_assets

For build decisions, always use the individual asset instances.

property earliest_build_year
property has_operational_rules: bool

Redefine has_operational_rules property based on aggregate_options attribute

property operational_assets

For operational decisions, whether we use an Asset or AssetGroup depends on whether AssetGroup has aggregate_operations==True.

class CandidateFuel

Bases: _EnergyCarrier

A candidate fuel is one type of fuel that can be used to meet a final fuel demand, be produced by a fuel production plant, or consumed by a plant or thermal resource.

Gasoline is a final fuel; E85 ethanol and fossil gasoline are candidate fuels.

Every candidate fuel is either a commodity, which can be parametrized to have an upper limit of availability and prices, or can be produced via a fuel conversion plant. Currently, the only form of fuel conversion possible is fuel-to-fuel or electricity-to-fuel.

from_csv()

instantiate fuel objects from a csv input file

Fields:
field annual_energy_policies: dict[str, AnnualEnergyStandardContribution] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field annual_price: NumericTimeseries | None = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / MMBtu

  • excel_short_title = Annual Price

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field availability: NumericTimeseries | None = None

This input sets the maximum potential for this commodity product. If the commodity product is used in RESOLVE, consumption of this product will never exceed the availability in a given year.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = MMBtu_per_year

  • excel_short_title = Availability

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field commodity: bool = True (alias 'fuel_is_commodity_bool')

Set to False if this fuel is endogenously produced; otherwise, it will be considered a β€˜commodity’ with a fixed price stream and potentially a fixed consumption limit.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field electrolyzers: dict[str, Linkage] = {}
field emission_types: dict[str, Linkage] = {}
field emissions_policies: dict[str, EmissionsContribution] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field final_fuels: dict[str, Linkage] = {}
field fuel_production_plants: dict[str, Linkage] = {}
field fuel_storages: dict[str, Linkage] = {}
field fuel_transportations: dict[str, Linkage] = {}
field fuel_zones: dict[str, Linkage] = {}
field monthly_price_multiplier: NumericTimeseries | None = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Multiplier

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field pollutants: dict[str, Linkage] = {}
field price_per_unit: NumericTimeseries | None = None (alias 'fuel_price_per_mmbtu')
Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / MMBtu

  • excel_short_title = Price

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field resources: dict[str, CandidateFuelToResource] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field sector_candidate_fuel_blending: dict[tuple[str, str] | str, ThreeWayLinkage] = {}
field unit: Unit | str = <Unit('MMBtu')>
calc_energy_demand(sector: str, final_fuel_energy_demand: Series) β†’ Series

CandidateFuel energy demand = FinalFuel energy demand * candidate fuel blending %

Parameters:
  • sector – str of Sector name, used for filtering input data

  • final_fuel_energy_demand – pd.Series of energy demand for the FinalFuel

Returns: pd.Series of energy demand for the CandidateFuel

calc_fuel_cost(candidate_fuel_energy_demand: Series)

CandidateFuel fuel cost = CandidateFuel energy demand * candidate fuel fuel_price per mmbtu

Parameters:

candidate_fuel_energy_demand – pd.Series of calculated CandidateFuel energy demand in mmbtu

Returns: pd.Series of CandidateFuel fuel cost in $

candidate_fuel_blend(sector: str) β†’ Series
Parameters:

sector – str of Sector name

Returns: pd.Series of blend_override data for the input sector name saved on the SectorCandidateFuelBlending ThreeWayLinkage

revalidate()

Check that product price is specified if commodity is True.

SAVE_PATH: ClassVar[str] = 'candidate_fuels'
property final_fuel_name
property fuel_is_commodity_bool
property fuel_price_per_mmbtu
property pollutant_list
property thermal_resource_instances: dict[str]
class Demand

Bases: Component

Currently only works for a single input product via one DemandToProduct or Process linkage. Will need to be updated to accommodate multiple input products via multiple DemandToProduct or Process linkages and/or via ProductBlend.

Fields:
  • annual_energy_forecast (Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Forecast')])

  • annual_peak_forecast (Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Peak')])

  • attr_path ()

  • class_name ()

  • demand_products (dict[str, DemandToProduct])

  • emissions_policies (Annotated[dict[str, linkage.EmissionsContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)])

  • include ()

  • input_zones (dict[str, FromZoneToDemand])

  • model_year_profiles (dict[int, ts.NumericTimeseries])

  • name ()

  • output_zones (dict[str, ToZoneToDemand])

  • processes (dict[Union[tuple[str, str], str], Process])

  • profile (Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Profile')])

  • profile_model_years (Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Modeled Year Profile')])

  • scale_by_capacity (bool)

  • scale_by_energy (bool)

  • td_losses_adjustment (Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='T&D Factor')])

field annual_energy_forecast: Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Forecast')] = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Forecast

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annual_peak_forecast: Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Peak')] = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Peak

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field demand_products: dict[str, DemandToProduct] = {}
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 input_zones: dict[str, FromZoneToDemand] = {}
field model_year_profiles: dict[int, ts.NumericTimeseries] = {}

Model year profiles scaled to annual peak and/or annual energy forecasts

field output_zones: dict[str, ToZoneToDemand] = {}
field processes: dict[tuple[str, str] | str, Process] = {}
field profile: Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Profile')] = None

Weather year(s) demand profile to be scaled. Must have either weather year OR model year profile, but not both.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field profile_model_years: Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Modeled Year Profile')] = None

Model year(s) demand profile to be scaled. Datetime index should include modeled years. Must have either weather year OR model year profile, but not both.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Modeled Year Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field scale_by_capacity: bool = False

If true, calculate model year profiles by scaling profile to median annual peak

field scale_by_energy: bool = False

If true, calculate model year profiles by scaling profile to mean annual energy

field td_losses_adjustment: Annotated[ts.NumericTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='T&D Factor')] [Optional]

T&D loss adjustment to gross up to system-level demands. For example, a DER may be able to serve 8% more demand (i.e., 1.08) than an equivalent bulk system resource due to T&D losses. Adjustment factor is directly multiplied against demand (as opposed to 1 / (1 + td_losses_adjustment).

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = T&D Factor

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

forecast_demand(modeled_years: tuple[int, int], weather_years: tuple[int, int], custom_scalars: Series | None = None)

Calculate the scaling coefficient and scaling offset for the demand series in order to scale them to any future between the first model year and last model year. The coefficient and offset is determine by the future peak demand series and energy series, and the demand scaling method defined by the user.

Parameters:
  • modeled_years – tuple first model year to last model year

  • weather_years – tuple first weather year to last weather year (only used for profile_modeled_years)

  • custom_scalars – Optional series of scalars to be applied to annual energy forecast. Only used if scale_by_energy is true. Intended to ensure annual energy forecast is still true when weighted dispatch windows are applied.

Returns: Updated modeled_year_profile dict

get_demand(modeled_year: int, weather_year_timestamp: Timestamp)

Based on the model year, first find the future demand series belonging to that model year. And based on the period and hour, query the specific hourly demand for that hour in the model year. :param system: System.system. current power system :param modeled_year: int. model year being queried :param weather_year_timestamp: model hour being queried

Returns: int. demand for the tp under query.

normalize_profile(normalize_by)

Normalize profile by capacity or by energy

resample_ts_attributes(modeled_years: tuple[int, int], weather_years: tuple[int, int], resample_weather_year_attributes=True, resample_non_weather_year_attributes=True)

Resample timeseries attributes to the default frequencies to make querying via slice_by_timepoint and slice_by_year more consistent later.

  1. Downsample data by comparing against a β€œcorrect index” with the correct default_freq

  2. If data start year > modeled start year, fill timeseries backward

  3. Create a temporary timestamp for the first hour of the year after the modeled end year to make sure we have all the hours, minutes (e.g., 23:59:59) filled in in step (4)

  4. Resample to fill in any data (particularly at end of timeseries) and drop temporary timestamp from (3)

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

static scale_demand(profile: NumericTimeseries, to_peak: bool | float, to_energy: bool | float, td_losses_adjustment: float, leap_year: bool) β†’ NumericTimeseries

Scale timeseries by energy and/or median peak.

Scaling to energy assumes to_energy forecast value will match whether it is/is not a leap year. In other words, the energy forecast for a leap day includes an extra day’s worth of energy.

Parameters:
  • profile – Hourly timeseries to be scaled

  • to_peak – Median annual peak to be scaled to

  • to_energy – Mean annual energy to be scaled to

  • td_losses_adjustment – T&D losses adjustment (simple scalar on demand profile)

  • leap_year – If year being scaled to is a leap year (affecting energy scaling)

Returns:

Scaled hourly timeseries

Return type:

new_profile

update_demand_components(**kwargs)
SAVE_PATH: ClassVar[str] = 'demands'
property consumed_products

Unique input products.

property policies
property primary_consumed_product: str
property produced_products

Unique output products.

property products
property timeseries_attrs
property unit
class ELCCSurface

Bases: Component

Fields:
field assets: dict[str, AssetToELCC] = {}
field facets: dict[str, ELCCFacetToSurface] = {}
field prm_policies: dict[str, ELCCReliabilityContribution] = {}
revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'elcc_surfaces'
class Electricity

Bases: _EnergyCarrier

Fields:
  • annual_price ()

  • attr_path ()

  • availability ()

  • charging_processes ()

  • class_name ()

  • commodity ()

  • demands ()

  • include ()

  • monthly_price_multiplier ()

  • name ()

  • price_per_unit ()

  • processes ()

  • product_blends ()

  • transportations ()

  • unit (pint.Unit | str)

  • zones ()

field unit: pint.Unit | str = <Unit('kilowatt_hour')>
SAVE_PATH: ClassVar[str] = 'electricity_products'
class EnergyDemand

Bases: Demand

An energy demand is an element of the non-electric sector economy that demands a CandidateFuel or electricity. It operates nearly identically to a Demand but requires a subclass of _EnergyCarrier as its consumed input.

Fields:
  • annual_energy_forecast ()

  • annual_peak_forecast ()

  • attr_path ()

  • class_name ()

  • demand_products ()

  • emissions_policies ()

  • include ()

  • input_zones ()

  • model_year_profiles ()

  • name ()

  • output_zones ()

  • processes ()

  • profile ()

  • profile_model_years ()

  • scale_by_capacity ()

  • scale_by_energy ()

  • td_losses_adjustment ()

SAVE_PATH: ClassVar[str] = 'demands/energy_demands'
class FinalFuel

Bases: Component

A final fuel represents a type of energy that can be consumed by a device, or by an energy demand subsector. A final fuel may represent several unique fuels– for example, the β€œdiesel” final fuel might actually represent the sum of fossil diesel and renewable diesel. The purpose of a final fuel is to aggregate all fuels which have common combustion characteristics from the perspective of a device or energy demand subsector. The term β€œfinal” refers to the fact that this is the fuel that is seen at the β€œfinal” point in the energy supply chain, i.e. the point of combustion.

This component exists mainly so that the fuel share of service demand for devices can be specified via a linkage to fuels. The fuel_switchings attribute defined on a three-way linkage between final fuels and energy demand subsectors that dictates the extent, efficiency, and cost of fuel switching within a given energy demand subsector. Fuel efficiency occurs after fuel switching.

Fields:
field annual_demand: NumericTimeseries | None = None

Annual fuel demand.

field candidate_fuels: dict[str, Linkage] = {}
field ccs_plants: dict[str, Linkage] = {}
field demand: NumericTimeseries | None = None

Annual fuel demand.

field devices: dict[str, Linkage] = {}
field energy_demand_subsector_to_final_fuel_to_ccs_plant: dict[tuple[str, str] | str, ThreeWayLinkage] | None = None
field energy_demand_subsectors: dict[str, Linkage] = {}
field fuel_is_electricity: bool = False
field fuel_is_using_emissions_trajectory_override: bool = False
field fuel_price_per_mmbtu_override: NumericTimeseries | None = None
field fuel_switchings: dict[tuple[str, str] | str, ThreeWayLinkage] | None = None
field fuel_zones: dict[str, Linkage] = {}
field negative_emissions_technologies: dict[str, Linkage] = {}
field policies: dict[str, Linkage] = {}
field sector_candidate_fuel_blending: dict[tuple[str, str] | str, ThreeWayLinkage] | None = None
calc_energy_demand_cost_and_emissions(sector: str, energy_demand: Series)

Loop through CandidateFuels linked to the FinalFuel. For each candidate fuel, calculate the energy demand. Then loop through each pollutant on each candidate fuel and calculate emissions by pollutant type. Results are temporarily saved on the linkages (ex: FinalFuelToCandidateFuel and CandidateFuelToPollutant). After looping, results are then aggregated (by calling the `self._return_{result type}_by_candidate_fuel’ functions) and saved permanently on the linked component. Another option is to save aggregated results on the 1:1 XToFinalFuel linkage because it will not be overwritten.

Parameters:
  • sector – name of sector for filtering. Ex: β€œResidential” or β€œIndustrial”

  • energy_demand – pd.Series of energy demand of FinalFuel in mmbtu

Returns:

SAVE_PATH: ClassVar[str] = 'products/final_fuels'
property candidate_fuels_list: list[CandidateFuel]

list of CandidateFuel components linked to the FinalFuel object

Type:

Returns

class FlexLoadResource

Bases: ShedDrResource, StorageResource

Fields:
field adjacency: int [Required]

Number of adjacent hours to constrain energy shifting. Adjacency constraints ensure that if load is shifted down in one hour, an equivalent amount of load is shifted up at most X hours away, and vice versa. [hours]

Constraints:
  • gt = 0

field duration: NumericTimeseries = None (alias 'flex_storage_duration')

Operational time of the battery at a specified power level before it runs out of energy [hours]. Note: not all flex load resources will require a duration. Only EV resources. For all others, the duration will default to the length of the adjacency window.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • default_exclude = False

field energy_budget_daily: FractionalTimeseries = None

Daily fraction of energy capacity allowed for daily dispatch [dimensionless].

field shift_direction: FlexLoadShiftDirection [Required]

If pre_consumption, flexible load resources always need to increase load first before providing power.An example of this is pre-cooling.If deferred_consumption, flexible load resources always will provide power first before increasing load.An example of this is deferring to use appliances. If either, the resource can do provide power or increase load first depending on what is optimal.

classmethod update_duration_default(values)

Set default of duration equal to adjacency if not provided

SAVE_PATH: ClassVar[str] = 'resources/shift'
class FuelProductionPlant

Bases: Plant

A subclass of Plant that is specifically designed to produce some kind of β€œfuel” rather than electricity.

Fields:
  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_retired_capacity ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • input_zones ()

  • integer_build_increment ()

  • max_output_profile ()

  • mean_time_to_repair ()

  • min_operational_capacity ()

  • min_output_profile ()

  • name ()

  • operational_capacity ()

  • output_zones ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • primary_product ()

  • prm_policies ()

  • processes ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_down_limit ()

  • ramp_up_limit ()

  • random_seed ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost ()

  • vintage_parent_group ()

  • zones ()

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'fuel_production_plants'
class FuelStorage

Bases: FuelProductionPlant

Fields:
  • allow_inter_period_sharing (bool)

  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • annualized_storage_capital_cost (float)

  • annualized_storage_fixed_om_cost (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries)

  • asset_groups ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • charging_processes (dict[tuple[str, str] | str, new_modeling_toolkit.system.generics.process.ChargeProcess])

  • class_name ()

  • cumulative_retired_capacity ()

  • cumulative_retired_storage_capacity (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)

  • custom_constraints ()

  • duration (float)

  • duration_constraint (new_modeling_toolkit.system.fuel.fuel_storage.StorageDurationConstraint)

  • elcc_surfaces ()

  • emissions_policies ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • input_zones ()

  • integer_build_increment ()

  • max_input_profile (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)

  • max_output_profile ()

  • mean_time_to_repair ()

  • min_input_profile (new_modeling_toolkit.core.temporal.timeseries.FractionalTimeseries)

  • min_operational_capacity ()

  • min_output_profile ()

  • min_state_of_charge (float)

  • name ()

  • operational_capacity ()

  • operational_storage_capacity (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)

  • output_zones ()

  • parasitic_loss (float)

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • primary_product ()

  • prm_policies ()

  • processes ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_down_limit ()

  • ramp_up_limit ()

  • random_seed ()

  • retired_capacity ()

  • retired_storage_capacity (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)

  • selected_capacity ()

  • selected_storage_capacity (float | None)

  • stochastic_outage_rate ()

  • variable_cost ()

  • variable_cost_input (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries)

  • vintage_parent_group ()

  • zones ()

field allow_inter_period_sharing: bool = False

For fuel storage plants that have chronological energy storage capability, enable inter-period energy/state-of-charge tracking

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annualized_storage_capital_cost: float = 0.0

$/MMBtu-yr. For new storage capacity, the annualized fixed cost of investment. This is an annualized version of an overnight cost that could include financing costs ($/kWh-year).

Constraints:
  • category = FieldCategory.BUILD

  • units = dollar / MMBtu_year

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annualized_storage_fixed_om_cost: NumericTimeseries [Optional] (alias 'new_storage_capacity_fixed_om_by_vintage')

$/MMBtu-yr. For the planned portion of the resource’s storage capacity, the ongoing fixed O&M cost

Constraints:
  • category = FieldCategory.BUILD

  • units = dollar / MMBtu_year

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field charging_processes: dict[tuple[str, str] | str, ChargeProcess] [Optional]

These three-way linkages define the input-output charging relationship on the fuel storage plant.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field cumulative_retired_storage_capacity: NumericTimeseries | None = None
field duration: float [Required] (alias 'storage_duration')

Operational time of the fuel storage at a specified operation level before it runs out of energy [hours]

Constraints:
  • ge = 0

  • category = FieldCategory.OPERATIONS

  • units = hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • default_exclude = False

field duration_constraint: StorageDurationConstraint = StorageDurationConstraint.FIXED
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_input_profile: FractionalTimeseries [Optional]

Fixed shape of storage’s (e.g. flat shape for storage resources) max input.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = unitless

  • excel_short_title = Max Input Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field min_input_profile: FractionalTimeseries [Optional]

Fixed shape of storage’s (e.g. flat shape for storage resources) min input.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = unitless

  • excel_short_title = Max Input Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field min_state_of_charge: float = 0

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 state of charge at any given time.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field operational_storage_capacity: NumericTimeseries | None = None
field parasitic_loss: float = 0

Hourly state of charge losses.

Constraints:
  • ge = 0

  • le = 1

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field retired_storage_capacity: NumericTimeseries | None = None
field selected_storage_capacity: float | None = None
field variable_cost_input: NumericTimeseries [Optional]

Variable O&M cost per MMBtu generated.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / MMBtu

  • excel_short_title = VO&M In

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

apply_parasitic_loss(state_of_charge, period_hrs)
save_capacity_expansion_results()
save_cumulative_retired_storage_capacity()

Save the resulting retired storage capacity after the RESOLVE model has been solved.

save_operational_storage_capacity()

Save the resulting operational storage capacity after the RESOLVE model has been solved.

save_retired_storage_capacity()
save_selected_storage_capacity()

Save the resulting selected storage capacity after the RESOLVE model has been solved.

SAVE_PATH: ClassVar[str] = 'plants/fuel_storage_plants'
property charging_efficiency
property discharging_efficiency
property discharging_processes
property planned_storage_capacity: Series

This property is for fuel storage only now.

property primary_charging_processes
property primary_discharging_processes
property produced_products

Unique output products.

property storage_processes
property stored_products
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 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 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 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 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 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 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 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
class GenericResourceGroup

Bases: AssetGroup, GenericResource

Fields:
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

model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/generic/groups'
property annual_results_column_order

This property defines the ordering of columns in the Asset annual results summary out of Resolve.

property list_of_resource_names: list
property production_tax_credit_ts: NumericTimeseries
property results_reporting_category
class HybridStorageResource

Bases: StorageResource

Fields:
field hybrid_variable_resources: dict[str, HybridStorageResourceToHybridVariableResource] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/hybrid_storage'
property hybrid_erm_policy_linkage

Gets the ERM policy linkage for the hybrid storage resource for accessibility.

property hybrid_linkage
property paired_variable_resource: HybridVariableResource
class HybridStorageResourceGroup

Bases: StorageResourceGroup, HybridStorageResource

Fields:
model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

SAVE_PATH: ClassVar[str] = 'resources/hybrid_storage/groups'
class HybridVariableResource

Bases: VariableResource

Fields:
field hybrid_storage_resources: dict[str, HybridStorageResourceToHybridVariableResource] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/hybrid_variable'
property hybrid_linkage
class HybridVariableResourceGroup

Bases: VariableResourceGroup, HybridVariableResource

Fields:
model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

SAVE_PATH: ClassVar[str] = 'resources/hybrid_variable/groups'
class HydroResource

Bases: VariableResource

Resource with storage capacity.

Adds state-of-charge tracking.

It feels like BatteryResource could be composed of a GenericResource + Asset (that represents the storage costs), but need to think about this more before implementing.

Fields:
revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/hydro'
class HydroResourceGroup

Bases: VariableResourceGroup, HydroResource

Fields:
model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/hydro/groups'
class Load

Bases: Component

Fields:
field annual_energy_forecast: NumericTimeseries | None = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units = hour * megawatt

  • excel_short_title = Forecast

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annual_energy_policies: dict[str, AllToPolicy] [Optional]
field annual_peak_forecast: NumericTimeseries | None = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units = megawatt

  • excel_short_title = Peak

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field devices: dict[str, Linkage] [Optional]
field emissions_policies: dict[str, AllToPolicy] [Optional]
field energy_demand_subsectors: dict[str, Linkage] [Optional]
field erm_policies: dict[str, AllToPolicy] [Optional]
field hourly_energy_policies: dict[str, AllToPolicy] [Optional]
field model_year_profiles: dict[int, NumericTimeseries] = {}

Model year profiles scaled to annual peak and/or annual energy forecasts

field prm_policies: dict[str, AllToPolicy] [Optional]
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field profile: NumericTimeseries | None = None

Weather year(s) load profile to be scaled. Must have either weather year OR model year profile, but not both.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field profile_model_years: NumericTimeseries | None = None

Model year(s) load profile to be scaled. Datetime index should include modeled years. Must have either weather year OR model year profile, but not both.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Modeled Year Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field reserves: dict[str, LoadToReserve] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field scale_by_capacity: bool = False (alias 'scale_by_peak')

If true, calculate model year profiles by scaling profile to median annual peak

field scale_by_energy: bool = False

If true, calculate model year profiles by scaling profile to mean annual energy

field td_losses_adjustment: NumericTimeseries | None [Optional]

T&D loss adjustment to gross up to system-level loads. For example, a DER may be able to serve 8% more load (i.e., 1.08) than an equivalent bulk system resource due to T&D losses. Adjustment factor is directly multiplied against load (as opposed to 1 / (1 + td_losses_adjustment).

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = T&D Factor

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field zones: dict[str, LoadToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

forecast_load(modeled_years: tuple[int, int], weather_years: tuple[int, int], custom_scalars: Series | None = None)

Calculate the scaling coefficient and scaling offset for the load series in order to scale them to any future between the first model year and last model year. The coefficient and offset is determine by the future peak load series and energy series, and the load scaling method defined by the user.

Parameters:
  • modeled_years – tuple first model year to last model year

  • weather_years – tuple first weather year to last weather year (only used for profile_modeled_years)

  • custom_scalars – Optional series of scalars to be applied to annual energy forecast. Only used if scale_by_energy is true. Intended to ensure annual energy forecast is still true when weighted dispatch windows are applied.

Returns: Updated modeled_year_profile dict

get_load(modeled_year: int, weather_year_timestamp: Timestamp)

Based on the model year, first find the future load series belonging to that model year. And based on the period and hour, query the specific hourly load for that hour in the model year. :param system: System.system. current power system :param modeled_year: int. model year being queried :param weather_year_timestamp: model hour being queried

Returns: int. load for the tp under query.

normalize_profile(normalize_by)

Normalize profile by capacity or by energy

resample_ts_attributes(modeled_years: tuple[int, int], weather_years: tuple[int, int], resample_weather_year_attributes=True, resample_non_weather_year_attributes=True)

Resample timeseries attributes to the default frequencies to make querying via slice_by_timepoint and slice_by_year more consistent later.

  1. Downsample data by comparing against a β€œcorrect index” with the correct default_freq

  2. If data start year > modeled start year, fill timeseries backward

  3. Create a temporary timestamp for the first hour of the year after the modeled end year to make sure we have all the hours, minutes (e.g., 23:59:59) filled in in step (4)

  4. Resample to fill in any data (particularly at end of timeseries) and drop temporary timestamp from (3)

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

static scale_load(profile: NumericTimeseries, to_peak: bool | float, to_energy: bool | float, td_losses_adjustment: float, leap_year: bool) β†’ NumericTimeseries

Scale timeseries by energy and/or median peak.

Scaling to energy assumes to_energy forecast value will match whether it is/is not a leap year. In other words, the energy forecast for a leap day includes an extra day’s worth of energy.

Parameters:
  • profile – Hourly timeseries to be scaled

  • to_peak – Median annual peak to be scaled to

  • to_energy – Mean annual energy to be scaled to

  • td_losses_adjustment – T&D losses adjustment (simple scalar on load profile)

  • leap_year – If year being scaled to is a leap year (affecting energy scaling)

Returns:

Scaled hourly timeseries

Return type:

new_profile

update_load_components(**kwargs)
SAVE_PATH: ClassVar[str] = 'loads'
property annual_results_column_order

This property defines the ordering of columns in the component’s annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property policies
property timeseries_attrs
property zone_names_string: str

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

class NegativeEmissionsTechnology

Bases: Plant

Fields:
  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_retired_capacity ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • input_zones ()

  • integer_build_increment ()

  • max_output_profile ()

  • mean_time_to_repair ()

  • min_operational_capacity ()

  • min_output_profile ()

  • name ()

  • operational_capacity ()

  • output_zones ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • primary_product ()

  • prm_policies ()

  • processes ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_down_limit ()

  • ramp_up_limit ()

  • random_seed ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost ()

  • vintage_parent_group ()

  • zones ()

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'plants/negative_emissions_technologies'
property primary_processes: dict[tuple[str, str], Process]

Primary process defined as process in which both consumed and produced products are the primary product.

class OutageDistribution

Bases: Component

Fields:
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 class_name: str | None = None
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 name: str | tuple [Required]
field probability_mass_function: DataFrame | None = None
field resources: dict[str, Linkage] = {}
derate_checks(l_derate_prob, l_derate)
classmethod get_data_from_xlwings(wb: Book, sheet_name: str, fully_specified: bool = False, new_style: bool = False) β†’ DataFrame

Override Component.get_data_from_xlwings, because outage distribution points are special.

Currently, this class does not have any particular input attributes. All attributes are in the form of β€œderate_#” and β€œderate_prob_#”, so we cannot read directly from the Scenario Tool the way we would for standard component classes. This way of defining attributes works because in CustomModel we are allow extra attributes to be passed.

To accommodate the extra β€œindex”, we assume that the index named range (OutageDistribution) is two columns, where the second column is the distribution point.

get_random_derate_fraction_arr(size, seed)
set_pmf()
property PMF

Returns probability mass function for outages

SAVE_PATH: ClassVar[str] = 'outage_distributions'
class PlanningReserveMargin

Bases: Policy

Policy class for Planning Reserve Margin (PRM) type policies.

Assets can be assigned Effective Load Carrying Capability (ELCC) linkages or Net Qualifying Capacity (NQC) attributes to contribute toward PRM polices.

Fields:
field assets_: dict[str, ReliabilityContribution] = {}
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 caiso_tx_constraints: dict[str, ReliabilityContribution] = {}
field class_name: str | None = None
field constraint_operator: ConstraintOperator = ConstraintOperator.GREATER_THAN_OR_EQUAL_TO
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: dict[str, ELCCReliabilityContribution] = {}
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 loads: Annotated[dict[str, linkage.AllToPolicy], Metadata(linkage_order='from')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field name: str | tuple [Required]
field plants: dict[str, ReliabilityContribution] = {}
field price: ts.NumericTimeseries | None = None
field reliability_event_length: NumericTimeseries [Optional]
field resources: dict[str, ReliabilityContribution] = {}
field slack_penalty: float = 1000000

Cost to model of relaxing policy ($)

field target: ts.NumericTimeseries | None = None
field target_adjustment: ts.NumericTimeseries | None [Optional]

Adjustment to the target. A positive adjustment would add the target, while a negative adjustment would be subtracted from the target.

field target_basis: TargetBasis = TargetBasis.SYSTEM_LOAD
field target_units: TargetUnits [Required]

Units of the target. Can be percentage or absolute. For example, policy targets for an GHG policy arelikely absolute while an RPS policy is a percentage of sales.

field tx_paths: dict[str, ReliabilityContribution] = {}
field type: str = 'prm'
revalidate()

Validate Asset β†’ ELCC β†’ PRM linkage criteria are met.

  1. Check that every asset linked to the reliability policy has at least an NQC or ELCC assigned

  2. There cannot be more than one ELCC surface for an asset-policy pair

  3. There cannot be both an ELCC and NQC for the same asset

property assets
property governed_items
class Pollutant

Bases: Product

ADD DESCRIPTION

Fields:
  • GWP (float)

  • annual_price (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)

  • attr_path ()

  • availability (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)

  • candidate_fuels (dict[str, new_modeling_toolkit.core.linkage.CandidateFuelToPollutant])

  • ccs_plants (dict[str, new_modeling_toolkit.core.linkage.Linkage])

  • charging_processes ()

  • class_name ()

  • commodity ()

  • demands ()

  • emissions_policies (dict[str, new_modeling_toolkit.core.linkage.EmissionsContribution])

  • include ()

  • monthly_price_multiplier ()

  • name ()

  • negative_emissions_technologies (dict[str, new_modeling_toolkit.core.linkage.Linkage])

  • non_energy_subsectors (dict[str, new_modeling_toolkit.core.linkage.Linkage])

  • policies (dict[str, new_modeling_toolkit.core.linkage.Linkage])

  • price_per_unit (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)

  • processes ()

  • product_blends ()

  • resources (dict[str, new_modeling_toolkit.core.linkage.ResourceToPollutant])

  • transportations ()

  • tx_paths (dict[str, new_modeling_toolkit.core.linkage.TransmissionPathToPollutant])

  • unit (pint.registry.Unit)

  • zones ()

field GWP: float = 1

This input defines the CO2-equivalent global warming potential of this pollutant.

Constraints:
  • units = unitless

  • excel_short_title = Global Warming Potential

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annual_price: NumericTimeseries | None = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / metric_ton

  • excel_short_title = Annual Price

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field availability: NumericTimeseries | None = None

This input sets the maximum potential for this commodity product. If the commodity product is used in RESOLVE, consumption of this product will never exceed the availability in a given year.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = metric_ton

  • excel_short_title = Availability

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field candidate_fuels: dict[str, CandidateFuelToPollutant] = {}
field ccs_plants: dict[str, Linkage] = {}
field emissions_policies: dict[str, EmissionsContribution] = {}
field negative_emissions_technologies: dict[str, Linkage] = {}
field non_energy_subsectors: dict[str, Linkage] = {}
field policies: dict[str, Linkage] = {}
field price_per_unit: NumericTimeseries | None = None
Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / metric_ton

  • excel_short_title = Price

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field resources: dict[str, ResourceToPollutant] = {}
field tx_paths: dict[str, TransmissionPathToPollutant] = {}
field unit: Unit = <Unit('metric_ton')>
calc_emissions(linkage: CandidateFuelToPollutant, energy_demand: Series) β†’ None

Call functions to calculate net, gross, and upstream emissions for pollutant type.

Parameters:
  • linkage – Linkage object for CandidateFuelToPollutant

  • energy_demand – pd.Series of energy demand for the linked CandidateFuel

Returns: Emissions results are saved on the linkage directly for later access/aggregation

calc_gross_emissions(linkage: CandidateFuelToPollutant, energy_demand: Series) β†’ [<class 'pandas.core.series.Series'>, <class 'pandas.core.series.Series'>]

Calculate gross emissions

Parameters:
  • linkage – Linkage object for CandidateFuelToPollutant

  • energy_demand – pd.Series of energy demand for the linked CandidateFuel

Returns: tuple(pd.Series of emissions, pd.Series of emissions in CO2e)

calc_net_emissions(linkage: CandidateFuelToPollutant, energy_demand: Series) β†’ [<class 'pandas.core.series.Series'>, <class 'pandas.core.series.Series'>]

Calculate net emissions

Parameters:
  • linkage – Linkage object for CandidateFuelToPollutant

  • energy_demand – pd.Series of energy demand for the linked CandidateFuel

Returns: tuple(pd.Series of emissions, pd.Series of emissions in CO2e)

calc_upstream_emissions(linkage: CandidateFuelToPollutant, energy_demand: Series) β†’ [<class 'pandas.core.series.Series'>, <class 'pandas.core.series.Series'>]

Calculate upstream emissions

Parameters:
  • linkage – Linkage object for CandidateFuelToPollutant

  • energy_demand – pd.Series of energy demand for the linked CandidateFuel

Returns: tuple(pd.Series of emissions, pd.Series of emissions in CO2e)

SAVE_PATH: ClassVar[str] = 'pollutants'
class Reserve

Bases: Component

Fields:
field category: str | None = None
field custom_constraints: dict[str, CustomConstraintLinkage] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = 3

  • default_exclude = True

field direction: ReserveDirection [Required]
field exclusive: bool = True
field load_following_percentage: float | None = None
field loads: dict[str, LoadToReserve] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field penalty_unserved_reserve: float = 10000

Modeled penalty for unserved operating reserves.

field requirement: NumericTimeseries [Optional]
field resources: dict[str, ResourceToReserve] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field zones: dict[str, ReserveToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'reserves'
class ResourceGroup

Bases: Component

Fields:
field category: ResourceGroupCategory | None = None

[RECAP only]. string. Category of all resources in the group. Must be linked to a ResourceGroup. Used to upsample resources and simulate outages in RECAP.

field fixed_annual_shape: bool | None = False

[RECAP only]. TRUE/FALSE. boolean. Whether or not resources in this group have a fixed annual shape. Typically used when you do not want a resource to got through RECAP’s day draw algorithm.

field flexible_resources: dict[str, Linkage] = {}
field hybrid_variable_resources: dict[str, Linkage] = {}
field hydro_resources: dict[str, Linkage] = {}
field random_seed: float | None = None

Random seed used for outage simulation in RECAP.

field resources: dict[str, Linkage] = {}
field shed_dr_resources: dict[str, Linkage] = {}
field storage_resources: dict[str, Linkage] = {}
field thermal_resources: dict[str, Linkage] = {}
field variable_resources: dict[str, Linkage] = {}
draw_days_by_group(load_calendar, model_year, day_window_variable_draws, draw_random_seed)

Randomly draw the days for resource groups with a category of β€œvariable”. Default probability function is normal multivariate :returns:

day}: i is the datetimeindex of the full load profile,

group is the variable profile group, and day is a datetime.datetime representing the random day draw for that variable profile group

Return type:

dict {(i,group)

get_aggregated_generation_profile(model_year) β†’ Series
get_start_and_end_date()

Get the start and end date for the overlapping section of profiles for the group :returns: start_date and end_date (Timestamp) for the group of profiles :rtype: (start_date, end_date)

SAVE_PATH: ClassVar[str] = 'resource_groups'
property resource_dict
class Sector

Bases: Component

This class defines a Sector object and its methods.

Fields:
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 building_shell_subsectors: Dict[str, Linkage] | None = None
field class_name: str | None = None
field energy_demand_subsectors: dict[str, Linkage] = {}
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 name: str | tuple [Required]
field negative_emissions_technologies: dict[str, Linkage] = {}
field non_energy_subsectors: dict[str, Linkage] = {}
field sector_candidate_fuel_blending: dict[tuple[str, str] | str, ThreeWayLinkage] | None = None
field stock_rollover_subsectors: dict[str, Linkage] = {}
SAVE_PATH: ClassVar[str] = 'sectors'
class Sequestration

Bases: Plant

Fields:
  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_retired_capacity ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • input_zones ()

  • integer_build_increment ()

  • max_output_profile ()

  • mean_time_to_repair ()

  • min_operational_capacity ()

  • min_output_profile ()

  • name ()

  • operational_capacity ()

  • output_zones ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • primary_product ()

  • prm_policies ()

  • processes ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_down_limit ()

  • ramp_up_limit ()

  • random_seed ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost ()

  • vintage_parent_group ()

  • zones ()

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'plants/sequestration_plants'
property primary_processes: dict

Primary process defined as process in which both consumed and produced products are the primary product.

property primary_sequestration_rate: float
class ShedDrResource

Bases: UnitCommitmentResource

Fields:
field max_annual_calls: NumericTimeseries | None = None

Annual number of allowable calls per individual unit for a shed DR resource.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_call_duration: int | None = None

Maximum duration of a single shed demand response event call [hrs].

Constraints:
  • gt = 0

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_daily_calls: NumericTimeseries | None = None

Daily number of allowable calls per individual unit for a shed DR resource.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_monthly_calls: NumericTimeseries | None = None

Monthly number of allowable calls per individual unit for a shed DR resource.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

SAVE_PATH: ClassVar[str] = 'resources/shed'
class SolarResource

Bases: VariableResource

Fields:
  • allow_inter_period_sharing ()

  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_retired_capacity ()

  • curtailable ()

  • curtailment_cost ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • energy_budget_annual ()

  • energy_budget_daily ()

  • energy_budget_monthly ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • integer_build_increment ()

  • mean_time_to_repair ()

  • min_operational_capacity ()

  • name ()

  • operational_capacity ()

  • outage_distributions ()

  • outage_profile ()

  • outage_profile__type ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • power_output_max ()

  • power_output_max__type ()

  • power_output_min ()

  • power_output_min__type ()

  • prm_policies ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_rate_1_hour ()

  • ramp_rate_2_hour ()

  • ramp_rate_3_hour ()

  • ramp_rate_4_hour ()

  • random_seed ()

  • reserves ()

  • resource_groups ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost_power_output ()

  • vintage_parent_group ()

  • zones ()

SAVE_PATH: ClassVar[str] = 'resources/solar'
class SolarResourceGroup

Bases: VariableResourceGroup, SolarResource

Fields:
  • aggregate_operations ()

  • allow_inter_period_sharing ()

  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • assets ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_potential ()

  • cumulative_retired_capacity ()

  • curtailable ()

  • curtailment_cost ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • energy_budget_annual ()

  • energy_budget_daily ()

  • energy_budget_monthly ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • integer_build_increment ()

  • mean_time_to_repair ()

  • min_cumulative_new_build ()

  • min_operational_capacity ()

  • name ()

  • operational_capacity ()

  • outage_distributions ()

  • outage_profile ()

  • outage_profile__type ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • power_output_max ()

  • power_output_max__type ()

  • power_output_min ()

  • power_output_min__type ()

  • prm_policies ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_rate_1_hour ()

  • ramp_rate_2_hour ()

  • ramp_rate_3_hour ()

  • ramp_rate_4_hour ()

  • random_seed ()

  • reserves ()

  • resource_groups ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost_power_output ()

  • vintage_parent_group ()

  • vintages_to_construct ()

  • zones ()

model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

SAVE_PATH: ClassVar[str] = 'resources/solar/groups'
class StorageResource

Bases: GenericResource

Resource with storage capacity.

Adds state-of-charge tracking.

It feels like BatteryResource could be composed of a GenericResource + Asset (that represents the storage costs), but need to think about this more before implementing.

Fields:
field annualized_storage_capital_cost: float = 0.0 (alias 'new_storage_annual_fixed_cost_dollars_per_kwh_yr_by_vintage')

$/kWh-yr. For new storage capacity, the annualized fixed cost of investment. This is an annualized version of an overnight cost that could include financing costs ($/kWh-year).

Constraints:
  • units = dollar / kiloWh_year

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annualized_storage_fixed_om_cost: NumericTimeseries [Optional] (alias 'new_storage_capacity_fixed_om_by_vintage')

$/kWh-yr. For the planned portion of the resource’s storage capacity, the ongoing fixed O&M cost

Constraints:
  • units = dollar / kiloWh_year

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field charging_efficiency: FractionalTimeseries [Optional]

[RESOLVE, RECAP]. % of Charging MW. Efficiency losses associated with charging (increasing load), typically expressed as a % of nameplate unless charging power specified to increase storage β€œstate of charge”.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field charging_efficiency__type: TimeseriesType | None = None

Whether the charging_efficiency 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 cumulative_retired_storage_capacity: NumericTimeseries | None = None
field discharging_efficiency: FractionalTimeseries [Optional]

[RESOLVE, RECAP]. % of Discharging MW, Efficiency losses associated with discharging (providing power), typically expressed as a % of nameplate unless charging power specified, taking energy out of storage β€œstate of charge”.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field discharging_efficiency__type: TimeseriesType | None = None

Whether the discharging_efficiency 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 duration: float [Required] (alias 'storage_duration')

[RESOLVE, RECAP]. Hours of operational time the battery can operate at a specified power level before it runs out of energy. Required when resource is an operational group or does not belong to one.

Constraints:
  • ge = 0

  • category = FieldCategory.OPERATIONS

  • units = hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • default_exclude = False

field duration_constraint: StorageDurationConstraint = StorageDurationConstraint.FIXED

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.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field operational_storage_capacity: NumericTimeseries | None = None
field parasitic_loss: float = 0

[Storage] Hourly state of charge losses.

Constraints:
  • ge = 0

  • le = 1

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_input_max: FractionalTimeseries [Optional] (alias 'increase_load_potential_profile')

Fixed shape of resource’s potential power draw (e.g. flat shape for storage resources). Used in conjunction with new_modeling_toolkit.common.resource.Resource.curtailable.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = unitless

  • excel_short_title = Max Input Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_input_max__type: TimeseriesType | None = None

Whether the power_input_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_input_min: FractionalTimeseries [Optional]

Fixed shape of resource’s potential power draw (e.g. flat shape for storage resources). Used in conjunction with new_modeling_toolkit.common.resource.Resource.curtailable.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = unitless

  • excel_short_title = Min Input Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_input_min__type: TimeseriesType | None = None

Whether the power_input_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 retired_storage_capacity: NumericTimeseries | None = None
field selected_storage_capacity: float | None = None
field state_of_charge_min: float = 0

[Storage] Minimum state-of-charge at any given time.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field variable_cost_power_input: NumericTimeseries [Optional] (alias 'variable_cost_increase_load')

Variable O&M cost per MWh generated.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / megawatt_hour

  • excel_short_title = VO&M In

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

apply_parasitic_loss(state_of_charge, period_hrs)
check_if_operationally_equal(other)

Check is this Asset is β€œoperationally equivalent” to another Asset.

This check is used when automatically grouping resources together in RESOLVE for the construction of operational constraints. See AssetGroup for more information.

Operational equivalence is defined by two categories. First, all the β€œoperational attributes” of the Assets (which are defined in a class variable) must be equal. Any attribute whose value may impact the optimal operational decisions for the assets have to be equal. For example, they must have equal power_output_max profiles, among other things. Second, they must have equivalent β€œoperational linkages” - see check_operational_linkages_are_equal for more information.

Parameters:
  • other – the Resource to compare to

  • check_linkages – whether linkages should be considered in determining operational equality

  • fields_to_check – an optional list of a subset of fields to check

Returns:

whether the two Resources are operationally equal

Return type:

bool

clear_calculated_properties()

Clear the property cache so scaled profiles are recalculated after rescaling

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

save_capacity_expansion_results()
save_cumulative_retired_storage_capacity()

Save the resulting retired storage capacity after the RESOLVE model has been solved.

save_operational_storage_capacity()

Save the resulting operational storage capacity after the RESOLVE model has been solved.

save_retired_storage_capacity()

Save the resulting retired storage capacity after the RESOLVE model has been solved.

save_selected_storage_capacity()

Save the resulting selected storage capacity after the RESOLVE model has been solved.

SAVE_PATH: ClassVar[str] = 'resources/storage'
property imax_profile: Series
property imin_profile: Series
property planned_storage_capacity: Series

This property is for storage only now.

property scaled_SOC_max_profile: Dict[int, Series]

This property is for storage only now.

property scaled_imax_profile: Dict[int, Series]
property scaled_imin_profile: Dict[int, Series]
class StorageResourceGroup

Bases: GenericResourceGroup, StorageResource

Fields:
field annualized_storage_capital_cost: NumericTimeseries [Optional]
field annualized_storage_fixed_om_cost: NumericTimeseries [Optional]
field duration: float | None = None (alias 'storage_duration')

[RESOLVE, RECAP]. Hours of operational time of the battery can operate at a specified power level before it runs out of energy. Required when resource is an operational group or does not belong to one.

Constraints:
  • ge = 0

  • category = FieldCategory.OPERATIONS

  • units = hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = False

  • default_exclude = False

field power_input_max: FractionalTimeseries [Optional] (alias 'increase_load_potential_profile')

Fixed shape of resource’s potential power draw (e.g. flat shape for storage resources). Used in conjunction with new_modeling_toolkit.common.resource.Resource.curtailable.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = unitless

  • excel_short_title = Max Input Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/storage/groups'
class ThermalResource

Bases: GenericResource

Fuel-burning resource.

Fields:
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 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

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.

class ThermalResourceGroup

Bases: GenericResourceGroup, ThermalResource

Fields:
model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

revalidate()

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

SAVE_PATH: ClassVar[str] = 'resources/thermal/groups'
class ThermalUnitCommitmentResource

Bases: ThermalResource, UnitCommitmentResource

Fields:
field addition_to_load: float = 0

Synchronous condenser addition to load. Multiplier to commited capacity. Default 0.

Constraints:
  • ge = 0

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 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

revalidate()

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

SAVE_PATH: ClassVar[str] = 'resources/thermal'
class TxPath

Bases: Asset

Fields:
field forward_rating_profile: FractionalTimeseries | None [Optional]

Normalized fixed shape of TXPath’s potential forward rating

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Forward Rating

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field hurdle_rate_forward_direction: NumericTimeseries [Optional]
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Forward Hurdle

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field hurdle_rate_reverse_direction: NumericTimeseries [Optional]
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Reverse Hurdle

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field pollutants: dict[str, Linkage] = {}
field reverse_rating_profile: FractionalTimeseries | None [Optional]

Normalized fixed shape of TXPath’s potential reverse rating

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Reverse Rating

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field zones: dict[str, ZoneToTransmissionPath] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'tx_paths'
property annual_results_column_order

This property defines the ordering of columns in the component’s annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property from_zone
property to_zone
class VariableResource

Bases: GenericResource

Fields:
  • allow_inter_period_sharing ()

  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_retired_capacity ()

  • curtailable (bool)

  • curtailment_cost (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries)

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • energy_budget_annual ()

  • energy_budget_daily ()

  • energy_budget_monthly ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • integer_build_increment ()

  • mean_time_to_repair ()

  • min_operational_capacity ()

  • name ()

  • operational_capacity ()

  • outage_distributions ()

  • outage_profile ()

  • outage_profile__type ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • power_output_max ()

  • power_output_max__type ()

  • power_output_min ()

  • power_output_min__type ()

  • prm_policies ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_rate_1_hour ()

  • ramp_rate_2_hour ()

  • ramp_rate_3_hour ()

  • ramp_rate_4_hour ()

  • random_seed ()

  • reserves ()

  • resource_groups ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost_power_output ()

  • vintage_parent_group ()

  • zones ()

field curtailable: bool = True

TRUE/FALSE. boolean. Whether resource’s power output can be curtailed relative to new_modeling_toolkit.common.resource.Resource.potential_provide_power_profile.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field curtailment_cost: NumericTimeseries [Optional]

$/MWh. float. Cost of curtailment - the exogeneously assumed costat which different contract zones would be willing to curtail theirvariable renewable generation

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

get_sampled_profile_cf(profile: Timeseries, temporal_settings: TemporalSettings) β†’ float

Return capacity factor of given profile based on dispatch windows weights

classmethod scale_resource_profile(profile: Timeseries, scalar: float) β†’ Timeseries

Update input timeseries given scalar

update_resource_profiles(**kwargs)
SAVE_PATH: ClassVar[str] = 'resources/variable'
class VariableResourceGroup

Bases: GenericResourceGroup, VariableResource

Fields:
  • aggregate_operations ()

  • allow_inter_period_sharing ()

  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • assets ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_potential ()

  • cumulative_retired_capacity ()

  • curtailable ()

  • curtailment_cost ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • energy_budget_annual ()

  • energy_budget_daily ()

  • energy_budget_monthly ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • integer_build_increment ()

  • mean_time_to_repair ()

  • min_cumulative_new_build ()

  • min_operational_capacity ()

  • name ()

  • operational_capacity ()

  • outage_distributions ()

  • outage_profile ()

  • outage_profile__type ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • power_output_max ()

  • power_output_max__type ()

  • power_output_min ()

  • power_output_min__type ()

  • prm_policies ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_rate_1_hour ()

  • ramp_rate_2_hour ()

  • ramp_rate_3_hour ()

  • ramp_rate_4_hour ()

  • random_seed ()

  • reserves ()

  • resource_groups ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost_power_output ()

  • vintage_parent_group ()

  • vintages_to_construct ()

  • zones ()

model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

SAVE_PATH: ClassVar[str] = 'resources/variable/groups'
class WindResource

Bases: VariableResource

Fields:
  • allow_inter_period_sharing ()

  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_retired_capacity ()

  • curtailable ()

  • curtailment_cost ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • energy_budget_annual ()

  • energy_budget_daily ()

  • energy_budget_monthly ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • integer_build_increment ()

  • mean_time_to_repair ()

  • min_operational_capacity ()

  • name ()

  • operational_capacity ()

  • outage_distributions ()

  • outage_profile ()

  • outage_profile__type ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • power_output_max ()

  • power_output_max__type ()

  • power_output_min ()

  • power_output_min__type ()

  • prm_policies ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_rate_1_hour ()

  • ramp_rate_2_hour ()

  • ramp_rate_3_hour ()

  • ramp_rate_4_hour ()

  • random_seed ()

  • reserves ()

  • resource_groups ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost_power_output ()

  • vintage_parent_group ()

  • zones ()

classmethod scale_resource_profile(profile: Timeseries, scalar: float) β†’ Timeseries

Wind power scales cubicly with wind speed

SAVE_PATH: ClassVar[str] = 'resources/wind'
class WindResourceGroup

Bases: VariableResourceGroup, WindResource

Fields:
  • aggregate_operations ()

  • allow_inter_period_sharing ()

  • annual_energy_policies ()

  • annualized_capital_cost ()

  • annualized_fixed_om_cost ()

  • asset_groups ()

  • assets ()

  • attr_path ()

  • build_year ()

  • caiso_tx_constraints ()

  • can_build_new ()

  • can_retire ()

  • class_name ()

  • cumulative_potential ()

  • cumulative_retired_capacity ()

  • curtailable ()

  • curtailment_cost ()

  • custom_constraints ()

  • elcc_surfaces ()

  • emissions_policies ()

  • energy_budget_annual ()

  • energy_budget_daily ()

  • energy_budget_monthly ()

  • erm_policies ()

  • hourly_energy_policies ()

  • include ()

  • integer_build_increment ()

  • mean_time_to_repair ()

  • min_cumulative_new_build ()

  • min_operational_capacity ()

  • name ()

  • operational_capacity ()

  • outage_distributions ()

  • outage_profile ()

  • outage_profile__type ()

  • physical_lifetime ()

  • planned_capacity ()

  • potential ()

  • power_output_max ()

  • power_output_max__type ()

  • power_output_min ()

  • power_output_min__type ()

  • prm_policies ()

  • production_tax_credit ()

  • ptc_term ()

  • ramp_rate_1_hour ()

  • ramp_rate_2_hour ()

  • ramp_rate_3_hour ()

  • ramp_rate_4_hour ()

  • random_seed ()

  • reserves ()

  • resource_groups ()

  • retired_capacity ()

  • selected_capacity ()

  • stochastic_outage_rate ()

  • variable_cost_power_output ()

  • vintage_parent_group ()

  • vintages_to_construct ()

  • zones ()

model_post_init(_ModelMetaclass__context: Any) β†’ None

We need to both initialize private attributes and call the user-defined model_post_init method.

SAVE_PATH: ClassVar[str] = 'resources/wind/groups'
class Zone

Bases: Component

Fields:
field annual_energy_policies: dict[str, AllToPolicy] = {}
field assets: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field biomass_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field consuming_fuel_production_plants: dict[str, ZoneToPlant] = {}
field consuming_fuel_storage_plants: dict[str, FromZoneToFuelStorage] = {}
field consuming_generic_demands: dict[str, ZoneToDemand] = {}
field consuming_generic_plants: dict[str, ZoneToPlant] = {}
field electrofuel_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field emissions_policies: dict[str, AllToPolicy] = {}
field energy_demand_subsectors: dict[str, Linkage] = {}
field erm_policies: dict[str, AllToPolicy] = {}
field final_fuel_demands: dict[str, Linkage] = {}
field flexible_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field hourly_energy_policies: dict[str, AllToPolicy] = {}
field hydro_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field loads: dict[str, LoadToZone] = {}
field non_energy_subsectors: dict[str, Linkage] = {}
field penalty_overgen: float = 10000

Modeled penalty for overgeneration.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / megawatt_hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field penalty_unserved_energy: float = 10000

Modeled penalty for unserved load.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / megawatt_hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field prm_policies: dict[str, AllToPolicy] = {}
field producing_fuel_production_plants: dict[str, ZoneToPlant] = {}
field producing_fuel_storage_plants: dict[str, ToZoneToFuelStorage] = {}
field producing_generic_demands: dict[str, ZoneToDemand] = {}
field producing_generic_plants: dict[str, ZoneToPlant] = {}
field products: dict[str, ZoneToProduct] = {}
field reserves: dict[str, ReserveToZone] = {}
field resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field shed_dr_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field stock_rollover_subsectors: dict[str, Linkage] = {}
field storage_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field thermal_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

field transportations: dict[str, ZoneToTransportation] = {}
field tx_paths: dict[str, ZoneToTransmissionPath] = {}
field variable_resources: dict[str, AssetToZone] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = from

  • default_exclude = False

get_aggregated_load(modeled_year: int, weather_year_timestamp: Timestamp) β†’ float

Queries aggregated load in zone at given timepoint

get_aggregated_load_profile(modeled_year) β†’ Series

Queries aggregated load profile in zone

SAVE_PATH: ClassVar[str] = 'zones'

This class defines a zone object and its methods.

property annual_results_column_order

This property defines the ordering of columns in the component’s annual results summary out of Resolve. The name of the model field or formulation_block pyomo component can be used.

property consuming_demands

All demands in the zone that consume products

property consuming_plants

All plants in the zone that consume products

property electricity_products
property load_instances: Dict[str, Load]
property non_electricity_products
property policies
property producing_demands

All demands in the zone that produce products

property producing_plants

All plants in the zone that produce products

property resource_instances: Dict[str, GenericResource]
property sequestering_plants

All plants in the zone that sequester products (specific type of production)

property transportation_instances_from_zone: dict | None

All transportations from zone

property transportation_instances_to_zone: dict | None

All transportations to zone

property tx_path_instances_from_zone: Dict
property tx_path_instances_to_zone: Dict