floodmodeller-api 0.4.3__py3-none-any.whl → 0.4.4.post1__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.
Files changed (30) hide show
  1. floodmodeller_api/_base.py +22 -37
  2. floodmodeller_api/dat.py +165 -185
  3. floodmodeller_api/ied.py +82 -87
  4. floodmodeller_api/ief.py +92 -186
  5. floodmodeller_api/inp.py +64 -70
  6. floodmodeller_api/logs/__init__.py +1 -1
  7. floodmodeller_api/logs/lf.py +61 -17
  8. floodmodeller_api/test/conftest.py +7 -0
  9. floodmodeller_api/test/test_conveyance.py +107 -0
  10. floodmodeller_api/test/test_dat.py +5 -4
  11. floodmodeller_api/test/test_data/conveyance_test.dat +165 -0
  12. floodmodeller_api/test/test_data/conveyance_test.feb +116 -0
  13. floodmodeller_api/test/test_data/conveyance_test.gxy +85 -0
  14. floodmodeller_api/test/test_data/expected_conveyance.csv +60 -0
  15. floodmodeller_api/test/test_ief.py +26 -15
  16. floodmodeller_api/test/test_logs_lf.py +54 -0
  17. floodmodeller_api/to_from_json.py +24 -12
  18. floodmodeller_api/units/boundaries.py +6 -0
  19. floodmodeller_api/units/conveyance.py +301 -0
  20. floodmodeller_api/units/sections.py +21 -0
  21. floodmodeller_api/util.py +42 -0
  22. floodmodeller_api/version.py +1 -1
  23. floodmodeller_api/xml2d.py +80 -136
  24. floodmodeller_api/zzn.py +166 -139
  25. {floodmodeller_api-0.4.3.dist-info → floodmodeller_api-0.4.4.post1.dist-info}/METADATA +4 -1
  26. {floodmodeller_api-0.4.3.dist-info → floodmodeller_api-0.4.4.post1.dist-info}/RECORD +30 -24
  27. {floodmodeller_api-0.4.3.dist-info → floodmodeller_api-0.4.4.post1.dist-info}/WHEEL +1 -1
  28. {floodmodeller_api-0.4.3.dist-info → floodmodeller_api-0.4.4.post1.dist-info}/LICENSE.txt +0 -0
  29. {floodmodeller_api-0.4.3.dist-info → floodmodeller_api-0.4.4.post1.dist-info}/entry_points.txt +0 -0
  30. {floodmodeller_api-0.4.3.dist-info → floodmodeller_api-0.4.4.post1.dist-info}/top_level.txt +0 -0
floodmodeller_api/zzn.py CHANGED
@@ -24,7 +24,8 @@ import numpy as np
24
24
  import pandas as pd
25
25
 
26
26
  from ._base import FMFile
27
- from .util import is_windows
27
+ from .to_from_json import to_json
28
+ from .util import handle_exception, is_windows
28
29
 
29
30
 
30
31
  class ZZN(FMFile):
@@ -40,156 +41,151 @@ class ZZN(FMFile):
40
41
  _filetype: str = "ZZN"
41
42
  _suffix: str = ".zzn"
42
43
 
44
+ @handle_exception(when="read")
43
45
  def __init__( # noqa: PLR0915
44
46
  self,
45
47
  zzn_filepath: str | Path | None = None,
46
48
  from_json: bool = False,
47
49
  ):
48
- try:
49
- if from_json:
50
- return
51
- FMFile.__init__(self, zzn_filepath)
52
-
53
- # Get zzn_dll path
54
- lib = "zzn_read.dll" if is_windows() else "libzzn_read.so"
55
- zzn_dll = Path(__file__).resolve().parent / "libs" / lib
56
-
57
- # Catch LD_LIBRARY_PATH error for linux
58
- try:
59
- zzn_read = ct.CDLL(str(zzn_dll))
60
- except OSError as e:
61
- msg_1 = "libifport.so.5: cannot open shared object file: No such file or directory"
62
- if msg_1 in str(e):
63
- msg_2 = "Set LD_LIBRARY_PATH environment variable to be floodmodeller_api/lib"
64
- raise OSError(msg_2) from e
65
- raise
66
-
67
- # Get zzl path
68
- zzn = self._filepath
69
- zzl = zzn.with_suffix(".zzl")
70
- if not zzl.exists():
71
- raise FileNotFoundError(
72
- "Error: Could not find associated .ZZL file. Ensure that the zzn results have an associated zzl file with matching name.",
73
- )
50
+ if from_json:
51
+ return
52
+ FMFile.__init__(self, zzn_filepath)
74
53
 
