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.
- ddfem/__init__.py +0 -4
- ddfem/base_model.py +200 -0
- ddfem/boundary.py +3 -12
- ddfem/geometry/__init__.py +3 -3
- ddfem/geometry/arc.py +8 -10
- ddfem/geometry/box.py +8 -7
- ddfem/geometry/circle.py +39 -0
- ddfem/geometry/domain.py +4 -16
- ddfem/geometry/domain_dune.py +0 -16
- ddfem/geometry/helpers.py +12 -19
- ddfem/geometry/pie.py +7 -7
- ddfem/geometry/primitive_base.py +70 -129
- ddfem/geometry/vesica.py +6 -7
- ddfem/model2ufl.py +4 -10
- ddfem/transformers/DDM1.py +68 -10
- ddfem/transformers/Fitted.py +12 -22
- ddfem/transformers/Mix0.py +64 -10
- ddfem/transformers/NNS.py +72 -11
- ddfem/transformers/NS.py +79 -14
- ddfem/transformers/__init__.py +0 -1
- ddfem/transformers/transformer_base.py +15 -102
- {ddfem-0.9.0.dist-info → ddfem-1.0.0.dist-info}/METADATA +1 -2
- ddfem-1.0.0.dist-info/RECORD +27 -0
- ddfem/examples/__init__.py +0 -0
- ddfem/examples/advection_diffusion.py +0 -74
- ddfem/examples/beam.py +0 -147
- ddfem/examples/cahn_hilliard.py +0 -67
- ddfem/examples/chemical_reaction.py +0 -88
- ddfem/examples/constant.py +0 -46
- ddfem/examples/five_circle_flat.py +0 -197
- ddfem/examples/forchheimer.py +0 -48
- ddfem/examples/hyperelasticity.py +0 -88
- ddfem/examples/linear_elasticity.py +0 -45
- ddfem/examples/plaplace.py +0 -29
- ddfem/examples/single_circle.py +0 -135
- ddfem/examples/triple_circle.py +0 -217
- ddfem/examples/triple_circle_beam.py +0 -208
- ddfem/geometry/ball.py +0 -24
- ddfem/geometry/plane.py +0 -20
- ddfem-0.9.0.dist-info/RECORD +0 -41
- {ddfem-0.9.0.dist-info → ddfem-1.0.0.dist-info}/WHEEL +0 -0
- {ddfem-0.9.0.dist-info → ddfem-1.0.0.dist-info}/licenses/LICENSE +0 -0
- {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
|
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
|
-
|
33
|
-
|
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
|
63
|
+
convec += DDModel.BT.BndFlux_cExt(t, x, U)
|
55
64
|
return convec
|
56
65
|
|
57
|
-
|
58
|
-
|
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
|
-
|
77
|
-
|
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
|
-
|
80
|
-
|
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
|
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
|
-
|
33
|
-
|
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
|
63
|
+
convec += DDModel.BT.BndFlux_cExt(t, x, U)
|
55
64
|
return convec
|
56
65
|
|
57
|
-
|
58
|
-
|
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
|
-
|
77
|
-
|
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
|
-
|
80
|
-
|
115
|
+
elif hasattr(Model, "F_v"):
|
116
|
+
print("NSDDM: F_v")
|
81
117
|
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
ddfem/transformers/__init__.py
CHANGED
@@ -1,30 +1,22 @@
|
|
1
|
-
from ufl import as_matrix, diff, dot,
|
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
|
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(
|
23
|
-
|
24
|
-
|
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
|
-
|
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
|
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
|
55
|
+
if hasattr(Model, "F_c"):
|
69
56
|
|
70
57
|
def F_c(t, x, U):
|
71
|
-
|
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
|
65
|
+
if hasattr(Model, "F_v"):
|
79
66
|
|
80
67
|
def F_v(t, x, U, DU):
|
81
|
-
|
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.
|
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,,
|
ddfem/examples/__init__.py
DELETED
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
|