zoomy-core 0.1.1__py3-none-any.whl → 0.1.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.

Potentially problematic release.


This version of zoomy-core might be problematic. Click here for more details.

Files changed (53) hide show
  1. zoomy_core/decorators/decorators.py +25 -0
  2. zoomy_core/fvm/flux.py +97 -0
  3. zoomy_core/fvm/nonconservative_flux.py +97 -0
  4. zoomy_core/fvm/ode.py +55 -0
  5. zoomy_core/fvm/solver_numpy.py +305 -0
  6. zoomy_core/fvm/timestepping.py +13 -0
  7. zoomy_core/mesh/mesh.py +1234 -0
  8. zoomy_core/mesh/mesh_extrude.py +168 -0
  9. zoomy_core/mesh/mesh_util.py +487 -0
  10. zoomy_core/misc/custom_types.py +6 -0
  11. zoomy_core/misc/interpolation.py +140 -0
  12. zoomy_core/misc/io.py +438 -0
  13. zoomy_core/misc/logger_config.py +18 -0
  14. zoomy_core/misc/misc.py +216 -0
  15. zoomy_core/misc/static_class.py +94 -0
  16. zoomy_core/model/analysis.py +147 -0
  17. zoomy_core/model/basefunction.py +113 -0
  18. zoomy_core/model/basemodel.py +512 -0
  19. zoomy_core/model/boundary_conditions.py +193 -0
  20. zoomy_core/model/initial_conditions.py +171 -0
  21. zoomy_core/model/model.py +63 -0
  22. zoomy_core/model/models/GN.py +70 -0
  23. zoomy_core/model/models/advection.py +53 -0
  24. zoomy_core/model/models/basisfunctions.py +181 -0
  25. zoomy_core/model/models/basismatrices.py +377 -0
  26. zoomy_core/model/models/core.py +564 -0
  27. zoomy_core/model/models/coupled_constrained.py +60 -0
  28. zoomy_core/model/models/poisson.py +41 -0
  29. zoomy_core/model/models/shallow_moments.py +757 -0
  30. zoomy_core/model/models/shallow_moments_sediment.py +378 -0
  31. zoomy_core/model/models/shallow_moments_topo.py +423 -0
  32. zoomy_core/model/models/shallow_moments_variants.py +1509 -0
  33. zoomy_core/model/models/shallow_water.py +266 -0
  34. zoomy_core/model/models/shallow_water_topo.py +111 -0
  35. zoomy_core/model/models/shear_shallow_flow.py +594 -0
  36. zoomy_core/model/models/sme_turbulent.py +613 -0
  37. zoomy_core/model/models/vam.py +455 -0
  38. zoomy_core/postprocessing/postprocessing.py +72 -0
  39. zoomy_core/preprocessing/openfoam_moments.py +452 -0
  40. zoomy_core/transformation/helpers.py +25 -0
  41. zoomy_core/transformation/to_amrex.py +238 -0
  42. zoomy_core/transformation/to_c.py +181 -0
  43. zoomy_core/transformation/to_jax.py +14 -0
  44. zoomy_core/transformation/to_numpy.py +115 -0
  45. zoomy_core/transformation/to_openfoam.py +254 -0
  46. zoomy_core/transformation/to_ufl.py +67 -0
  47. {zoomy_core-0.1.1.dist-info → zoomy_core-0.1.3.dist-info}/METADATA +2 -1
  48. zoomy_core-0.1.3.dist-info/RECORD +51 -0
  49. zoomy_core-0.1.3.dist-info/top_level.txt +1 -0
  50. zoomy_core-0.1.1.dist-info/RECORD +0 -5
  51. zoomy_core-0.1.1.dist-info/top_level.txt +0 -1
  52. {zoomy_core-0.1.1.dist-info → zoomy_core-0.1.3.dist-info}/WHEEL +0 -0
  53. {zoomy_core-0.1.1.dist-info → zoomy_core-0.1.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,378 @@
1
+ from library.zoomy_core.model.models.shallow_moments import (IC, Matrix, Model, eigenvalue_dict_to_matrix,
2
+ register_sympy_attribute, sympy)
3
+
4
+
5
+ class ShallowMomentsSediment(Model):
6
+ """
7
+ Shallow Moments Sediment 1d
8
+
9
+ :gui:
10
+ - tab: model
11
+ - requires: [ 'mesh.dimension': 1 ]
12
+
13
+ """
14
+
15
+ def __init__(
16
+ self,
17
+ boundary_conditions,
18
+ initial_conditions,
19
+ aux_initial_conditions=IC.Constant(),
20
+ dimension=1,
21
+ fields=2,
22
+ aux_variables=0,
23
+ parameters={},
24
+ _default_parameters={"g": 1.0, "ex": 0.0, "ez": 1.0},
25
+ settings={},
26
+ settings_default={"topography": False, "friction": []},
27
+ basis=Basis(),
28
+ ):
29
+ self.basis = basis
30
+ self.variables = register_sympy_attribute(fields, "q")
31
+ self.n_variables = self.variables.length()
32
+ self.level = self.n_variables - 2
33
+ self.basis.compute_matrices(self.level)
34
+ super().__init__(
35
+ dimension=dimension,
36
+ fields=fields,
37
+ aux_variables=aux_variables,
38
+ parameters=parameters,
39
+ _default_parameters=_default_parameters,
40
+ boundary_conditions=boundary_conditions,
41
+ initial_conditions=initial_conditions,
42
+ aux_initial_conditions=aux_initial_conditions,
43
+ settings={**settings_default, **settings},
44
+ )
45
+
46
+ def flux(self):
47
+ flux = Matrix([0 for i in range(self.n_variables)])
48
+ h = self.variables[0]
49
+ ha = self.variables[1 : 1 + self.level + 1]
50
+ p = self.parameters
51
+ flux[0] = ha[0]
52
+ flux[1] = p.g * p.ez * h * h / 2
53
+ for k in range(self.level + 1):
54
+ for i in range(self.level + 1):
55
+ for j in range(self.level + 1):
56
+ flux[k + 1] += (
57
+ ha[i] * ha[j] / h * self.basis.A[k, i, j] / self.basis.M[k, k]
58
+ )
59
+ return [flux]
60
+
61
+ def nonconservative_matrix(self):
62
+ nc = Matrix([[0 for i in range(self.n_variables)] for j in range(self.n_variables)])
63
+ h = self.variables[0]
64
+ ha = self.variables[1 : 1 + self.level + 1]
65
+ p = self.parameters
66
+ um = ha[0] / h
67
+ # nc[1, 0] = - p.g * p.ez * h
68
+ for k in range(1, self.level + 1):
69
+ nc[k + 1, k + 1] += um
70
+ for k in range(self.level + 1):
71
+ for i in range(1, self.level + 1):
72
+ for j in range(1, self.level + 1):
73
+ nc[k + 1, i + 1] -= (
74
+ ha[j] / h * self.basis.B[k, i, j] / self.basis.M[k, k]
75
+ )
76
+ return [nc]
77
+
78
+ def eigenvalues(self):
79
+ A = self.normal[0] * self.sympy_quasilinear_matrix[0]
80
+ for d in range(1, self.dimension):
81
+ A += self.normal[d] * self.sympy_quasilinear_matrix[d]
82
+ alpha_erase = self.variables[2:]
83
+ for alpha_i in alpha_erase:
84
+ A = A.subs(alpha_i, 0)
85
+ return eigenvalue_dict_to_matrix(A.eigenvals())
86
+
87
+ def source(self):
88
+ out = Matrix([0 for i in range(self.n_variables)])
89
+ return out
90
+
91
+ def topography(self):
92
+ assert "dhdx" in vars(self.aux_variables)
93
+ out = Matrix([0 for i in range(self.n_variables)])
94
+ h = self.variables[0]
95
+ p = self.parameters
96
+ dhdx = self.aux_variables.dhdx
97
+ out[1] = h * p.g * (p.ex - p.ez * dhdx)
98
+ return out
99
+
100
+ def inclined_plane(self):
101
+ out = Matrix([0 for i in range(self.n_variables)])
102
+ h = self.variables[0]
103
+ p = self.parameters
104
+ out[1] = h * p.g * (p.ex)
105
+ return out
106
+
107
+ def newtonian(self):
108
+ """
109
+ :gui:
110
+ - requires_parameter: ('nu', 0.0)
111
+ """
112
+ assert "nu" in vars(self.parameters)
113
+ out = Matrix([0 for i in range(self.n_variables)])
114
+ h = self.variables[0]
115
+ ha = self.variables[1 : 1 + self.level + 1]
116
+ p = self.parameters
117
+ for k in range(1 + self.level):
118
+ for i in range(1 + self.level):
119
+ out[1 + k] += (
120
+ -p.nu / h * ha[i] / h * self.basis.D[i, k] / self.basis.M[k, k]
121
+ )
122
+ return out
123
+
124
+ def slip(self):
125
+ """
126
+ :gui:
127
+ - requires_parameter: ('lamda', 0.0)
128
+ - requires_parameter: ('rho', 1.0)
129
+ """
130
+ assert "lamda" in vars(self.parameters)
131
+ assert "rho" in vars(self.parameters)
132
+ out = Matrix([0 for i in range(self.n_variables)])
133
+ h = self.variables[0]
134
+ ha = self.variables[1 : 1 + self.level + 1]
135
+ p = self.parameters
136
+ for k in range(1 + self.level):
137
+ for i in range(1 + self.level):
138
+ out[1 + k] += -1.0 / p.lamda / p.rho * ha[i] / h / self.basis.M[k, k]
139
+ return out
140
+
141
+ def chezy(self):
142
+ """
143
+ :gui:
144
+ - requires_parameter: ('C', 1000.0)
145
+ """
146
+ assert "C" in vars(self.parameters)
147
+ out = Matrix([0 for i in range(self.n_variables)])
148
+ h = self.variables[0]
149
+ ha = self.variables[1 : 1 + self.level + 1]
150
+ p = self.parameters
151
+ tmp = 0
152
+ for i in range(1 + self.level):
153
+ for j in range(1 + self.level):
154
+ tmp += ha[i] * ha[j] / h / h
155
+ sqrt = sympy.sqrt(tmp)
156
+ for k in range(1 + self.level):
157
+ for l in range(1 + self.level):
158
+ out[1 + k] += -1.0 / (p.C**2 * self.basis.M[k, k]) * ha[l] * sqrt / h
159
+ return out
160
+
161
+ def chezy_ssf(self):
162
+ """
163
+ :gui:
164
+ - requires_parameter: ('C', 1000.0)
165
+ """
166
+ assert "Cf" in vars(self.parameters)
167
+ out = Matrix([0 for i in range(self.n_variables)])
168
+ h = self.variables[0]
169
+ ha = self.variables[1 : 1 + self.level + 1]
170
+ p = self.parameters
171
+ tmp = 0
172
+ for i in range(1 + self.level):
173
+ for j in range(1 + self.level):
174
+ tmp += ha[i] * ha[j] / h / h
175
+ sqrt = sympy.sqrt(tmp)
176
+ for k in range(1 + self.level):
177
+ for l in range(1 + self.level):
178
+ out[1 + k] += -(p.Cf * self.basis.M[k, k]) * ha[l] * sqrt / h
179
+ return out
180
+
181
+
182
+ class ShallowMomentsSediment2d(Model):
183
+ def __init__(
184
+ self,
185
+ boundary_conditions,
186
+ initial_conditions,
187
+ dimension=2,
188
+ fields=3,
189
+ aux_variables=0,
190
+ parameters={},
191
+ _default_parameters={"g": 1.0, "ex": 0.0, "ey": 0.0, "ez": 1.0},
192
+ settings={},
193
+ settings_default={"topography": False, "friction": []},
194
+ basis=Basis(),
195
+ ):
196
+ self.basis = basis
197
+ self.variables = register_sympy_attribute(fields, "q")
198
+ self.n_variables = self.variables.length()
199
+ self.level = int((self.n_variables - 1) / 2) - 1
200
+ self.basis.compute_matrices(self.level)
201
+ super().__init__(
202
+ dimension=dimension,
203
+ fields=fields,
204
+ aux_variables=aux_variables,
205
+ parameters=parameters,
206
+ _default_parameters=_default_parameters,
207
+ boundary_conditions=boundary_conditions,
208
+ initial_conditions=initial_conditions,
209
+ settings={**settings_default, **settings},
210
+ )
211
+
212
+ def flux(self):
213
+ offset = self.level + 1
214
+ flux_x = Matrix([0 for i in range(self.n_variables)])
215
+ flux_y = Matrix([0 for i in range(self.n_variables)])
216
+ h = self.variables[0]
217
+ ha = self.variables[1 : 1 + self.level + 1]
218
+ hb = self.variables[1 + self.level + 1 : 1 + 2 * (self.level + 1)]
219
+ p = self.parameters
220
+ flux_x[0] = ha[0]
221
+ flux_x[1] = p.g * p.ez * h * h / 2
222
+ for k in range(self.level + 1):
223
+ for i in range(self.level + 1):
224
+ for j in range(self.level + 1):
225
+ # TODO avoid devision by zero
226
+ flux_x[k + 1] += (
227
+ ha[i] * ha[j] / h * self.basis.A[k, i, j] / self.basis.M[k, k]
228
+ )
229
+ for k in range(self.level + 1):
230
+ for i in range(self.level + 1):
231
+ for j in range(self.level + 1):
232
+ # TODO avoid devision by zero
233
+ flux_x[k + 1 + offset] += (
234
+ hb[i] * ha[j] / h * self.basis.A[k, i, j] / self.basis.M[k, k]
235
+ )
236
+
237
+ flux_y[0] = hb[0]
238
+ flux_y[1 + offset] = p.g * p.ez * h * h / 2
239
+ for k in range(self.level + 1):
240
+ for i in range(self.level + 1):
241
+ for j in range(self.level + 1):
242
+ # TODO avoid devision by zero
243
+ flux_y[k + 1] += (
244
+ hb[i] * ha[j] / h * self.basis.A[k, i, j] / self.basis.M[k, k]
245
+ )
246
+ for k in range(self.level + 1):
247
+ for i in range(self.level + 1):
248
+ for j in range(self.level + 1):
249
+ # TODO avoid devision by zero
250
+ flux_y[k + 1 + offset] += (
251
+ hb[i] * hb[j] / h * self.basis.A[k, i, j] / self.basis.M[k, k]
252
+ )
253
+ return [flux_x, flux_y]
254
+
255
+ def nonconservative_matrix(self):
256
+ offset = self.level + 1
257
+ nc_x = Matrix([[0 for i in range(self.n_variables)] for j in range(self.n_variables)])
258
+ nc_y = Matrix([[0 for i in range(self.n_variables)] for j in range(self.n_variables)])
259
+ h = self.variables[0]
260
+ ha = self.variables[1 : 1 + self.level + 1]
261
+ hb = self.variables[1 + offset : 1 + offset + self.level + 1]
262
+ p = self.parameters
263
+ um = ha[0] / h
264
+ vm = hb[0] / h
265
+ for k in range(1, self.level + 1):
266
+ nc_x[k + 1, k + 1] += um
267
+ nc_y[k + 1, k + 1 + offset] += um
268
+ for k in range(self.level + 1):
269
+ for i in range(1, self.level + 1):
270
+ for j in range(1, self.level + 1):
271
+ nc_x[k + 1, i + 1] -= (
272
+ ha[j] / h * self.basis.B[k, i, j] / self.basis.M[k, k]
273
+ )
274
+ nc_y[k + 1, i + 1 + offset] -= (
275
+ ha[j] / h * self.basis.B[k, i, j] / self.basis.M[k, k]
276
+ )
277
+
278
+ for k in range(1, self.level + 1):
279
+ nc_x[k + 1 + offset, k + 1] += vm
280
+ nc_y[k + 1 + offset, k + 1 + offset] += vm
281
+ for k in range(self.level + 1):
282
+ for i in range(1, self.level + 1):
283
+ for j in range(1, self.level + 1):
284
+ nc_x[k + 1 + offset, i + 1] -= (
285
+ hb[j] / h * self.basis.B[k, i, j] / self.basis.M[k, k]
286
+ )
287
+ nc_y[k + 1 + offset, i + 1 + offset] -= (
288
+ hb[j] / h * self.basis.B[k, i, j] / self.basis.M[k, k]
289
+ )
290
+ return [nc_x, nc_y]
291
+
292
+ def eigenvalues(self):
293
+ # we delete heigher order moments (level >= 2) for analytical eigenvalues
294
+ offset = self.level + 1
295
+ A = self.normal[0] * self.sympy_quasilinear_matrix[0]
296
+ for d in range(1, self.dimension):
297
+ A += self.normal[d] * self.sympy_quasilinear_matrix[d]
298
+ alpha_erase = self.variables[2 : 2 + self.level]
299
+ beta_erase = self.variables[2 + offset : 2 + offset + self.level]
300
+ for alpha_i in alpha_erase:
301
+ A = A.subs(alpha_i, 0)
302
+ for beta_i in beta_erase:
303
+ A = A.subs(beta_i, 0)
304
+ return eigenvalue_dict_to_matrix(A.eigenvals())
305
+
306
+ def source(self):
307
+ out = Matrix([0 for i in range(self.n_variables)])
308
+ return out
309
+
310
+ def topography(self):
311
+ assert "dhdx" in vars(self.aux_variables)
312
+ assert "dhdy" in vars(self.aux_variables)
313
+ offset = self.level + 1
314
+ out = Matrix([0 for i in range(self.n_variables)])
315
+ h = self.variables[0]
316
+ p = self.parameters
317
+ dhdx = self.aux_variables.dhdx
318
+ dhdy = self.aux_variables.dhdy
319
+ out[1] = h * p.g * (p.ex - p.ez * dhdx)
320
+ out[1 + offset] = h * p.g * (p.ey - p.ez * dhdy)
321
+ return out
322
+
323
+ def newtonian(self):
324
+ assert "nu" in vars(self.parameters)
325
+ out = Matrix([0 for i in range(self.n_variables)])
326
+ offset = self.level + 1
327
+ h = self.variables[0]
328
+ ha = self.variables[1 : 1 + self.level + 1]
329
+ hb = self.variables[1 + offset : 1 + self.level + 1 + offset]
330
+ p = self.parameters
331
+ for k in range(1 + self.level):
332
+ for i in range(1 + self.level):
333
+ out[1 + k] += (
334
+ -p.nu / h * ha[i] / h * self.basis.D[i, k] / self.basis.M[k, k]
335
+ )
336
+ out[1 + k + offset] += (
337
+ -p.nu / h * hb[i] / h * self.basis.D[i, k] / self.basis.M[k, k]
338
+ )
339
+ return out
340
+
341
+ def slip(self):
342
+ assert "lamda" in vars(self.parameters)
343
+ assert "rho" in vars(self.parameters)
344
+ out = Matrix([0 for i in range(self.n_variables)])
345
+ offset = self.level + 1
346
+ h = self.variables[0]
347
+ h = self.variables[0]
348
+ ha = self.variables[1 : 1 + self.level + 1]
349
+ hb = self.variables[1 + offset : 1 + self.level + 1 + offset]
350
+ p = self.parameters
351
+ for k in range(1 + self.level):
352
+ for i in range(1 + self.level):
353
+ out[1 + k] += -1.0 / p.lamda / p.rho * ha[i] / h / self.basis.M[k, k]
354
+ out[1 + k + offset] += (
355
+ -1.0 / p.lamda / p.rho * hb[i] / h / self.basis.M[k, k]
356
+ )
357
+ return out
358
+
359
+ def chezy(self):
360
+ assert "C" in vars(self.parameters)
361
+ out = Matrix([0 for i in range(self.n_variables)])
362
+ offset = self.level + 1
363
+ h = self.variables[0]
364
+ ha = self.variables[1 : 1 + self.level + 1]
365
+ hb = self.variables[1 + offset : 1 + self.level + 1 + offset]
366
+ p = self.parameters
367
+ tmp = 0
368
+ for i in range(1 + self.level):
369
+ for j in range(1 + self.level):
370
+ tmp += ha[i] * ha[j] / h / h + hb[i] * hb[j] / h / h
371
+ sqrt = sympy.sqrt(tmp)
372
+ for k in range(1 + self.level):
373
+ for l in range(1 + self.level):
374
+ out[1 + k] += -1.0 / (p.C**2 * self.basis.M[k, k]) * ha[l] * sqrt / h
375
+ out[1 + k + offset] += (
376
+ -1.0 / (p.C**2 * self.basis.M[k, k]) * hb[l] * sqrt / h
377
+ )
378
+ return out