ddfem 0.9.0__py3-none-any.whl → 1.0.0__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 (43) hide show
  1. ddfem/__init__.py +0 -4
  2. ddfem/base_model.py +200 -0
  3. ddfem/boundary.py +3 -12
  4. ddfem/geometry/__init__.py +3 -3
  5. ddfem/geometry/arc.py +8 -10
  6. ddfem/geometry/box.py +8 -7
  7. ddfem/geometry/circle.py +39 -0
  8. ddfem/geometry/domain.py +4 -16
  9. ddfem/geometry/domain_dune.py +0 -16
  10. ddfem/geometry/helpers.py +12 -19
  11. ddfem/geometry/pie.py +7 -7
  12. ddfem/geometry/primitive_base.py +70 -129
  13. ddfem/geometry/vesica.py +6 -7
  14. ddfem/model2ufl.py +4 -10
  15. ddfem/transformers/DDM1.py +68 -10
  16. ddfem/transformers/Fitted.py +12 -22
  17. ddfem/transformers/Mix0.py +64 -10
  18. ddfem/transformers/NNS.py +72 -11
  19. ddfem/transformers/NS.py +79 -14
  20. ddfem/transformers/__init__.py +0 -1
  21. ddfem/transformers/transformer_base.py +15 -102
  22. {ddfem-0.9.0.dist-info → ddfem-1.0.0.dist-info}/METADATA +1 -2
  23. ddfem-1.0.0.dist-info/RECORD +27 -0
  24. ddfem/examples/__init__.py +0 -0
  25. ddfem/examples/advection_diffusion.py +0 -74
  26. ddfem/examples/beam.py +0 -147
  27. ddfem/examples/cahn_hilliard.py +0 -67
  28. ddfem/examples/chemical_reaction.py +0 -88
  29. ddfem/examples/constant.py +0 -46
  30. ddfem/examples/five_circle_flat.py +0 -197
  31. ddfem/examples/forchheimer.py +0 -48
  32. ddfem/examples/hyperelasticity.py +0 -88
  33. ddfem/examples/linear_elasticity.py +0 -45
  34. ddfem/examples/plaplace.py +0 -29
  35. ddfem/examples/single_circle.py +0 -135
  36. ddfem/examples/triple_circle.py +0 -217
  37. ddfem/examples/triple_circle_beam.py +0 -208
  38. ddfem/geometry/ball.py +0 -24
  39. ddfem/geometry/plane.py +0 -20
  40. ddfem-0.9.0.dist-info/RECORD +0 -41
  41. {ddfem-0.9.0.dist-info → ddfem-1.0.0.dist-info}/WHEEL +0 -0
  42. {ddfem-0.9.0.dist-info → ddfem-1.0.0.dist-info}/licenses/LICENSE +0 -0
  43. {ddfem-0.9.0.dist-info → ddfem-1.0.0.dist-info}/top_level.txt +0 -0
ddfem/transformers/NNS.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from ufl import as_vector, conditional, dot, grad, sqrt, zero
2
2
 
3
- from .transformer_base import transformer
3
+ from .transformer_base import transformer_base
4
4
 
5
5
  """
6
6
  Paper: using x^- = 1/2(x-|x|), x^+ = 1/2(x+|x|) so that x = x^+ + x^-, i.e., x^+ - x = - x^-
@@ -29,9 +29,18 @@ model = - ddm2.F_c(u).grad(v) - ddm2.S_e(u)v
29
29
  """
30
30
 
31
31
 
32
- @transformer
33
- def NDDM(Model):
32
+ def NDDM(OriginalModel, domainDescription):
33
+ Model = transformer_base(OriginalModel, domainDescription)
34
+
34
35
  class DDModel(Model):
36
+ def sigma(t, x, U, DU=None):
37
+ if DU:
38
+ return DU
39
+ return grad(U)
40
+
41
+ # self.normal = grad(self.sign_dist)
42
+ # self.projection = self.x - self.sign_dist * self.normal
43
+
35
44
  def S_e_source(t, x, U, DU):
36
45
  return DDModel.phi(x) * Model.S_e(t, x, U, DDModel.sigma(t, x, U, DU))
37
46
 
@@ -51,11 +60,31 @@ def NDDM(Model):
51
60
  else:
52
61
  convec = zero(U.ufl_shape)
53
62
 
