From 8bf702cbf7ec42e247db0f3db002c37d3c540f6a Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Mon, 8 Sep 2025 23:58:05 -0600 Subject: [PATCH 01/12] remove references to hydroenergyreservoir --- Project.toml | 4 +- src/library/psi_library.jl | 8 +- src/library/psitest_library.jl | 248 +++++++++++++-------------------- 3 files changed, 104 insertions(+), 156 deletions(-) diff --git a/Project.toml b/Project.toml index f7ae56b..b3e542b 100644 --- a/Project.toml +++ b/Project.toml @@ -22,7 +22,7 @@ TimeSeries = "9e3dc215-6440-5c97-bce1-76c03772f85e" [compat] CSV = "~0.10" DataFrames = "1" -DataStructures = "~0.18" +DataStructures = "^0.18, ^0.19" Dates = "1" Downloads = "1.6" HDF5 = "0.17" @@ -33,5 +33,5 @@ PowerSystems = "^4.5" PrettyTables = "2" Random = "1" SHA = "0.7" -TimeSeries = "~0.23, 0.24" +TimeSeries = "^0.24, ^0.25" julia = "^1.6" diff --git a/src/library/psi_library.jl b/src/library/psi_library.jl index b914400..38b554e 100644 --- a/src/library/psi_library.jl +++ b/src/library/psi_library.jl @@ -285,7 +285,7 @@ function build_5_bus_hydro_uc_sys_targets(; add_forecasts, raw_data, sys_kwargs. c_sys5_hy_uc = PSY.System(rawsys; sys_kwargs...) end cost = HydroGenerationCost(CostCurve(LinearCurve(0.15)), 0.0) - for hy in get_components(HydroEnergyReservoir, c_sys5_hy_uc) + for hy in get_components(HydroTurbine, c_sys5_hy_uc) set_operation_cost!(hy, cost) end return c_sys5_hy_uc @@ -335,7 +335,7 @@ function build_5_bus_hydro_ed_sys_targets(; raw_data, kwargs...) sys_kwargs..., ) cost = HydroGenerationCost(CostCurve(LinearCurve(0.15)), 0.0) - for hy in get_components(HydroEnergyReservoir, c_sys5_hy_ed) + for hy in get_components(HydroTurbine, c_sys5_hy_ed) set_operation_cost!(hy, cost) end PSY.transform_single_time_series!(c_sys5_hy_ed, Hour(2), Hour(1)) @@ -387,7 +387,7 @@ function build_5_bus_hydro_wk_sys_targets(; raw_data, kwargs...) sys_kwargs..., ) cost = HydroGenerationCost(CostCurve(LinearCurve(0.15)), 0.0) - for hy in get_components(HydroEnergyReservoir, c_sys5_hy_wk) + for hy in get_components(HydroTurbine, c_sys5_hy_wk) set_operation_cost!(hy, cost) end PSY.transform_single_time_series!(c_sys5_hy_wk, Hour(48), Hour(48)) @@ -565,7 +565,7 @@ function make_modified_RTS_GMLC_sys( end # Add Hydro to regulation reserves - for d in PSY.get_components(PSY.HydroEnergyReservoir, sys) + for d in PSY.get_components(PSY.HydroTurbine, sys) PSY.remove_component!(sys, d) end diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index 1ea0ca7..d7837ae 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -1,3 +1,40 @@ +function _get_generic_hydro_reservoir_pair(node) + reservoir = PSY.HydroReservoir(; + name = "HydroReservoir", + available = true, + storage_level_limits = (min = 0.0, max = 50.0), + spillage_limits = nothing, + inflow = 4.0, + outflow = 0.0, + level_targets = nothing, + intake_elevation = 0.0, + travel_time = 0.0, + initial_level = 0.5, + head_to_volume_factor = LinearCurve(0.0), + operation_cost = HydroReservoirCost() + ) + + hydro = HydroTurbine(; + name = "HydroEnergyReservoirTurbine", + available = true, + bus = node, + active_power = 0.0, + reactive_power = 0.0, + rating = 7.0, + active_power_limits = (min = 0.0, max = 7.0), + reactive_power_limits = (min = 0.0, max = 7.0), + ramp_limits = (up = 7.0, down = 7.0), + time_limits = nothing, + operation_cost = HydroGenerationCost( + CostCurve(LinearCurve(0.15)), 0.0), + base_power = 100.0, + conversion_factor = 1.0, + outflow_limits = nothing, + powerhouse_elevation = 0.0 + ) + return hydro, reservoir +end + function build_c_sys14(; add_forecasts, raw_data, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes14() @@ -718,7 +755,7 @@ function build_c_sys5_hyd(; PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hyd)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = TimeSeries.timestamp(hydro_budget_DA[t][ix])[1] @@ -730,7 +767,7 @@ function build_c_sys5_hyd(; PSY.Deterministic("hydro_budget", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hyd)) forecast_data_inflow = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() forecast_data_target = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 @@ -771,7 +808,7 @@ function build_c_sys5_hyd(; ), ) end - for (ix, r) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + for (ix, r) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hyd)) PSY.add_time_series!( c_sys5_hyd, r, @@ -799,22 +836,22 @@ function build_c_sys5_hyd(; end end if add_reserves - reserve_hy = reserve5_hy(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + reserve_hy = reserve5_hy(PSY.get_components(PSY.HydroTurbine, c_sys5_hyd)) PSY.add_service!( c_sys5_hyd, reserve_hy[1], - PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd), + PSY.get_components(PSY.HydroTurbine, c_sys5_hyd), ) PSY.add_service!( c_sys5_hyd, reserve_hy[2], - [collect(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd))[end]], + [collect(PSY.get_components(PSY.HydroTurbine, c_sys5_hyd))[end]], ) # ORDC curve PSY.add_service!( c_sys5_hyd, reserve_hy[3], - PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd), + PSY.get_components(PSY.HydroTurbine, c_sys5_hyd), ) for (ix, serv) in enumerate(PSY.get_components(PSY.VariableReserve, c_sys5_hyd)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() @@ -884,7 +921,7 @@ function build_c_sys5_hyd_ems(; PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hyd)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = TimeSeries.timestamp(hydro_budget_DA[t][ix])[1] @@ -896,7 +933,7 @@ function build_c_sys5_hyd_ems(; PSY.Deterministic("hydro_budget", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hyd)) forecast_data_inflow = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() forecast_data_target = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 @@ -937,7 +974,7 @@ function build_c_sys5_hyd_ems(; ), ) end - for (ix, r) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + for (ix, r) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hyd)) PSY.add_time_series!( c_sys5_hyd, r, @@ -965,22 +1002,22 @@ function build_c_sys5_hyd_ems(; end end if add_reserves - reserve_hy = reserve5_hy(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd)) + reserve_hy = reserve5_hy(PSY.get_components(PSY.HydroTurbine, c_sys5_hyd)) PSY.add_service!( c_sys5_hyd, reserve_hy[1], - PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd), + PSY.get_components(PSY.HydroTurbine, c_sys5_hyd), ) PSY.add_service!( c_sys5_hyd, reserve_hy[2], - [collect(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd))[end]], + [collect(PSY.get_components(PSY.HydroTurbine, c_sys5_hyd))[end]], ) # ORDC curve PSY.add_service!( c_sys5_hyd, reserve_hy[3], - PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hyd), + PSY.get_components(PSY.HydroTurbine, c_sys5_hyd), ) for (ix, serv) in enumerate(PSY.get_components(PSY.VariableReserve, c_sys5_hyd)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() @@ -2075,7 +2112,7 @@ function build_c_sys5_hy_uc(; add_forecasts, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroTurbine, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(hydro_timeseries_DA[t][ix])[1] @@ -2087,7 +2124,7 @@ function build_c_sys5_hy_uc(; add_forecasts, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(storage_target_DA[t][ix])[1] @@ -2099,7 +2136,7 @@ function build_c_sys5_hy_uc(; add_forecasts, kwargs...) PSY.Deterministic("storage_target", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(hydro_timeseries_DA[t][ix])[1] @@ -2111,7 +2148,7 @@ function build_c_sys5_hy_uc(; add_forecasts, kwargs...) PSY.Deterministic("inflow", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = TimeSeries.timestamp(hydro_budget_DA[t][ix])[1] @@ -2193,7 +2230,7 @@ function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroTurbine, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(hydro_timeseries_DA[t][ix])[1] @@ -2205,7 +2242,7 @@ function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(storage_target_DA[t][ix])[1] @@ -2217,7 +2254,7 @@ function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("storage_target", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(hydro_timeseries_DA[t][ix])[1] @@ -2229,7 +2266,7 @@ function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("inflow", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_uc)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_uc)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = TimeSeries.timestamp(hydro_budget_DA[t][ix])[1] @@ -2316,7 +2353,7 @@ function build_c_sys5_hy_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, l) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, l) in enumerate(PSY.get_components(PSY.HydroTurbine, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = hydro_timeseries_DA[t][ix] @@ -2348,7 +2385,7 @@ function build_c_sys5_hy_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, l) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, l) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = storage_target_DA[t][ix] @@ -2364,7 +2401,7 @@ function build_c_sys5_hy_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("storage_target", forecast_data), ) end - for (ix, l) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, l) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = hydro_timeseries_DA[t][ix] @@ -2380,7 +2417,7 @@ function build_c_sys5_hy_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("inflow", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = hydro_budget_DA[t][ix] @@ -2467,7 +2504,7 @@ function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, l) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, l) in enumerate(PSY.get_components(PSY.HydroTurbine, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = hydro_timeseries_DA[t][ix] @@ -2499,7 +2536,7 @@ function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("max_active_power", forecast_data), ) end - for (ix, l) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, l) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = storage_target_DA[t][ix] @@ -2515,7 +2552,7 @@ function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("storage_target", forecast_data), ) end - for (ix, l) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, l) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = hydro_timeseries_DA[t][ix] @@ -2531,7 +2568,7 @@ function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) PSY.Deterministic("inflow", forecast_data), ) end - for (ix, h) in enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_hy_ed)) + for (ix, h) in enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ta = hydro_budget_DA[t][ix] @@ -3683,26 +3720,8 @@ function build_hydro_test_case_b_sys(; raw_data, kwargs...) "d/m/y H:M:S", ), ) - hydro = HydroEnergyReservoir(; - name = "HydroEnergyReservoir", - available = true, - bus = node, - active_power = 0.0, - reactive_power = 0.0, - rating = 7.0, - prime_mover_type = PrimeMovers.HY, - active_power_limits = (min = 0.0, max = 7.0), - reactive_power_limits = (min = 0.0, max = 7.0), - ramp_limits = (up = 7.0, down = 7.0), - time_limits = nothing, - operation_cost = HydroGenerationCost( - CostCurve(LinearCurve(0.15)), 0.0), - base_power = 100.0, - storage_capacity = 50.0, - inflow = 4.0, - conversion_factor = 1.0, - initial_storage = 0.5, - ) + + duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3750,26 +3769,9 @@ function build_hydro_test_case_c_sys(; raw_data, kwargs...) "d/m/y H:M:S", ), ) - hydro = HydroEnergyReservoir(; - name = "HydroEnergyReservoir", - available = true, - bus = node, - active_power = 0.0, - reactive_power = 0.0, - rating = 7.0, - prime_mover_type = PrimeMovers.HY, - active_power_limits = (min = 0.0, max = 7.0), - reactive_power_limits = (min = 0.0, max = 7.0), - ramp_limits = (up = 7.0, down = 7.0), - time_limits = nothing, - operation_cost = HydroGenerationCost( - CostCurve(LinearCurve(0.15)), 0.0), - base_power = 100.0, - storage_capacity = 50.0, - inflow = 4.0, - conversion_factor = 1.0, - initial_storage = 0.5, - ) + turbine, reservoir = _get_generic_hydro_reservoir_pair(node) + set_reservoirs!(turbine, [reservoir]) + duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3787,10 +3789,11 @@ function build_hydro_test_case_c_sys(; raw_data, kwargs...) hydro_test_case_c_sys = PSY.System(100.0; sys_kwargs...) PSY.add_component!(hydro_test_case_c_sys, node) PSY.add_component!(hydro_test_case_c_sys, load) - PSY.add_component!(hydro_test_case_c_sys, hydro) + PSY.add_component!(hydro_test_case_c_sys, turbine) + PSY.add_component!(hydro_test_case_c_sys, reservoir) PSY.add_time_series!(hydro_test_case_c_sys, load, load_forecast_dur) - PSY.add_time_series!(hydro_test_case_c_sys, hydro, inflow_forecast_dur) - PSY.add_time_series!(hydro_test_case_c_sys, hydro, energy_target_forecast_dur) + PSY.add_time_series!(hydro_test_case_c_sys, reservoir, inflow_forecast_dur) + PSY.add_time_series!(hydro_test_case_c_sys, reservoir, energy_target_forecast_dur) return hydro_test_case_c_sys end @@ -3817,26 +3820,8 @@ function build_hydro_test_case_d_sys(; raw_data, kwargs...) "d/m/y H:M:S", ), ) - hydro = HydroEnergyReservoir(; - name = "HydroEnergyReservoir", - available = true, - bus = node, - active_power = 0.0, - reactive_power = 0.0, - rating = 7.0, - prime_mover_type = PrimeMovers.HY, - active_power_limits = (min = 0.0, max = 7.0), - reactive_power_limits = (min = 0.0, max = 7.0), - ramp_limits = (up = 7.0, down = 7.0), - time_limits = nothing, - operation_cost = HydroGenerationCost( - CostCurve(LinearCurve(0.15)), 0.0), - base_power = 100.0, - storage_capacity = 50.0, - inflow = 4.0, - conversion_factor = 1.0, - initial_storage = 0.5, - ) + turbine, reservoir = _get_generic_hydro_reservoir_pair(node) + set_reservoirs!(turbine, [reservoir]) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3854,10 +3839,11 @@ function build_hydro_test_case_d_sys(; raw_data, kwargs...) hydro_test_case_d_sys = PSY.System(100.0; sys_kwargs...) PSY.add_component!(hydro_test_case_d_sys, node) PSY.add_component!(hydro_test_case_d_sys, load) - PSY.add_component!(hydro_test_case_d_sys, hydro) + PSY.add_component!(hydro_test_case_d_sys, turbine) + PSY.add_component!(hydro_test_case_d_sys, reservoir) PSY.add_time_series!(hydro_test_case_d_sys, load, load_forecast_dur) - PSY.add_time_series!(hydro_test_case_d_sys, hydro, inflow_forecast_dur) - PSY.add_time_series!(hydro_test_case_d_sys, hydro, energy_target_forecast_dur) + PSY.add_time_series!(hydro_test_case_d_sys, reservoir, inflow_forecast_dur) + PSY.add_time_series!(hydro_test_case_d_sys, reservoir, energy_target_forecast_dur) return hydro_test_case_d_sys end @@ -3884,28 +3870,8 @@ function build_hydro_test_case_e_sys(; raw_data, kwargs...) "d/m/y H:M:S", ), ) - hydro = HydroEnergyReservoir(; - name = "HydroEnergyReservoir", - available = true, - bus = node, - active_power = 0.0, - reactive_power = 0.0, - rating = 7.0, - prime_mover_type = PrimeMovers.HY, - active_power_limits = (min = 0.0, max = 7.0), - reactive_power_limits = (min = 0.0, max = 7.0), - ramp_limits = (up = 7.0, down = 7.0), - time_limits = nothing, - operation_cost = HydroGenerationCost( - CostCurve(LinearCurve(0.15)), - 0.0, - ), - base_power = 100.0, - storage_capacity = 50.0, - inflow = 4.0, - conversion_factor = 1.0, - initial_storage = 20.0, - ) + turbine, reservoir = _get_generic_hydro_reservoir_pair(node) + set_reservoirs!(turbine, [reservoir]) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3923,10 +3889,11 @@ function build_hydro_test_case_e_sys(; raw_data, kwargs...) hydro_test_case_e_sys = PSY.System(100.0; sys_kwargs...) PSY.add_component!(hydro_test_case_e_sys, node) PSY.add_component!(hydro_test_case_e_sys, load) - PSY.add_component!(hydro_test_case_e_sys, hydro) + PSY.add_component!(hydro_test_case_e_sys, turbine) + PSY.add_component!(hydro_test_case_e_sys, reservoir) PSY.add_time_series!(hydro_test_case_e_sys, load, load_forecast_dur) - PSY.add_time_series!(hydro_test_case_e_sys, hydro, inflow_forecast_dur) - PSY.add_time_series!(hydro_test_case_e_sys, hydro, energy_target_forecast_dur) + PSY.add_time_series!(hydro_test_case_e_sys, reservoir, inflow_forecast_dur) + PSY.add_time_series!(hydro_test_case_e_sys, reservoir, energy_target_forecast_dur) return hydro_test_case_e_sys end @@ -3953,28 +3920,8 @@ function build_hydro_test_case_f_sys(; raw_data, kwargs...) "d/m/y H:M:S", ), ) - hydro = HydroEnergyReservoir(; - name = "HydroEnergyReservoir", - available = true, - bus = node, - active_power = 0.0, - reactive_power = 0.0, - rating = 7.0, - prime_mover_type = PrimeMovers.HY, - active_power_limits = (min = 0.0, max = 7.0), - reactive_power_limits = (min = 0.0, max = 7.0), - ramp_limits = (up = 7.0, down = 7.0), - time_limits = nothing, - operation_cost = HydroGenerationCost( - CostCurve(LinearCurve(0.15)), - 0.0, - ), - base_power = 100.0, - storage_capacity = 50.0, - inflow = 4.0, - conversion_factor = 1.0, - initial_storage = 10.0, - ) + turbine, reservoir = _get_generic_hydro_reservoir_pair(node) + set_reservoirs!(turbine, [reservoir]) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3992,10 +3939,11 @@ function build_hydro_test_case_f_sys(; raw_data, kwargs...) hydro_test_case_f_sys = PSY.System(100.0; sys_kwargs...) PSY.add_component!(hydro_test_case_f_sys, node) PSY.add_component!(hydro_test_case_f_sys, load) - PSY.add_component!(hydro_test_case_f_sys, hydro) + PSY.add_component!(hydro_test_case_f_sys, turbine) + PSY.add_component!(hydro_test_case_f_sys, reservoir) PSY.add_time_series!(hydro_test_case_f_sys, load, load_forecast_dur) - PSY.add_time_series!(hydro_test_case_f_sys, hydro, inflow_forecast_dur) - PSY.add_time_series!(hydro_test_case_f_sys, hydro, energy_target_forecast_dur) + PSY.add_time_series!(hydro_test_case_f_sys, reservoir, inflow_forecast_dur) + PSY.add_time_series!(hydro_test_case_f_sys, reservoir, energy_target_forecast_dur) return hydro_test_case_f_sys end @@ -4478,7 +4426,7 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) ) end for (ix, h) in - enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_all_components)) + enumerate(PSY.get_components(PSY.HydroTurbine, c_sys5_all_components)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(hydro_timeseries_DA[t][ix])[1] @@ -4491,7 +4439,7 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) ) end for (ix, h) in - enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_all_components)) + enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_all_components)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(storage_target_DA[t][ix])[1] @@ -4504,7 +4452,7 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) ) end for (ix, h) in - enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_all_components)) + enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_all_components)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = timestamp(hydro_timeseries_DA[t][ix])[1] @@ -4517,7 +4465,7 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) ) end for (ix, h) in - enumerate(PSY.get_components(PSY.HydroEnergyReservoir, c_sys5_all_components)) + enumerate(PSY.get_components(PSY.HydroReservoir, c_sys5_all_components)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() for t in 1:2 ini_time = TimeSeries.timestamp(hydro_budget_DA[t][ix])[1] From 16331dfe32fa8a3743a7a0e135dbd015384e9153 Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 00:17:28 -0600 Subject: [PATCH 02/12] upodate psi tests systems --- src/library/psitest_library.jl | 38 +++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index d7837ae..353d395 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -719,16 +719,20 @@ function build_c_sys5_hyd(; sys_kwargs..., ) nodes = nodes5() + hydros = hydro_generators5(nodes) + reservoir = hydro_reservoir() c_sys5_hyd = PSY.System( 100.0, nodes, thermal_generators5(nodes), - [hydro_generators5(nodes)[2]], + [hydros[2]], loads5(nodes), branches5(nodes); time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) + add_component!(c_sys5_hyd, reservoir) + set_reservoirs!(hydros[2], [reservoir]) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hyd)) @@ -885,16 +889,21 @@ function build_c_sys5_hyd_ems(; sys_kwargs..., ) nodes = nodes5() + hydro_turbine = hydro_generators5(nodes)[2] + reservoir = hydro_reservoir() + c_sys5_hyd = PSY.System( 100.0, nodes, thermal_generators5(nodes), - [hydro_generators5_ems(nodes)[2]], + [hydro_turbine], loads5(nodes), branches5(nodes); time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) + PSY.add_component!(c_sys5_hyd, reservoir) + set_reservoirs!(hydro_turbine, [reservoir]) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hyd)) @@ -2087,17 +2096,21 @@ end function build_c_sys5_hy_uc(; add_forecasts, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes5() + hydros = hydro_generators5(nodes) + reservoir = hydro_reservoir() c_sys5_hy_uc = PSY.System( 100.0, nodes, thermal_generators5_uc_testing(nodes), - hydro_generators5(nodes), + hydros, renewable_generators5(nodes), loads5(nodes), branches5(nodes); time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) + add_component!(c_sys5_hy_uc, reservoir) + set_reservoirs!(hydros[2], [reservoir]) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hy_uc)) @@ -2205,17 +2218,21 @@ end function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes5() + hydros = hydro_generators5(nodes) + reservoir = hydro_reservoir() c_sys5_hy_uc = PSY.System( 100.0, nodes, thermal_generators5_uc_testing(nodes), - hydro_generators5_ems(nodes), + hydros, renewable_generators5(nodes), loads5(nodes), branches5(nodes); time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) + add_component!(c_sys5_hy_uc, reservoir) + set_reservoirs!(hydros[2], [reservoir]) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hy_uc)) @@ -2474,19 +2491,22 @@ end function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes5() + hydros = hydro_generators5(nodes) + reservoir = hydro_reservoir() c_sys5_hy_ed = PSY.System( 100.0, nodes, thermal_generators5_uc_testing(nodes), - hydro_generators5_ems(nodes), renewable_generators5(nodes), loads5(nodes), + hydros, interruptible(nodes), branches5(nodes); time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) - + add_component!(c_sys5_hy_ed, reservoir) + set_reservoirs!(hydros[2], [reservoir]) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() @@ -4397,17 +4417,21 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes5() + hydros = hydro_generators5(nodes) + reservoir = hydro_reservoir() c_sys5_all_components = PSY.System( 100.0, nodes, thermal_generators5(nodes), renewable_generators5(nodes), loads5(nodes), - hydro_generators5(nodes), + hydros, branches5(nodes); time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) + add_component!(c_sys5_all_components, reservoir) + set_reservoirs!(hydros[2], [reservoir]) # Boilerplate to handle time series # TODO refactor as per https://github.com/NREL-Sienna/PowerSystemCaseBuilder.jl/issues/66 From 012a260f30fded0586a0129d551f96d5e03e68b2 Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 00:20:10 -0600 Subject: [PATCH 03/12] use existing function --- src/library/psitest_library.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index 353d395..6d6cfb8 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -720,7 +720,7 @@ function build_c_sys5_hyd(; ) nodes = nodes5() hydros = hydro_generators5(nodes) - reservoir = hydro_reservoir() + reservoir = hydro_reservoir5_energy() c_sys5_hyd = PSY.System( 100.0, nodes, @@ -890,7 +890,7 @@ function build_c_sys5_hyd_ems(; ) nodes = nodes5() hydro_turbine = hydro_generators5(nodes)[2] - reservoir = hydro_reservoir() + reservoir = hydro_reservoir5_energy() c_sys5_hyd = PSY.System( 100.0, @@ -2097,7 +2097,7 @@ function build_c_sys5_hy_uc(; add_forecasts, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes5() hydros = hydro_generators5(nodes) - reservoir = hydro_reservoir() + reservoir = hydro_reservoir5_energy() c_sys5_hy_uc = PSY.System( 100.0, nodes, @@ -2219,7 +2219,7 @@ function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes5() hydros = hydro_generators5(nodes) - reservoir = hydro_reservoir() + reservoir = hydro_reservoir5_energy() c_sys5_hy_uc = PSY.System( 100.0, nodes, @@ -2492,7 +2492,7 @@ function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) sys_kwargs = filter_kwargs(; kwargs...) nodes = nodes5() hydros = hydro_generators5(nodes) - reservoir = hydro_reservoir() + reservoir = hydro_reservoir5_energy() c_sys5_hy_ed = PSY.System( 100.0, nodes, @@ -4418,7 +4418,7 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) nodes = nodes5() hydros = hydro_generators5(nodes) - reservoir = hydro_reservoir() + reservoir = hydro_reservoir5_energy() c_sys5_all_components = PSY.System( 100.0, nodes, From 0537fd4d561692404a3951ddd39aa907ed9f667d Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 00:26:07 -0600 Subject: [PATCH 04/12] Update src/library/psitest_library.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/library/psitest_library.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index 6d6cfb8..67daa22 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -30,7 +30,7 @@ function _get_generic_hydro_reservoir_pair(node) base_power = 100.0, conversion_factor = 1.0, outflow_limits = nothing, - powerhouse_elevation = 0.0 + powerhouse_elevation = 0.0, ) return hydro, reservoir end From d72fba1e6522e2c51396c818ea7b7b454dd67fdd Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 00:26:13 -0600 Subject: [PATCH 05/12] Update src/library/psitest_library.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/library/psitest_library.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index 67daa22..d2f845c 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -3741,7 +3741,6 @@ function build_hydro_test_case_b_sys(; raw_data, kwargs...) ), ) - duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) From 3f7eef0ba427c47b366675a9959dadb314fc698d Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 00:26:21 -0600 Subject: [PATCH 06/12] Update src/library/psitest_library.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/library/psitest_library.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index d2f845c..8bc08ad 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -11,7 +11,7 @@ function _get_generic_hydro_reservoir_pair(node) travel_time = 0.0, initial_level = 0.5, head_to_volume_factor = LinearCurve(0.0), - operation_cost = HydroReservoirCost() + operation_cost = HydroReservoirCost(), ) hydro = HydroTurbine(; From 01b1400bb0041c998845963438bbce33960507e3 Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 10:04:48 -0600 Subject: [PATCH 07/12] fix vector --- src/library/psitest_library.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index 6d6cfb8..bf53f72 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -2109,8 +2109,8 @@ function build_c_sys5_hy_uc(; add_forecasts, kwargs...) time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) - add_component!(c_sys5_hy_uc, reservoir) - set_reservoirs!(hydros[2], [reservoir]) + add_component!(c_sys5_hy_uc, reservoir[1]) + set_reservoirs!(hydros[2], reservoir) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hy_uc)) @@ -4430,7 +4430,7 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) - add_component!(c_sys5_all_components, reservoir) + add_component!(c_sys5_all_components, reservoir[1]) set_reservoirs!(hydros[2], [reservoir]) # Boilerplate to handle time series From e5b615be6b582bc8ccd9b891ee54cb8c912a4d0a Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 14:30:29 -0600 Subject: [PATCH 08/12] last changes to reservoirs --- src/library/psitest_library.jl | 27 +++++++++++++++------------ src/utils/utils.jl | 3 ++- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index f1c6b71..945a3a3 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -732,7 +732,7 @@ function build_c_sys5_hyd(; sys_kwargs..., ) add_component!(c_sys5_hyd, reservoir) - set_reservoirs!(hydros[2], [reservoir]) + set_reservoirs!(hydros[2], reservoir) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hyd)) @@ -902,8 +902,8 @@ function build_c_sys5_hyd_ems(; time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) - PSY.add_component!(c_sys5_hyd, reservoir) - set_reservoirs!(hydro_turbine, [reservoir]) + PSY.add_component!(c_sys5_hyd, reservoir[1]) + set_reservoirs!(hydro_turbine, reservoir) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hyd)) @@ -2232,7 +2232,7 @@ function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) sys_kwargs..., ) add_component!(c_sys5_hy_uc, reservoir) - set_reservoirs!(hydros[2], [reservoir]) + set_reservoirs!(hydros[2], reservoir) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hy_uc)) @@ -2506,7 +2506,7 @@ function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) sys_kwargs..., ) add_component!(c_sys5_hy_ed, reservoir) - set_reservoirs!(hydros[2], [reservoir]) + set_reservoirs!(hydros[2], reservoir) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hy_ed)) forecast_data = SortedDict{Dates.DateTime, TimeSeries.TimeArray}() @@ -3741,6 +3741,7 @@ function build_hydro_test_case_b_sys(; raw_data, kwargs...) ), ) + hydro, reservoir =_get_generic_hydro_reservoir_pair(node) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3759,9 +3760,11 @@ function build_hydro_test_case_b_sys(; raw_data, kwargs...) PSY.add_component!(hydro_test_case_b_sys, node) PSY.add_component!(hydro_test_case_b_sys, load) PSY.add_component!(hydro_test_case_b_sys, hydro) + PSY.add_component!(hydro_test_case_b_sys, reservoir) + PSY.set_reservoirs!(hydro, [reservoir]) PSY.add_time_series!(hydro_test_case_b_sys, load, load_forecast_dur) - PSY.add_time_series!(hydro_test_case_b_sys, hydro, inflow_forecast_dur) - PSY.add_time_series!(hydro_test_case_b_sys, hydro, energy_target_forecast_dur) + PSY.add_time_series!(hydro_test_case_b_sys, reservoir, inflow_forecast_dur) + PSY.add_time_series!(hydro_test_case_b_sys, reservoir, energy_target_forecast_dur) return hydro_test_case_b_sys end @@ -3789,7 +3792,7 @@ function build_hydro_test_case_c_sys(; raw_data, kwargs...) ), ) turbine, reservoir = _get_generic_hydro_reservoir_pair(node) - set_reservoirs!(turbine, [reservoir]) + set_reservoirs!(turbine, reservoir) duration_load = [0.3, 0.6, 0.5] load_data = @@ -3840,7 +3843,7 @@ function build_hydro_test_case_d_sys(; raw_data, kwargs...) ), ) turbine, reservoir = _get_generic_hydro_reservoir_pair(node) - set_reservoirs!(turbine, [reservoir]) + set_reservoirs!(turbine, reservoir) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3890,7 +3893,7 @@ function build_hydro_test_case_e_sys(; raw_data, kwargs...) ), ) turbine, reservoir = _get_generic_hydro_reservoir_pair(node) - set_reservoirs!(turbine, [reservoir]) + set_reservoirs!(turbine, reservoir) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -3940,7 +3943,7 @@ function build_hydro_test_case_f_sys(; raw_data, kwargs...) ), ) turbine, reservoir = _get_generic_hydro_reservoir_pair(node) - set_reservoirs!(turbine, [reservoir]) + set_reservoirs!(turbine, reservoir) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) @@ -4430,7 +4433,7 @@ function build_c_sys5_all_components(; add_forecasts, raw_data, kwargs...) sys_kwargs..., ) add_component!(c_sys5_all_components, reservoir[1]) - set_reservoirs!(hydros[2], [reservoir]) + set_reservoirs!(hydros[2], reservoir) # Boilerplate to handle time series # TODO refactor as per https://github.com/NREL-Sienna/PowerSystemCaseBuilder.jl/issues/66 diff --git a/src/utils/utils.jl b/src/utils/utils.jl index 0a7e23e..82ff0c4 100644 --- a/src/utils/utils.jl +++ b/src/utils/utils.jl @@ -79,7 +79,7 @@ end """ Creates a JSON file informing the user about the meaning of the hash value in the file path -if it doesn't exist already +if it doesn't exist already """ function serialize_case_parameters(case_args::Dict{Symbol, <:Any}) dir_path = get_serialization_dir(case_args) @@ -151,6 +151,7 @@ function convert_to_hydropump!(d::EnergyReservoirStorage, sys::System) ), active_power_pump = 0.0, efficiency = (turbine = d.efficiency.out, pump = d.efficiency.in), + must_run = false ) add_component!(sys, hpump) add_component!(sys, head_reservoir) From ec7433105ad6bfdb94b15fe4f658e6b40c555747 Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Tue, 9 Sep 2025 14:47:18 -0600 Subject: [PATCH 09/12] one more test --- src/library/psitest_library.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index 945a3a3..c9ebf54 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -731,7 +731,7 @@ function build_c_sys5_hyd(; time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) - add_component!(c_sys5_hyd, reservoir) + add_component!(c_sys5_hyd, reservoir[1]) set_reservoirs!(hydros[2], reservoir) if add_forecasts @@ -2231,7 +2231,7 @@ function build_c_sys5_hy_ems_uc(; add_forecasts, raw_data, kwargs...) time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) - add_component!(c_sys5_hy_uc, reservoir) + add_component!(c_sys5_hy_uc, reservoir[1]) set_reservoirs!(hydros[2], reservoir) if add_forecasts @@ -2505,7 +2505,7 @@ function build_c_sys5_hy_ems_ed(; add_forecasts, raw_data, kwargs...) time_series_in_memory = get(sys_kwargs, :time_series_in_memory, true), sys_kwargs..., ) - add_component!(c_sys5_hy_ed, reservoir) + add_component!(c_sys5_hy_ed, reservoir[1]) set_reservoirs!(hydros[2], reservoir) if add_forecasts for (ix, l) in enumerate(PSY.get_components(PSY.PowerLoad, c_sys5_hy_ed)) From 177a53a853e8bd4f310f36b27bc23fbee06a742e Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Fri, 12 Sep 2025 23:00:45 -0600 Subject: [PATCH 10/12] Update src/utils/utils.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/utils/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/utils.jl b/src/utils/utils.jl index 82ff0c4..608c337 100644 --- a/src/utils/utils.jl +++ b/src/utils/utils.jl @@ -151,7 +151,7 @@ function convert_to_hydropump!(d::EnergyReservoirStorage, sys::System) ), active_power_pump = 0.0, efficiency = (turbine = d.efficiency.out, pump = d.efficiency.in), - must_run = false + must_run = false, ) add_component!(sys, hpump) add_component!(sys, head_reservoir) From fe4bb739360f0795f47442abcbd26f6ff621490f Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Fri, 12 Sep 2025 23:00:52 -0600 Subject: [PATCH 11/12] Update src/library/psitest_library.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/library/psitest_library.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/psitest_library.jl b/src/library/psitest_library.jl index c9ebf54..0224b1b 100644 --- a/src/library/psitest_library.jl +++ b/src/library/psitest_library.jl @@ -3741,7 +3741,7 @@ function build_hydro_test_case_b_sys(; raw_data, kwargs...) ), ) - hydro, reservoir =_get_generic_hydro_reservoir_pair(node) + hydro, reservoir = _get_generic_hydro_reservoir_pair(node) duration_load = [0.3, 0.6, 0.5] load_data = SortedDict(time_periods[1] => TimeSeries.TimeArray(time_periods, duration_load)) From a22940d21ab327d5edaadc947a7f933e7367e474 Mon Sep 17 00:00:00 2001 From: Jose Daniel Lara Date: Mon, 15 Sep 2025 07:29:06 -0600 Subject: [PATCH 12/12] add supports services check --- src/library/psi_library.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/psi_library.jl b/src/library/psi_library.jl index 38b554e..3c9bdf1 100644 --- a/src/library/psi_library.jl +++ b/src/library/psi_library.jl @@ -1426,7 +1426,7 @@ function _duplicate_system(main_sys::PSY.System, twin_sys::PSY.System, HVDC_line !PSY.has_time_series(b) && PSY.copy_time_series!(b, main_comp) # add service to the device to be added to main_sys - if length(PSY.get_services(main_comp)) > 0 + if length(PSY.get_services(main_comp)) > 0 && supports_services(b) PSY.get_name(b) srvc_ = PSY.get_services(main_comp) for ss in srvc_