Storage
E4ST.Storage — Typestruct Storage <: Modification
Storage(;name, file, build_file="")Storage is represented over sets of time-weighted sequential representative hours for which the following must hold true, for a given storage device:
- Net charge over the interval must equal zero.
- Total charge of the device cannot exceed its maximum charge, or go below zero.
- Initial charge over an interval can be anywhere between 0 and the maximum charge, and is the same initial charge for each time interval.
Arguments
name- the name of theModification.file- the filename of the storage table, where each row represents a storage device
. See also summarize_table(::Val{:storage})
build_file- the filename of the buildable storage table, where each row represents a specification for buildable storage. See alsosummarize_table(::Val{:build_storage})
Variables Introduced
pcap_stor[stor_idx, yr_idx]- The discharge power capacity, in MW, of the storage device.pcharge_stor[stor_idx, yr_idx, hr_idx]- The charge power, in MW, for a given hour.pdischarge_stor[stor_idx, yr_idx, hr_idx]- The discharged power, in MW, for a given hour.e0_stor[stor_idx]- The starting charge energy (in MWh) for each interval.
Constraints Introduced
cons_stor_charge_bal[stor_idx, yr_idx, int_idx]- the charge balancing equation - net charge in each interval is 0cons_stor_charge_max[stor_idx, yr_idx, int_idx, _hr_idx]- constrain the stored energy in each hour of each interval to be less than the maximum (function ofpcap_storand the discharge duration column of the storage table). Note_hr_idxis the index within the interval, not the normalhr_idxcons_stor_charge_min[stor_idx, yr_idx, int_idx, _hr_idx]- constrain the stored energy in each hour of each interval to be greater than zero. Note_hr_idxis the index within the interval, not the normalhr_idxcons_pcap_stor_noadd[stor_idx, yr_idx; years[yr_idx] >= storage.year_on[stor_idx]]- constrain the capacity to be non-increasing after being built. (only in multi-year simulations)cons_pcap_stor_prebuild[stor_idx, yr_idx; years[yr_idx] < storage.year_on[stor_idx]]- constrain the capacity to be zero before being built. (should only happen in multi-year simulations)cons_pcap_stor_exog[stor_idx, yr_idx]- constrain the exogenous, unbuilt capacity to equal pcap0 for the first year >= its build year.
Objective Terms
capex_obj_stor- the capital expenditures to build the storage device, only non-zero in the build year. (function ofpcap_storandcapex, andyear_on)fom_stor- the fixed operation and maintenance costs for the storage device (function ofpcap_storandfomfrom the storage table)vom_stor- the variable operation and maintenance costs for the storage device (function ofpdischarge_stor, thevomcolumn of the storage table, and the hour weightsget_hour_weights)
Power Balancing Equation
Each storage device can either be on the "gen" side or the "load" side, as specified by the side column.
- "gen" side:
pcharge_storgets subtracted frompgen_buspdischarge_storgets added topgen_bus
- "load" side:
pcharge_storgets added toplserv_buspdischarge_storgets subtracted fromplserv_bus
E4ST.modify_raw_data! — Methodmodify_raw_data!(mod::Modification, config, data, model)Change the raw data with mod.
E4ST.modify_setup_data! — Methodmodify_setup_data!(mod::Modification, config, data, model)Change the setup data with mod.
E4ST.modify_model! — Methodmodify_model!(mod::Modification, config, data, model)Apply mod to the model, called in setup_model
E4ST.modify_results! — Methodmodify_results!(mod::Storage, config, data)Modify battery results. Add columns to the storage table for:
pcap- discharge capacity of the storage device, in MW.pcharge- the charging rate, in MWpdischarge- the discharging rate, in MWecharge- the energy charged in each representative hour (including losses)edischarge- Energy that was discharged by the storage deviceploss- Power that was lost by the battery, counted as served load equal topcharge * (1-η)eloss- Energy that was lost by the battery, counted as served load
Also saves the updated storage table via save_updated_storage_table.
E4ST.save_updated_storage_table — Methodsave_updated_storage_table(config, data)Saves the updated storage table with any additional storage units, updated capacities, etc.
E4ST.summarize_table — Methodsummarize_table(::Val{:storage})| column_name | data_type | unit | required | description |
|---|---|---|---|---|
bus_idx | Int64 | E4ST.NA | true | The index of the bus table that the storage device corresponds to |
status | Bool | E4ST.NA | false | Whether or not the storage device is in service |
build_status | InlineStrings.String15 | E4ST.NA | true | Whether the storage device is built, 'new, or unbuilt. All storage devices marked new when the storage file is read in will be changed to built. Can also be changed to retired_exog or retired_endog after the simulation is run. See update_build_status! |
build_type | AbstractString | E4ST.NA | true | Whether the storage device is 'real', 'exog' (exogenously built), or 'endog' (endogenously built) |
build_id | AbstractString | E4ST.NA | true | Identifier of the build row. For pre-existing storage devices not specified in the build file, this is usually left empty |
year_on | E4ST.YearString | E4ST.Year | true | The first year of operation for the storage device. (For new devices this is also the year it was built) |
year_off | E4ST.YearString | E4ST.Year | true | The first year that the storage device is no longer operating. |
pcap0 | Float64 | E4ST.MWCapacity | true | Starting nameplate power discharge capacity for the storage device |
pcap_min | Float64 | E4ST.MWCapacity | true | Minimum nameplate power discharge capacity of the storage device (normally set to zero to allow for retirement) |
pcap_max | Float64 | E4ST.MWCapacity | true | Maximum nameplate power discharge capacity of the storage device |
vom | Float64 | E4ST.DollarsPerMWhGenerated | true | Variable operation and maintenance cost per MWh of energy discharged |
fom | Float64 | E4ST.DollarsPerMWCapacityPerHour | true | Hourly fixed operation and maintenance cost for a MW of discharge capacity |
capex | Float64 | E4ST.DollarsPerMWBuiltCapacity | true | Hourly capital expenditures for a MW of discharge capacity |
duration_discharge | Float64 | E4ST.Hours | true | Number of hours to fully discharge the storage device, from full. |
duration_charge | Float64 | E4ST.Hours | false | Number of hours to fully charge the empty storage device from empty. (Defaults to equal duration_discharge) |
storage_efficiency | Float64 | E4ST.MWhDischargedPerMWhCharged | true | The round-trip efficiency of the battery. |
side | String | E4ST.NA | true | The side of the power balance equation to add the charging/discharging to. Can be "gen" or "load" |
hour_groupby | String | E4ST.NA | true | The column of the hours table to group by. For example day |
hour_duration | String | E4ST.NA | true | The column of the hours table specifying the duration of each representatibe hour |
hour_order | String | E4ST.NA | true | The column of the hours table specifying the sequence of the hours. |
E4ST.summarize_table — Methodsummarize_table(::Val{:build_storage})| column_name | data_type | unit | required | description |
|---|---|---|---|---|
area | AbstractString | E4ST.NA | true | The area with which to filter by. I.e. "state". Leave blank to not filter by area. |
subarea | AbstractString | E4ST.NA | true | The subarea to include in the filter. I.e. "maryland". Leave blank to not filter by area. |
status | Bool | E4ST.NA | false | Whether or not the storage device is in service |
build_status | InlineStrings.String15 | E4ST.NA | true | Whether the storage device is built, 'new, or unbuilt. All storage devices marked new when the storage file is read in will be changed to built. Can also be changed to retired_exog or retired_endog after the simulation is run. See update_build_status! |
build_type | AbstractString | E4ST.NA | true | Whether the storage device is 'real', 'exog' (exogenously built), or 'endog' (endogenously built) |
build_id | AbstractString | E4ST.NA | true | Identifier of the build row. Each storage device made using this build spec will inherit this build_id |
year_on | E4ST.YearString | E4ST.Year | true | The first year of operation for the storage device. (For new devices this is also the year it was built) |
age_off | Float64 | E4ST.NumYears | true | The age at which the storage device is no longer operating. I.e. if year_on = y2030 and age_off = 20, then capacity will be 0 in y2040. |
year_on_min | E4ST.YearString | E4ST.Year | true | The first year in which a storage device can be built/come online (inclusive). Storage device with no restriction and exogenously built gens will be left blank |
year_on_max | E4ST.YearString | E4ST.Year | true | The last year in which a storage device can be built/come online (inclusive). Storage devices with no restriction and exogenously built gens will be left blank |
pcap0 | Float64 | E4ST.MWCapacity | true | Starting nameplate power discharge capacity for the storage device |
pcap_min | Float64 | E4ST.MWCapacity | true | Minimum nameplate power discharge capacity of the storage device (normally set to zero to allow for retirement) |
pcap_max | Float64 | E4ST.MWCapacity | true | Maximum nameplate power discharge capacity of the storage device |
vom | Float64 | E4ST.DollarsPerMWhGenerated | true | Variable operation and maintenance cost per MWh of energy discharged |
fom | Float64 | E4ST.DollarsPerMWCapacityPerHour | true | Hourly fixed operation and maintenance cost for a MW of discharge capacity |
capex | Float64 | E4ST.DollarsPerMWBuiltCapacity | true | Hourly capital expenditures for a MW of discharge capacity |
duration_discharge | Float64 | E4ST.Hours | true | Number of hours to fully discharge the storage device, from full. |
duration_charge | Float64 | E4ST.Hours | false | Number of hours to fully charge the empty storage device from empty. (Defaults to equal duration_discharge) |
storage_efficiency | Float64 | E4ST.MWhDischargedPerMWhCharged | true | The round-trip efficiency of the device. |
side | String | E4ST.NA | true | The side of the power balance equation to add the charging/discharging to. Can be "gen" or "load" |
hour_groupby | String | E4ST.NA | true | The column of the hours table to group by. For example day |
hour_duration | String | E4ST.NA | true | The column of the hours table specifying the duration of each representatibe hour |
hour_order | String | E4ST.NA | true | The column of the hours table specifying the sequence of the hours. |