54
- convec -= DDModel.BT.BndFlux_cExt(t, x, U)
63
+ convec += DDModel.BT.BndFlux_cExt(t, x, U)
55
64
  return convec
56
65
 
57
- def S_outside(t, x, U, DU):
58
- return -(
66
+ if hasattr(Model, "S_e") and hasattr(Model, "F_c"):
67
+ print("NDDM: S_e and F_c")
68
+
69
+ def S_e(t, x, U, DU):
70
+ return DDModel.S_e_source(t, x, U, DU) + DDModel.S_e_convection(
71
+ t, x, U, DU
72
+ )
73
+
74
+ elif hasattr(Model, "S_e"):
75
+ print("NDDM: S_e")
76
+
77
+ def S_e(t, x, U, DU):
78
+ return DDModel.S_e_source(t, x, U, DU)
79
+
80
+ elif hasattr(Model, "F_c"):
81
+ print("NDDM: F_c")
82
+
83
+ def S_e(t, x, U, DU):
84
+ return DDModel.S_e_convection(t, x, U, DU)
85
+
86
+ def S_i_stability(t, x, U, DU):
87
+ return -Model.stabFactor * (
59
88
  DDModel.BT.jumpV(t, x, U) * (1 - DDModel.phi(x)) / (DDModel.epsilon**2)
60
89
  )
61
90
 
@@ -63,7 +92,7 @@ def NDDM(Model):
63
92
  return DDModel.phi(x) * Model.S_i(t, x, U, DDModel.sigma(t, x, U, DU))
64
93
 
65
94
  def S_i_diffusion(t, x, U, DU):
66
- beta = 3 * (1 - DDModel.phi(x)) / (2 * DDModel.epsilon)
95
+ beta = 3 * (1 - DDModel.phi(x)) * Model.stabFactor / (2 * DDModel.epsilon)
67
96
  diffusion = beta * (
68
97
  sqrt(dot(grad(DDModel.phi(x)), grad(DDModel.phi(x))))
69
98
  * DDModel.BT.jumpV(t, x, U)
@@ -73,10 +102,42 @@ def NDDM(Model):
73
102
  diffusion += DDModel.BT.jumpFv(t, x, U, DU, Fv)
74
103
  return -diffusion
75
104
 
76
- def F_c(t, x, U):
77
- return DDModel.phi(x) * Model.F_c(t, x, U)
105
+ if hasattr(Model, "S_i") and hasattr(Model, "F_v"):
106
+ print("NDDM: S_i and F_v")
107
+
108
+ def S_i(t, x, U, DU):
109
+ return (
110
+ DDModel.S_i_stability(t, x, U, DU)
111
+ + DDModel.S_i_source(t, x, U, DU)
112
+ + DDModel.S_i_diffusion(t, x, U, DU)
113
+ )
114
+
115
+ elif hasattr(Model, "F_v"):
116
+ print("NDDM: F_v")
117
+
118
+ def S_i(t, x, U, DU):
119
+ return DDModel.S_i_stability(t, x, U, DU) + DDModel.S_i_diffusion(
120
+ t, x, U, DU
121
+ )
122
+
123
+ elif hasattr(Model, "S_i"):
124
+ print("NDDM: S_i")
125
+
126
+ def S_i(t, x, U, DU):
127
+ return DDModel.S_i_stability(t, x, U, DU) + DDModel.S_i_source(
128
+ t, x, U, DU
129
+ )
130
+
131
+ if hasattr(Model, "F_c"):
132
+ print("NDDM: F_c")
133
+
134
+ def F_c(t, x, U):
135
+ return DDModel.phi(x) * Model.F_c(t, x, U)
136
+
137
+ if hasattr(Model, "F_v"):
138
+ print("NDDM: F_v")
78
139
 
79
- def F_v(t, x, U, DU):
80
- return DDModel.phi(x) * Model.F_v(t, x, U, DDModel.sigma(t, x, U, DU))
140
+ def F_v(t, x, U, DU):
141
+ return DDModel.phi(x) * Model.F_v(t, x, U, DDModel.sigma(t, x, U, DU))
81
142
 
82
143
  return DDModel
ddfem/transformers/NS.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from ufl import as_vector, conditional, dot, grad, outer, sqrt, zero
2
2
 
3
- from .transformer_base import transformer
3
+ from .transformer_base import transformer_base
4
4
 
5
5
  """
6
6
  Paper: using x^- = 1/2(x-|x|), x^+ = 1/2(x+|x|) so that x = x^+ + x^-, i.e., x^+ - x = - x^-
@@ -29,9 +29,18 @@ model = - ddm2.F_c(u).grad(v) - ddm2.S_e(u)v
29
29
  """
30
30
 
31
31
 
32
- @transformer
33
- def NSDDM(Model):
32
+ def NSDDM(OriginalModel, domainDescription):
33
+ Model = transformer_base(OriginalModel, domainDescription)
34
+
34
35
  class DDModel(Model):
36
+ def sigma(t, x, U, DU=None):
37
+ if DU:
38
+ return DU
39
+ return grad(U)
40
+
41
+ # self.normal = grad(self.sign_dist)
42
+ # self.projection = self.x - self.sign_dist * self.normal
43
+
35
44
  def S_e_source(t, x, U, DU):
36
45
  return DDModel.phi(x) * Model.S_e(t, x, U, DDModel.sigma(t, x, U, DU))
37
46
 
@@ -51,11 +60,31 @@ def NSDDM(Model):
51
60
  else:
52
61
  convec = zero(U.ufl_shape)
53
62
 
54
- convec -= DDModel.BT.BndFlux_cExt(t, x, U)
63
+ convec += DDModel.BT.BndFlux_cExt(t, x, U)
55
64
  return convec
56
65
 
57
- def S_outside(t, x, U, DU):
58
- return -(
66
+ if hasattr(Model, "S_e") and hasattr(Model, "F_c"):
67
+ print("NSDDM: S_e and F_c")
68
+
69
+ def S_e(t, x, U, DU):
70
+ return DDModel.S_e_source(t, x, U, DU) + DDModel.S_e_convection(
71
+ t, x, U, DU
72
+ )
73
+
74
+ elif hasattr(Model, "S_e"):
75
+ print("NSDDM: S_e")
76
+
77
+ def S_e(t, x, U, DU):
78
+ return DDModel.S_e_source(t, x, U, DU)
79
+
80
+ elif hasattr(Model, "F_c"):
81
+ print("NSDDM: F_c")
82
+
83
+ def S_e(t, x, U, DU):
84
+ return DDModel.S_e_convection(t, x, U, DU)
85
+
86
+ def S_i_stability(t, x, U, DU):
87
+ return -DDModel.stabFactor * (
59
88
  DDModel.BT.jumpV(t, x, U) * (1 - DDModel.phi(x)) / (DDModel.epsilon**2)
60
89
  )
61
90
 
@@ -63,7 +92,7 @@ def NSDDM(Model):
63
92
  return DDModel.phi(x) * Model.S_i(t, x, U, DDModel.sigma(t, x, U, DU))
64
93
 
65
94
  def S_i_diffusion(t, x, U, DU):
66
- beta = 6 * (1 - DDModel.phi(x)) / DDModel.epsilon
95
+ beta = 6 * (1 - DDModel.phi(x)) * Model.stabFactor / DDModel.epsilon
67
96
  diffusion = beta * (
68
97
  sqrt(dot(grad(DDModel.phi(x)), grad(DDModel.phi(x))))
69
98
  * DDModel.BT.jumpV(t, x, U)
@@ -73,14 +102,50 @@ def NSDDM(Model):
73
102
  diffusion += DDModel.BT.jumpFv(t, x, U, DU, Fv)
74
103
  return -diffusion
75
104
 
76
- def F_c(t, x, U):
77
- return DDModel.phi(x) * Model.F_c(t, x, U)
105
+ if hasattr(Model, "S_i") and hasattr(Model, "F_v"):
106
+ print("NSDDM: S_i and F_v")
107
+
108
+ def S_i(t, x, U, DU):
109
+ return (
110
+ DDModel.S_i_stability(t, x, U, DU)
111
+ + DDModel.S_i_source(t, x, U, DU)
112
+ + DDModel.S_i_diffusion(t, x, U, DU)
113
+ )
78
114
 
79
- def F_v(t, x, U, DU):
80
- diffusion = DDModel.phi(x) * Model.F_v(t, x, U, DDModel.sigma(t, x, U, DU))
115
+ elif hasattr(Model, "F_v"):
116
+ print("NSDDM: F_v")
81
117
 
82
- out = outer(DDModel.BT.jumpV(t, x, U), grad(DDModel.phi(x)))
83
- diffusion += Model.F_v_lin_mult(t, x, U, DDModel.sigma(t, x, U, DU), out)
84
- return diffusion
118
+ def S_i(t, x, U, DU):
119
+ return DDModel.S_i_stability(t, x, U, DU) + DDModel.S_i_diffusion(
120
+ t, x, U, DU
121
+ )
122
+
123
+ elif hasattr(Model, "S_i"):
124
+ print("NSDDM: S_i")
125
+
126
+ def S_i(t, x, U, DU):
127
+ return DDModel.S_i_stability(t, x, U, DU) + DDModel.S_i_source(
128
+ t, x, U, DU
129
+ )
130
+
131
+ if hasattr(Model, "F_c"):
132
+ print("NSDDM: F_c")
133
+
134
+ def F_c(t, x, U):
135
+ return DDModel.phi(x) * Model.F_c(t, x, U)
136
+
137
+ if hasattr(Model, "F_v"):
138
+ print("NSDDM: F_v")
139
+
140
+ def F_v(t, x, U, DU):
141
+ diffusion = DDModel.phi(x) * Model.F_v(
142
+ t, x, U, DDModel.sigma(t, x, U, DU)
143
+ )
144
+
145
+ out = outer(DDModel.BT.jumpV(t, x, U), grad(DDModel.phi(x)))
146
+ diffusion += Model.F_v_lin_mult(
147
+ t, x, U, DDModel.sigma(t, x, U, DU), out
148
+ )
149
+ return diffusion
85
150
 
86
151
  return DDModel
@@ -3,4 +3,3 @@ from .Fitted import Fitted
3
3
  from .Mix0 import Mix0DDM
4
4
  from .NNS import NDDM
5
5
  from .NS import NSDDM
6
- from .transformer_base import transformer, posttransformer, pretransformer
@@ -1,30 +1,22 @@
1
- from ufl import as_matrix, diff, dot, grad, inner, replace, variable, zero
1
+ from ufl import as_matrix, diff, dot, inner, replace, variable, zero
2
2
  from ufl.algorithms.ad import expand_derivatives
3
3
 
4
4
  from ..boundary import BndFlux_c, BndFlux_v, BndValue, BoundaryTerms
5
5
 
6
6
 
7
- def pretransformer(Model, domainDescription):
7
+ def transformer_base(Model, domainDescription):
8
8
  class DDBase(Model):
9
9
  BT = BoundaryTerms(Model, domainDescription)
10
10
  boundary = BT.physical
11
11
  domain = BT.domain
12
12
 
13
- hasFlux_c = hasattr(Model, "F_c")
14
- hasFlux_v = hasattr(Model, "F_v")
15
- hasSource_i = hasattr(Model, "S_i")
16
- hasSource_e = hasattr(Model, "S_e")
17
-
18
- hasOutFactor_i = hasattr(Model, "outFactor_i")
19
- hasOutFactor_e = hasattr(Model, "outFactor_e")
20
-
21
13
  if BT.BndValueExt is not None:
22
- boundary[lambda x: DDBase.domain.chi(x) < 0.5] = BndValue(BT.BndValueExt)
23
-
24
- assert (
25
- hasOutFactor_i or hasOutFactor_e
26
- ), "Dirichlet boundary requires the attribute outFactor_i or outFactor_e for outside term scaling"
14
+ boundary[lambda x: DDBase.domain.omega.chi(x) < 0.5] = BndValue(
15
+ BT.BndValueExt
16
+ )
27
17
  else:
18
+ hasFlux_c = hasattr(Model, "F_c")
19
+ hasFlux_v = hasattr(Model, "F_v")
28
20
 
29
21
  if hasFlux_c:
30
22
  valFc = BndFlux_c(lambda t, x, U, n: -DDBase.BT.BndFlux_cExt(t, x, U))
@@ -38,18 +30,13 @@ def pretransformer(Model, domainDescription):
38
30
  valN = valFc
39
31
  elif hasFlux_v:
40
32
  valN = valFv
41
- boundary[lambda x: DDBase.domain.chi(x) < 0.5] = valN
33
+ boundary[lambda x: DDBase.domain.omega.chi(x) < 0.5] = valN
42
34
 
43
35
  phi = domain.phi
44
36
  epsilon = domain.omega.epsilon
45
- ep = domain.external_projection
37
+ ep = domain.omega.external_projection
46
38
 
47
- def sigma(t, x, U, DU=None):
48
- if DU:
49
- return DU
50
- return grad(U)
51
-
52
- if hasSource_e:
39
+ if hasattr(Model, "S_e"):
53
40
 
54
41
  def S_e(t, x, U, DU):
55
42
  return replace(
@@ -57,7 +44,7 @@ def pretransformer(Model, domainDescription):
57
44
  {x: DDBase.ep(x)},
58
45
  )
59
46
 
60
- if hasSource_i:
47
+ if hasattr(Model, "S_i"):
61
48
 
62
49
  def S_i(t, x, U, DU):
63
50
  return replace(
@@ -65,20 +52,20 @@ def pretransformer(Model, domainDescription):
65
52
  {x: DDBase.ep(x)},
66
53
  )
67
54
 
68
- if hasFlux_c:
55
+ if hasattr(Model, "F_c"):
69
56
 
70
57
  def F_c(t, x, U):
71
- # return Model.F_c(t, DDBase.ep(x), U)
58
+ return Model.F_c(t, DDBase.ep(x), U)
72
59
 
73
60
  return replace(
74
61
  expand_derivatives(Model.F_c(t, x, U)),
75
62
  {x: DDBase.ep(x)},
76
63
  )
77
64
 
78
- if hasFlux_v:
65
+ if hasattr(Model, "F_v"):
79
66
 
80
67
  def F_v(t, x, U, DU):
81
- # return Model.F_v(t, DDBase.ep(x), U, DU)
68
+ return Model.F_v(t, DDBase.ep(x), U, DU)
82
69
 
83
70
  return replace(
84
71
  expand_derivatives(Model.F_v(t, x, U, DU)),
@@ -137,77 +124,3 @@ def pretransformer(Model, domainDescription):
137
124
  )
138
125
 
139
126
  return DDBase
140
-
141
-
142
- def posttransformer(DDModel):
143
- class DDM(DDModel):
144
- if DDModel.hasSource_e or DDModel.hasFlux_c or DDModel.hasOutFactor_e:
145
-
146
- def S_e(t, x, U, DU):
147
- total = zero(U.ufl_shape)
148
-
149
- if DDModel.hasOutFactor_e:
150
- total += DDModel.outFactor_e * DDModel.S_outside(t, x, U, DU)
151
- if DDModel.hasSource_e:
152
- total += DDModel.S_e_source(t, x, U, DU)
153
- if DDModel.hasFlux_c:
154
- total += DDModel.S_e_convection(t, x, U, DU)
155
- return total
156
-
157
- else:
158
- try:
159
- del DDModel.S_e
160
- except AttributeError:
161
- pass
162
-
163
- if DDModel.hasSource_i or DDModel.hasFlux_v or DDModel.hasOutFactor_i:
164
-
165
- def S_i(t, x, U, DU):
166
- total = zero(U.ufl_shape)
167
-
168
- if DDModel.hasOutFactor_i:
169
- total += DDModel.outFactor_i * DDModel.S_outside(t, x, U, DU)
170
- if DDModel.hasSource_i:
171
- total += DDModel.S_i_source(t, x, U, DU)
172
- if DDModel.hasFlux_v:
173
- total += DDModel.S_i_diffusion(t, x, U, DU)
174
- return total
175
-
176
- else:
177
- try:
178
- del DDModel.S_i
179
- except AttributeError:
180
- pass
181
-
182
- if DDModel.hasFlux_c:
183
-
184
- def F_c(t, x, U):
185
- return DDModel.F_c(t, x, U)
186
-
187
- else:
188
- try:
189
- del DDModel.F_c
190
- except AttributeError:
191
- pass
192
-
193
- if DDModel.hasFlux_v:
194
-
195
- def F_v(t, x, U, DU):
196
- return DDModel.F_v(t, x, U, DU)
197
-
198
- else:
199
- try:
200
- del DDModel.F_v
201
- except AttributeError:
202
- pass
203
-
204
- return DDM
205
-
206
-
207
- def transformer(transformer):
208
- def _transformer(OriginalModel, domainDescription):
209
- PreModel = pretransformer(OriginalModel, domainDescription)
210
- Model = transformer(PreModel)
211
- return posttransformer(Model)
212
-
213
- return _transformer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ddfem
3
- Version: 0.9.0
3
+ Version: 1.0.0
4
4
  Summary: Diffuse domain finite element solver
5
5
  Author-email: Luke Benfield <luke.benfield@warwick.ac.uk>, Andreas Dedner <a.s.dedner@warwick.ac.uk>
6
6
  License-Expression: MIT
@@ -12,7 +12,6 @@ Requires-Python: >=3.9
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
14
  Requires-Dist: fenics-ufl>=2022
15
- Requires-Dist: numpy
16
15
  Dynamic: license-file
17
16
 
18
17
  # Diffuse Domain Finite Element Methods
@@ -0,0 +1,27 @@
1
+ ddfem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ ddfem/base_model.py,sha256=BJGMMTy-qa3CuYVJILwcZ4mtY8cVUtzFtn9NOm87IeE,6825
3
+ ddfem/boundary.py,sha256=8PQp7LXlHxA8yn4bQbF_vLljKY4XezJbPkziX9o9IvU,7196
4
+ ddfem/dune.py,sha256=oU4bKiG4AndEhMVhAi1Nnmo9cEhjceTW3X2ptv6ombU,67
5
+ ddfem/model2ufl.py,sha256=PhbaLqJ4DS9EVKdi22f-iFxFsd97qsN-IYK0AU3a2is,4094
6
+ ddfem/geometry/__init__.py,sha256=P4mAihoy07qck7_TI-4m6NlsEM0i4wvuC_Xuo7vxHCY,293
7
+ ddfem/geometry/arc.py,sha256=r8l4zQonfgWzA37B3dVXaZ5UhHgkTXL-4KedVG0PWvk,1365
8
+ ddfem/geometry/box.py,sha256=QwtqYVDmZE9CLWRUqNsmw58WqjvBtG0WBoFruuJZWVs,925
9
+ ddfem/geometry/circle.py,sha256=prlh37BuPIYRxo1v56UAxa2-Os1YJXsNbOWGOOMkWX4,1049
10
+ ddfem/geometry/domain.py,sha256=scATAs_0qkeDuIlQ6ejl2j4GSuOZt1sL3PpT_-6aBh0,1110
11
+ ddfem/geometry/domain_dune.py,sha256=eR3MXlHAE0c9swUWAsNzPEzJyqHHtU2ZMvQDPd7JiCw,2112
12
+ ddfem/geometry/helpers.py,sha256=iykom4lPPQwnInydnUux8dhL1IL5kfOzJvpjSKDGaUw,825
13
+ ddfem/geometry/pie.py,sha256=3X2gv4AdEYCrl5Po089luULQ6TYptEJm1SVAZR1VPHI,993
14
+ ddfem/geometry/primitive_base.py,sha256=d5vedYORVKfJKFQeAULAIJFalZYn5xcZncX93hPYDlc,8041
15
+ ddfem/geometry/vesica.py,sha256=NseyI7SRxGkA_wmw503P25MD524IMhkh1ZEQgUddWFA,1702
16
+ ddfem/transformers/DDM1.py,sha256=pKj0PaB7m7kyLu_iHu0ol9_KU_tHeAatxwDutqRSdks,2854
17
+ ddfem/transformers/Fitted.py,sha256=XTE1U68RVfezC9ascdvEBYmd6F1pn8KW5mHws02Wxns,2550
18
+ ddfem/transformers/Mix0.py,sha256=DUDFt7vUvhQgMlyYSptClTYkZ1jcS2mYbZXcoCy_0zs,5530
19
+ ddfem/transformers/NNS.py,sha256=yeH-sk_p6BgjHo2rThGRoiCqNETnh6Tzc5KJEFEPuqU,5310
20
+ ddfem/transformers/NS.py,sha256=LBno0zhDWc81Lv2yMvxM7YpbWqnrsVUC-t0q39_gZ0k,5604
21
+ ddfem/transformers/__init__.py,sha256=46DtyvhBUqtrWGBfinekdz4ahjoHW4pd7sPL2vdR-Xs,120
22
+ ddfem/transformers/transformer_base.py,sha256=ho7Gz_97dA4W_7Nj6UlSQLKMaAJhdBN_mOhsD1BArRU,3888
23
+ ddfem-1.0.0.dist-info/licenses/LICENSE,sha256=7EI8xVBu6h_7_JlVw-yPhhOZlpY9hP8wal7kHtqKT_E,1074
24
+ ddfem-1.0.0.dist-info/METADATA,sha256=vSTe1NTH9Sleq5jIEkeDVgMVNl1TKWm2392KCsL2TnA,697
25
+ ddfem-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
+ ddfem-1.0.0.dist-info/top_level.txt,sha256=LF2T9-5A2Bak81PqbCcsAex8d5Xrla2Wq8yrlQi-ZtY,6
27
+ ddfem-1.0.0.dist-info/RECORD,,
File without changes
@@ -1,74 +0,0 @@
1
- from dune.ufl import Constant
2
- from ufl import as_vector, conditional, div, dot, grad, outer, sqrt
3
-
4
- from ddfem.boundary import BndFlux_c, BndFlux_v, BndValue
5
-
6
-
7
- def adModel(exact, D, withVelocity, inverted):
8
- class Model:
9
- solution = exact
10
- dimRange = 1
11
- diffFactor = Constant(D)
12
-
13
- # this should probably be a vector of dimRange and then used by
14
- # componentwise multiplication with (u-g):
15
- outFactor_i = diffFactor
16
-
17
- if withVelocity:
18
-
19
- outFactor_e = 1
20
-
21
- def diff(t, x):
22
- return Model.diffFactor * (1 - 0.5 * dot(x, x))
23
-
24
- def F_v(t, x, U, DU):
25
- return Model.diff(t, x) * DU
26
-
27
- if withVelocity:
28
-
29
- def b(t, x):
30
- return Constant([0.9, 0.5]) + 3 * as_vector([x[1], -x[0]])
31
-
32
- def F_c(t, x, U):
33
- return outer(U, Model.b(t, x))
34
-
35
- if exact:
36
-
37
- def S_i(t, x, U, DU):
38
- return -div(Model.F_v(t, x, exact(t, x), grad(exact(t, x)))) + (
39
- exact(t, x) - U
40
- )
41
-
42
- if exact and withVelocity:
43
-
44
- def S_e(t, x, U, DU):
45
- return div(Model.F_c(t, x, exact(t, x)))
46
-
47
- if exact:
48
- valD = BndValue(lambda t, x: exact(t, x))
49
- valFv = BndFlux_v(
50
- lambda t, x, U, DU, n: Model.F_v(t, x, exact(t, x), grad(exact(t, x)))
51
- * n
52
- )
53
-
54
- if withVelocity:
55
- valFc = BndFlux_c(lambda t, x, U, n: Model.F_c(t, x, exact(t, x)) * n)
56
- valN = [valFc, valFv]
57
- else:
58
- valN = valFv
59
-
60
- boundary = {
61
- "sides": valD,
62
- "ends": valN,
63
- }
64
- else:
65
- x0 = as_vector([-0.5, -0.5])
66
- bnd = lambda x: conditional(dot(x - Model.x0, x - Model.x0) < 0.15, 10, 0)
67
- valD = BndValue(lambda t, x, U: as_vector([Model.bnd(x)]))
68
- boundary = {"full": valD}
69
-
70
- if inverted:
71
- for i in range(1, 5):
72
- boundary[i] = valD
73
-
74
- return Model
ddfem/examples/beam.py DELETED
@@ -1,147 +0,0 @@
1
- import numpy as np
2
- import pygmsh
3
- from dune.alugrid import aluConformGrid as leafGridView
4
- from dune.fem import adapt, mark, markNeighbors
5
- from dune.fem.function import gridFunction
6
- from dune.fem.space import lagrange
7
- from dune.fem.view import adaptiveLeafGridView
8
- from dune.grid import cartesianDomain
9
- from dune.ufl import Constant, Space
10
- from ufl import SpatialCoordinate, sqrt
11
-
12
- from ddfem import geometry as gm
13
- from ddfem.geometry.domain_dune import DomainDune
14
-
15
-
16
- def getDomain(initialRefine, version, adaptLevels=0, epsFactor=4.5, *args, **kwargs):
17
-
18
- domain_range = [[-0.1, -0.1], [1.1, 0.25]]
19
- initial_gridsize = [360 * 2**initialRefine, 105 * 2**initialRefine]
20
- h = sqrt(
21
- ((domain_range[1][0] - domain_range[0][0]) / initial_gridsize[0]) ** 2
22
- + ((domain_range[1][1] - domain_range[0][1]) / initial_gridsize[1]) ** 2
23
- )
24
-
25
- def get_eps(h):
26
- return Constant(epsFactor * h * 0.5 ** (adaptLevels / 2), "epsilon")
27
-
28
- rectangles = [
29
- [2, 1, [1, 0.075], "left"],
30
- [2, 0.15, [0, 0.075], "other"],
31
- ]
32
-
33
- sdfs = [gm.Box(c[0], c[1], c[2], name=c[3]) for c in rectangles]
34
- omega = sdfs[0] & sdfs[1]
35
- omega.name = "full"
36
-
37
- h_max = h * 3
38
- h_min = h / 2
39
- radius = 5
40
-
41
- x = SpatialCoordinate(Space(2))
42
- sdf = omega(x)
43
-
44
- def spacing(x, y, epsilon):
45
- r_min = epsilon.value
46
- r_max = radius * epsilon.value
47
- dist = np.abs(sdf((x, y)))
48
- if dist <= r_min:
49
- return geom.characteristic_length_min
50
- elif dist >= r_max:
51
- return geom.characteristic_length_max
52
- else:
53
- # Linear
54
- m = (geom.characteristic_length_max - geom.characteristic_length_min) / (
55
- r_max - r_min
56
- )
57
- return m * (dist - r_min) + geom.characteristic_length_min
58
-
59
- if version == "cartesian":
60
- domain = cartesianDomain(*domain_range, initial_gridsize)
61
- epsilon = get_eps(h)
62
-
63
- elif version == "fitted":
64
- with pygmsh.occ.Geometry() as geom:
65
- geom.characteristic_length_max = h_max
66
- geom.characteristic_length_min = h_min
67
- epsilon = get_eps(h_min)
68
-
69
- rec = geom.add_rectangle([0, 0, 0], 1, 0.15)
70
-
71
- geom.set_mesh_size_callback(
72
- lambda dim, tag, x, y, z, lc: spacing(x, y, epsilon),
73
- ignore_other_mesh_sizes=True,
74
- )
75
-
76
- mesh = geom.generate_mesh()
77
- points, cells = mesh.points, mesh.cells_dict
78
- domain = {
79
- "vertices": points[:, :2].astype(float),
80
- "simplices": cells["triangle"].astype(int),
81
- }
82
-
83
- elif version == "dune_adaptive":
84
- gridsize = [int(j * h / h_max) for j in initial_gridsize]
85
- domain = cartesianDomain(*domain_range, gridsize)
86
-
87
- elif version == "gmsh_adaptive":
88
- with pygmsh.occ.Geometry() as geom:
89
- geom.characteristic_length_max = h_max
90
- geom.characteristic_length_min = h_min
91
- epsilon = get_eps(h_min)
92
-
93
- geom.set_mesh_size_callback(
94
- lambda dim, tag, x, y, z, lc: spacing(x, y, epsilon),
95
- ignore_other_mesh_sizes=True,
96
- )
97
-
98
- geom.add_rectangle(
99
- [domain_range[0][0], domain_range[0][1], 0.0],
100
- domain_range[1][0] - domain_range[0][0],
101
- domain_range[1][1] - domain_range[0][1],
102
- )
103
-
104
- mesh = geom.generate_mesh()
105
- points, cells = mesh.points, mesh.cells_dict
106
- domain = {
107
- "vertices": points[:, :2].astype(float),
108
- "simplices": cells["triangle"].astype(int),
109
- }
110
-
111
- else:
112
- raise ValueError("invalid mesh type")
113
-
114
- gridView = adaptiveLeafGridView(leafGridView(domain))
115
-
116
- if version == "dune_adaptive":
117
- omega.epsilon = get_eps(h_min)
118
- omega.epsilon.value *= radius
119
- epsilon_value = omega.epsilon.value
120
-
121
- marker = mark
122
-
123
- refinements = int(2 * np.log2(h_max / h_min))
124
-
125
- region = gridFunction(
126
- omega.phi(x) * (1 - omega.phi(x)), gridView=gridView
127
- ) # interface
128
-
129
- for j in range(1, refinements + 1):
130
-
131
- omega.epsilon.value = epsilon_value * j / refinements
132
- marker(region, 0.00247262315663, maxLevel=refinements) # 1 epsilon
133
-
134
- adapt(gridView.hierarchicalGrid)
135
-
136
- h_min = h_max * 0.5 ** (j / 2)
137
- epsilon = get_eps(h_min)
138
-
139
- omega.propagate_epsilon(epsilon)
140
- domain = omega
141
-
142
- domain = DomainDune(omega, x, gridView)
143
- # domain.adapt(level=adaptLevels)
144
-
145
- print(f"h={h * 0.5 ** (adaptLevels / 2)}, epsilon={epsilon.value}")
146
-
147
- return gridView, domain