zoomy-core 0.1.14__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 (57) hide show
  1. decorators/decorators.py +25 -0
  2. fvm/__init__.py +0 -0
  3. fvm/flux.py +52 -0
  4. fvm/nonconservative_flux.py +97 -0
  5. fvm/ode.py +55 -0
  6. fvm/solver_numpy.py +297 -0
  7. fvm/timestepping.py +13 -0
  8. mesh/__init__.py +0 -0
  9. mesh/mesh.py +1239 -0
  10. mesh/mesh_extrude.py +168 -0
  11. mesh/mesh_util.py +487 -0
  12. misc/__init__.py +0 -0
  13. misc/custom_types.py +6 -0
  14. misc/interpolation.py +140 -0
  15. misc/io.py +448 -0
  16. misc/logger_config.py +18 -0
  17. misc/misc.py +218 -0
  18. model/__init__.py +0 -0
  19. model/analysis.py +147 -0
  20. model/basefunction.py +113 -0
  21. model/basemodel.py +513 -0
  22. model/boundary_conditions.py +193 -0
  23. model/initial_conditions.py +171 -0
  24. model/model.py +65 -0
  25. model/models/GN.py +70 -0
  26. model/models/advection.py +53 -0
  27. model/models/basisfunctions.py +181 -0
  28. model/models/basismatrices.py +381 -0
  29. model/models/coupled_constrained.py +60 -0
  30. model/models/poisson.py +41 -0
  31. model/models/shallow_moments.py +757 -0
  32. model/models/shallow_moments_sediment.py +378 -0
  33. model/models/shallow_moments_topo.py +423 -0
  34. model/models/shallow_moments_variants.py +1509 -0
  35. model/models/shallow_water.py +266 -0
  36. model/models/shallow_water_topo.py +111 -0
  37. model/models/shear_shallow_flow.py +594 -0
  38. model/models/sme_turbulent.py +613 -0
  39. model/models/vam.py +455 -0
  40. postprocessing/__init__.py +0 -0
  41. postprocessing/plotting.py +244 -0
  42. postprocessing/postprocessing.py +75 -0
  43. preprocessing/__init__.py +0 -0
  44. preprocessing/openfoam_moments.py +453 -0
  45. transformation/__init__.py +0 -0
  46. transformation/helpers.py +25 -0
  47. transformation/to_amrex.py +241 -0
  48. transformation/to_c.py +185 -0
  49. transformation/to_jax.py +14 -0
  50. transformation/to_numpy.py +118 -0
  51. transformation/to_openfoam.py +258 -0
  52. transformation/to_ufl.py +67 -0
  53. zoomy_core-0.1.14.dist-info/METADATA +52 -0
  54. zoomy_core-0.1.14.dist-info/RECORD +57 -0
  55. zoomy_core-0.1.14.dist-info/WHEEL +5 -0
  56. zoomy_core-0.1.14.dist-info/licenses/LICENSE +674 -0
  57. zoomy_core-0.1.14.dist-info/top_level.txt +8 -0
