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,378 @@
1
+ from 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