def test_control_curve_interpolated(model): m = model m.scenarios.setup() si = ScenarioIndex(0, np.array([0], dtype=np.int32)) s = Storage(m, 'Storage', max_volume=100.0) cc = ConstantParameter(0.8) values = [20.0, 5.0, 0.0] s.cost = ControlCurveInterpolatedParameter(s, cc, values) s.setup(m) for v in (0.0, 10.0, 50.0, 80.0, 90.0, 100.0): s.initial_volume = v s.reset() assert_allclose(s.get_cost(m.timestepper.current, si), np.interp(v/100.0, [0.0, 0.8, 1.0], values[::-1])) # special case when control curve is 100% cc.update(np.array([1.0,])) s.initial_volume == 100.0 s.reset() assert_allclose(s.get_cost(m.timestepper.current, si), values[1]) # special case when control curve is 0% cc.update(np.array([0.0,])) s.initial_volume == 0.0 s.reset() assert_allclose(s.get_cost(m.timestepper.current, si), values[0])
def test_with_nonstorage_load(self, model): """ Test load from dict with 'storage_node' key. """ m = model m.scenarios.setup() s = Storage(m, 'Storage', max_volume=100.0) l = Link(m, 'Link') data = { "type": "controlcurve", "control_curve": 0.8, "values": [10.0, 0.0], "storage_node": "Storage" } l.cost = p = load_parameter(model, data) assert isinstance(p, ControlCurveParameter) s.setup(m) # Init memory view on storage (bypasses usual `Model.setup`) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) print(s.volume) assert_allclose(l.get_cost(m.timestepper.current, si), 0.0) # When storage volume changes, the cost of the link changes. s.initial_volume = 90.0 m.reset() assert_allclose(l.get_cost(m.timestepper.current, si), 10.0)
def test_single_cc_load(self, model): """ Test load from dict with 'control_curve' key This is different to the above test by using singular 'control_curve' key in the dict """ m = model m.scenarios.setup() s = Storage(m, 'Storage', max_volume=100.0) data = { "type": "controlcurve", "storage_node": "Storage", "control_curve": 0.8, } s.cost = p = load_parameter(model, data) assert isinstance(p, ControlCurveParameter) s.setup(m) # Init memory view on storage (bypasses usual `Model.setup`) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) s.initial_volume = 90.0 m.reset() assert_allclose(s.get_cost(m.timestepper.current, si), 0) s.initial_volume = 70.0 m.reset() assert_allclose(s.get_cost(m.timestepper.current, si), 1)
def test_scaled_profile_nested_load(model): """ Test `ScaledProfileParameter` loading with `AggregatedParameter` """ s = Storage(model, 'Storage', max_volume=100.0) l = Link(model, 'Link') data = { 'type': 'scaledprofile', 'scale': 50.0, 'profile': { 'type': 'aggregated', 'agg_func': 'product', 'parameters': [{ 'type': 'monthlyprofile', 'values': [0.5] * 12 }, { 'type': 'monthlyprofilecontrolcurve', 'control_curves': [0.8, 0.6], 'values': [[1.0] * 12, [0.7] * np.arange(12), [0.3] * 12], 'storage_node': 'Storage' }] } } l.max_flow = p = load_parameter(model, data) p.setup(model) # Test correct aggregation is performed model.scenarios.setup() s.setup( model) # Init memory view on storage (bypasses usual `Model.setup`) s.initial_volume = 90.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 50.0 * 0.5 * 1.0) s.initial_volume = 70.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 50.0 * 0.5 * 0.7 * (mth - 1)) s.initial_volume = 30.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 50.0 * 0.5 * 0.3)
def test_with_nonstorage(self, model): """ Test usage on non-`Storage` node. """ # Now test if the parameter is used on a non storage node m = model m.scenarios.setup() s = Storage(m, 'Storage', max_volume=100.0) l = Link(m, 'Link') cc = ConstantParameter(0.8) l.cost = ControlCurveParameter(s, cc, [10.0, 0.0]) s.setup(m) # Init memory view on storage (bypasses usual `Model.setup`) print(s.volume) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) assert_allclose(l.get_cost(m.timestepper.current, si), 0.0) # When storage volume changes, the cost of the link changes. s.initial_volume = 90.0 m.reset() print(s.volume) assert_allclose(l.get_cost(m.timestepper.current, si), 10.0)
def test_daily_profile_control_curve(model): """ Test `DailyProfileControlCurveParameter` """ s = Storage(model, 'Storage', max_volume=100.0) l = Link(model, 'Link') data = { 'type': 'dailyprofilecontrolcurve', 'control_curves': [0.8, 0.6], 'values': [[1.0]*366, [0.7]*np.arange(366), [0.3]*366], 'storage_node': 'Storage' } l.max_flow = p = load_parameter(model, data) p.setup(model) # Test correct aggregation is performed model.scenarios.setup() s.setup(model) # Init memory view on storage (bypasses usual `Model.setup`) s.initial_volume = 90.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 1.0) s.initial_volume = 70.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) doy = ts.datetime.dayofyear np.testing.assert_allclose(p.value(ts, si), 0.7*(doy - 1)) s.initial_volume = 30.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 0.3)