floodmodeller-api 0.5.0.post1__py3-none-any.whl → 0.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- floodmodeller_api/__init__.py +11 -1
- floodmodeller_api/_base.py +55 -36
- floodmodeller_api/backup.py +15 -12
- floodmodeller_api/dat.py +191 -121
- floodmodeller_api/diff.py +4 -4
- floodmodeller_api/hydrology_plus/hydrology_plus_export.py +15 -14
- floodmodeller_api/ied.py +8 -10
- floodmodeller_api/ief.py +56 -42
- floodmodeller_api/ief_flags.py +1 -1
- floodmodeller_api/inp.py +7 -10
- floodmodeller_api/logs/lf.py +25 -26
- floodmodeller_api/logs/lf_helpers.py +20 -20
- floodmodeller_api/logs/lf_params.py +1 -5
- floodmodeller_api/mapping.py +11 -2
- floodmodeller_api/test/__init__.py +2 -2
- floodmodeller_api/test/conftest.py +2 -3
- floodmodeller_api/test/test_backup.py +2 -2
- floodmodeller_api/test/test_conveyance.py +13 -7
- floodmodeller_api/test/test_dat.py +168 -20
- floodmodeller_api/test/test_data/EX18_DAT_expected.json +164 -144
- floodmodeller_api/test/test_data/EX3_DAT_expected.json +6 -2
- floodmodeller_api/test/test_data/EX6_DAT_expected.json +12 -46
- floodmodeller_api/test/test_data/encoding_test_cp1252.dat +1081 -0
- floodmodeller_api/test/test_data/encoding_test_utf8.dat +1081 -0
- floodmodeller_api/test/test_data/integrated_bridge/AR_NoSP_NoBl_2O_NO_OneFRC.ied +33 -0
- floodmodeller_api/test/test_data/integrated_bridge/AR_vSP_25pc_1O.ied +32 -0
- floodmodeller_api/test/test_data/integrated_bridge/PL_vSP_25pc_1O.ied +34 -0
- floodmodeller_api/test/test_data/integrated_bridge/SBTwoFRCsStaggered.IED +32 -0
- floodmodeller_api/test/test_data/integrated_bridge/US_NoSP_NoBl_OR_RN.ied +28 -0
- floodmodeller_api/test/test_data/integrated_bridge/US_SP_NoBl_OR_frc_PT2-5_RN.ied +34 -0
- floodmodeller_api/test/test_data/integrated_bridge/US_fSP_NoBl_1O.ied +30 -0
- floodmodeller_api/test/test_data/integrated_bridge/US_nSP_NoBl_1O.ied +49 -0
- floodmodeller_api/test/test_data/integrated_bridge/US_vSP_NoBl_2O_Para.ied +35 -0
- floodmodeller_api/test/test_data/integrated_bridge.dat +40 -0
- floodmodeller_api/test/test_data/network.ied +2 -2
- floodmodeller_api/test/test_data/network_dat_expected.json +141 -243
- floodmodeller_api/test/test_data/network_ied_expected.json +2 -2
- floodmodeller_api/test/test_data/network_with_comments.ied +2 -2
- floodmodeller_api/test/test_data/structure_logs/EX17_expected.csv +4 -0
- floodmodeller_api/test/test_data/structure_logs/EX17_expected.json +69 -0
- floodmodeller_api/test/test_data/structure_logs/EX18_expected.csv +20 -0
- floodmodeller_api/test/test_data/structure_logs/EX18_expected.json +292 -0
- floodmodeller_api/test/test_data/structure_logs/EX6_expected.csv +4 -0
- floodmodeller_api/test/test_data/structure_logs/EX6_expected.json +35 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_flow.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_fr.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_mode.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_stage.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_state.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_velocity.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_h.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_mode.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_link_inflow.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_max.csv +87 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_h.csv +182 -0
- floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_mode.csv +182 -0
- floodmodeller_api/test/test_flowtimeprofile.py +2 -2
- floodmodeller_api/test/test_hydrology_plus_export.py +4 -2
- floodmodeller_api/test/test_ied.py +3 -3
- floodmodeller_api/test/test_ief.py +12 -4
- floodmodeller_api/test/test_inp.py +2 -2
- floodmodeller_api/test/test_integrated_bridge.py +159 -0
- floodmodeller_api/test/test_json.py +14 -13
- floodmodeller_api/test/test_logs_lf.py +50 -29
- floodmodeller_api/test/test_read_file.py +1 -0
- floodmodeller_api/test/test_river.py +12 -12
- floodmodeller_api/test/test_tool.py +8 -5
- floodmodeller_api/test/test_toolbox_structure_log.py +148 -158
- floodmodeller_api/test/test_xml2d.py +14 -16
- floodmodeller_api/test/test_zz.py +143 -0
- floodmodeller_api/to_from_json.py +9 -9
- floodmodeller_api/tool.py +15 -11
- floodmodeller_api/toolbox/example_tool.py +5 -1
- floodmodeller_api/toolbox/model_build/add_siltation_definition.py +13 -9
- floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +500 -194
- floodmodeller_api/toolbox/model_build/structure_log_definition.py +5 -1
- floodmodeller_api/units/__init__.py +15 -0
- floodmodeller_api/units/_base.py +87 -20
- floodmodeller_api/units/_helpers.py +343 -0
- floodmodeller_api/units/boundaries.py +59 -71
- floodmodeller_api/units/comment.py +1 -1
- floodmodeller_api/units/conduits.py +57 -54
- floodmodeller_api/units/connectors.py +112 -0
- floodmodeller_api/units/controls.py +107 -0
- floodmodeller_api/units/conveyance.py +1 -1
- floodmodeller_api/units/iic.py +2 -9
- floodmodeller_api/units/losses.py +44 -45
- floodmodeller_api/units/sections.py +52 -51
- floodmodeller_api/units/structures.py +361 -531
- floodmodeller_api/units/units.py +27 -26
- floodmodeller_api/units/unsupported.py +5 -7
- floodmodeller_api/units/variables.py +2 -2
- floodmodeller_api/urban1d/_base.py +13 -17
- floodmodeller_api/urban1d/conduits.py +11 -21
- floodmodeller_api/urban1d/general_parameters.py +1 -1
- floodmodeller_api/urban1d/junctions.py +7 -11
- floodmodeller_api/urban1d/losses.py +13 -17
- floodmodeller_api/urban1d/outfalls.py +18 -22
- floodmodeller_api/urban1d/raingauges.py +5 -10
- floodmodeller_api/urban1d/subsections.py +5 -4
- floodmodeller_api/urban1d/xsections.py +14 -17
- floodmodeller_api/util.py +23 -6
- floodmodeller_api/validation/parameters.py +7 -3
- floodmodeller_api/validation/urban_parameters.py +1 -4
- floodmodeller_api/validation/validation.py +11 -5
- floodmodeller_api/version.py +1 -1
- floodmodeller_api/xml2d.py +27 -31
- floodmodeller_api/xml2d_template.py +1 -1
- floodmodeller_api/zz.py +539 -0
- {floodmodeller_api-0.5.0.post1.dist-info → floodmodeller_api-0.5.2.dist-info}/LICENSE.txt +1 -1
- {floodmodeller_api-0.5.0.post1.dist-info → floodmodeller_api-0.5.2.dist-info}/METADATA +30 -16
- {floodmodeller_api-0.5.0.post1.dist-info → floodmodeller_api-0.5.2.dist-info}/RECORD +116 -83
- {floodmodeller_api-0.5.0.post1.dist-info → floodmodeller_api-0.5.2.dist-info}/WHEEL +1 -1
- floodmodeller_api/test/test_zzn.py +0 -36
- floodmodeller_api/units/helpers.py +0 -123
- floodmodeller_api/zzn.py +0 -414
- /floodmodeller_api/test/test_data/{network_from_tabularCSV.csv → tabular_csv_outputs/network_zzn_max.csv} +0 -0
- {floodmodeller_api-0.5.0.post1.dist-info → floodmodeller_api-0.5.2.dist-info}/entry_points.txt +0 -0
- {floodmodeller_api-0.5.0.post1.dist-info → floodmodeller_api-0.5.2.dist-info}/top_level.txt +0 -0
|
@@ -38,7 +38,8 @@ def test_insert_intermediate_wls():
|
|
|
38
38
|
result = insert_intermediate_wls(arr, threshold)
|
|
39
39
|
|
|
40
40
|
assert isinstance(result, np.ndarray), "Result should be a numpy array"
|
|
41
|
-
assert result[0] == 1.0
|
|
41
|
+
assert result[0] == 1.0, "First element should match the input"
|
|
42
|
+
assert result[-1] == 3.0, "Last element should match the input"
|
|
42
43
|
assert all(np.diff(result) <= threshold), "All gaps should be <= to the threshold"
|
|
43
44
|
|
|
44
45
|
|
|
@@ -52,11 +53,13 @@ def from_gui(test_workspace: Path):
|
|
|
52
53
|
return pd.read_csv(test_workspace / "expected_conveyance.csv")
|
|
53
54
|
|
|
54
55
|
|
|
55
|
-
@pytest.mark.parametrize("section",
|
|
56
|
+
@pytest.mark.parametrize("section", ["a", "a2", "b", "b2", "c", "d", "d2", "e", "e2", "e3"])
|
|
56
57
|
def test_results_close_to_gui(section: str, dat: DAT, from_gui: pd.DataFrame):
|
|
57
58
|
threshold = 6
|
|
58
59
|
|
|
59
|
-
actual = dat.sections[section].conveyance
|
|
60
|
+
actual = dat.sections[section].conveyance # type: ignore
|
|
61
|
+
# ignored because we know that these all have type RIVER
|
|
62
|
+
|
|
60
63
|
expected = (
|
|
61
64
|
from_gui.set_index(f"{section}_stage")[f"{section}_conveyance"].dropna().drop_duplicates()
|
|
62
65
|
)
|
|
@@ -71,16 +74,19 @@ def test_results_close_to_gui(section: str, dat: DAT, from_gui: pd.DataFrame):
|
|
|
71
74
|
assert hausdorff_distance < threshold
|
|
72
75
|
|
|
73
76
|
|
|
74
|
-
@pytest.mark.parametrize("section",
|
|
77
|
+
@pytest.mark.parametrize("section", ["a", "a2", "b", "b2", "c", "d", "d2", "e", "e2", "e3"])
|
|
75
78
|
def test_results_match_gui_at_shared_points(section: str, dat: DAT, from_gui: pd.DataFrame):
|
|
76
|
-
tolerance = 1e-2 # 0.
|
|
77
|
-
|
|
79
|
+
tolerance = 1e-2 # 0.01
|
|
80
|
+
|
|
81
|
+
actual = dat.sections[section].conveyance # type: ignore
|
|
82
|
+
# ignored because we know that these all have type RIVER
|
|
83
|
+
|
|
78
84
|
expected = (
|
|
79
85
|
from_gui.set_index(f"{section}_stage")[f"{section}_conveyance"].dropna().drop_duplicates()
|
|
80
86
|
)
|
|
81
87
|
shared_index = sorted(set(actual.index).intersection(expected.index))
|
|
82
88
|
diff = expected[shared_index] - actual[shared_index]
|
|
83
|
-
assert (abs(diff) < tolerance).all() # asserts all conveyance values within 0.
|
|
89
|
+
assert (abs(diff) < tolerance).all() # asserts all conveyance values within 0.01 difference
|
|
84
90
|
|
|
85
91
|
|
|
86
92
|
def test_calculate_geometry():
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
import logging
|
|
1
2
|
from pathlib import Path
|
|
2
3
|
from unittest.mock import patch
|
|
3
4
|
|
|
4
5
|
import pytest
|
|
5
6
|
|
|
6
7
|
from floodmodeller_api import DAT
|
|
7
|
-
from floodmodeller_api.units import QTBDY
|
|
8
|
+
from floodmodeller_api.units import JUNCTION, LATERAL, QTBDY, RESERVOIR
|
|
8
9
|
from floodmodeller_api.util import FloodModellerAPIError
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
@pytest.fixture
|
|
12
|
+
@pytest.fixture()
|
|
12
13
|
def dat_fp(test_workspace):
|
|
13
14
|
return Path(test_workspace, "network.dat")
|
|
14
15
|
|
|
15
16
|
|
|
16
|
-
@pytest.fixture
|
|
17
|
+
@pytest.fixture()
|
|
17
18
|
def data_before(dat_fp):
|
|
18
19
|
return DAT(dat_fp)._write()
|
|
19
20
|
|
|
@@ -41,13 +42,6 @@ def dat_ex6(test_workspace):
|
|
|
41
42
|
yield dat
|
|
42
43
|
|
|
43
44
|
|
|
44
|
-
def test_dat_str_not_changed_by_write(dat_fp, data_before):
|
|
45
|
-
# TODO: Update this test - it isn't really testing anything since the behaviour of the fixture is exactly the same
|
|
46
|
-
"""DAT: Test str representation equal to dat file with no changes"""
|
|
47
|
-
dat = DAT(dat_fp)
|
|
48
|
-
assert dat._write() == data_before
|
|
49
|
-
|
|
50
|
-
|
|
51
45
|
def test_changing_section_and_dist_works(dat_fp, data_before):
|
|
52
46
|
"""DAT: Test changing and reverting section name and dist to next makes no changes"""
|
|
53
47
|
dat = DAT(dat_fp)
|
|
@@ -77,17 +71,17 @@ def test_changing_and_reverting_qtbdy_hydrograph_works(dat_fp, data_before):
|
|
|
77
71
|
assert dat._write() == data_before
|
|
78
72
|
|
|
79
73
|
|
|
80
|
-
def test_dat_read_doesnt_change_data(test_workspace,
|
|
74
|
+
def test_dat_read_doesnt_change_data(test_workspace, tmp_path):
|
|
81
75
|
"""DAT: Check all '.dat' files in folder by reading the _write() output into a new DAT instance and checking it stays the same."""
|
|
82
76
|
for datfile in Path(test_workspace).glob("*.dat"):
|
|
83
77
|
dat = DAT(datfile)
|
|
84
78
|
first_output = dat._write()
|
|
85
|
-
new_path =
|
|
79
|
+
new_path = tmp_path / "tmp.dat"
|
|
86
80
|
dat.save(new_path)
|
|
87
81
|
second_dat = DAT(new_path)
|
|
88
|
-
assert dat == second_dat
|
|
82
|
+
assert dat == second_dat, f"dat objects not equal for {datfile=}"
|
|
89
83
|
second_output = second_dat._write()
|
|
90
|
-
assert first_output == second_output
|
|
84
|
+
assert first_output == second_output, f"dat outputs not equal for {datfile=}"
|
|
91
85
|
|
|
92
86
|
|
|
93
87
|
def test_insert_unit_before(units, dat_ex6):
|
|
@@ -201,12 +195,14 @@ def test_remove_unit(dat_ex3):
|
|
|
201
195
|
assert (prev_dat_struct_len - len(dat_ex3._dat_struct)) == 1
|
|
202
196
|
|
|
203
197
|
|
|
204
|
-
def test_diff(test_workspace,
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
198
|
+
def test_diff(test_workspace, caplog):
|
|
199
|
+
with caplog.at_level(logging.INFO):
|
|
200
|
+
dat_ex4 = DAT(Path(test_workspace, "ex4.DAT"))
|
|
201
|
+
dat_ex4_changed = DAT(Path(test_workspace, "ex4_changed.DAT"))
|
|
202
|
+
dat_ex4.diff(dat_ex4_changed)
|
|
203
|
+
|
|
204
|
+
assert caplog.text == (
|
|
205
|
+
"INFO root:_base.py:135 Files not equivalent, 12 difference(s) found:\n"
|
|
210
206
|
" DAT->structures->MILLAu->RNWEIR..MILLAu->upstream_crest_height: 1.07 != 1.37\n"
|
|
211
207
|
" DAT->structures->MILLBu->RNWEIR..MILLBu->upstream_crest_height: 0.43 != 0.73\n"
|
|
212
208
|
" DAT->structures->ROAD1->RNWEIR..ROAD1->upstream_crest_height: 2.02 != 2.32\n"
|
|
@@ -220,3 +216,155 @@ def test_diff(test_workspace, capsys):
|
|
|
220
216
|
" DAT->_all_units->itm[61]->RNWEIR..CSRD01u->upstream_crest_height: 0.81 != 1.11\n"
|
|
221
217
|
" DAT->_all_units->itm[73]->RNWEIR..FOOTa->upstream_crest_height: 2.47 != 2.77\n"
|
|
222
218
|
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def test_valid_network(test_workspace: Path):
|
|
222
|
+
"""Test against network derived manually."""
|
|
223
|
+
dat = DAT(test_workspace / "network.dat")
|
|
224
|
+
actual_nodes, actual_edges = dat.get_network()
|
|
225
|
+
|
|
226
|
+
expected_edges = [
|
|
227
|
+
("FSSR16BDY_resin", "RIVER_resin"),
|
|
228
|
+
("QTBDY_CS26", "RIVER_CS26"),
|
|
229
|
+
("RIVER_CS26", "RIVER_CS25"),
|
|
230
|
+
("RIVER_CS25", "RIVER_CS24"),
|
|
231
|
+
("RIVER_CS25", "SPILL_RD25Su"),
|
|
232
|
+
("RIVER_CS24", "RIVER_CS23"),
|
|
233
|
+
("RIVER_CS24", "SPILL_RD24Su"),
|
|
234
|
+
("RIVER_CS23", "RIVER_CS22"),
|
|
235
|
+
("RIVER_CS23", "SPILL_RD23Su"),
|
|
236
|
+
("RIVER_CS22", "RIVER_CS21"),
|
|
237
|
+
("RIVER_CS22", "SPILL_RD22Su"),
|
|
238
|
+
("RIVER_CS21", "RIVER_CS20"),
|
|
239
|
+
("RIVER_CS21", "SPILL_RD21Su"),
|
|
240
|
+
("RIVER_CS20", "RIVER_CS19"),
|
|
241
|
+
("RIVER_CS20", "SPILL_RD20Su"),
|
|
242
|
+
("RIVER_CS19", "RIVER_CS18"),
|
|
243
|
+
("RIVER_CS19", "SPILL_RD19Su"),
|
|
244
|
+
("RIVER_CS18", "RIVER_RESOUT2a"),
|
|
245
|
+
("RIVER_CS18", "SPILL_RD18Su"),
|
|
246
|
+
("RIVER_RESOUT2a", "RIVER_RESOUT2b"),
|
|
247
|
+
("RIVER_RESOUT2b", "JUNCTION_RESOUT2b"),
|
|
248
|
+
("JUNCTION_RESOUT2b", "RIVER_RESOUT2u"),
|
|
249
|
+
("JUNCTION_RESOUT2b", "RIVER_RESOUT2d"),
|
|
250
|
+
("RIVER_resin", "RIVER_CSRD25"),
|
|
251
|
+
("RIVER_CSRD25", "RIVER_CSRD24"),
|
|
252
|
+
("RIVER_CSRD25", "SPILL_RD25Su"),
|
|
253
|
+
("RIVER_CSRD24", "RIVER_CSRD23"),
|
|
254
|
+
("RIVER_CSRD24", "SPILL_RD24Su"),
|
|
255
|
+
("RIVER_CSRD23", "RIVER_CSRD22"),
|
|
256
|
+
("RIVER_CSRD23", "SPILL_RD23Su"),
|
|
257
|
+
("RIVER_CSRD22", "RIVER_CSRD21"),
|
|
258
|
+
("RIVER_CSRD22", "SPILL_RD22Su"),
|
|
259
|
+
("RIVER_CSRD21", "RIVER_CSRD20"),
|
|
260
|
+
("RIVER_CSRD21", "SPILL_RD21Su"),
|
|
261
|
+
("RIVER_CSRD20", "RIVER_CSRD19"),
|
|
262
|
+
("RIVER_CSRD20", "SPILL_RD20Su"),
|
|
263
|
+
("RIVER_CSRD19", "RIVER_CSRD18"),
|
|
264
|
+
("RIVER_CSRD19", "SPILL_RD19Su"),
|
|
265
|
+
("RIVER_CSRD18", "RIVER_CSRD17"),
|
|
266
|
+
("RIVER_CSRD18", "SPILL_RD18Su"),
|
|
267
|
+
("RIVER_CSRD17", "RIVER_CSRD16"),
|
|
268
|
+
("RIVER_CSRD16", "RIVER_CSRD15"),
|
|
269
|
+
("RIVER_CSRD15", "RIVER_CSRD14u"),
|
|
270
|
+
("RIVER_CSRD14u", "JUNCTION_CSRD14u"),
|
|
271
|
+
("JUNCTION_CSRD14u", "RNWEIR_MILLBu"),
|
|
272
|
+
("JUNCTION_CSRD14u", "RNWEIR_MILLAu"),
|
|
273
|
+
("RNWEIR_MILLAu", "RIVER_MILLAd"),
|
|
274
|
+
("RIVER_MILLAd", "RIVER_RESOUT2u"),
|
|
275
|
+
("RIVER_RESOUT2d", "RIVER_CSRD13"),
|
|
276
|
+
("RIVER_CSRD13", "RIVER_CSRD12u"),
|
|
277
|
+
("RIVER_CSRD12u", "JUNCTION_CSRD12u"),
|
|
278
|
+
("RNWEIR_MILLBu", "JUNCTION_CSRD12u"),
|
|
279
|
+
("JUNCTION_CSRD12u", "RIVER_CSRD12d"),
|
|
280
|
+
("RIVER_CSRD12d", "RIVER_CSRD10"),
|
|
281
|
+
("RIVER_CSRD10", "RIVER_CSRD09"),
|
|
282
|
+
("RIVER_CSRD09u", "RIVER_CSRD09a"),
|
|
283
|
+
("RIVER_CSRD09", "JUNCTION_CSRD09"),
|
|
284
|
+
("RIVER_CSRD09u", "JUNCTION_CSRD09"),
|
|
285
|
+
("JUNCTION_CSRD09", "RNWEIR_ROAD1"),
|
|
286
|
+
("RIVER_CSRD09a", "BERNOULLI_CSRD09a"),
|
|
287
|
+
("BERNOULLI_CSRD09a", "RIVER_CSRD08u"),
|
|
288
|
+
("RIVER_CSRD08u", "RIVER_CSRD08a"),
|
|
289
|
+
("RIVER_CSRD08a", "JUNCTION_CSRD08a"),
|
|
290
|
+
("JUNCTION_CSRD08a", "RIVER_CSRD08"),
|
|
291
|
+
("RNWEIR_ROAD1", "JUNCTION_CSRD08a"),
|
|
292
|
+
("RIVER_CSRD08", "RIVER_CSRD07"),
|
|
293
|
+
("RIVER_CSRD07", "RIVER_CSRD06"),
|
|
294
|
+
("RIVER_CSRD06", "RIVER_CSRD05"),
|
|
295
|
+
("RIVER_CSRD05", "RIVER_CSRD04"),
|
|
296
|
+
("RIVER_CSRD04", "RIVER_CSRD03"),
|
|
297
|
+
("RIVER_CSRD03", "RIVER_CSRD02"),
|
|
298
|
+
("RIVER_CSRD02", "RIVER_CSRD02d"),
|
|
299
|
+
("RIVER_CSRD02d", "JUNCTION_CSRD02d"),
|
|
300
|
+
("JUNCTION_CSRD02d", "RNWEIR_RAILRDu"),
|
|
301
|
+
("JUNCTION_CSRD02d", "BERNOULLI_RAILBRu"),
|
|
302
|
+
("BERNOULLI_RAILBRu", "JUNCTION_RAILBRd"),
|
|
303
|
+
("RNWEIR_RAILRDu", "JUNCTION_RAILBRd"),
|
|
304
|
+
("JUNCTION_RAILBRd", "RIVER_CSRD01a"),
|
|
305
|
+
("RIVER_CSRD01a", "RIVER_CSRD01u"),
|
|
306
|
+
("RIVER_CSRD01u", "RNWEIR_CSRD01u"),
|
|
307
|
+
("RNWEIR_CSRD01u", "RIVER_CSRD01d"),
|
|
308
|
+
("RIVER_CSRD01d", "RIVER_CSRD01"),
|
|
309
|
+
("RIVER_CSRD01", "INTERPOLATE_DS.001"),
|
|
310
|
+
("INTERPOLATE_DS.001", "INTERPOLATE_DS.002"),
|
|
311
|
+
("INTERPOLATE_DS.002", "INTERPOLATE_DS.003"),
|
|
312
|
+
("INTERPOLATE_DS.003", "INTERPOLATE_DS.004"),
|
|
313
|
+
("INTERPOLATE_DS.004", "INTERPOLATE_DS.005"),
|
|
314
|
+
("INTERPOLATE_DS.005", "INTERPOLATE_DS.006"),
|
|
315
|
+
("INTERPOLATE_DS.006", "RIVER_DS2"),
|
|
316
|
+
("RIVER_DS2", "JUNCTION_DS2"),
|
|
317
|
+
("JUNCTION_DS2", "RNWEIR_FOOTa"),
|
|
318
|
+
("JUNCTION_DS2", "BERNOULLI_FOOTBRu"),
|
|
319
|
+
("RNWEIR_FOOTa", "JUNCTION_FOOTb"),
|
|
320
|
+
("BERNOULLI_FOOTBRu", "JUNCTION_FOOTb"),
|
|
321
|
+
("JUNCTION_FOOTb", "RIVER_DS3"),
|
|
322
|
+
("RIVER_DS3", "RIVER_DS4"),
|
|
323
|
+
("RIVER_DS4", "QHBDY_DS4"),
|
|
324
|
+
]
|
|
325
|
+
|
|
326
|
+
actual = {tuple(x.unique_name for x in y) for y in actual_edges}
|
|
327
|
+
expected = set(expected_edges)
|
|
328
|
+
assert expected == actual
|
|
329
|
+
assert len(actual_nodes) == 86
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def test_invalid_network(test_workspace: Path):
|
|
333
|
+
"""Test dat file that cannot be made into a valid network."""
|
|
334
|
+
dat = DAT(test_workspace / "All Units 4_6.DAT")
|
|
335
|
+
with pytest.raises(RuntimeError):
|
|
336
|
+
dat.get_network()
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def test_create_and_insert_connectors():
|
|
340
|
+
dat = DAT()
|
|
341
|
+
junction = JUNCTION(comment="hi", labels=["A", "B"])
|
|
342
|
+
lateral = LATERAL(name="lat", comment="bye")
|
|
343
|
+
reservoir = RESERVOIR(
|
|
344
|
+
easting=0,
|
|
345
|
+
northing=0,
|
|
346
|
+
runoff=0,
|
|
347
|
+
name="res",
|
|
348
|
+
comment="hello",
|
|
349
|
+
lateral_inflow_labels=["C", "D"],
|
|
350
|
+
)
|
|
351
|
+
dat.insert_units([junction, lateral, reservoir], add_at=-1)
|
|
352
|
+
assert dat.connectors == {"A": junction, "lat": lateral}
|
|
353
|
+
assert dat.controls == {"res": reservoir}
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
@pytest.mark.parametrize(
|
|
357
|
+
("dat_str", "label"),
|
|
358
|
+
[
|
|
359
|
+
("encoding_test_utf8.dat", "d\xc3\xa5rek"), # because it's initially saved as utf8
|
|
360
|
+
("encoding_test_cp1252.dat", "d\xe5rek"),
|
|
361
|
+
],
|
|
362
|
+
)
|
|
363
|
+
def test_encoding(test_workspace: Path, dat_str: str, label: str, tmp_path: Path):
|
|
364
|
+
dat_read = DAT(test_workspace / dat_str)
|
|
365
|
+
new_path = tmp_path / "tmp_encoding.dat"
|
|
366
|
+
dat_read.save(new_path)
|
|
367
|
+
dat_write = DAT(new_path)
|
|
368
|
+
|
|
369
|
+
assert label in dat_read.sections
|
|
370
|
+
assert label in dat_write.sections # remains as \xc3\xa5 even for utf8
|
|
@@ -1720,6 +1720,112 @@
|
|
|
1720
1720
|
}
|
|
1721
1721
|
}
|
|
1722
1722
|
},
|
|
1723
|
+
"connectors": {
|
|
1724
|
+
"S1u": {
|
|
1725
|
+
"API Class": "floodmodeller_api.units.connectors.JUNCTION",
|
|
1726
|
+
"Object Attributes": {
|
|
1727
|
+
"_label_len": 12,
|
|
1728
|
+
"_name": "S1u",
|
|
1729
|
+
"_subtype": "OPEN",
|
|
1730
|
+
"comment": "",
|
|
1731
|
+
"labels": [
|
|
1732
|
+
"S1u",
|
|
1733
|
+
"S1",
|
|
1734
|
+
"S1d"
|
|
1735
|
+
]
|
|
1736
|
+
}
|
|
1737
|
+
},
|
|
1738
|
+
"S4_drop": {
|
|
1739
|
+
"API Class": "floodmodeller_api.units.connectors.JUNCTION",
|
|
1740
|
+
"Object Attributes": {
|
|
1741
|
+
"_label_len": 12,
|
|
1742
|
+
"_name": "S4_drop",
|
|
1743
|
+
"_subtype": "OPEN",
|
|
1744
|
+
"comment": "",
|
|
1745
|
+
"labels": [
|
|
1746
|
+
"S4_drop",
|
|
1747
|
+
"P_suc",
|
|
1748
|
+
"S5"
|
|
1749
|
+
]
|
|
1750
|
+
}
|
|
1751
|
+
}
|
|
1752
|
+
},
|
|
1753
|
+
"controls": {
|
|
1754
|
+
"S0": {
|
|
1755
|
+
"API Class": "floodmodeller_api.units.controls.RESERVOIR",
|
|
1756
|
+
"Object Attributes": {
|
|
1757
|
+
"_label_len": 12,
|
|
1758
|
+
"_name": "S0",
|
|
1759
|
+
"data": {
|
|
1760
|
+
"class": "pandas.DataFrame",
|
|
1761
|
+
"object": {
|
|
1762
|
+
"Elevation": {
|
|
1763
|
+
"0": 19.0,
|
|
1764
|
+
"1": 20.0,
|
|
1765
|
+
"2": 21.0,
|
|
1766
|
+
"3": 22.0,
|
|
1767
|
+
"4": 23.0
|
|
1768
|
+
},
|
|
1769
|
+
"Plan Area": {
|
|
1770
|
+
"0": 800.0,
|
|
1771
|
+
"1": 1000.0,
|
|
1772
|
+
"2": 1200.0,
|
|
1773
|
+
"3": 1400.0,
|
|
1774
|
+
"4": 1600.0
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
},
|
|
1778
|
+
"_revision": 1,
|
|
1779
|
+
"comment": "",
|
|
1780
|
+
"labels": [
|
|
1781
|
+
"S0",
|
|
1782
|
+
"QT1",
|
|
1783
|
+
"QT2"
|
|
1784
|
+
],
|
|
1785
|
+
"lateral_inflow_labels": [],
|
|
1786
|
+
"no_rows": 5,
|
|
1787
|
+
"easting": 0,
|
|
1788
|
+
"northing": 0,
|
|
1789
|
+
"runoff": 0
|
|
1790
|
+
}
|
|
1791
|
+
},
|
|
1792
|
+
"CSO": {
|
|
1793
|
+
"API Class": "floodmodeller_api.units.controls.RESERVOIR",
|
|
1794
|
+
"Object Attributes": {
|
|
1795
|
+
"_label_len": 12,
|
|
1796
|
+
"_name": "CSO",
|
|
1797
|
+
"data": {
|
|
1798
|
+
"class": "pandas.DataFrame",
|
|
1799
|
+
"object": {
|
|
1800
|
+
"Elevation": {
|
|
1801
|
+
"0": 19.0,
|
|
1802
|
+
"1": 20.0,
|
|
1803
|
+
"2": 21.0,
|
|
1804
|
+
"3": 22.0,
|
|
1805
|
+
"4": 23.0
|
|
1806
|
+
},
|
|
1807
|
+
"Plan Area": {
|
|
1808
|
+
"0": 800.0,
|
|
1809
|
+
"1": 1000.0,
|
|
1810
|
+
"2": 1200.0,
|
|
1811
|
+
"3": 1200.0,
|
|
1812
|
+
"4": 1200.0
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
},
|
|
1816
|
+
"_revision": 1,
|
|
1817
|
+
"comment": "",
|
|
1818
|
+
"labels": [
|
|
1819
|
+
"CSO"
|
|
1820
|
+
],
|
|
1821
|
+
"lateral_inflow_labels": [],
|
|
1822
|
+
"no_rows": 5,
|
|
1823
|
+
"easting": 0,
|
|
1824
|
+
"northing": 0,
|
|
1825
|
+
"runoff": 0
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
},
|
|
1723
1829
|
"structures": {
|
|
1724
1830
|
"S0": {
|
|
1725
1831
|
"API Class": "floodmodeller_api.units.structures.WEIR",
|
|
@@ -1932,54 +2038,6 @@
|
|
|
1932
2038
|
}
|
|
1933
2039
|
},
|
|
1934
2040
|
"_unsupported": {
|
|
1935
|
-
"S0 (RESERVOIR)": {
|
|
1936
|
-
"API Class": "floodmodeller_api.units.unsupported.UNSUPPORTED",
|
|
1937
|
-
"Object Attributes": {
|
|
1938
|
-
"_label_len": 12,
|
|
1939
|
-
"_name": "S0",
|
|
1940
|
-
"_unit": "RESERVOIR",
|
|
1941
|
-
"_subtype": false,
|
|
1942
|
-
"_raw_block": [
|
|
1943
|
-
"RESERVOIR #revision#1",
|
|
1944
|
-
"S0 QT1 QT2",
|
|
1945
|
-
"",
|
|
1946
|
-
" 5",
|
|
1947
|
-
" 19.000 800.000",
|
|
1948
|
-
" 20.000 1000.000",
|
|
1949
|
-
" 21.000 1200.000",
|
|
1950
|
-
" 22.000 1400.000",
|
|
1951
|
-
" 23.000 1600.000",
|
|
1952
|
-
" 0000 0000 0"
|
|
1953
|
-
],
|
|
1954
|
-
"comment": "#revision#1",
|
|
1955
|
-
"labels": [
|
|
1956
|
-
"S0",
|
|
1957
|
-
"QT1",
|
|
1958
|
-
"QT2"
|
|
1959
|
-
],
|
|
1960
|
-
"ds_label": "QT1"
|
|
1961
|
-
}
|
|
1962
|
-
},
|
|
1963
|
-
"S1u (JUNCTION)": {
|
|
1964
|
-
"API Class": "floodmodeller_api.units.unsupported.UNSUPPORTED",
|
|
1965
|
-
"Object Attributes": {
|
|
1966
|
-
"_label_len": 12,
|
|
1967
|
-
"_name": "S1u",
|
|
1968
|
-
"_unit": "JUNCTION",
|
|
1969
|
-
"_subtype": "OPEN",
|
|
1970
|
-
"_raw_block": [
|
|
1971
|
-
"JUNCTION",
|
|
1972
|
-
"OPEN",
|
|
1973
|
-
"S1u S1 S1d"
|
|
1974
|
-
],
|
|
1975
|
-
"comment": "",
|
|
1976
|
-
"labels": [
|
|
1977
|
-
"S1u",
|
|
1978
|
-
"S1",
|
|
1979
|
-
"S1d"
|
|
1980
|
-
]
|
|
1981
|
-
}
|
|
1982
|
-
},
|
|
1983
2041
|
"C2m (MANHOLE)": {
|
|
1984
2042
|
"API Class": "floodmodeller_api.units.unsupported.UNSUPPORTED",
|
|
1985
2043
|
"Object Attributes": {
|
|
@@ -2001,26 +2059,6 @@
|
|
|
2001
2059
|
"ds_label": "C2md"
|
|
2002
2060
|
}
|
|
2003
2061
|
},
|
|
2004
|
-
"S4_drop (JUNCTION)": {
|
|
2005
|
-
"API Class": "floodmodeller_api.units.unsupported.UNSUPPORTED",
|
|
2006
|
-
"Object Attributes": {
|
|
2007
|
-
"_label_len": 12,
|
|
2008
|
-
"_name": "S4_drop",
|
|
2009
|
-
"_unit": "JUNCTION",
|
|
2010
|
-
"_subtype": "OPEN",
|
|
2011
|
-
"_raw_block": [
|
|
2012
|
-
"JUNCTION",
|
|
2013
|
-
"OPEN",
|
|
2014
|
-
"S4_drop P_suc S5"
|
|
2015
|
-
],
|
|
2016
|
-
"comment": "",
|
|
2017
|
-
"labels": [
|
|
2018
|
-
"S4_drop",
|
|
2019
|
-
"P_suc",
|
|
2020
|
-
"S5"
|
|
2021
|
-
]
|
|
2022
|
-
}
|
|
2023
|
-
},
|
|
2024
2062
|
"P_suc (OCPUMP)": {
|
|
2025
2063
|
"API Class": "floodmodeller_api.units.unsupported.UNSUPPORTED",
|
|
2026
2064
|
"Object Attributes": {
|
|
@@ -2069,32 +2107,6 @@
|
|
|
2069
2107
|
],
|
|
2070
2108
|
"ds_label": "P_del"
|
|
2071
2109
|
}
|
|
2072
|
-
},
|
|
2073
|
-
"CSO (RESERVOIR)": {
|
|
2074
|
-
"API Class": "floodmodeller_api.units.unsupported.UNSUPPORTED",
|
|
2075
|
-
"Object Attributes": {
|
|
2076
|
-
"_label_len": 12,
|
|
2077
|
-
"_name": "CSO",
|
|
2078
|
-
"_unit": "RESERVOIR",
|
|
2079
|
-
"_subtype": false,
|
|
2080
|
-
"_raw_block": [
|
|
2081
|
-
"RESERVOIR #revision#1",
|
|
2082
|
-
"CSO",
|
|
2083
|
-
"",
|
|
2084
|
-
" 5",
|
|
2085
|
-
" 19.000 800.000",
|
|
2086
|
-
" 20.000 1000.000",
|
|
2087
|
-
" 21.000 1200.000",
|
|
2088
|
-
" 22.000 1200.000",
|
|
2089
|
-
" 23.000 1200.000",
|
|
2090
|
-
" 0000 0000 0"
|
|
2091
|
-
],
|
|
2092
|
-
"comment": "#revision#1",
|
|
2093
|
-
"labels": [
|
|
2094
|
-
"CSO",
|
|
2095
|
-
""
|
|
2096
|
-
]
|
|
2097
|
-
}
|
|
2098
2110
|
}
|
|
2099
2111
|
},
|
|
2100
2112
|
"_all_units": [
|
|
@@ -2180,31 +2192,41 @@
|
|
|
2180
2192
|
}
|
|
2181
2193
|
},
|
|
2182
2194
|
{
|
|
2183
|
-
"API Class": "floodmodeller_api.units.
|
|
2195
|
+
"API Class": "floodmodeller_api.units.controls.RESERVOIR",
|
|
2184
2196
|
"Object Attributes": {
|
|
2185
2197
|
"_label_len": 12,
|
|
2186
2198
|
"_name": "S0",
|
|
2187
|
-
"
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2199
|
+
"data": {
|
|
2200
|
+
"class": "pandas.DataFrame",
|
|
2201
|
+
"object": {
|
|
2202
|
+
"Elevation": {
|
|
2203
|
+
"0": 19.0,
|
|
2204
|
+
"1": 20.0,
|
|
2205
|
+
"2": 21.0,
|
|
2206
|
+
"3": 22.0,
|
|
2207
|
+
"4": 23.0
|
|
2208
|
+
},
|
|
2209
|
+
"Plan Area": {
|
|
2210
|
+
"0": 800.0,
|
|
2211
|
+
"1": 1000.0,
|
|
2212
|
+
"2": 1200.0,
|
|
2213
|
+
"3": 1400.0,
|
|
2214
|
+
"4": 1600.0
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
},
|
|
2218
|
+
"_revision": 1,
|
|
2219
|
+
"comment": "",
|
|
2202
2220
|
"labels": [
|
|
2203
2221
|
"S0",
|
|
2204
2222
|
"QT1",
|
|
2205
2223
|
"QT2"
|
|
2206
2224
|
],
|
|
2207
|
-
"
|
|
2225
|
+
"lateral_inflow_labels": [],
|
|
2226
|
+
"no_rows": 5,
|
|
2227
|
+
"easting": 0,
|
|
2228
|
+
"northing": 0,
|
|
2229
|
+
"runoff": 0
|
|
2208
2230
|
}
|
|
2209
2231
|
},
|
|
2210
2232
|
{
|
|
@@ -2223,17 +2245,11 @@
|
|
|
2223
2245
|
}
|
|
2224
2246
|
},
|
|
2225
2247
|
{
|
|
2226
|
-
"API Class": "floodmodeller_api.units.
|
|
2248
|
+
"API Class": "floodmodeller_api.units.connectors.JUNCTION",
|
|
2227
2249
|
"Object Attributes": {
|
|
2228
2250
|
"_label_len": 12,
|
|
2229
2251
|
"_name": "S1u",
|
|
2230
|
-
"_unit": "JUNCTION",
|
|
2231
2252
|
"_subtype": "OPEN",
|
|
2232
|
-
"_raw_block": [
|
|
2233
|
-
"JUNCTION",
|
|
2234
|
-
"OPEN",
|
|
2235
|
-
"S1u S1 S1d"
|
|
2236
|
-
],
|
|
2237
2253
|
"comment": "",
|
|
2238
2254
|
"labels": [
|
|
2239
2255
|
"S1u",
|
|
@@ -2988,17 +3004,11 @@
|
|
|
2988
3004
|
}
|
|
2989
3005
|
},
|
|
2990
3006
|
{
|
|
2991
|
-
"API Class": "floodmodeller_api.units.
|
|
3007
|
+
"API Class": "floodmodeller_api.units.connectors.JUNCTION",
|
|
2992
3008
|
"Object Attributes": {
|
|
2993
3009
|
"_label_len": 12,
|
|
2994
3010
|
"_name": "S4_drop",
|
|
2995
|
-
"_unit": "JUNCTION",
|
|
2996
3011
|
"_subtype": "OPEN",
|
|
2997
|
-
"_raw_block": [
|
|
2998
|
-
"JUNCTION",
|
|
2999
|
-
"OPEN",
|
|
3000
|
-
"S4_drop P_suc S5"
|
|
3001
|
-
],
|
|
3002
3012
|
"comment": "",
|
|
3003
3013
|
"labels": [
|
|
3004
3014
|
"S4_drop",
|
|
@@ -3527,29 +3537,39 @@
|
|
|
3527
3537
|
}
|
|
3528
3538
|
},
|
|
3529
3539
|
{
|
|
3530
|
-
"API Class": "floodmodeller_api.units.
|
|
3540
|
+
"API Class": "floodmodeller_api.units.controls.RESERVOIR",
|
|
3531
3541
|
"Object Attributes": {
|
|
3532
3542
|
"_label_len": 12,
|
|
3533
3543
|
"_name": "CSO",
|
|
3534
|
-
"
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3544
|
+
"data": {
|
|
3545
|
+
"class": "pandas.DataFrame",
|
|
3546
|
+
"object": {
|
|
3547
|
+
"Elevation": {
|
|
3548
|
+
"0": 19.0,
|
|
3549
|
+
"1": 20.0,
|
|
3550
|
+
"2": 21.0,
|
|
3551
|
+
"3": 22.0,
|
|
3552
|
+
"4": 23.0
|
|
3553
|
+
},
|
|
3554
|
+
"Plan Area": {
|
|
3555
|
+
"0": 800.0,
|
|
3556
|
+
"1": 1000.0,
|
|
3557
|
+
"2": 1200.0,
|
|
3558
|
+
"3": 1200.0,
|
|
3559
|
+
"4": 1200.0
|
|
3560
|
+
}
|
|
3561
|
+
}
|
|
3562
|
+
},
|
|
3563
|
+
"_revision": 1,
|
|
3564
|
+
"comment": "",
|
|
3549
3565
|
"labels": [
|
|
3550
|
-
"CSO"
|
|
3551
|
-
|
|
3552
|
-
]
|
|
3566
|
+
"CSO"
|
|
3567
|
+
],
|
|
3568
|
+
"lateral_inflow_labels": [],
|
|
3569
|
+
"no_rows": 5,
|
|
3570
|
+
"easting": 0,
|
|
3571
|
+
"northing": 0,
|
|
3572
|
+
"runoff": 0
|
|
3553
3573
|
}
|
|
3554
3574
|
}
|
|
3555
3575
|
],
|