From 92985d72153b49326b96de00b5a140baa35863b2 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Fri, 11 Aug 2023 15:20:17 +0200 Subject: [PATCH] Comments processed --- python/ribasim/tests/conftest.py | 6 +- .../ribasim_testmodels/__init__.py | 6 +- .../ribasim_testmodels/discrete_control.py | 18 +- .../ribasim_testmodels/time.py | 154 ------------------ 4 files changed, 9 insertions(+), 175 deletions(-) diff --git a/python/ribasim/tests/conftest.py b/python/ribasim/tests/conftest.py index 1483fed49..9491cd18e 100644 --- a/python/ribasim/tests/conftest.py +++ b/python/ribasim/tests/conftest.py @@ -7,13 +7,12 @@ basic_model, basic_transient_model, bucket_model, - conditions_on_discrete_flow_model, - crossing_specific_control_model, flow_boundary_time_model, flow_condition_model, invalid_control_states_model, invalid_fractional_flow_model, invalid_qh_model, + level_setpoint_with_minmax_model, linear_resistance_model, manning_resistance_model, misc_nodes_model, @@ -70,7 +69,6 @@ def backwater() -> ribasim.Model: invalid_qh_model().write(datadir / "invalid_qh") invalid_fractional_flow_model().write(datadir / "invalid_fractional_flow") flow_boundary_time_model().write(datadir / "flow_boundary_time") - crossing_specific_control_model().write(datadir / "crossing_specific_control") - conditions_on_discrete_flow_model().write(datadir / "conditions_on_discrete_flow") + level_setpoint_with_minmax_model().write(datadir / "level_setpoint_with_minmax") pid_control_equation_model().write(datadir / "pid_control_equation") invalid_control_states_model().write(datadir / "invalid_control_states") diff --git a/python/ribasim_testmodels/ribasim_testmodels/__init__.py b/python/ribasim_testmodels/ribasim_testmodels/__init__.py index ab09b41ae..61fd665c6 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/__init__.py +++ b/python/ribasim_testmodels/ribasim_testmodels/__init__.py @@ -8,8 +8,8 @@ ) from ribasim_testmodels.bucket import bucket_model from ribasim_testmodels.discrete_control import ( - crossing_specific_control_model, flow_condition_model, + level_setpoint_with_minmax_model, pump_discrete_control_model, tabulated_rating_curve_control_model, ) @@ -27,7 +27,6 @@ ) from ribasim_testmodels.pid_control import pid_control_model from ribasim_testmodels.time import ( - conditions_on_discrete_flow_model, flow_boundary_time_model, ) from ribasim_testmodels.trivial import trivial_model @@ -49,9 +48,8 @@ "tabulated_rating_curve_control_model", "invalid_qh_model", "flow_boundary_time_model", - "crossing_specific_control_model", - "conditions_on_discrete_flow_model", "pid_control_equation_model", "invalid_fractional_flow_model", "invalid_control_states_model", + "level_setpoint_with_minmax_model", ] diff --git a/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py b/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py index 490774fd5..1c3e095cc 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py +++ b/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py @@ -412,10 +412,11 @@ def tabulated_rating_curve_control_model() -> ribasim.Model: return model -def crossing_specific_control_model(): +def level_setpoint_with_minmax_model(): """ - Set up a model with DiscreteControl with truth states that are - crossing-direction specific. + Set up a minimal model in which the level of a basin is kept within an acceptable range + around a setpoint while being affected by time-varying forcing. + This is done by bringing the level back to the setpoint once the level goes beyond this range. """ # Forcing @@ -562,7 +563,7 @@ def crossing_specific_control_model(): discrete_control = ribasim.DiscreteControl(condition=condition, logic=logic) model = ribasim.Model( - modelname="crossing_specific_control", + modelname="level_setpoint_with_minmax", node=node, edge=edge, basin=basin, @@ -575,12 +576,3 @@ def crossing_specific_control_model(): ) return model - - -if __name__ == "__main__": - import matplotlib.pyplot as plt - - model = crossing_specific_control_model() - model.plot() - - plt.show() diff --git a/python/ribasim_testmodels/ribasim_testmodels/time.py b/python/ribasim_testmodels/ribasim_testmodels/time.py index fbc2bb0f0..f4b3469eb 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/time.py +++ b/python/ribasim_testmodels/ribasim_testmodels/time.py @@ -102,157 +102,3 @@ def flow_boundary_time_model(): ) return model - - -def conditions_on_discrete_flow_model(): - xy = np.array( - [ - (1.0, 1.0), # 1: Basin - (2.0, 0.0), # 2: Basin - (2.0, 1.0), # 3: Pump - (0.0, 1.0), # 4: FlowBoundary - (2.0, 2.0), # 5: LevelBoundary - (1.0, 2.0), # 6: DiscreteControl - ] - ) - - node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1]) - node_type = [ - "Basin", - "Basin", - "Pump", - "FlowBoundary", - "LevelBoundary", - "DiscreteControl", - ] - - # Make sure the feature id starts at 1: explicitly give an index. - node = ribasim.Node( - static=gpd.GeoDataFrame( - data={"type": node_type}, - index=pd.Index(np.arange(len(xy)) + 1, name="fid"), - geometry=node_xy, - crs="EPSG:28992", - ) - ) - - # Setup the edges: - from_id = np.array([4, 3, 5, 6], dtype=np.int64) - to_id = np.array([1, 2, 3, 3], dtype=np.int64) - lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) - edge = ribasim.Edge( - static=gpd.GeoDataFrame( - data={ - "from_node_id": from_id, - "to_node_id": to_id, - "edge_type": 3 * ["flow"] + ["control"], - }, - geometry=lines, - crs="EPSG:28992", - ) - ) - - # Setup the basins: - profile = pd.DataFrame( - data={ - "node_id": [1, 1, 2, 2], - "area": [0.0, 1000.0] * 2, - "level": [0.0, 1.0] * 2, - } - ) - - static = pd.DataFrame( - data={ - "node_id": [1, 2], - "drainage": 2 * [0.0], - "potential_evaporation": 2 * [0.0], - "infiltration": 2 * [0.0], - "precipitation": 2 * [0.0], - "urban_runoff": 2 * [0.0], - } - ) - - basin = ribasim.Basin(profile=profile, static=static) - - # Setup pump: - pump = ribasim.Pump( - static=pd.DataFrame( - data={ - "node_id": 6 * [3], - "control_state": [str(n) for n in np.arange(6) + 1], - "flow_rate": 6 * [1.0], - } - ) - ) - - # Setup level boundary: - level_boundary = ribasim.LevelBoundary( - static=pd.DataFrame( - data={ - "node_id": [5], - "level": [1.0], - } - ) - ) - - # Setup flow boundary: - flow_rate = np.linspace(1.0, 5.0, 6) - - flow_boundary = ribasim.FlowBoundary( - time=pd.DataFrame( - data={ - "node_id": 6 * [4], - "time": pd.date_range( - start="2020-01-01 00:00:00", - end="2021-01-01 00:00:00", - periods=6, - ).astype("datetime64[s]"), - "flow_rate": flow_rate, - } - ) - ) - - # Setup the control: - greater_than = (flow_rate[1:] + flow_rate[:-1]) / 2 - - condition = pd.DataFrame( - data={ - "node_id": 5 * [6], - "listen_feature_id": 5 * [1], - "variable": 5 * ["flow"], - "greater_than": greater_than, - } - ) - - logic = pd.DataFrame( - data={ - "node_id": 6 * [6], - "truth_state": ["FFFFF", "TFFFF", "TTFFF", "TTTFF", "TTTTF", "TTTTT"], - "control_state": pump.static.control_state, - } - ) - - discrete_control = ribasim.DiscreteControl(condition=condition, logic=logic) - - model = ribasim.Model( - modelname="conditions_on_discrete_flow", - node=node, - edge=edge, - basin=basin, - pump=pump, - level_boundary=level_boundary, - flow_boundary=flow_boundary, - discrete_control=discrete_control, - starttime="2020-01-01 00:00:00", - endtime="2021-01-01 00:00:00", - ) - - return model - - -if __name__ == "__main__": - import matplotlib.pyplot as plt - - model = conditions_on_discrete_flow_model() - model.plot() - plt.show()