@@ -0,0 +1,258 @@
1
+ import os
2
+ import re
3
+ import textwrap
4
+ import sympy as sp
5
+ from sympy.printing.cxx import CXX11CodePrinter
6
+
7
+ from zoomy_core.misc import misc as misc
8
+
9
+
10
+ class FoamPrinter(CXX11CodePrinter):
11
+ """
12
+ Convert SymPy expressions to OpenFOAM 12 compatible C++ code.
13
+ - Q, Qaux: Foam::List<Foam::scalar>
14
+ - Matrices: Foam::List<Foam::List<Foam::scalar>>
15
+ - Vectors: Foam::vector (.x(), .y(), .z())
16
+ """
17
+
18
+ def __init__(self, model, *args, **kwargs):
19
+ super().__init__(*args, **kwargs)
20
+
21
+ self.n_dof_q = model.n_variables
22
+ self.n_dof_qaux = model.n_aux_variables
23
+
24
+ # Map variable names to Q[i], Qaux[i]
25
+ self.map_Q = {k: f"Q[{i}]" for i, k in enumerate(model.variables.values())}
26
+ self.map_Qaux = {k: f"Qaux[{i}]" for i, k in enumerate(model.aux_variables.values())}
27
+ self.map_param = {k: str(float(model.parameter_values[i])) for i, k in enumerate(model.parameters.values())}
28
+
29
+ # Map normal/position to n.x(), n.y(), n.z()
30
+ self.map_normal = {k: ["n.x()", "n.y()", "n.z()"][i] for i, k in enumerate(model.normal.values())}
31
+ self.map_position = {k: ["X.x()", "X.y()", "X.z()"][i] for i, k in enumerate(model.position.values())}
32
+
33
+ self._std_regex = re.compile(r'std::([A-Za-z_]\w*)')
34
+
35
+ self._argument_table = {"Q": "const Foam::List<Foam::scalar>& Q",
36
+ "Qaux": "const Foam::List<Foam::scalar>& Qaux",
37
+ "n": "const Foam::vector& n",
38
+ "X": "const Foam::vector& X",
39
+ "time": "const Foam::scalar& time",
40
+ "dX": "const Foam::scalar& dX",
41
+ "z": "const Foam::scalar& z"
42
+ }
43
+
44
+ def create_lambertw(self):
45
+ return textwrap.dedent("""\
46
+ inline Foam::scalar lambertw(const Foam::scalar x)
47
+ {
48
+ // valid for x > -exp(-1)
49
+ Foam::scalar w = (x < 1.0 ? x : log(1.0 + x)); // good initial guess
50
+ for (int i = 0; i < 5; ++i)
51
+ {
52
+ Foam::scalar ew = exp(w);
53
+ Foam::scalar wew = w * ew;
54
+ Foam::scalar diff = wew - x;
55
+ w -= diff / (ew * (w + 1.0) - (w + 2.0) * diff / (2.0 * w + 2.0));
56
+ }
57
+ return w;
58
+ }
59
+ """)
60
+
61
+ def get_function_arguments(self, arguments):
62
+ out = ",\n".join([self._argument_table[arg] for arg in arguments])
63
+ return out
64
+
65
+ # --- Symbol printing --------------------------------------------------
66
+ def _print_Symbol(self, s):
67
+ for m in [self.map_Q, self.map_Qaux, self.map_param, self.map_normal, self.map_position]:
68
+ if s in m:
69
+ return m[s]
70
+ return super()._print_Symbol(s)
71
+
72
+ # --- Pow printing -----------------------------------------------------
73
+ def _print_Pow(self, expr):
74
+ base, exp = expr.as_base_exp()
75
+ if exp.is_Integer:
76
+ n = int(exp)
77
+ if n == 0:
78
+ return "1.0"
79
+ if n == 1:
80
+ return self._print(base)
81
+ if n < 0:
82
+ return f"(1.0 / Foam::pow({self._print(base)}, {abs(n)}))"
83
+ return f"Foam::pow({self._print(base)}, {n})"
84
+ return f"Foam::pow({self._print(base)}, {self._print(exp)})"
85
+
86
+ # Print as a plain C function call "lambertw(...)"
87
+ def _print_LambertW(self, expr):
88
+ return f"lambertw({self._print(expr.args[0])})"
89
+
90
+ # --- Expression conversion --------------------------------------------
91
+ def convert_expression_body(self, expr, target='res'):
92
+ tmp_sym = sp.numbered_symbols('t')
93
+ temps, simplified = sp.cse(expr, symbols=tmp_sym)
94
+ lines = []
95
+ for lhs, rhs in temps:
96
+ lines.append(f"Foam::scalar {self.doprint(lhs)} = {self.doprint(rhs)};")
97
+ for i in range(expr.rows):
98
+ for j in range(expr.cols):
99
+ lines.append(f"{target}[{i}][{j}] = {self.doprint(simplified[0][i, j])};")
100
+ return "\n ".join(lines)
101
+
102
+ # --- Matrix factory ---------------------------------------------------
103
+ def createMatrix(self, rows, cols):
104
+ return f"Foam::List<Foam::List<Foam::scalar>>({rows}, Foam::List<Foam::scalar>({cols}, 0.0))"
105
+
106
+ # --- Header / Footer --------------------------------------------------
107
+ def create_file_header(self, n_dof_q, n_dof_qaux, dim, list_sorted_function_names):
108
+ return textwrap.dedent(f"""\
109
+ #pragma once
110
+ #include "List.H"
111
+ #include "vector.H"
112
+ #include "scalar.H"
113
+
114
+ namespace Model
115
+ {{
116
+ constexpr int n_dof_q = {n_dof_q};
117
+ constexpr int n_dof_qaux = {n_dof_qaux};
118
+ constexpr int dimension = {dim};
119
+ const Foam::List<Foam::word> map_boundary_tag_to_function_index{{ {", ".join(f'"{item}"' for item in list_sorted_function_names)} }};
120
+ """)
121
+
122
+ def create_file_footer(self):
123
+ return "\n} // namespace Model\n"
124
+
125
+ def create_generic_function(self, name, expr, arguments, n_dof_q, n_dof_qaux, target='res'):
126
+ if isinstance(expr, list):
127
+ dim = len(expr)
128
+ return [self.create_function(f"{name}_{d}", expr[i], n_dof_q, n_dof_qaux)
129
+ for i, d in enumerate(['x', 'y', 'z'][:dim])]
130
+
131
+ rows, cols = expr.shape
132
+ body = self.convert_expression_body(expr, target)
133
+ return f"""
134
+ inline Foam::List<Foam::List<Foam::scalar>> {name}(
135
+ {self.get_function_arguments(arguments)})
136
+ {{
137
+ auto {target} = {self.createMatrix(rows, cols)};
138
+ {body}
139
+ return {target};
140
+ }}
141
+ """
142
+
143
+ # --- Function generators ---------------------------------------------
144
+ def create_function(self, name, expr, n_dof_q, n_dof_qaux, target='res'):
145
+ if isinstance(expr, list):
146
+ dim = len(expr)
147
+ return [self.create_function(f"{name}_{d}", expr[i], n_dof_q, n_dof_qaux)
148
+ for i, d in enumerate(['x', 'y', 'z'][:dim])]
149
+
150
+ rows, cols = expr.shape
151
+ body = self.convert_expression_body(expr, target)
152
+ return f"""
153
+ inline Foam::List<Foam::List<Foam::scalar>> {name}(
154
+ const Foam::List<Foam::scalar>& Q,
155
+ const Foam::List<Foam::scalar>& Qaux)
156
+ {{
157
+ auto {target} = {self.createMatrix(rows, cols)};
158
+ {body}
159
+ return {target};
160
+ }}
161
+ """
162
+
163
+ def create_function_normal(self, name, expr, n_dof_q, n_dof_qaux, dim, target='res'):
164
+ if isinstance(expr, list):
165
+ return [self.create_function_normal(f"{name}_{d}", expr[i], n_dof_q, n_dof_qaux, dim)
166
+ for i, d in enumerate(['x', 'y', 'z'][:dim])]
167
+
168
+ rows, cols = expr.shape
169
+ body = self.convert_expression_body(expr, target)
170
+ return f"""
171
+ inline Foam::List<Foam::List<Foam::scalar>> {name}(
172
+ const Foam::List<Foam::scalar>& Q,
173
+ const Foam::List<Foam::scalar>& Qaux,
174
+ const Foam::vector& n)
175
+ {{
176
+ auto {target} = {self.createMatrix(rows, cols)};
177
+ {body}
178
+ return {target};
179
+ }}
180
+ """
181
+
182
+ def create_function_interpolate(self, name, expr, n_dof_q, n_dof_qaux, target='res'):
183
+ rows, cols = expr.shape
184
+ body = self.convert_expression_body(expr, target)
185
+ return f"""
186
+ inline Foam::List<Foam::List<Foam::scalar>> {name}(
187
+ const Foam::List<Foam::scalar>& Q,
188
+ const Foam::List<Foam::scalar>& Qaux,
189
+ const Foam::vector& X)
190
+ {{
191
+ auto {target} = {self.createMatrix(rows, cols)};
192
+ {body}
193
+ return {target};
194
+ }}
195
+ """
196
+
197
+ def create_function_boundary(self, name, expr, n_dof_q, n_dof_qaux, dim, target='res'):
198
+ rows, cols = expr.shape
199
+ body = self.convert_expression_body(expr, target)
200
+ return f"""
201
+ inline Foam::List<Foam::List<Foam::scalar>> {name}(
202
+ const Foam::List<Foam::scalar>& Q,
203
+ const Foam::List<Foam::scalar>& Qaux,
204
+ const Foam::vector& n,
205
+ const Foam::vector& X,
206
+ const Foam::scalar& time,
207
+ const Foam::scalar& dX)
208
+ {{
209
+ auto {target} = {self.createMatrix(rows, cols)};
210
+ {body}
211
+ return {target};
212
+ }}
213
+ """
214
+
215
+ # --- Full model generation ------------------------------------------
216
+ def create_model(self, model, additional_writes=None):
217
+ n_dof = model.n_variables
218
+ n_dof_qaux = model.n_aux_variables
219
+ dim = model.dimension
220
+ funcs = []
221
+ funcs.append(self.create_lambertw())
222
+ funcs += self.create_function('flux', model.flux(), n_dof, n_dof_qaux)
223
+ funcs += self.create_function('flux_jacobian', model.flux_jacobian(), n_dof, n_dof_qaux)
224
+ funcs += self.create_function('dflux', model.dflux(), n_dof, n_dof_qaux)
225
+ funcs += self.create_function('dflux_jacobian', model.dflux_jacobian(), n_dof, n_dof_qaux)
226
+ funcs += self.create_function('nonconservative_matrix', model.nonconservative_matrix(), n_dof, n_dof_qaux)
227
+ funcs += self.create_function('quasilinear_matrix', model.quasilinear_matrix(), n_dof, n_dof_qaux)
228
+ funcs.append(self.create_function_normal('eigenvalues', model.eigenvalues(), n_dof, n_dof_qaux, dim))
229
+ funcs.append(self.create_function('left_eigenvectors', model.left_eigenvectors(), n_dof, n_dof_qaux))
230
+ funcs.append(self.create_function('right_eigenvectors', model.right_eigenvectors(), n_dof, n_dof_qaux))
231
+ funcs.append(self.create_function('source', model.source(), n_dof, n_dof_qaux))
232
+ funcs.append(self.create_function('residual', model.residual(), n_dof, n_dof_qaux))
233
+ funcs.append(self.create_function('source_implicit', model.source_implicit(), n_dof, n_dof_qaux))
234
+ funcs.append(self.create_function_interpolate('interpolate', model.project_2d_to_3d(), n_dof, n_dof_qaux))
235
+ funcs.append(self.create_function_boundary(
236
+ 'boundary_conditions',
237
+ model.boundary_conditions.get_boundary_condition_function(
238
+ model.time, model.position, model.distance,
239
+ model.variables, model.aux_variables, model.parameters, model.normal),
240
+ n_dof, n_dof_qaux, dim))
241
+ if additional_writes is not None:
242
+ for a in additional_writes:
243
+ funcs.append(self.create_generic_function(
244
+ a['name'], a['expression'], a['arguments'], n_dof, n_dof_qaux))
245
+
246
+ return self.create_file_header(n_dof, n_dof_qaux, dim, model.boundary_conditions.list_sorted_function_names) + "\n".join(funcs) + self.create_file_footer()
247
+
248
+
249
+ def write_code(model, settings, additional_writes=None):
250
+ printer = FoamPrinter(model)
251
+ code = printer.create_model(model, additional_writes=additional_writes)
252
+ main_dir = misc.get_main_directory()
253
+
254
+ path = os.path.join(main_dir, settings.output.directory, ".foam_interface")
255
+ os.makedirs(path, exist_ok=True)
256
+ file_path = os.path.join(path, "Model.H")
257
+ with open(file_path, "w+") as f:
258
+ f.write(code)
@@ -0,0 +1,67 @@
1
+ from attrs import define
2
+ import ufl
3
+ from zoomy_core.transformation.to_numpy import NumpyRuntimeModel
4
+
5
+
6
+
7
+ @define(kw_only=False, slots=True, frozen=True)
8
+ class UFLRuntimeModel(NumpyRuntimeModel):
9
+ printer=None
10
+
11
+ module = {
12
+ 'ones_like': lambda x: 0*x + 1,
13
+ 'zeros_like': lambda x: 0*x,
14
+ 'array': ufl.as_vector,
15
+ 'squeeze': lambda x: x,
16
+
17
+ # --- Elementary arithmetic ---
18
+ "Abs": abs,
19
+ "sign": ufl.sign,
20
+ "Min": ufl.min_value,
21
+ "Max": ufl.max_value,
22
+ # --- Powers and roots ---
23
+ "sqrt": ufl.sqrt,
24
+ "exp": ufl.exp,
25
+ "ln": ufl.ln,
26
+ "pow": lambda x, y: x**y,
27
+ # --- Trigonometric functions ---
28
+ "sin": ufl.sin,
29
+ "cos": ufl.cos,
30
+ "tan": ufl.tan,
31
+ "asin": ufl.asin,
32
+ "acos": ufl.acos,
33
+ "atan": ufl.atan,
34
+ "atan2": ufl.atan2,
35
+ # --- Hyperbolic functions ---
36
+ "sinh": ufl.sinh,
37
+ "cosh": ufl.cosh,
38
+ "tanh": ufl.tanh,
39
+ # --- Piecewise / conditional logic ---
40
+ "Heaviside": lambda x: ufl.conditional(x >= 0, 1.0, 0.0),
41
+ "Piecewise": ufl.conditional,
42
+ "signum": ufl.sign,
43
+ # --- Vector & tensor ops ---
44
+ "dot": ufl.dot,
45
+ "inner": ufl.inner,
46
+ "outer": ufl.outer,
47
+ "cross": ufl.cross,
48
+ # --- Differential operators (used in forms) ---
49
+ "grad": ufl.grad,
50
+ "div": ufl.div,
51
+ "curl": ufl.curl,
52
+ # --- Common constants ---
53
+ "pi": ufl.pi,
54
+ "E": ufl.e,
55
+ # --- Matrix and linear algebra ---
56
+ "transpose": ufl.transpose,
57
+ "det": ufl.det,
58
+ "inv": ufl.inv,
59
+ "tr": ufl.tr,
60
+ # --- Python builtins (SymPy may emit these) ---
61
+ "abs": abs,
62
+ "min": ufl.min_value,
63
+ "max": ufl.max_value,
64
+ "sqrt": ufl.sqrt,
65
+ "sum": lambda x: ufl.Constant(sum(x)) if isinstance(x, (list, tuple)) else x,
66
+ "ImmutableDenseMatrix": lambda x: x,
67
+ }
@@ -0,0 +1,52 @@
1
+ Metadata-Version: 2.4
2
+ Name: zoomy_core
3
+ Version: 0.1.14
4
+ Summary: A simulation software for dimensionally-reduced free surface flows.
5
+ Author-email: Ingo Steldermann <steldermann@mbd.rwth-aachen.de>
6
+ License: GNU
7
+ Project-URL: Homepage, https://github.com/mbd-rwth/Zoomy
8
+ Project-URL: Documentation, https://mbd-rwth.github.io/Zoomy
9
+ Project-URL: Source, https://github.com/mbd-rwth/Zoomy
10
+ Project-URL: Issues, https://github.com/mbd-rwth/Zoomy/issues
11
+ Keywords: simulation,shallow flow,free surface flow,shallow moments,shallow water,VAM
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Framework :: Jupyter
16
+ Requires-Python: >=3.9
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: attrs
20
+ Requires-Dist: sympy>=1.14
21
+ Requires-Dist: numpy
22
+ Requires-Dist: scipy
23
+ Requires-Dist: loguru
24
+ Requires-Dist: h5py
25
+ Requires-Dist: matplotlib
26
+ Requires-Dist: meshio
27
+ Requires-Dist: pytest
28
+ Provides-Extra: gui
29
+ Requires-Dist: pyvista; extra == "gui"
30
+ Requires-Dist: trame; extra == "gui"
31
+ Requires-Dist: trame-vtk; extra == "gui"
32
+ Requires-Dist: trame-vuetify; extra == "gui"
33
+ Requires-Dist: panel; extra == "gui"
34
+ Provides-Extra: coupling
35
+ Requires-Dist: precice; extra == "coupling"
36
+ Provides-Extra: testing
37
+ Requires-Dist: swashes; extra == "testing"
38
+ Requires-Dist: pyswashes; extra == "testing"
39
+ Provides-Extra: mesh
40
+ Requires-Dist: gmsh; extra == "mesh"
41
+ Requires-Dist: python-gmsh; extra == "mesh"
42
+ Requires-Dist: rasterio; extra == "mesh"
43
+ Provides-Extra: dev
44
+ Requires-Dist: watchfiles; extra == "dev"
45
+ Requires-Dist: Cython; extra == "dev"
46
+ Requires-Dist: pytest-html; extra == "dev"
47
+ Dynamic: license-file
48
+
49
+ # zoomy-core
50
+
51
+ This repository is a submodule of the the [Zoomy Lab](https://github.com/ZoomyLab/Zoomy) repository.
52
+
@@ -0,0 +1,57 @@
1
+ decorators/decorators.py,sha256=4fmdDDkHKoRFRbxMpTdM3KqDMV-dOL02DH2Ig29cpR0,853
2
+ fvm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ fvm/flux.py,sha256=5EKXY_xqnH5T5o4cZTC-_SON14WLoXwygel8OTbPdAk,1888
4
+ fvm/nonconservative_flux.py,sha256=80iRIOZ5xiRJ7yeVgzrlf-kNmLlrqnUzQTEZxsHPZyc,3359
5
+ fvm/ode.py,sha256=Cx7DgLoWm7aqIjPtWUhoD9FnScZyPjKSuI4--uaiuU0,1453
6
+ fvm/solver_numpy.py,sha256=y5szY7jz1FQ8kHQip5NvHy3ww4r68bSaz0jFoGa_Om4,10835
7
+ fvm/timestepping.py,sha256=SqYjV0YAj4v5Ug2y7sEdZgF3DRH1lHPDa5BFsXzrm14,405
8
+ mesh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ mesh/mesh.py,sha256=TKYHl067O0mBvcIKy63epf9Echono7NyFjBUlOuLTDI,50259
10
+ mesh/mesh_extrude.py,sha256=ln9bD5l_BEELUgx--j1I70Wv3tGgdqVcrxcDXKBMVyE,5992
11
+ mesh/mesh_util.py,sha256=IOe5FZ2vhiCTGRsRxUHEoek1o6N2QQAceuLUhuioG_k,16174
12
+ misc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ misc/custom_types.py,sha256=l1kfQJWPzT0PEvW-8bh4MD4BaIspWmtfQ4Y8Oq2qcT4,141
14
+ misc/interpolation.py,sha256=Z27uhcGRE_BWPm9voUbxHV5Ptj3cJnWd9vAWNqIfGIM,5095
15
+ misc/io.py,sha256=Vz7mRGIGAOgyDLgLOQvu9vVnFVudufr_lXVx_sNHeOg,14559
16
+ misc/logger_config.py,sha256=506zLc8d9hn7b-r55ZWHWWx7GY0NjayVGMLNcNJQr5E,478
17
+ misc/misc.py,sha256=CP2PAGYEfn8LITTSZ7Xm3qQOngzPPW8RymRYN1GnNWo,7521
18
+ model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ model/analysis.py,sha256=qt7cs3s5ijen5I11ntS3Y5pVPI8ufijjCJj-7Is9YMo,5332
20
+ model/basefunction.py,sha256=XtlKQCkamWnM_ohW0-3PYXrkK0_poIFHMtz-o52JYSo,3542
21
+ model/basemodel.py,sha256=q1vJtqqBnvtB0soDyGWUcZs2AM9VMopWw-M86t1Whwo,16926
22
+ model/boundary_conditions.py,sha256=_TFYppTc9Q8ANXCjsKxcVvNbLyqHKr-VYjdcLZxV3no,6608
23
+ model/initial_conditions.py,sha256=3ZmJeABD1xHb-qZ2tBlIFnHVvHWJxygTgtIw5t7k1oM,5427
24
+ model/model.py,sha256=RvYQig-8aFmUmY6eyUhQ-DZ9U2mc0ods4Zo-tVeERbI,1973
25
+ model/models/GN.py,sha256=ymOlDpn8I5Xzk2GvXm2gvialSWTzxpPSvxzkP0qOMlc,1913
26
+ model/models/advection.py,sha256=G-oDMNbKAahlW90ocyf-HGM55-JX59cMARV8JaRfe_g,2111
27
+ model/models/basisfunctions.py,sha256=ZHeQYXwgpB8YAZ-8l3NYYvi8CSuvFzJ0xiyaai4WsCA,5410
28
+ model/models/basismatrices.py,sha256=W6hJqNhxawfqN3wAFnXvbaclavJ0QKPgs1jeDcPwpUA,13074
29
+ model/models/coupled_constrained.py,sha256=q2qOh7Vf3ryG0rS9VXD4oUDMaHEZ7g74AtgHQePXEC0,1741
30
+ model/models/poisson.py,sha256=B_8qc_6FnEzB91-fdKzWlHo8Jiq1Kmjxp1xBC6YB-ag,1075
31
+ model/models/shallow_moments.py,sha256=kSNxnAQnCmmFBggcXmOh1yVlF_1_8-QxDGLPvajcELo,27098
32
+ model/models/shallow_moments_sediment.py,sha256=rt1ohClioEpPOYO0w1zB9VHGkjP0RWxM4M18BEA00rI,14292
33
+ model/models/shallow_moments_topo.py,sha256=_5KWvT3iUbPU5zAZN4J904b1r5yJiMTFojmeVD7oxsg,17402
34
+ model/models/shallow_moments_variants.py,sha256=NsRF9kaiYxQtV94oOZsMBDFXwzmm_R-rz6fAUuYQRxc,52059
35
+ model/models/shallow_water.py,sha256=1Sn8mVCUiYZue2SvLfGfRMOsfD0G9hL72x_ENdA9QRU,8412
36
+ model/models/shallow_water_topo.py,sha256=Y-ibbM9Hj7gPreZUmTEBcYlhM0AzIiMYKuEeJYi-Pxc,3455
37
+ model/models/shear_shallow_flow.py,sha256=O2JZaK1E8qUPVJHYaTksMDV3IuxD9nez1hHmdKHRJng,17250
38
+ model/models/sme_turbulent.py,sha256=8PzvbSdEYNEaz-9LCvahL_-Gt_tdGv3PPjBqYRz11V4,24048
39
+ model/models/vam.py,sha256=aHI1LCkNQC8g8uEZujp36NYVuaKxfCapl9W-5fSzLWk,15114
40
+ postprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ postprocessing/plotting.py,sha256=WJs_CCoeiWhGnVXQx8BBVmKxJkVFJYVnmVVdTDjz0J4,7005
42
+ postprocessing/postprocessing.py,sha256=9-c-CJ1jevY74JatSjDRYWzIenxogS7jO3-7Ty_B9k4,2860
43
+ preprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ preprocessing/openfoam_moments.py,sha256=22SRInpuk57VhWAFNVEPeNMy9F6ka5rnadBxNQSHBGM,14688
45
+ transformation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ transformation/helpers.py,sha256=KClsyBc0LZNocKzbfknhhYPshA83cDLkzfAKkPGoy1o,915
47
+ transformation/to_amrex.py,sha256=TZofZ9B-1ljIn3EVuMjZW21XJG2inlitGzSXz8LmE94,9639
48
+ transformation/to_c.py,sha256=balvP-qJOqUIgI_cVVq4ie6cz1vd1tzPoljdVJ_nq28,7245
49
+ transformation/to_jax.py,sha256=XkQHMv8hNm9kMcUm8xHZMhlsQqK9_4IDuUw8phFJviU,395
50
+ transformation/to_numpy.py,sha256=cWs4uwg8w8fBHlNUYdayf03crrBYYWxpckxH-0t7tEU,4548
51
+ transformation/to_openfoam.py,sha256=rbh7-p89zWS9Sk8HTm5PjCOV7bk2xK5x_EyVn79a114,10723
52
+ transformation/to_ufl.py,sha256=U4TQpBStlR44bXP8_ochYYDSYk1kZTlpKl-aZ7WNTqw,1991
53
+ zoomy_core-0.1.14.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
54
+ zoomy_core-0.1.14.dist-info/METADATA,sha256=3VTd1UVauKzQKKadwu-LmMMWG5WDZBuVGAlyfwQ_y74,1847
55
+ zoomy_core-0.1.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
56
+ zoomy_core-0.1.14.dist-info/top_level.txt,sha256=a7udeQrjSnc2Y_GED5JOFjl8Cw6ATndPtiX5o1cvcF0,75
57
+ zoomy_core-0.1.14.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+