floodmodeller-api 0.4.2__py3-none-any.whl → 0.4.3__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 (178) hide show
  1. floodmodeller_api/__init__.py +8 -9
  2. floodmodeller_api/_base.py +184 -176
  3. floodmodeller_api/backup.py +273 -273
  4. floodmodeller_api/dat.py +909 -838
  5. floodmodeller_api/diff.py +136 -119
  6. floodmodeller_api/ied.py +307 -311
  7. floodmodeller_api/ief.py +647 -646
  8. floodmodeller_api/ief_flags.py +253 -253
  9. floodmodeller_api/inp.py +266 -268
  10. floodmodeller_api/libs/libifcoremd.dll +0 -0
  11. floodmodeller_api/libs/libifcoremt.so.5 +0 -0
  12. floodmodeller_api/libs/libifport.so.5 +0 -0
  13. floodmodeller_api/{libmmd.dll → libs/libimf.so} +0 -0
  14. floodmodeller_api/libs/libintlc.so.5 +0 -0
  15. floodmodeller_api/libs/libmmd.dll +0 -0
  16. floodmodeller_api/libs/libsvml.so +0 -0
  17. floodmodeller_api/libs/libzzn_read.so +0 -0
  18. floodmodeller_api/libs/zzn_read.dll +0 -0
  19. floodmodeller_api/logs/__init__.py +2 -2
  20. floodmodeller_api/logs/lf.py +320 -314
  21. floodmodeller_api/logs/lf_helpers.py +354 -346
  22. floodmodeller_api/logs/lf_params.py +643 -529
  23. floodmodeller_api/mapping.py +84 -0
  24. floodmodeller_api/test/__init__.py +4 -4
  25. floodmodeller_api/test/conftest.py +9 -8
  26. floodmodeller_api/test/test_backup.py +117 -117
  27. floodmodeller_api/test/test_dat.py +221 -92
  28. floodmodeller_api/test/test_data/All Units 4_6.DAT +1081 -1081
  29. floodmodeller_api/test/test_data/All Units 4_6.feb +1081 -1081
  30. floodmodeller_api/test/test_data/BRIDGE.DAT +926 -926
  31. floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +36 -36
  32. floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +36 -36
  33. floodmodeller_api/test/test_data/DamBreakADI.xml +52 -52
  34. floodmodeller_api/test/test_data/DamBreakFAST.xml +58 -58
  35. floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +53 -53
  36. floodmodeller_api/test/test_data/DamBreakTVD.xml +55 -55
  37. floodmodeller_api/test/test_data/DefenceBreach.xml +53 -53
  38. floodmodeller_api/test/test_data/DefenceBreachFAST.xml +60 -60
  39. floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +55 -55
  40. floodmodeller_api/test/test_data/Domain1+2_QH.xml +76 -76
  41. floodmodeller_api/test/test_data/Domain1_H.xml +41 -41
  42. floodmodeller_api/test/test_data/Domain1_Q.xml +41 -41
  43. floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +48 -48
  44. floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +48 -48
  45. floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +263 -0
  46. floodmodeller_api/test/test_data/Domain1_W.xml +41 -41
  47. floodmodeller_api/test/test_data/EX1.DAT +321 -321
  48. floodmodeller_api/test/test_data/EX1.ext +107 -107
  49. floodmodeller_api/test/test_data/EX1.feb +320 -320
  50. floodmodeller_api/test/test_data/EX1.gxy +107 -107
  51. floodmodeller_api/test/test_data/EX17.DAT +421 -422
  52. floodmodeller_api/test/test_data/EX17.ext +213 -213
  53. floodmodeller_api/test/test_data/EX17.feb +422 -422
  54. floodmodeller_api/test/test_data/EX18.DAT +375 -375
  55. floodmodeller_api/test/test_data/EX18_DAT_expected.json +3876 -0
  56. floodmodeller_api/test/test_data/EX2.DAT +302 -302
  57. floodmodeller_api/test/test_data/EX3.DAT +926 -926
  58. floodmodeller_api/test/test_data/EX3_DAT_expected.json +16235 -0
  59. floodmodeller_api/test/test_data/EX3_IEF_expected.json +61 -0
  60. floodmodeller_api/test/test_data/EX6.DAT +2084 -2084
  61. floodmodeller_api/test/test_data/EX6.ext +532 -532
  62. floodmodeller_api/test/test_data/EX6.feb +2084 -2084
  63. floodmodeller_api/test/test_data/EX6_DAT_expected.json +31647 -0
  64. floodmodeller_api/test/test_data/Event Data Example.DAT +336 -336
  65. floodmodeller_api/test/test_data/Event Data Example.ext +107 -107
  66. floodmodeller_api/test/test_data/Event Data Example.feb +336 -336
  67. floodmodeller_api/test/test_data/Linked1D2D.xml +52 -52
  68. floodmodeller_api/test/test_data/Linked1D2DFAST.xml +53 -53
  69. floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +48 -48
  70. floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +313 -0
  71. floodmodeller_api/test/test_data/blockage.dat +50 -50
  72. floodmodeller_api/test/test_data/blockage.ext +45 -45
  73. floodmodeller_api/test/test_data/blockage.feb +9 -9
  74. floodmodeller_api/test/test_data/blockage.gxy +71 -71
  75. floodmodeller_api/test/test_data/defaultUnits.dat +127 -127
  76. floodmodeller_api/test/test_data/defaultUnits.ext +45 -45
  77. floodmodeller_api/test/test_data/defaultUnits.feb +9 -9
  78. floodmodeller_api/test/test_data/defaultUnits.fmpx +58 -58
  79. floodmodeller_api/test/test_data/defaultUnits.gxy +85 -85
  80. floodmodeller_api/test/test_data/ex3.ief +20 -20
  81. floodmodeller_api/test/test_data/ex3.lf1 +2800 -2800
  82. floodmodeller_api/test/test_data/ex4.DAT +1374 -1374
  83. floodmodeller_api/test/test_data/ex4_changed.DAT +1374 -1374
  84. floodmodeller_api/test/test_data/example1.inp +329 -329
  85. floodmodeller_api/test/test_data/example2.inp +158 -158
  86. floodmodeller_api/test/test_data/example3.inp +297 -297
  87. floodmodeller_api/test/test_data/example4.inp +388 -388
  88. floodmodeller_api/test/test_data/example5.inp +147 -147
  89. floodmodeller_api/test/test_data/example6.inp +154 -154
  90. floodmodeller_api/test/test_data/jump.dat +176 -176
  91. floodmodeller_api/test/test_data/network.dat +1374 -1374
  92. floodmodeller_api/test/test_data/network.ext +45 -45
  93. floodmodeller_api/test/test_data/network.exy +1 -1
  94. floodmodeller_api/test/test_data/network.feb +45 -45
  95. floodmodeller_api/test/test_data/network.ied +45 -45
  96. floodmodeller_api/test/test_data/network.ief +20 -20
  97. floodmodeller_api/test/test_data/network.inp +147 -147
  98. floodmodeller_api/test/test_data/network.pxy +57 -57
  99. floodmodeller_api/test/test_data/network.zzd +122 -122
  100. floodmodeller_api/test/test_data/network_dat_expected.json +21837 -0
  101. floodmodeller_api/test/test_data/network_from_tabularCSV.csv +87 -87
  102. floodmodeller_api/test/test_data/network_ied_expected.json +287 -0
  103. floodmodeller_api/test/test_data/rnweir.dat +9 -9
  104. floodmodeller_api/test/test_data/rnweir.ext +45 -45
  105. floodmodeller_api/test/test_data/rnweir.feb +9 -9
  106. floodmodeller_api/test/test_data/rnweir.gxy +45 -45
  107. floodmodeller_api/test/test_data/rnweir_default.dat +74 -74
  108. floodmodeller_api/test/test_data/rnweir_default.ext +45 -45
  109. floodmodeller_api/test/test_data/rnweir_default.feb +9 -9
  110. floodmodeller_api/test/test_data/rnweir_default.fmpx +58 -58
  111. floodmodeller_api/test/test_data/rnweir_default.gxy +53 -53
  112. floodmodeller_api/test/test_data/unit checks.dat +16 -16
  113. floodmodeller_api/test/test_ied.py +29 -29
  114. floodmodeller_api/test/test_ief.py +125 -24
  115. floodmodeller_api/test/test_inp.py +47 -48
  116. floodmodeller_api/test/test_json.py +114 -0
  117. floodmodeller_api/test/test_logs_lf.py +48 -51
  118. floodmodeller_api/test/test_tool.py +165 -154
  119. floodmodeller_api/test/test_toolbox_structure_log.py +234 -239
  120. floodmodeller_api/test/test_xml2d.py +151 -156
  121. floodmodeller_api/test/test_zzn.py +36 -34
  122. floodmodeller_api/to_from_json.py +218 -0
  123. floodmodeller_api/tool.py +332 -330
  124. floodmodeller_api/toolbox/__init__.py +5 -5
  125. floodmodeller_api/toolbox/example_tool.py +45 -45
  126. floodmodeller_api/toolbox/model_build/__init__.py +2 -2
  127. floodmodeller_api/toolbox/model_build/add_siltation_definition.py +100 -94
  128. floodmodeller_api/toolbox/model_build/structure_log/__init__.py +1 -1
  129. floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +287 -289
  130. floodmodeller_api/toolbox/model_build/structure_log_definition.py +76 -72
  131. floodmodeller_api/units/__init__.py +10 -10
  132. floodmodeller_api/units/_base.py +214 -209
  133. floodmodeller_api/units/boundaries.py +467 -469
  134. floodmodeller_api/units/comment.py +52 -55
  135. floodmodeller_api/units/conduits.py +382 -403
  136. floodmodeller_api/units/helpers.py +123 -132
  137. floodmodeller_api/units/iic.py +107 -101
  138. floodmodeller_api/units/losses.py +305 -308
  139. floodmodeller_api/units/sections.py +444 -445
  140. floodmodeller_api/units/structures.py +1690 -1684
  141. floodmodeller_api/units/units.py +93 -102
  142. floodmodeller_api/units/unsupported.py +44 -44
  143. floodmodeller_api/units/variables.py +87 -89
  144. floodmodeller_api/urban1d/__init__.py +11 -11
  145. floodmodeller_api/urban1d/_base.py +188 -177
  146. floodmodeller_api/urban1d/conduits.py +93 -85
  147. floodmodeller_api/urban1d/general_parameters.py +58 -58
  148. floodmodeller_api/urban1d/junctions.py +81 -79
  149. floodmodeller_api/urban1d/losses.py +81 -74
  150. floodmodeller_api/urban1d/outfalls.py +114 -107
  151. floodmodeller_api/urban1d/raingauges.py +111 -108
  152. floodmodeller_api/urban1d/subsections.py +92 -93
  153. floodmodeller_api/urban1d/xsections.py +147 -141
  154. floodmodeller_api/util.py +77 -21
  155. floodmodeller_api/validation/parameters.py +660 -660
  156. floodmodeller_api/validation/urban_parameters.py +388 -404
  157. floodmodeller_api/validation/validation.py +110 -112
  158. floodmodeller_api/version.py +1 -1
  159. floodmodeller_api/xml2d.py +688 -684
  160. floodmodeller_api/xml2d_template.py +37 -37
  161. floodmodeller_api/zzn.py +387 -365
  162. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/LICENSE.txt +13 -13
  163. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/METADATA +82 -82
  164. floodmodeller_api-0.4.3.dist-info/RECORD +179 -0
  165. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/WHEEL +1 -1
  166. floodmodeller_api-0.4.3.dist-info/entry_points.txt +3 -0
  167. floodmodeller_api/libifcoremd.dll +0 -0
  168. floodmodeller_api/test/test_data/EX3.bmp +0 -0
  169. floodmodeller_api/test/test_data/test_output.csv +0 -87
  170. floodmodeller_api/zzn_read.dll +0 -0
  171. floodmodeller_api-0.4.2.data/scripts/fmapi-add_siltation.bat +0 -2
  172. floodmodeller_api-0.4.2.data/scripts/fmapi-add_siltation.py +0 -3
  173. floodmodeller_api-0.4.2.data/scripts/fmapi-structure_log.bat +0 -2
  174. floodmodeller_api-0.4.2.data/scripts/fmapi-structure_log.py +0 -3
  175. floodmodeller_api-0.4.2.data/scripts/fmapi-toolbox.bat +0 -2
  176. floodmodeller_api-0.4.2.data/scripts/fmapi-toolbox.py +0 -41
  177. floodmodeller_api-0.4.2.dist-info/RECORD +0 -169
  178. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,132 +1,123 @@