75
- self.meta: dict[str, Any] = {} # Dict object to hold all metadata
76
- self.data = {} # Dict object to hold all data
77
-
78
- # PROCESS_ZZL
79
- self.meta["zzl_name"] = ct.create_string_buffer(bytes(str(zzl), "utf-8"), 255)
80
- self.meta["zzn_name"] = ct.create_string_buffer(bytes(str(zzn), "utf-8"), 255)
81
- self.meta["model_title"] = ct.create_string_buffer(b"", 128)
82
- self.meta["nnodes"] = ct.c_int(0)
83
- self.meta["label_length"] = ct.c_int(0)
84
- self.meta["dt"] = ct.c_float(0.0)
85
- self.meta["timestep0"] = ct.c_int(0)
86
- self.meta["ltimestep"] = ct.c_int(0)
87
- self.meta["save_int"] = ct.c_float(0.0)
88
- self.meta["is_quality"] = ct.c_bool(False)
89
- self.meta["nvars"] = ct.c_int(0)
90
- self.meta["tzero"] = (ct.c_int * 5)()
91
- self.meta["errstat"] = ct.c_int(0)
92
- zzn_read.process_zzl(
93
- ct.byref(self.meta["zzl_name"]),
94
- ct.byref(self.meta["model_title"]),
95
- ct.byref(self.meta["nnodes"]),
96
- ct.byref(self.meta["label_length"]),
97
- ct.byref(self.meta["dt"]),
98
- ct.byref(self.meta["timestep0"]),
99
- ct.byref(self.meta["ltimestep"]),
100
- ct.byref(self.meta["save_int"]),
101
- ct.byref(self.meta["is_quality"]),
102
- ct.byref(self.meta["nvars"]),
103
- ct.byref(self.meta["tzero"]),
104
- ct.byref(self.meta["errstat"]),
105
- )
106
- # PROCESS_LABELS
107
- self.meta["labels"] = (
108
- ct.c_char * self.meta["label_length"].value * self.meta["nnodes"].value
109
- )()
110
- zzn_read.process_labels(
111
- ct.byref(self.meta["zzl_name"]),
112
- ct.byref(self.meta["nnodes"]),
113
- ct.byref(self.meta["label_length"]),
114
- ct.byref(self.meta["errstat"]),
115
- )
116
- for i in range(self.meta["nnodes"].value):
117
- zzn_read.get_zz_label(
118
- ct.byref(ct.c_int(i + 1)),
119
- ct.byref(self.meta["labels"][i]),
120
- ct.byref(self.meta["errstat"]),
121
- )
122
- # PREPROCESS_ZZN
123
- last_hr = (
124
- (self.meta["ltimestep"].value - self.meta["timestep0"].value)
125
- * self.meta["dt"].value
126
- / 3600
127
- )
128
- self.meta["output_hrs"] = (ct.c_float * 2)(0.0, last_hr)
129
- self.meta["aitimestep"] = (ct.c_int * 2)(
130
- self.meta["timestep0"].value,
131
- self.meta["ltimestep"].value,
132
- )
133
- self.meta["isavint"] = (ct.c_int * 2)()
134
- zzn_read.preprocess_zzn(
135
- ct.byref(self.meta["output_hrs"]),
136
- ct.byref(self.meta["aitimestep"]),
137
- ct.byref(self.meta["dt"]),
138
- ct.byref(self.meta["timestep0"]),
139
- ct.byref(self.meta["ltimestep"]),
140
- ct.byref(self.meta["save_int"]),
141
- ct.byref(self.meta["isavint"]),
142
- )
143
- # PROCESS_ZZN
144
- self.meta["node_ID"] = ct.c_int(-1)
145
- self.meta["savint_skip"] = ct.c_int(1)
146
- self.meta["savint_range"] = ct.c_int(
147
- int(
148
- (self.meta["isavint"][1] - self.meta["isavint"][0])
149
- / self.meta["savint_skip"].value,
150
- ),
54
+ # Get zzn_dll path
55
+ lib = "zzn_read.dll" if is_windows() else "libzzn_read.so"
56
+ zzn_dll = Path(__file__).resolve().parent / "libs" / lib
57
+
58
+ # Catch LD_LIBRARY_PATH error for linux
59
+ try:
60
+ zzn_read = ct.CDLL(str(zzn_dll))
61
+ except OSError as e:
62
+ msg_1 = "libifport.so.5: cannot open shared object file: No such file or directory"
63
+ if msg_1 in str(e):
64
+ msg_2 = "Set LD_LIBRARY_PATH environment variable to be floodmodeller_api/lib"
65
+ raise OSError(msg_2) from e
66
+ raise
67
+
68
+ # Get zzl path
69
+ zzn = self._filepath
70
+ zzl = zzn.with_suffix(".zzl")
71
+ if not zzl.exists():
72
+ raise FileNotFoundError(
73
+ "Error: Could not find associated .ZZL file. Ensure that the zzn results have an associated zzl file with matching name.",
151
74
  )
152
- nx = self.meta["nnodes"].value
153
- ny = self.meta["nvars"].value
154
- nz = self.meta["savint_range"].value + 1
155
- self.data["all_results"] = (ct.c_float * nx * ny * nz)()
156
- self.data["max_results"] = (ct.c_float * nx * ny)()
157
- self.data["min_results"] = (ct.c_float * nx * ny)()
158
- self.data["max_times"] = (ct.c_int * nx * ny)()
159
- self.data["min_times"] = (ct.c_int * nx * ny)()
160
- zzn_read.process_zzn(
161
- ct.byref(self.meta["zzn_name"]),
162
- ct.byref(self.meta["node_ID"]),
163
- ct.byref(self.meta["nnodes"]),
164
- ct.byref(self.meta["is_quality"]),
165
- ct.byref(self.meta["nvars"]),
166
- ct.byref(self.meta["savint_range"]),
167
- ct.byref(self.meta["savint_skip"]),
168
- ct.byref(self.data["all_results"]),
169
- ct.byref(self.data["max_results"]),
170
- ct.byref(self.data["min_results"]),
171
- ct.byref(self.data["max_times"]),
172
- ct.byref(self.data["min_times"]),
75
+
76
+ self.meta: dict[str, Any] = {} # Dict object to hold all metadata
77
+ self.data = {} # Dict object to hold all data
78
+
79
+ # PROCESS_ZZL
80
+ self.meta["zzl_name"] = ct.create_string_buffer(bytes(str(zzl), "utf-8"), 255)
81
+ self.meta["zzn_name"] = ct.create_string_buffer(bytes(str(zzn), "utf-8"), 255)
82
+ self.meta["model_title"] = ct.create_string_buffer(b"", 128)
83
+ self.meta["nnodes"] = ct.c_int(0)
84
+ self.meta["label_length"] = ct.c_int(0)
85
+ self.meta["dt"] = ct.c_float(0.0)
86
+ self.meta["timestep0"] = ct.c_int(0)
87
+ self.meta["ltimestep"] = ct.c_int(0)
88
+ self.meta["save_int"] = ct.c_float(0.0)
89
+ self.meta["is_quality"] = ct.c_bool(False)
90
+ self.meta["nvars"] = ct.c_int(0)
91
+ self.meta["tzero"] = (ct.c_int * 5)()
92
+ self.meta["errstat"] = ct.c_int(0)
93
+ zzn_read.process_zzl(
94
+ ct.byref(self.meta["zzl_name"]),
95
+ ct.byref(self.meta["model_title"]),
96
+ ct.byref(self.meta["nnodes"]),
97
+ ct.byref(self.meta["label_length"]),
98
+ ct.byref(self.meta["dt"]),
99
+ ct.byref(self.meta["timestep0"]),
100
+ ct.byref(self.meta["ltimestep"]),
101
+ ct.byref(self.meta["save_int"]),
102
+ ct.byref(self.meta["is_quality"]),
103
+ ct.byref(self.meta["nvars"]),
104
+ ct.byref(self.meta["tzero"]),
105
+ ct.byref(self.meta["errstat"]),
106
+ )
107
+ # PROCESS_LABELS
108
+ self.meta["labels"] = (
109
+ ct.c_char * self.meta["label_length"].value * self.meta["nnodes"].value
110
+ )()
111
+ zzn_read.process_labels(
112
+ ct.byref(self.meta["zzl_name"]),
113
+ ct.byref(self.meta["nnodes"]),
114
+ ct.byref(self.meta["label_length"]),
115
+ ct.byref(self.meta["errstat"]),
116
+ )
117
+ for i in range(self.meta["nnodes"].value):
118
+ zzn_read.get_zz_label(
119
+ ct.byref(ct.c_int(i + 1)),
120
+ ct.byref(self.meta["labels"][i]),
173
121
  ct.byref(self.meta["errstat"]),
174
- ct.byref(self.meta["isavint"]),
175
122
  )
123
+ # PREPROCESS_ZZN
124
+ last_hr = (
125
+ (self.meta["ltimestep"].value - self.meta["timestep0"].value)
126
+ * self.meta["dt"].value
127
+ / 3600
128
+ )
129
+ self.meta["output_hrs"] = (ct.c_float * 2)(0.0, last_hr)
130
+ self.meta["aitimestep"] = (ct.c_int * 2)(
131
+ self.meta["timestep0"].value,
132
+ self.meta["ltimestep"].value,
133
+ )
134
+ self.meta["isavint"] = (ct.c_int * 2)()
135
+ zzn_read.preprocess_zzn(
136
+ ct.byref(self.meta["output_hrs"]),
137
+ ct.byref(self.meta["aitimestep"]),
138
+ ct.byref(self.meta["dt"]),
139
+ ct.byref(self.meta["timestep0"]),
140
+ ct.byref(self.meta["ltimestep"]),
141
+ ct.byref(self.meta["save_int"]),
142
+ ct.byref(self.meta["isavint"]),
143
+ )
144
+ # PROCESS_ZZN
145
+ self.meta["node_ID"] = ct.c_int(-1)
146
+ self.meta["savint_skip"] = ct.c_int(1)
147
+ self.meta["savint_range"] = ct.c_int(
148
+ int(
149
+ (self.meta["isavint"][1] - self.meta["isavint"][0])
150
+ / self.meta["savint_skip"].value,
151
+ ),
152
+ )
153
+ nx = self.meta["nnodes"].value
154
+ ny = self.meta["nvars"].value
155
+ nz = self.meta["savint_range"].value + 1
156
+ self.data["all_results"] = (ct.c_float * nx * ny * nz)()
157
+ self.data["max_results"] = (ct.c_float * nx * ny)()
158
+ self.data["min_results"] = (ct.c_float * nx * ny)()
159
+ self.data["max_times"] = (ct.c_int * nx * ny)()
160
+ self.data["min_times"] = (ct.c_int * nx * ny)()
161
+ zzn_read.process_zzn(
162
+ ct.byref(self.meta["zzn_name"]),
163
+ ct.byref(self.meta["node_ID"]),
164
+ ct.byref(self.meta["nnodes"]),
165
+ ct.byref(self.meta["is_quality"]),
166
+ ct.byref(self.meta["nvars"]),
167
+ ct.byref(self.meta["savint_range"]),
168
+ ct.byref(self.meta["savint_skip"]),
169
+ ct.byref(self.data["all_results"]),
170
+ ct.byref(self.data["max_results"]),
171
+ ct.byref(self.data["min_results"]),
172
+ ct.byref(self.data["max_times"]),
173
+ ct.byref(self.data["min_times"]),
174
+ ct.byref(self.meta["errstat"]),
175
+ ct.byref(self.meta["isavint"]),
176
+ )
176
177
 
177
- # Convert useful metadata from C types into python types
178
-
179
- self.meta["dt"] = self.meta["dt"].value
180
- self.meta["nnodes"] = self.meta["nnodes"].value
181
- self.meta["save_int"] = self.meta["save_int"].value
182
- self.meta["nvars"] = self.meta["nvars"].value
183
- self.meta["savint_range"] = self.meta["savint_range"].value
178
+ # Convert useful metadata from C types into python types
184
179
 
185
- self.meta["zzn_name"] = self.meta["zzn_name"].value.decode()
186
- self.meta["labels"] = [
187
- label.value.decode().strip() for label in list(self.meta["labels"])
188
- ]
189
- self.meta["model_title"] = self.meta["model_title"].value.decode()
180
+ self.meta["dt"] = self.meta["dt"].value
181
+ self.meta["nnodes"] = self.meta["nnodes"].value
182
+ self.meta["save_int"] = self.meta["save_int"].value
183
+ self.meta["nvars"] = self.meta["nvars"].value
184
+ self.meta["savint_range"] = self.meta["savint_range"].value
190
185
 
191
- except Exception as e:
192
- self._handle_exception(e, when="read")
186
+ self.meta["zzn_name"] = self.meta["zzn_name"].value.decode()
187
+ self.meta["labels"] = [label.value.decode().strip() for label in list(self.meta["labels"])]
188
+ self.meta["model_title"] = self.meta["model_title"].value.decode()
193
189
 
194
190
  def to_dataframe( # noqa: PLR0911
195
191
  self,
@@ -385,3 +381,34 @@ class ZZN(FMFile):
385
381
  if var not in input_vars:
386
382
  del output[var]
387
383
  return output
384
+
385
+ def to_json(
386
+ self,
387
+ result_type: str = "all",
388
+ variable: str = "all",
389
+ include_time: bool = False,
390
+ multilevel_header: bool = True,
391
+ ) -> str:
392
+ """Loads zzn results to JSON object.
393
+
394
+ Args:
395
+ result_type (str, optional): {'all'} | 'max' | 'min'
396
+ Define whether to return all timesteps or just max/min results. Defaults to 'all'.
397
+ variable (str, optional): {'all'} | 'Flow' | 'Stage' | 'Froude' | 'Velocity' | 'Mode' | 'State'
398
+ Specify a single output variable (e.g 'flow' or 'stage'). Defaults to 'all'.
399
+ include_time (bool, optional):
400
+ Whether to include the time of max or min results. Defaults to False.
401
+ multilevel_header (bool, optional): If True, the returned dataframe will have multi-level column
402
+ headers with the variable as first level and node label as second header. If False, the column
403
+ names will be formatted "{node label}_{variable}". Defaults to True.
404
+
405
+ Returns:
406
+ str: A JSON string representing the ZZN results.
407
+ """
408
+ df = self.to_dataframe(result_type, variable, include_time, multilevel_header)
409
+ return to_json(df)
410
+
411
+ @classmethod
412
+ def from_json(cls, json_string: str = ""):
413
+ # Not possible
414
+ raise NotImplementedError("It is not possible to build a ZZN class instance from JSON")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: floodmodeller_api
3
- Version: 0.4.3
3
+ Version: 0.4.4.post1
4
4
  Summary: Extends the functionality of Flood Modeller to python users
5
5
  Author: Jacobs
6
6
  Author-email: joe.pierce@jacobs.com
@@ -15,6 +15,9 @@ Requires-Dist: lxml ==5.*
15
15
  Requires-Dist: tqdm ==4.*
16
16
  Requires-Dist: pytest <8,>4
17
17
  Requires-Dist: pytest-mock ==3.*
18
+ Requires-Dist: shapely ==2.*
19
+ Requires-Dist: scipy ==1.*
20
+ Requires-Dist: freezegun ==1.*
18
21
 
19
22
  ![FM Logo](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png)
20
23
 
@@ -1,20 +1,20 @@
1
1
  floodmodeller_api/__init__.py,sha256=VOWWU7wv1Ds2v9I5ZyHX24faD46zjZ6lUx4VfVx4c7w,190
2
- floodmodeller_api/_base.py,sha256=Zz2bJYPzyNlvhWMLrpD0_jMaGYuq6UyTvtZUh1hEx1U,7748
2
+ floodmodeller_api/_base.py,sha256=r1TlppIIY0EV1fRBwZtrAztygAIG6qFq0OROybjwe-o,7101
3
3
  floodmodeller_api/backup.py,sha256=PqxPhtM3HYyKmRE7Gks1hlkPsGoc-a58VD2jXTtPis0,11444
4
- floodmodeller_api/dat.py,sha256=CvBSjnSg5_IER5cWb2yb7C5aUtY7mqjHZzw-ORhvm_A,37223
4
+ floodmodeller_api/dat.py,sha256=XPF-yiyKXUIDfCEfUy-XOj17JW7GtWbEON0x2Ws2Lis,36255
5
5
  floodmodeller_api/diff.py,sha256=AjNEqS1SNWGIdheKKsbcqVfXmR-m1UeGdasp7TR-yhM,5183
6
- floodmodeller_api/ied.py,sha256=OUEBP_BHhw8ALNARGfh9em-12LgTlbcOUnVvfxLz_Jc,13489
7
- floodmodeller_api/ief.py,sha256=hGEkkVdoKD-NIczZyA5A6AmipabuAbBOdH22pNGwbdg,26136
6
+ floodmodeller_api/ied.py,sha256=Uhjey-FuLLFZq8L3_x9sqPUYKGmduL3-doWLQRHXBRU,13112
7
+ floodmodeller_api/ief.py,sha256=15_sviEJ_Y6wenLTfwOY8bnRRFiRWXKUEzg7i6suZVo,23109
8
8
  floodmodeller_api/ief_flags.py,sha256=CIH8zNcyTDu_MG6N6n7OBDkjawI5eJSHBPvIpJtAEp4,11305
9
- floodmodeller_api/inp.py,sha256=ZyDE-CPBsEyMHKQSkgQsJ5rtCbpynIRVcfxfsoS90dc,11529
9
+ floodmodeller_api/inp.py,sha256=iUoymM-Y_2KYa7ZOloocj-TzpaN0-Ng35GoEchLpGUE,11179
10
10
  floodmodeller_api/mapping.py,sha256=tcCCajcqkhXt9-MFawkfkQJ-s5xtLl_Ap2jA4pBHRTg,3309
11
- floodmodeller_api/to_from_json.py,sha256=NBBHkGwoeGOWz-I3bW-LecbLMHaOT-qohWf6Ffr_8FY,6882
11
+ floodmodeller_api/to_from_json.py,sha256=AjWJnzlLOQCuWZGQLThNCizepb5ay-P71qtJAiSBI0U,7209
12
12
  floodmodeller_api/tool.py,sha256=jxAWFAivWJE0mzHw9FwH9wSgn_Zuo01eJ97951LSgAU,11377
13
- floodmodeller_api/util.py,sha256=tndEG4UqbM0f-7eqUTZ4sgd0Fi24OxBS61kQmRw82Uo,2485
14
- floodmodeller_api/version.py,sha256=Nyg0pmk5ea9-SLCAFEIF96ByFx4-TJFtrqYPN-Zn6g4,22
15
- floodmodeller_api/xml2d.py,sha256=vqVmNLLXn-FMNtXc_mTzZv4dr6tjgYBUeY80CZrQFpg,27689
13
+ floodmodeller_api/util.py,sha256=s93Wxg3F43mpm3gq3_UBbgqiZ4T0HTW2osqNG6kuIJE,3905
14
+ floodmodeller_api/version.py,sha256=4ZEzfisb7CBE8mZJHsVVkqSmecAalLdtwfQHDTnpWTw,28
15
+ floodmodeller_api/xml2d.py,sha256=YOapObFoF-UrhsOlu35GcJ_EmdAS9S-n8OxJaXRI44w,25548
16
16
  floodmodeller_api/xml2d_template.py,sha256=iaPdZHN6pEHf-QDSDwfUeDhd9QyuQPY_NUz7cvZLs7g,1806
17
- floodmodeller_api/zzn.py,sha256=H_Jy9TOv8nGAKn5Odqvk5ptqNEm2eaNgSDBFXBVCc3Y,16546
17
+ floodmodeller_api/zzn.py,sha256=d9N8-HMBFV7zdv7W_GgitSz2K-vyOXfWdE0SRP3gk8Y,17418
18
18
  floodmodeller_api/libs/libifcoremd.dll,sha256=kef4LcAB6uORn3tjPwlLngTMQRcJ5gbY2P_U7r29lho,1341056
19
19
  floodmodeller_api/libs/libifcoremt.so.5,sha256=vKK1nJ9OLlS6qshCh8uoOGdmJdXR1bsxVwJF8BruX-A,1259936
20
20
  floodmodeller_api/libs/libifport.so.5,sha256=ZvM9s0pRqv0KPwTBpUG1YlDHn2DaZ8Hyr2sqdhrEaD8,176840
@@ -24,19 +24,20 @@ floodmodeller_api/libs/libmmd.dll,sha256=Qn7wGNSUv2y4Uxqzu8tQHtTIx8ZHkJezOrTRV1D
24
24
  floodmodeller_api/libs/libsvml.so,sha256=tWR5ky0SlmJgWS8IGpRhtsD29pO-AU91hyUg866m9Ts,26483632
25
25
  floodmodeller_api/libs/libzzn_read.so,sha256=hXX6heYoSDrn-2HmBQW8XNhO2wegq_Nrn_EjHjaN154,38696
26
26
  floodmodeller_api/libs/zzn_read.dll,sha256=XWNCUM7bm1exlOYfJd3tx7x6o-hy0x7hOEI34zT9R5E,84992
27
- floodmodeller_api/logs/__init__.py,sha256=tjyzpPvEyc55M_j640mUhRKKVAKg1o48u2OEhnp28Qg,74
28
- floodmodeller_api/logs/lf.py,sha256=61kQuvUlSixp-8pwTTgHPnmMfKbE12lhJAOXhEKvfFo,10902
27
+ floodmodeller_api/logs/__init__.py,sha256=nKqaEXuZ7ejfxlxb1-eINb-YiHon4eJjwiz_76aF4wQ,73
28
+ floodmodeller_api/logs/lf.py,sha256=GNKPAYDvXkDcKZIIFwaktRl-YGAZNyYPG-zeLLoBXnc,12203
29
29
  floodmodeller_api/logs/lf_helpers.py,sha256=wyw9Vdd-n3Nf9VMOmwr22iQbkQ-Jm4op5lXRZIEFeS8,10227
30
30
  floodmodeller_api/logs/lf_params.py,sha256=gLogRIqxT-Q-9oAjlf2XPCsgWwnnS716pbxpGTJ6KP8,18858
31
31
  floodmodeller_api/test/__init__.py,sha256=YolvBwdsReqIBbcB2t-WfXSNhvcVIWbSH3qr5PX5lJw,85
32
- floodmodeller_api/test/conftest.py,sha256=BqaxNpfG-yTUWGc61ipsIz8krKhAT_6eZW0XiLwM1dQ,163
32
+ floodmodeller_api/test/conftest.py,sha256=Ko5tTc2jjIY2sijvJsNiGzhQKC1iaL0SCxdfWQGy8jM,312
33
33
  floodmodeller_api/test/test_backup.py,sha256=OVxRdiXdfgpHEnzN52PDoHFwCNlB-PLgUbUQzvjoA54,4217
34
- floodmodeller_api/test/test_dat.py,sha256=9nJP5f7SOHaefQS3bbn95rfrtrgoVF0xR4kzJhbfOOM,8478
34
+ floodmodeller_api/test/test_conveyance.py,sha256=eznbDlg40MHb5jrz2Om9nZF35wu9Zg1h-qqynOuBeSs,4104
35
+ floodmodeller_api/test/test_dat.py,sha256=eeEndHNC8JnOtF80XKCjpiCNH7ohIlpP0ySWte4a1ws,8569
35
36
  floodmodeller_api/test/test_ied.py,sha256=J4yvZLqBLNdOVyj_eXQ6raEXENe1FLkSth_-qvvH-oA,799
36
- floodmodeller_api/test/test_ief.py,sha256=YzsqeWESSaB37Al9yEqdrFS-vOTChQjjCEgYF_bKwO8,4189
37
+ floodmodeller_api/test/test_ief.py,sha256=Pb8QPuJiMWA9JV-mJ8rHK4Ce0ZP05--xSPF-9aoNu7Y,4346
37
38
  floodmodeller_api/test/test_inp.py,sha256=k6Unz41_CjcUEzRtg_KiQ4G2o3tA5iEK8Zx64Nfxwpk,1489
38
39
  floodmodeller_api/test/test_json.py,sha256=fuUDB0jFIRCBvtFtqKhjU-fW6nKv9oARd-9HV2bhvvc,4007
39
- floodmodeller_api/test/test_logs_lf.py,sha256=qQE-FYYlASPUYXo4dvK5KVLGObzD8A0ltFk-UW6kQFg,1267
40
+ floodmodeller_api/test/test_logs_lf.py,sha256=bLsvSTy3e_NcE0338DdfyDEFn6CfQXfbmPQElMpfakw,2890
40
41
  floodmodeller_api/test/test_tool.py,sha256=Or7nQ6XZIglpYbvKyIlvG9aERiTXtSRomeByTsP1VQ4,4058
41
42
  floodmodeller_api/test/test_toolbox_structure_log.py,sha256=GQP5L3rvdtCMEeG5QTFYmcXzdS-ISs3agmbGj0SeVdU,7255
42
43
  floodmodeller_api/test/test_xml2d.py,sha256=_Z7FI86EkfsGZkEC5Vr8RwBOdAZ3kDJF15VOhOANKrs,5091
@@ -88,6 +89,9 @@ floodmodeller_api/test/test_data/blockage.dat,sha256=Cg3QTAtNHqYLiJjbUbNNW7lBgiM
88
89
  floodmodeller_api/test/test_data/blockage.ext,sha256=vW4KJCP1YBKQrJM50XGDq7HG84bIqwc5_d-fxf2FSGU,493
89
90
  floodmodeller_api/test/test_data/blockage.feb,sha256=GM6Ne-6Ce3tf6BhHJm0XpPA6aRtNTCqhckfkO-UI0Sw,269
90
91
  floodmodeller_api/test/test_data/blockage.gxy,sha256=cDaJzM8izySup9mGskJGSX0GcSUHuz8bKWAKB-iPip8,850
92
+ floodmodeller_api/test/test_data/conveyance_test.dat,sha256=-g5baIH8zjksWLChQCOwSdnSQ3YVwhGIkaXXmppWh5E,8482
93
+ floodmodeller_api/test/test_data/conveyance_test.feb,sha256=5MJpWCyN5UQ3GniAa1vAInG4471M3s5fPo_kDakrGgA,6153
94
+ floodmodeller_api/test/test_data/conveyance_test.gxy,sha256=_1CrYOCEakLdQWy58LJmOspsWBKtKboP2lZzf2YsrHA,920
91
95
  floodmodeller_api/test/test_data/defaultUnits.dat,sha256=obTJrSPVxiItf5zOO1ERuX-RVwyGgIKpDO4Z18Clk_o,6480
92
96
  floodmodeller_api/test/test_data/defaultUnits.ext,sha256=fqPWbW1l4WLuoVjwYIHW4xyLLT-kmY2bnuETIp3JNCI,491
93
97
  floodmodeller_api/test/test_data/defaultUnits.feb,sha256=GM6Ne-6Ce3tf6BhHJm0XpPA6aRtNTCqhckfkO-UI0Sw,269
@@ -103,6 +107,7 @@ floodmodeller_api/test/test_data/example3.inp,sha256=TuW5aJGW9wYQsFa52qn4NsCLKx5
103
107
  floodmodeller_api/test/test_data/example4.inp,sha256=Ibg0WJz7cxGiAy4F-vjFOreRAnvgveQyXbhY4DaXCWo,19091
104
108
  floodmodeller_api/test/test_data/example5.inp,sha256=QFvmwBbYbELBExe-n-QoGzOreElhk7EpyTv6adJpDks,5486
105
109
  floodmodeller_api/test/test_data/example6.inp,sha256=dSLr6vCG-a5bFxWIPGKGWysn638mO6LdjDBqi4bFATQ,6274
110
+ floodmodeller_api/test/test_data/expected_conveyance.csv,sha256=JzUbMw0EbM6uelMUbly8S5uUl3V_XvWEwZAKIz2z_94,7302
106
111
  floodmodeller_api/test/test_data/jump.dat,sha256=MnTs3xHJkZNPkNs0a7G-rSz5r51hmYNnREwyocVuohY,4737
107
112
  floodmodeller_api/test/test_data/network.dat,sha256=vULB-pUNwRWTfzDEQSaVgkp5FWnyrgCC3PORbgVwu0A,82923
108
113
  floodmodeller_api/test/test_data/network.ext,sha256=7z7-mNqWkJETpMASav3BRGq_3DqJd9l5Mnv7DqGtECk,493
@@ -146,13 +151,14 @@ floodmodeller_api/toolbox/model_review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
146
151
  floodmodeller_api/toolbox/results_analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
152
  floodmodeller_api/units/__init__.py,sha256=WraRzDUiHxXY8wOcHYh5oqDx9IhOc-E4OVdHHZWbBko,471
148
153
  floodmodeller_api/units/_base.py,sha256=Zxug0OgdZ5Hu3Qoj_ukR75GLotFGNtHnfbil2kCvBhE,8441
149
- floodmodeller_api/units/boundaries.py,sha256=HH0HT1-3u1eIzVJv3-IK-qkI01EPoSxVzfW1FuoiqF4,19550
154
+ floodmodeller_api/units/boundaries.py,sha256=Mf7KQKVKCNMur23OW5JutMC-whm4LQuxNmBOVgUSFbk,19873
150
155
  floodmodeller_api/units/comment.py,sha256=2RmAm0Ef8pUVBng2xoGD0R3gzaq1x7xku2bRtkhDUqA,1864
151
156
  floodmodeller_api/units/conduits.py,sha256=Pmbw7R2_FP048YzmRhrKM1Cw_UY5rNPme8PliAkdlQA,17039
157
+ floodmodeller_api/units/conveyance.py,sha256=IQIvNTK8Y9ujvuwZTwKOf28gJFpcKmU4uC2aHjOHHVM,10828
152
158
  floodmodeller_api/units/helpers.py,sha256=yUAdhu1Fg3PmL_DhODzgkktwwzYYzQ6yItb0INmMJus,4068
153
159
  floodmodeller_api/units/iic.py,sha256=PHkqWLK51Trzjr5FHt84sYT-WVaPbgt_hHBSqHlbIFQ,3875
154
160
  floodmodeller_api/units/losses.py,sha256=el97L6ZATgaL7C2VTqtpmUHcR1GztkOTJpVMoXiSTko,12137
155
- floodmodeller_api/units/sections.py,sha256=k6w5v35p5aqH-GmJHf_ZwOoKdhfN099ULBg2cdgSGM4,15255
161
+ floodmodeller_api/units/sections.py,sha256=nTsCvitcKLTnH-YZ6kQbWJ1kzfYIFa1j4sv5B075gAE,16142
156
162
  floodmodeller_api/units/structures.py,sha256=x8bIlkZmxpWBkfv1vvH-2_i8gVcqs26NyM5P03m9CRg,70960
157
163
  floodmodeller_api/units/units.py,sha256=yBN0spwgjW4vDiRr8lapwpOVKgTIvWH_LEp6zXA38fI,5053
158
164
  floodmodeller_api/units/unsupported.py,sha256=WYynzkwQcYO_9_BPRKg9RVH2NnxDX-0wy4zOr7cJtso,1917
@@ -171,9 +177,9 @@ floodmodeller_api/validation/__init__.py,sha256=sUMqShUGLnuQjmxKN3wAR7XpDVYsSFn4
171
177
  floodmodeller_api/validation/parameters.py,sha256=qnDGZLzW2Bfd7hf-IF_s-smfZfKdQieweyJo_RxDhfQ,16101
172
178
  floodmodeller_api/validation/urban_parameters.py,sha256=ChK8pSFsX6Ndl5-xw8mlNJJ2oJ-6cqc9OYE2gGP2WZk,11757
173
179
  floodmodeller_api/validation/validation.py,sha256=GH7KsrbHmTnCg_vfazKnCakbvkwua0cw6hAGStKWemg,4447
174
- floodmodeller_api-0.4.3.dist-info/LICENSE.txt,sha256=tH7I97hBX5QUpGGDbkiWdqJuWgMsBZDA8zEd_029-cM,920
175
- floodmodeller_api-0.4.3.dist-info/METADATA,sha256=oPZTwgcZ9wbRBguqeIp3VelDC561Syq7rcGbWXhiNiE,4863
176
- floodmodeller_api-0.4.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
177
- floodmodeller_api-0.4.3.dist-info/entry_points.txt,sha256=RQFzb_zf1hNv2uNRfoCD3nRzyzGi8vPvj7VGOhrOjtI,198
178
- floodmodeller_api-0.4.3.dist-info/top_level.txt,sha256=x10nxct120kv2PpqYA2lhiwrYre3wKyic2wcUyNWWRw,18
179
- floodmodeller_api-0.4.3.dist-info/RECORD,,
180
+ floodmodeller_api-0.4.4.post1.dist-info/LICENSE.txt,sha256=tH7I97hBX5QUpGGDbkiWdqJuWgMsBZDA8zEd_029-cM,920
181
+ floodmodeller_api-0.4.4.post1.dist-info/METADATA,sha256=2430GH87InVB-FCBKztPcxw1QCBRBUlDgNL9ayFlA2k,4956
182
+ floodmodeller_api-0.4.4.post1.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
183
+ floodmodeller_api-0.4.4.post1.dist-info/entry_points.txt,sha256=RQFzb_zf1hNv2uNRfoCD3nRzyzGi8vPvj7VGOhrOjtI,198
184
+ floodmodeller_api-0.4.4.post1.dist-info/top_level.txt,sha256=x10nxct120kv2PpqYA2lhiwrYre3wKyic2wcUyNWWRw,18
185
+ floodmodeller_api-0.4.4.post1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (70.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5