Skip to content

Commit 768a762

Browse files
committed
Add reserves setpoint duration parameter for storage reserve provision
Add the optional per-project opchar column reserves_setpoint_duration_hours, the number of hours a storage project must be able to sustain its new setpoint if its reserves are called. It replaces the hardcoded timepoint duration on the reserves side of the stor headroom/footroom energy constraints and the gen_var_stor_hyb headroom energy constraint. When not specified, the timepoint duration is used, so existing scenarios are unchanged. Wire the column through the schema, the projects.tab writer and loader, opchar_param_requirements.csv, the Data Toolkit opchar generator, and all example opchar CSVs. Add param assertions to the stor and hybrid unit tests and a new example, test_w_storage_w_reserves_setpoint_duration (opchar subscenario 50, 4-hour requirement on hourly timepoints), in which both energy constraints bind.
1 parent 9707d1f commit 768a762

326 files changed

Lines changed: 3358 additions & 2956 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎data_toolkit/project/opchar/eia860_to_project_opchar_input_csvs.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ def make_opchar_sql_str(
390390
losses_factor_in_energy_target="NULL",
391391
losses_factor_curtailment="NULL",
392392
upward_reserves_to_soc_depletion="NULL",
393+
reserves_setpoint_duration_hours="NULL",
393394
):
394395
""" """
395396