1
- """
2
- Flood Modeller Python API
3
- Copyright (C) 2023 Jacobs U.K. Limited
4
-
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
6
- as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
7
-
8
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
10
-
11
- You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
12
-
13
- If you have any query about this program or this License, please contact us at support@floodmodeller.com or write to the following
14
- address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London, SE1 2QG, United Kingdom.
15
- """
16
-
17
- from typing import Optional
18
-
19
- # Helper Functions
20
-
21
-
22
- def split_10_char(line):
23
- return [line[i : i + 10].strip() for i in range(0, len(line), 10)]
24
-
25
-
26
- def split_12_char(line):
27
- return [line[i : i + 12].strip() for i in range(0, len(line), 12)]
28
-
29
-
30
- def split_n_char(line, n):
31
- return [line[i : i + n].strip() for i in range(0, len(line), n)]
32
-
33
-
34
- def join_10_char(*itms, dp=3):
35
- """Joins a set of values with a 10 character buffer and right-justified"""
36
- string = ""
37
- for itm in itms:
38
- if isinstance(itm, float):
39
- # save to 3 dp
40
- if len(f"{itm:.{dp}f}") > 10:
41
- # Use scientific notation if number greater than 10 characters
42
- itm = f"{itm:.{dp}e}"
43
- else:
44
- itm = f"{itm:.{dp}f}"
45
- itm = str(itm)
46
- itm = itm[:10]
47
- string += f"{itm:>10}"
48
- return string
49
-
50
-
51
- def join_12_char_ljust(*itms, dp=3):
52
- """Joins a set of values with a 12 character buffer and left-justified"""
53
- string = ""
54
- for itm in itms:
55
- if isinstance(itm, float):
56
- # save to 3 dp
57
- if len(f"{itm:.{dp}f}") > 10:
58
- # Use scientific notation if number greater than 10 characters
59
- itm = f"{itm:.{dp}e}"
60
- else:
61
- itm = f"{itm:.{dp}f}"
62
- itm = str(itm)
63
- itm = itm[:12]
64
- string += f"{itm:<12}"
65
- return string
66
-
67
-
68
- def join_n_char_ljust(n, *itms, dp=3):
69
- """Joins a set of values with a n character buffer and left-justified"""
70
- string = ""
71
- for itm in itms:
72
- if isinstance(itm, float):
73
- # save to 3 dp
74
- if len(f"{itm:.{dp}f}") > 10:
75
- # Use scientific notation if number greater than 10 characters
76
- itm = f"{itm:.{dp}e}"
77
- else:
78
- itm = f"{itm:.{dp}f}"
79
- itm = str(itm)
80
- itm = itm[:n]
81
- string += f"{itm:<{n}}"
82
- return string
83
-
84
-
85
- def _to_float(itm, default=0.0):
86
- try:
87
- return float(itm)
88
- except ValueError:
89
- return default
90
-
91
-
92
- def _to_int(itm, default=0):
93
- try:
94
- return int(itm)
95
- except ValueError:
96
- return default
97
-
98
-
99
- def _to_str(itm, default, check_float=False):
100
- if check_float:
101
- try:
102
- return float(itm)
103
- except ValueError:
104
- pass
105
- if itm == "":
106
- return default
107
- else:
108
- return itm
109
-
110
-
111
- def _to_data_list(block: list[str], num_cols: Optional[int] = None, date_col: Optional[int] = None):
112
- if num_cols is not None:
113
- num_cols += 1 if date_col is not None else 0
114
- data_list = []
115
- for row in block:
116
- row_split = split_10_char(row) if num_cols is None else split_10_char(row)[:num_cols]
117
- if date_col is not None:
118
- date_time = " ".join(row_split[date_col : date_col + 2])
119
- row_split = [
120
- _to_float(itm)
121
- for idx, itm in enumerate(row_split)
122
- if idx != date_col and idx != date_col + 1
123
- ]
124
- row_split.insert(date_col, date_time)
125
- else:
126
- row_split = [_to_float(itm) for itm in row_split]
127
-
128
- row = []
129
- for var in row_split:
130
- row.append(var)
131
- data_list.append(row)
132
- return data_list
1
+ """
2
+ Flood Modeller Python API
3
+ Copyright (C) 2024 Jacobs U.K. Limited
4
+
5
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
7
+
8
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
10
+
11
+ You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
12
+
13
+ If you have any query about this program or this License, please contact us at support@floodmodeller.com or write to the following
14
+ address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London, SE1 2QG, United Kingdom.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ # Helper Functions
20
+ NOTATION_THRESHOLD = 10
21
+
22
+
23
+ def split_10_char(line):
24
+ return [line[i : i + 10].strip() for i in range(0, len(line), 10)]
25
+
26
+
27
+ def split_12_char(line):
28
+ return [line[i : i + 12].strip() for i in range(0, len(line), 12)]
29
+
30
+
31
+ def split_n_char(line, n):
32
+ return [line[i : i + n].strip() for i in range(0, len(line), n)]
33
+
34
+
35
+ def join_10_char(*itms, dp=3):
36
+ """Joins a set of values with a 10 character buffer and right-justified"""
37
+ string = ""
38
+ for itm in itms:
39
+ if isinstance(itm, float):
40
+ # save to 3 dp
41
+ # Use scientific notation if number greater than NOTATION_THRESHOLD characters
42
+ itm = f"{itm:.{dp}e}" if len(f"{itm:.{dp}f}") > NOTATION_THRESHOLD else f"{itm:.{dp}f}"
43
+ itm = str(itm)
44
+ itm = itm[:10]
45
+ string += f"{itm:>10}"
46
+ return string
47
+
48
+
49
+ def join_12_char_ljust(*itms, dp=3):
50
+ """Joins a set of values with a 12 character buffer and left-justified"""
51
+ string = ""
52
+ for itm in itms:
53
+ if isinstance(itm, float):
54
+ # save to 3 dp
55
+ # Use scientific notation if number greater than 10 characters
56
+ itm = f"{itm:.{dp}e}" if len(f"{itm:.{dp}f}") > NOTATION_THRESHOLD else f"{itm:.{dp}f}"
57
+ itm = str(itm)
58
+ itm = itm[:12]
59
+ string += f"{itm:<12}"
60
+ return string
61
+
62
+
63
+ def join_n_char_ljust(n, *itms, dp=3):
64
+ """Joins a set of values with a n character buffer and left-justified"""
65
+ string = ""
66
+ for itm in itms:
67
+ if isinstance(itm, float):
68
+ # save to 3 dp
69
+ # Use scientific notation if number greater than 10 characters
70
+ itm = f"{itm:.{dp}e}" if len(f"{itm:.{dp}f}") > NOTATION_THRESHOLD else f"{itm:.{dp}f}"
71
+ itm = str(itm)
72
+ itm = itm[:n]
73
+ string += f"{itm:<{n}}"
74
+ return string
75
+
76
+
77
+ def _to_float(itm, default=0.0):
78
+ try:
79
+ return float(itm)
80
+ except ValueError:
81
+ return default
82
+
83
+
84
+ def _to_int(itm, default=0):
85
+ try:
86
+ return int(itm)
87
+ except ValueError:
88
+ return default
89
+
90
+
91
+ def _to_str(itm, default, check_float=False):
92
+ if check_float:
93
+ try:
94
+ return float(itm)
95
+ except ValueError:
96
+ pass
97
+ if itm == "":
98
+ return default
99
+ return itm
100
+
101
+
102
+ def _to_data_list(block: list[str], num_cols: int | None = None, date_col: int | None = None):
103
+ if num_cols is not None:
104
+ num_cols += 1 if date_col is not None else 0
105
+ data_list = []
106
+ for row in block:
107
+ row_split = split_10_char(row) if num_cols is None else split_10_char(row)[:num_cols]
108
+ if date_col is not None:
109
+ date_time = " ".join(row_split[date_col : date_col + 2])
110
+ row_split = [
111
+ _to_float(itm)
112
+ for idx, itm in enumerate(row_split)
113
+ if idx not in (date_col, date_col + 1)
114
+ ]
115
+ row_split.insert(date_col, date_time)
116
+ else:
117
+ row_split = [_to_float(itm) for itm in row_split]
118
+
119
+ row_list = []
120
+ for var in row_split:
121
+ row_list.append(var)
122
+ data_list.append(row_list)
123
+ return data_list
@@ -1,101 +1,107 @@
1
- """
2
- Flood Modeller Python API
3
- Copyright (C) 2023 Jacobs U.K. Limited
4
-
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
6
- as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
7
-
8
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
10
-
11
- You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
12
-
13
- If you have any query about this program or this License, please contact us at support@floodmodeller.com or write to the following
14
- address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London, SE1 2QG, United Kingdom.
15
- """
16
-
17
- import pandas as pd
18
-
19
- from ..diff import check_item_with_dataframe_equal
20
- from .helpers import join_10_char, split_10_char
21
-
22
- # Initial Conditions Class
23
-
24
-
25
- class IIC:
26
- """Class to hold initial conditions data"""
27
-
28
- def __init__(self, ic_block, n=12):
29
- self._label_len = n
30
- self._read(ic_block)
31
-
32
- def __repr__(self):
33
- return "<floodmodeller_api Initial Conditions Class: IIC()>"
34
-
35
- def _read(self, ic_block):
36
- header = [
37
- "label",
38
- "?",
39
- "flow",
40
- "stage",
41
- "froude no",
42
- "velocity",
43
- "umode",
44
- "ustate",
45
- "z",
46
- ]
47
- data_list = []
48
- for line in ic_block[2:]:
49
- lbl = line[: self._label_len + 1].strip()
50
- incl = line[self._label_len + 1 : self._label_len + 3].strip()
51
- q, h, fr, v, um, us, z = split_10_char(line[self._label_len + 3 :])
52
- data_list.append(
53
- [
54
- lbl,
55
- incl,
56
- float(q),
57
- float(h),
58
- float(fr),
59
- float(v),
60
- float(um),
61
- float(us),
62
- float(z),
63
- ]
64
- )
65
- # AL is this storing the values as strings?
66
- self.data = pd.DataFrame(data_list, columns=header)
67
- # JP Yes
68
- # AL If it does, would it worth making it store the values instead?
69
- # JP Yes I'll do that, only downside is that the updated values may not match notation
70
- # of original even if no changes. (i.e 2.0 -> 2.00 or 2. -> 2.00)
71
-
72
- # AL Is this only to transform the table of data into a string-like array?
73
- # JP Yes it just transforms the dataframe back into valid DAT format
74
- def _write(self):
75
- ic_block = [
76
- "INITIAL CONDITIONS",
77
- " label ? flow stage froude no velocity umode ustate z",
78
- ]
79
- rows = []
80
- for _, lbl, incl, q, h, fr, v, um, us, z in self.data.itertuples():
81
- string = f"{lbl:<{self._label_len}}{incl:>2}"
82
- string += join_10_char(q, h, fr, v, um, us, z)
83
- rows.append(string)
84
-
85
- ic_block.extend(rows)
86
-
87
- return ic_block
88
-
89
- def update_label(self, old, new):
90
- self.data.loc[self.data["label"] == old, "label"] = new
91
-
92
- def _get_diff(self, other):
93
- return self.__eq__(other, return_diff=True)
94
-
95
- def __eq__(self, other, return_diff=False):
96
- result = True
97
- diff = []
98
- result, diff = check_item_with_dataframe_equal(
99
- self.__dict__, other.__dict__, name="Initial Conditions", diff=diff
100
- )
101
- return (result, diff) if return_diff else result
1
+ """
2
+ Flood Modeller Python API
3
+ Copyright (C) 2024 Jacobs U.K. Limited
4
+
5
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
7
+
8
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
10
+
11
+ You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
12
+
13
+ If you have any query about this program or this License, please contact us at support@floodmodeller.com or write to the following
14
+ address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London, SE1 2QG, United Kingdom.
15
+ """
16
+
17
+ import pandas as pd
18
+
19
+ from ..diff import check_item_with_dataframe_equal
20
+ from ..to_from_json import Jsonable
21
+ from .helpers import join_10_char, split_10_char
22
+
23
+ # Initial Conditions Class
24
+
25
+
26
+ class IIC(Jsonable):
27
+ """Class to hold initial conditions data"""
28
+
29
+ def __init__(self, ic_block=None, n=12, from_json: bool = False):
30
+ if from_json:
31
+ return
32
+ self._label_len = n
33
+ self._read(ic_block)
34
+
35
+ def __repr__(self):
36
+ return "<floodmodeller_api Initial Conditions Class: IIC()>"
37
+
38
+ def _read(self, ic_block):
39
+ header = [
40
+ "label",
41
+ "?",
42
+ "flow",
43
+ "stage",
44
+ "froude no",
45
+ "velocity",
46
+ "umode",
47
+ "ustate",
48
+ "z",
49
+ ]
50
+ data_list = []
51
+ for line in ic_block[2:]:
52
+ lbl = line[: self._label_len + 1].strip()
53
+ incl = line[self._label_len + 1 : self._label_len + 3].strip()
54
+ q, h, fr, v, um, us, z = split_10_char(line[self._label_len + 3 :])
55
+ data_list.append(
56
+ [
57
+ lbl,
58
+ incl,
59
+ float(q),
60
+ float(h),
61
+ float(fr),
62
+ float(v),
63
+ float(um),
64
+ float(us),
65
+ float(z),
66
+ ],
67
+ )
68
+ # AL is this storing the values as strings?
69
+ self.data = pd.DataFrame(data_list, columns=header)
70
+ # JP Yes
71
+ # AL If it does, would it worth making it store the values instead?
72
+ # JP Yes I'll do that, only downside is that the updated values may not match notation
73
+ # of original even if no changes. (i.e 2.0 -> 2.00 or 2. -> 2.00)
74
+
75
+ # AL Is this only to transform the table of data into a string-like array?
76
+ # JP Yes it just transforms the dataframe back into valid DAT format
77
+ def _write(self):
78
+ ic_block = [
79
+ "INITIAL CONDITIONS",
80
+ " label ? flow stage froude no velocity umode ustate z",
81
+ ]
82
+ rows = []
83
+ for _, lbl, incl, q, h, fr, v, um, us, z in self.data.itertuples():
84
+ string = f"{lbl:<{self._label_len}}{incl:>2}"
85
+ string += join_10_char(q, h, fr, v, um, us, z)
86
+ rows.append(string)
87
+
88
+ ic_block.extend(rows)
89
+
90
+ return ic_block
91
+
92
+ def update_label(self, old, new):
93
+ self.data.loc[self.data["label"] == old, "label"] = new
94
+
95
+ def _get_diff(self, other):
96
+ return self.__eq__(other, return_diff=True) # pylint: disable=unnecessary-dunder-call
97
+
98
+ def __eq__(self, other, return_diff=False):
99
+ result = True
100
+ diff = []
101
+ result, diff = check_item_with_dataframe_equal(
102
+ self.__dict__,
103
+ other.__dict__,
104
+ name="Initial Conditions",
105
+ diff=diff,
106
+ )
107
+ return (result, diff) if return_diff else result