@@ -501,7 +502,8 @@ def make_opchar_sql_str(
501502
{energy_requirement_factor} AS energy_requirement_factor,
502503
{losses_factor_in_energy_target} AS losses_factor_in_energy_target,
503504
{losses_factor_curtailment} AS losses_factor_curtailment,
504-
{upward_reserves_to_soc_depletion} AS upward_reserves_to_soc_depletion
505+
{upward_reserves_to_soc_depletion} AS upward_reserves_to_soc_depletion,
506+
{reserves_setpoint_duration_hours} AS reserves_setpoint_duration_hours
505507
"""
506508

507509
return opchar_sql_str
Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
project,technology,operational_type,balancing_type_project,load_modifier_flag,distribution_loss_adjustment_factor,variable_om_cost_per_mwh,variable_om_cost_by_period_scenario_id,variable_om_cost_by_timepoint_scenario_id,variable_om_cost_by_timepoint_tmp_map_scenario_id,project_fuel_scenario_id,heat_rate_curves_scenario_id,variable_om_curves_scenario_id,startup_chars_scenario_id,min_stable_level_fraction,unit_size_mw,startup_cost_per_mw,shutdown_cost_per_mw,startup_fuel_mmbtu_per_mw,startup_plus_ramp_up_rate,shutdown_plus_ramp_down_rate,ramp_up_when_on_rate,ramp_up_when_on_rate_monthly_adjustment_scenario_id,ramp_down_when_on_rate,ramp_down_when_on_rate_monthly_adjustment_scenario_id,ramp_up_violation_penalty,ramp_down_violation_penalty,bt_hrz_ramp_up_rate_limit_scenario_id,bt_hrz_ramp_down_rate_limit_scenario_id,total_ramp_up_limit_scenario_id,total_ramp_down_limit_scenario_id,ramp_tuning_cost_per_mw,min_up_time_hours,min_up_time_violation_penalty,min_down_time_hours,min_down_time_violation_penalty,cycle_selection_scenario_id,supplemental_firing_scenario_id,allow_startup_shutdown_power,storage_efficiency,charging_efficiency,discharging_efficiency,charging_capacity_multiplier,discharging_capacity_multiplier,soc_penalty_cost_per_energyunit,soc_last_tmp_penalty_cost_per_energyunit,max_losses_in_hrz_frac_stor_energy_capacity,flex_load_static_profile_scenario_id,minimum_duration_hours,maximum_duration_hours,aux_consumption_frac_capacity,aux_consumption_frac_power,last_commitment_stage,n_startup_limit_scenario_id,variable_generator_profile_scenario_id,variable_generator_profile_tmp_map_scenario_id,cap_factor_default,curtailment_cost_scenario_id,hydro_operational_chars_scenario_id,hydro_operational_chars_hrz_map_scenario_id,energy_profile_scenario_id,energy_profile_tmp_map_scenario_id,energy_hrz_shaping_scenario_id,energy_hrz_shaping_hrz_map_scenario_id,energy_slice_hrz_shaping_scenario_id,energy_slice_hrz_shaping_hrz_map_scenario_id,base_net_requirement_scenario_id,peak_deviation_demand_charge_scenario_id,lf_reserves_up_derate,lf_reserves_down_derate,regulation_up_derate,regulation_down_derate,frequency_response_derate,spinning_reserves_derate,inertia_reserves_derate,lf_reserves_up_ramp_rate,lf_reserves_down_ramp_rate,regulation_up_ramp_rate,regulation_down_ramp_rate,frequency_response_ramp_rate,spinning_reserves_ramp_rate,inertia_constant_sec,powerunithour_per_fuelunit,cap_factor_limits_scenario_id,partial_availability_threshold,stor_exog_state_of_charge_scenario_id,stor_exog_state_of_charge_tmp_map_scenario_id,nonfuel_carbon_emissions_per_mwh,powerhouse,generator_efficiency,linked_load_component,load_modifier_profile_scenario_id,load_modifier_profile_tmp_map_scenario_id,load_component_shift_bounds_scenario_id,load_component_shift_bounds_hrz_map_scenario_id,efficiency_factor,energy_requirement_factor,losses_factor_in_energy_target,losses_factor_curtailment,upward_reserves_to_soc_depletion
2-
Nuclear,Nuclear,gen_must_run,day,0,0,1,,,,1.0,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
3-
Coal,Coal,gen_commit_lin,day,0,0,1,,,,1.0,1.0,,1.0,0.4,,,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
4-
Gas_CCGT,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
5-
Gas_CT,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
6-
Wind,Wind,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
7-
Battery,Storage,stor,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.8,0.8,,,,,,,1.0,99.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
8-
Hydro,Hydro,gen_hydro_must_take,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
9-
Gas_CCGT_new,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
10-
Gas_CT_new,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
11-
Solar,Solar,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
12-
Nuclear_z2,Nuclear,gen_must_run,day,0,0,1,,,,1.0,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
13-
Coal_z2,Coal,gen_commit_lin,day,0,0,1,,,,1.0,1.0,,1.0,0.4,,,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
14-
Gas_CCGT_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
15-
Gas_CT_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
16-
Wind_z2,Wind,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
17-
Battery_z2,Storage,stor,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.8,0.8,,,,,,,1.0,99.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
18-
Gas_CCGT_new_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
19-
Gas_CT_new_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
20-
Clunky_Old_Gen,Coal,gen_simple,day,0,0,1,,,,1.0,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
21-
Wind_new,Wind,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1+
project,technology,operational_type,balancing_type_project,load_modifier_flag,distribution_loss_adjustment_factor,variable_om_cost_per_mwh,variable_om_cost_by_period_scenario_id,variable_om_cost_by_timepoint_scenario_id,variable_om_cost_by_timepoint_tmp_map_scenario_id,project_fuel_scenario_id,heat_rate_curves_scenario_id,variable_om_curves_scenario_id,startup_chars_scenario_id,min_stable_level_fraction,unit_size_mw,startup_cost_per_mw,shutdown_cost_per_mw,startup_fuel_mmbtu_per_mw,startup_plus_ramp_up_rate,shutdown_plus_ramp_down_rate,ramp_up_when_on_rate,ramp_up_when_on_rate_monthly_adjustment_scenario_id,ramp_down_when_on_rate,ramp_down_when_on_rate_monthly_adjustment_scenario_id,ramp_up_violation_penalty,ramp_down_violation_penalty,bt_hrz_ramp_up_rate_limit_scenario_id,bt_hrz_ramp_down_rate_limit_scenario_id,total_ramp_up_limit_scenario_id,total_ramp_down_limit_scenario_id,ramp_tuning_cost_per_mw,min_up_time_hours,min_up_time_violation_penalty,min_down_time_hours,min_down_time_violation_penalty,cycle_selection_scenario_id,supplemental_firing_scenario_id,allow_startup_shutdown_power,storage_efficiency,charging_efficiency,discharging_efficiency,charging_capacity_multiplier,discharging_capacity_multiplier,soc_penalty_cost_per_energyunit,soc_last_tmp_penalty_cost_per_energyunit,max_losses_in_hrz_frac_stor_energy_capacity,flex_load_static_profile_scenario_id,minimum_duration_hours,maximum_duration_hours,aux_consumption_frac_capacity,aux_consumption_frac_power,last_commitment_stage,n_startup_limit_scenario_id,variable_generator_profile_scenario_id,variable_generator_profile_tmp_map_scenario_id,cap_factor_default,curtailment_cost_scenario_id,hydro_operational_chars_scenario_id,hydro_operational_chars_hrz_map_scenario_id,energy_profile_scenario_id,energy_profile_tmp_map_scenario_id,energy_hrz_shaping_scenario_id,energy_hrz_shaping_hrz_map_scenario_id,energy_slice_hrz_shaping_scenario_id,energy_slice_hrz_shaping_hrz_map_scenario_id,base_net_requirement_scenario_id,peak_deviation_demand_charge_scenario_id,lf_reserves_up_derate,lf_reserves_down_derate,regulation_up_derate,regulation_down_derate,frequency_response_derate,spinning_reserves_derate,inertia_reserves_derate,lf_reserves_up_ramp_rate,lf_reserves_down_ramp_rate,regulation_up_ramp_rate,regulation_down_ramp_rate,frequency_response_ramp_rate,spinning_reserves_ramp_rate,inertia_constant_sec,powerunithour_per_fuelunit,cap_factor_limits_scenario_id,partial_availability_threshold,stor_exog_state_of_charge_scenario_id,stor_exog_state_of_charge_tmp_map_scenario_id,nonfuel_carbon_emissions_per_mwh,powerhouse,generator_efficiency,linked_load_component,load_modifier_profile_scenario_id,load_modifier_profile_tmp_map_scenario_id,load_component_shift_bounds_scenario_id,load_component_shift_bounds_hrz_map_scenario_id,efficiency_factor,energy_requirement_factor,losses_factor_in_energy_target,losses_factor_curtailment,upward_reserves_to_soc_depletion,reserves_setpoint_duration_hours
2+
Nuclear,Nuclear,gen_must_run,day,0,0,1,,,,1.0,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
3+
Coal,Coal,gen_commit_lin,day,0,0,1,,,,1.0,1.0,,1.0,0.4,,,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
4+
Gas_CCGT,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
5+
Gas_CT,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
6+
Wind,Wind,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
7+
Battery,Storage,stor,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.8,0.8,,,,,,,1.0,99.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
8+
Hydro,Hydro,gen_hydro_must_take,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
9+
Gas_CCGT_new,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
10+
Gas_CT_new,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
11+
Solar,Solar,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
12+
Nuclear_z2,Nuclear,gen_must_run,day,0,0,1,,,,1.0,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
13+
Coal_z2,Coal,gen_commit_lin,day,0,0,1,,,,1.0,1.0,,1.0,0.4,,,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
14+
Gas_CCGT_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
15+
Gas_CT_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
16+
Wind_z2,Wind,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
17+
Battery_z2,Storage,stor,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.8,0.8,,,,,,,1.0,99.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
18+
Gas_CCGT_new_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
19+
Gas_CT_new_z2,Gas,gen_commit_lin,day,0,0,2,,,,1.0,1.0,,1.0,0.4,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
20+
Clunky_Old_Gen,Coal,gen_simple,day,0,0,1,,,,1.0,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
21+
Wind_new,Wind,gen_var,day,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

0 commit comments

Comments
 (0)