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/examples/single_circle.py
DELETED
@@ -1,135 +0,0 @@
|
|
1
|
-
import numpy as np
|
2
|
-
try:
|
3
|
-
import pygmsh
|
4
|
-
except ImportError:
|
5
|
-
pygmsh = None
|
6
|
-
|
7
|
-
try:
|
8
|
-
import dune
|
9
|
-
except ImportError:
|
10
|
-
print("""
|
11
|
-
Example code requires dune to run. To install run
|
12
|
-
pip install dune-fem
|
13
|
-
""")
|
14
|
-
|
15
|
-
from ddfem import geometry as gm
|
16
|
-
from ddfem.geometry.domain_dune import DomainDune
|
17
|
-
|
18
|
-
from dune.alugrid import aluConformGrid as leafGridView
|
19
|
-
from dune.fem.view import adaptiveLeafGridView
|
20
|
-
from dune.grid import cartesianDomain
|
21
|
-
from dune.ufl import Constant, Space
|
22
|
-
|
23
|
-
from ufl import SpatialCoordinate, sqrt
|
24
|
-
|
25
|
-
def getDomain(initialRefine, version, inverted, adaptLevels=0, epsFactor=4.5):
|
26
|
-
|
27
|
-
shiftx, shifty = sqrt(2) * 1e-6, sqrt(3) * 1e-6
|
28
|
-
domain_range = [[-0.5 + shiftx, -0.5 + shifty], [0.5 + shiftx, 0.5 + shifty]]
|
29
|
-
initial_gridsize = [75 * 2**initialRefine] * 2
|
30
|
-
h = sqrt(
|
31
|
-
((domain_range[1][0] - domain_range[0][0]) / initial_gridsize[0]) ** 2
|
32
|
-
+ ((domain_range[1][1] - domain_range[0][1]) / initial_gridsize[1]) ** 2
|
33
|
-
)
|
34
|
-
epsilon = Constant(epsFactor * h * 0.5 ** (adaptLevels / 2), "epsilon")
|
35
|
-
|
36
|
-
print(f"h={h * 0.5 ** (adaptLevels / 2)}, epsilon={epsilon.value}")
|
37
|
-
|
38
|
-
circles = [
|
39
|
-
[0.3, [0.15, 0.15], "b1"],
|
40
|
-
[0.3, [-0.15, -0.15], "b2"],
|
41
|
-
[0.4, [0, 0], "b3"],
|
42
|
-
]
|
43
|
-
|
44
|
-
b = [gm.Ball(c[0], c[1], epsilon=epsilon, name=c[2]) for c in circles]
|
45
|
-
sdfs = [b[0] | b[1], b[2]]
|
46
|
-
sdfs[0].name = "sides"
|
47
|
-
sdfs[1].name = "ends"
|
48
|
-
omega = b[2] # sdfs[0] & sdfs[1]
|
49
|
-
if inverted:
|
50
|
-
omega = omega.invert()
|
51
|
-
omega.name = "full"
|
52
|
-
|
53
|
-
x = SpatialCoordinate(Space(2))
|
54
|
-
sdf = omega(x)
|
55
|
-
|
56
|
-
def spacing(x, y):
|
57
|
-
r_min = 2*epsilon.value
|
58
|
-
r_max = 32 * epsilon.value
|
59
|
-
dist = np.abs(sdf((x, y)))
|
60
|
-
if dist <= r_min:
|
61
|
-
return geom.characteristic_length_min
|
62
|
-
elif dist >= r_max:
|
63
|
-
return geom.characteristic_length_max
|
64
|
-
else:
|
65
|
-
# Linear
|
66
|
-
m = (geom.characteristic_length_max - geom.characteristic_length_min) / (
|
67
|
-
r_max - r_min
|
68
|
-
)
|
69
|
-
return m * (dist - r_min) + geom.characteristic_length_min
|
70
|
-
|
71
|
-
if version == "cartesian":
|
72
|
-
domain = cartesianDomain(*domain_range, initial_gridsize)
|
73
|
-
|
74
|
-
elif version == "fitted":
|
75
|
-
if pygmsh is None:
|
76
|
-
raise AttributeError("'fitted' requires install pygmsh")
|
77
|
-
with pygmsh.occ.Geometry() as geom:
|
78
|
-
geom.characteristic_length_max = h
|
79
|
-
geom.characteristic_length_min = h
|
80
|
-
|
81
|
-
disks = geom.add_disk([circles[2][1][0], circles[2][1][1], 0.0], circles[2][0])
|
82
|
-
# [geom.add_disk([c[1][0], c[1][1], 0.0], c[0]) for c in circles]
|
83
|
-
|
84
|
-
# ds = geom.boolean_union([disks[0], disks[1]])
|
85
|
-
shape = disks # geom.boolean_intersection([ds, disks[2]])
|
86
|
-
if inverted:
|
87
|
-
rectangle = geom.add_rectangle(
|
88
|
-
[domain_range[0][0], domain_range[0][1], 0.0],
|
89
|
-
domain_range[1][0] - domain_range[0][0],
|
90
|
-
domain_range[1][1] - domain_range[0][1],
|
91
|
-
)
|
92
|
-
geom.boolean_difference(rectangle, shape)
|
93
|
-
|
94
|
-
geom.set_mesh_size_callback(
|
95
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y),
|
96
|
-
ignore_other_mesh_sizes=True,
|
97
|
-
)
|
98
|
-
mesh = geom.generate_mesh()
|
99
|
-
points, cells = mesh.points, mesh.cells_dict
|
100
|
-
domain = {
|
101
|
-
"vertices": points[:, :2].astype(float),
|
102
|
-
"simplices": cells["triangle"].astype(int),
|
103
|
-
}
|
104
|
-
|
105
|
-
elif version == "adaptive":
|
106
|
-
if pygmsh is None:
|
107
|
-
raise AttributeError("'adaptive' requires install pygmsh")
|
108
|
-
with pygmsh.occ.Geometry() as geom:
|
109
|
-
geom.characteristic_length_max = h
|
110
|
-
geom.characteristic_length_min = h
|
111
|
-
|
112
|
-
geom.add_rectangle(
|
113
|
-
[domain_range[0][0], domain_range[0][1], 0.0],
|
114
|
-
domain_range[1][0] - domain_range[0][0],
|
115
|
-
domain_range[1][1] - domain_range[0][1],
|
116
|
-
)
|
117
|
-
|
118
|
-
geom.set_mesh_size_callback(
|
119
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y),
|
120
|
-
ignore_other_mesh_sizes=True,
|
121
|
-
)
|
122
|
-
mesh = geom.generate_mesh()
|
123
|
-
points, cells = mesh.points, mesh.cells_dict
|
124
|
-
domain = {
|
125
|
-
"vertices": points[:, :2].astype(float),
|
126
|
-
"simplices": cells["triangle"].astype(int),
|
127
|
-
}
|
128
|
-
|
129
|
-
gridView = adaptiveLeafGridView(leafGridView(domain))
|
130
|
-
|
131
|
-
domain = DomainDune(omega, x, gridView)
|
132
|
-
domain.adapt(level=adaptLevels)
|
133
|
-
gridView.plot()
|
134
|
-
|
135
|
-
return gridView, domain
|
ddfem/examples/triple_circle.py
DELETED
@@ -1,217 +0,0 @@
|
|
1
|
-
import numpy as np
|
2
|
-
|
3
|
-
try:
|
4
|
-
import pygmsh
|
5
|
-
except ImportError:
|
6
|
-
pygmsh = None
|
7
|
-
|
8
|
-
try:
|
9
|
-
import dune
|
10
|
-
except ImportError:
|
11
|
-
print(
|
12
|
-
"""
|
13
|
-
Example code requires dune to run. To install run
|
14
|
-
pip install dune-fem
|
15
|
-
"""
|
16
|
-
)
|
17
|
-
|
18
|
-
from dune.alugrid import aluConformGrid as leafGridView
|
19
|
-
from dune.fem import adapt, mark, markNeighbors
|
20
|
-
from dune.fem.function import gridFunction
|
21
|
-
from dune.fem.space import lagrange
|
22
|
-
from dune.fem.view import adaptiveLeafGridView
|
23
|
-
from dune.grid import cartesianDomain
|
24
|
-
from dune.ufl import Constant, Space
|
25
|
-
from ufl import SpatialCoordinate, sqrt
|
26
|
-
|
27
|
-
from ddfem import geometry as gm
|
28
|
-
from ddfem.geometry.domain_dune import DomainDune
|
29
|
-
|
30
|
-
|
31
|
-
def getDomain(
|
32
|
-
initialRefine, version, inverted, adaptLevels=0, epsFactor=4.5, smoothing=None
|
33
|
-
):
|
34
|
-
|
35
|
-
gm.SDF.smoothing = smoothing
|
36
|
-
shiftx, shifty = sqrt(2) * 1e-6, sqrt(3) * 1e-6
|
37
|
-
domain_range = [[-0.5 + shiftx, -0.5 + shifty], [0.5 + shiftx, 0.5 + shifty]]
|
38
|
-
initial_gridsize = [100 * 2**initialRefine] * 2
|
39
|
-
h = sqrt(
|
40
|
-
((domain_range[1][0] - domain_range[0][0]) / initial_gridsize[0]) ** 2
|
41
|
-
+ ((domain_range[1][1] - domain_range[0][1]) / initial_gridsize[1]) ** 2
|
42
|
-
)
|
43
|
-
|
44
|
-
def get_eps(h):
|
45
|
-
return Constant(epsFactor * h * 0.5 ** (adaptLevels / 2), "epsilon")
|
46
|
-
|
47
|
-
balls = [
|
48
|
-
[0.3, [0.15, 0.15], "b1"],
|
49
|
-
[0.3, [-0.15, -0.15], "b2"],
|
50
|
-
[0.4, [0, 0], "b3"],
|
51
|
-
]
|
52
|
-
|
53
|
-
b = [gm.Ball(c[0], c[1], name=c[2]) for c in balls]
|
54
|
-
sdfs = [b[0] | b[1], b[2]]
|
55
|
-
sdfs[0].name = "sides"
|
56
|
-
sdfs[1].name = "ends"
|
57
|
-
omega = sdfs[0] & sdfs[1]
|
58
|
-
if inverted:
|
59
|
-
omega = omega.invert()
|
60
|
-
omega.name = "full"
|
61
|
-
|
62
|
-
h_max = h * 3
|
63
|
-
h_min = h / 2
|
64
|
-
radius = 5
|
65
|
-
|
66
|
-
x = SpatialCoordinate(Space(2))
|
67
|
-
sdf = omega(x)
|
68
|
-
|
69
|
-
def spacing(x, y, epsilon):
|
70
|
-
r_min = epsilon.value
|
71
|
-
r_max = radius * epsilon.value
|
72
|
-
dist = np.abs(sdf((x, y)))
|
73
|
-
if dist <= r_min:
|
74
|
-
return geom.characteristic_length_min
|
75
|
-
elif dist >= r_max:
|
76
|
-
return geom.characteristic_length_max
|
77
|
-
else:
|
78
|
-
# Linear
|
79
|
-
m = (geom.characteristic_length_max - geom.characteristic_length_min) / (
|
80
|
-
r_max - r_min
|
81
|
-
)
|
82
|
-
return m * (dist - r_min) + geom.characteristic_length_min
|
83
|
-
|
84
|
-
if version == "cartesian":
|
85
|
-
domain = cartesianDomain(*domain_range, initial_gridsize)
|
86
|
-
epsilon = get_eps(h)
|
87
|
-
|
88
|
-
elif version == "fitted":
|
89
|
-
if pygmsh is None:
|
90
|
-
raise AttributeError("'fitted' requires install pygmsh")
|
91
|
-
with pygmsh.occ.Geometry() as geom:
|
92
|
-
geom.characteristic_length_max = h_max
|
93
|
-
geom.characteristic_length_min = h_min
|
94
|
-
epsilon = get_eps(h_min)
|
95
|
-
|
96
|
-
disks = [geom.add_disk([c[1][0], c[1][1], 0.0], c[0]) for c in balls]
|
97
|
-
|
98
|
-
ds = geom.boolean_union([disks[0], disks[1]])
|
99
|
-
shape = geom.boolean_intersection([ds, disks[2]])
|
100
|
-
if inverted:
|
101
|
-
rectangle = geom.add_rectangle(
|
102
|
-
[domain_range[0][0], domain_range[0][1], 0.0],
|
103
|
-
domain_range[1][0] - domain_range[0][0],
|
104
|
-
domain_range[1][1] - domain_range[0][1],
|
105
|
-
)
|
106
|
-
geom.boolean_difference(rectangle, shape)
|
107
|
-
|
108
|
-
geom.set_mesh_size_callback(
|
109
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y, epsilon),
|
110
|
-
ignore_other_mesh_sizes=True,
|
111
|
-
)
|
112
|
-
mesh = geom.generate_mesh()
|
113
|
-
points, cells = mesh.points, mesh.cells_dict
|
114
|
-
domain = {
|
115
|
-
"vertices": points[:, :2].astype(float),
|
116
|
-
"simplices": cells["triangle"].astype(int),
|
117
|
-
}
|
118
|
-
|
119
|
-
elif version == "dune_adaptive":
|
120
|
-
gridsize = [int(j * h / h_max) for j in initial_gridsize]
|
121
|
-
domain = cartesianDomain(*domain_range, gridsize)
|
122
|
-
|
123
|
-
elif version == "gmsh_adaptive":
|
124
|
-
if pygmsh is None:
|
125
|
-
raise AttributeError("'gmsh_adaptive' requires install pygmsh")
|
126
|
-
with pygmsh.occ.Geometry() as geom:
|
127
|
-
geom.characteristic_length_max = h_max
|
128
|
-
geom.characteristic_length_min = h_min
|
129
|
-
epsilon = get_eps(h_min)
|
130
|
-
|
131
|
-
geom.add_rectangle(
|
132
|
-
[domain_range[0][0], domain_range[0][1], 0.0],
|
133
|
-
domain_range[1][0] - domain_range[0][0],
|
134
|
-
domain_range[1][1] - domain_range[0][1],
|
135
|
-
)
|
136
|
-
|
137
|
-
geom.set_mesh_size_callback(
|
138
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y, epsilon),
|
139
|
-
ignore_other_mesh_sizes=True,
|
140
|
-
)
|
141
|
-
mesh = geom.generate_mesh()
|
142
|
-
points, cells = mesh.points, mesh.cells_dict
|
143
|
-
domain = {
|
144
|
-
"vertices": points[:, :2].astype(float),
|
145
|
-
"simplices": cells["triangle"].astype(int),
|
146
|
-
}
|
147
|
-
|
148
|
-
elif version == "gmsh_embedded":
|
149
|
-
if pygmsh is None:
|
150
|
-
raise AttributeError("'fitted' requires install pygmsh")
|
151
|
-
with pygmsh.occ.Geometry() as geom:
|
152
|
-
geom.characteristic_length_max = h_max
|
153
|
-
geom.characteristic_length_min = h_min
|
154
|
-
epsilon = get_eps(h_min)
|
155
|
-
|
156
|
-
disks = [geom.add_disk([c[1][0], c[1][1], 0.0], c[0]) for c in balls]
|
157
|
-
|
158
|
-
ds = geom.boolean_union([disks[0], disks[1]])
|
159
|
-
shape = geom.boolean_intersection([ds, disks[2]])
|
160
|
-
rectangle = geom.add_rectangle(
|
161
|
-
[domain_range[0][0], domain_range[0][1], 0.0],
|
162
|
-
domain_range[1][0] - domain_range[0][0],
|
163
|
-
domain_range[1][1] - domain_range[0][1],
|
164
|
-
)
|
165
|
-
|
166
|
-
geom.boolean_fragments(rectangle, shape)
|
167
|
-
|
168
|
-
geom.set_mesh_size_callback(
|
169
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y, epsilon),
|
170
|
-
ignore_other_mesh_sizes=True,
|
171
|
-
)
|
172
|
-
mesh = geom.generate_mesh()
|
173
|
-
points, cells = mesh.points, mesh.cells_dict
|
174
|
-
domain = {
|
175
|
-
"vertices": points[:, :2].astype(float),
|
176
|
-
"simplices": cells["triangle"].astype(int),
|
177
|
-
}
|
178
|
-
|
179
|
-
else:
|
180
|
-
raise ValueError("invalid mesh type")
|
181
|
-
|
182
|
-
gridView = adaptiveLeafGridView(leafGridView(domain))
|
183
|
-
|
184
|
-
if version == "dune_adaptive":
|
185
|
-
omega.epsilon = get_eps(h_min)
|
186
|
-
omega.epsilon.value *= radius
|
187
|
-
epsilon_value = omega.epsilon.value
|
188
|
-
|
189
|
-
marker = mark
|
190
|
-
|
191
|
-
refinements = int(2 * np.log2(h_max / h_min))
|
192
|
-
|
193
|
-
region = gridFunction(
|
194
|
-
omega.phi(x) * (1 - omega.phi(x)), gridView=gridView
|
195
|
-
) # interface
|
196
|
-
|
197
|
-
for j in range(1, refinements + 1):
|
198
|
-
|
199
|
-
omega.epsilon.value = epsilon_value * j / refinements
|
200
|
-
marker(region, 0.00247262315663, maxLevel=refinements) # 1 epsilon
|
201
|
-
|
202
|
-
adapt(gridView.hierarchicalGrid)
|
203
|
-
|
204
|
-
h_min = h_max * 0.5 ** (j / 2)
|
205
|
-
epsilon = get_eps(h_min)
|
206
|
-
|
207
|
-
omega.propagate_epsilon(epsilon)
|
208
|
-
domain = omega
|
209
|
-
|
210
|
-
domain = DomainDune(omega, x, gridView)
|
211
|
-
domain.adapt(level=adaptLevels)
|
212
|
-
|
213
|
-
print(
|
214
|
-
f"h_max={h_max}, h_min={h_min * 0.5 ** (adaptLevels / 2)}, epsilon={epsilon.value}"
|
215
|
-
)
|
216
|
-
|
217
|
-
return gridView, domain
|
@@ -1,208 +0,0 @@
|
|
1
|
-
import numpy as np
|
2
|
-
|
3
|
-
try:
|
4
|
-
import pygmsh
|
5
|
-
except ImportError:
|
6
|
-
pygmsh = None
|
7
|
-
|
8
|
-
try:
|
9
|
-
import dune
|
10
|
-
except ImportError:
|
11
|
-
print(
|
12
|
-
"""
|
13
|
-
Example code requires dune to run. To install run
|
14
|
-
pip install dune-fem
|
15
|
-
"""
|
16
|
-
)
|
17
|
-
|
18
|
-
from dune.alugrid import aluConformGrid as leafGridView
|
19
|
-
from dune.fem import adapt, mark, markNeighbors
|
20
|
-
from dune.fem.function import gridFunction
|
21
|
-
from dune.fem.space import lagrange
|
22
|
-
from dune.fem.utility import gridWidth
|
23
|
-
from dune.fem.view import adaptiveLeafGridView
|
24
|
-
from dune.grid import cartesianDomain
|
25
|
-
from dune.ufl import Constant, Space
|
26
|
-
from ufl import SpatialCoordinate, as_vector, sqrt
|
27
|
-
|
28
|
-
from ddfem import geometry as gm
|
29
|
-
from ddfem.geometry.domain_dune import DomainDune
|
30
|
-
|
31
|
-
|
32
|
-
def getDomain(initialRefine, version, adaptLevels=0, epsFactor=4.5, dirichlet=True):
|
33
|
-
|
34
|
-
# gm.SDF.smoothing = 50
|
35
|
-
|
36
|
-
shiftx, shifty = sqrt(2) * 1e-6, sqrt(3) * 1e-6
|
37
|
-
|
38
|
-
if dirichlet:
|
39
|
-
domain_range = [
|
40
|
-
[-0.8 + shiftx, -0.8 + shifty, 0.1], # -0.5
|
41
|
-
[0.8 + shiftx, 0.8 + shifty, 3.3], # 3.2
|
42
|
-
]
|
43
|
-
initial_gridsize = [60, 60, 60]
|
44
|
-
else:
|
45
|
-
domain_range = [
|
46
|
-
[-0.8 + shiftx, -0.8 + shifty, 0.0 - 0.5],
|
47
|
-
[0.8 + shiftx, 0.8 + shifty, 3.2 + 0.5],
|
48
|
-
]
|
49
|
-
initial_gridsize = [60, 60, 80]
|
50
|
-
initial_gridsize = [i * 2**initialRefine for i in initial_gridsize]
|
51
|
-
h = sqrt(
|
52
|
-
((domain_range[1][0] - domain_range[0][0]) / initial_gridsize[0]) ** 2
|
53
|
-
+ ((domain_range[1][1] - domain_range[0][1]) / initial_gridsize[1]) ** 2
|
54
|
-
+ ((domain_range[1][2] - domain_range[0][2]) / initial_gridsize[2]) ** 2
|
55
|
-
)
|
56
|
-
|
57
|
-
def get_eps(h):
|
58
|
-
return Constant(epsFactor * h * 0.5 ** (adaptLevels / 3), "epsilon")
|
59
|
-
|
60
|
-
balls = [
|
61
|
-
[0.3, [0.15, 0.15], "b1"],
|
62
|
-
[0.3, [-0.15, -0.15], "b2"],
|
63
|
-
[0.4, [0, 0], "b3"],
|
64
|
-
]
|
65
|
-
|
66
|
-
b = [gm.Ball(c[0], c[1], name=c[2]) for c in balls]
|
67
|
-
sdfs = [b[0] | b[1], b[2]]
|
68
|
-
face_2d = sdfs[0] & sdfs[1]
|
69
|
-
|
70
|
-
face_2d.name = "beam"
|
71
|
-
|
72
|
-
if dirichlet:
|
73
|
-
length = 4
|
74
|
-
else:
|
75
|
-
length = 3.2
|
76
|
-
omega = face_2d.extrude(length, True)
|
77
|
-
omega.name = "full"
|
78
|
-
|
79
|
-
h_max = h * 3
|
80
|
-
h_min = h / 2
|
81
|
-
radius = 3
|
82
|
-
|
83
|
-
x = SpatialCoordinate(Space(3))
|
84
|
-
sdf = omega(x)
|
85
|
-
|
86
|
-
def spacing(x, y, z, epsilon):
|
87
|
-
r_min = epsilon.value
|
88
|
-
r_max = radius * epsilon.value
|
89
|
-
dist = np.abs(sdf((x, y, z)))
|
90
|
-
if dist <= r_min:
|
91
|
-
return geom.characteristic_length_min
|
92
|
-
elif dist >= r_max:
|
93
|
-
return geom.characteristic_length_max
|
94
|
-
else:
|
95
|
-
# Linear
|
96
|
-
m = (geom.characteristic_length_max - geom.characteristic_length_min) / (
|
97
|
-
r_max - r_min
|
98
|
-
)
|
99
|
-
return m * (dist - r_min) + geom.characteristic_length_min
|
100
|
-
|
101
|
-
if version == "cartesian":
|
102
|
-
domain = cartesianDomain(*domain_range, initial_gridsize)
|
103
|
-
epsilon = get_eps(h)
|
104
|
-
|
105
|
-
elif version == "fitted":
|
106
|
-
if pygmsh is None:
|
107
|
-
raise AttributeError("'fitted' requires install pygmsh")
|
108
|
-
with pygmsh.occ.Geometry() as geom:
|
109
|
-
geom.characteristic_length_max = h_max
|
110
|
-
geom.characteristic_length_min = h_min
|
111
|
-
epsilon = get_eps(h_min)
|
112
|
-
|
113
|
-
disks = [geom.add_disk([c[1][0], c[1][1], 0.0], c[0]) for c in balls]
|
114
|
-
|
115
|
-
ds = geom.boolean_union([disks[0], disks[1]])
|
116
|
-
shape = geom.boolean_intersection([ds, disks[2]])
|
117
|
-
geom.extrude(shape, [0, 0, length])
|
118
|
-
|
119
|
-
geom.set_mesh_size_callback(
|
120
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y, z, epsilon),
|
121
|
-
ignore_other_mesh_sizes=True,
|
122
|
-
)
|
123
|
-
mesh = geom.generate_mesh()
|
124
|
-
points, cells = mesh.points, mesh.cells_dict
|
125
|
-
domain = {
|
126
|
-
"vertices": points[:,].astype(float),
|
127
|
-
"simplices": cells["tetra"].astype(int),
|
128
|
-
}
|
129
|
-
|
130
|
-
elif version == "dune_adaptive":
|
131
|
-
gridsize = [int(j * h / h_max) for j in initial_gridsize]
|
132
|
-
domain = cartesianDomain(*domain_range, gridsize)
|
133
|
-
|
134
|
-
elif version == "gmsh_adaptive":
|
135
|
-
if pygmsh is None:
|
136
|
-
raise AttributeError("'gmsh_adaptive' requires install pygmsh")
|
137
|
-
with pygmsh.occ.Geometry() as geom:
|
138
|
-
geom.characteristic_length_max = h_max
|
139
|
-
geom.characteristic_length_min = h_min
|
140
|
-
epsilon = get_eps(h_min)
|
141
|
-
|
142
|
-
geom.add_box(
|
143
|
-
[0.0, 0.0, 0.0],
|
144
|
-
[
|
145
|
-
domain_range[1][0] - domain_range[0][0],
|
146
|
-
domain_range[1][1] - domain_range[0][1],
|
147
|
-
domain_range[1][2] - domain_range[0][2],
|
148
|
-
],
|
149
|
-
)
|
150
|
-
|
151
|
-
geom.set_mesh_size_callback(
|
152
|
-
lambda dim, tag, x, y, z, lc: spacing(x, y, z, epsilon),
|
153
|
-
ignore_other_mesh_sizes=True,
|
154
|
-
)
|
155
|
-
mesh = geom.generate_mesh()
|
156
|
-
points, cells = mesh.points, mesh.cells_dict
|
157
|
-
domain = {
|
158
|
-
"vertices": points[:,].astype(float),
|
159
|
-
"simplices": cells["tetra"].astype(int),
|
160
|
-
}
|
161
|
-
else:
|
162
|
-
raise ValueError("invalid mesh type")
|
163
|
-
|
164
|
-
gridView = adaptiveLeafGridView(leafGridView(domain))
|
165
|
-
# return gridView, None
|
166
|
-
|
167
|
-
if version == "dune_adaptive":
|
168
|
-
# omega.epsilon = get_eps(h)
|
169
|
-
omega.epsilon = get_eps(h_min)
|
170
|
-
omega.epsilon.value *= radius
|
171
|
-
epsilon_value = omega.epsilon.value
|
172
|
-
|
173
|
-
marker = mark
|
174
|
-
|
175
|
-
refinements = int(3 * np.log2(h_max / h_min))
|
176
|
-
region = gridFunction(
|
177
|
-
omega.phi(x) * (1 - omega.phi(x)), gridView=gridView
|
178
|
-
) # interface
|
179
|
-
|
180
|
-
for j in range(1, refinements + 1):
|
181
|
-
print("refining:", j, gridView.size(2), flush=True)
|
182
|
-
if gridView.size(2) > 5e5:
|
183
|
-
assert j == refinements
|
184
|
-
j -= 1
|
185
|
-
break
|
186
|
-
omega.epsilon.value = epsilon_value * j / refinements
|
187
|
-
marker(region, 0.00247262315663, maxLevel=refinements) # epsilon
|
188
|
-
adapt(gridView.hierarchicalGrid)
|
189
|
-
|
190
|
-
# markNeighbors(region, 0.1, maxLevel=refinements)
|
191
|
-
# marker(region, 0.2, maxLevel=refinements)
|
192
|
-
# adapt(gridView.hierarchicalGrid)
|
193
|
-
# omega.epsilon.value = omega.epsilon.value * 2**(-1/3)
|
194
|
-
|
195
|
-
h_min = h_max * 0.5 ** (j / 3)
|
196
|
-
epsilon = get_eps(h_min)
|
197
|
-
|
198
|
-
omega.propagate_epsilon(epsilon)
|
199
|
-
domain = omega
|
200
|
-
|
201
|
-
domain = DomainDune(omega, x, gridView)
|
202
|
-
# domain.adapt(level=adaptLevels)
|
203
|
-
|
204
|
-
print(
|
205
|
-
f"h_max={h_max}, h_min={h_min * 0.5 ** (adaptLevels / 3)}, epsilon={epsilon.value}"
|
206
|
-
)
|
207
|
-
|
208
|
-
return gridView, domain
|
ddfem/geometry/ball.py
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
from ufl import as_vector
|
2
|
-
|
3
|
-
from .helpers import ufl_length
|
4
|
-
from .primitive_base import ORIGIN, SDF
|
5
|
-
|
6
|
-
|
7
|
-
class Ball(SDF):
|
8
|
-
def __init__(self, radius, center=ORIGIN, *args, **kwargs):
|
9
|
-
self.radius = radius
|
10
|
-
|
11
|
-
if isinstance(center, (list, tuple)):
|
12
|
-
center = as_vector(center)
|
13
|
-
self.center = center
|
14
|
-
|
15
|
-
super().__init__(*args, **kwargs)
|
16
|
-
|
17
|
-
def __repr__(self):
|
18
|
-
return f"Ball({self.radius}, {self.center}, {self._repr_core()})"
|
19
|
-
|
20
|
-
def sdf(self, x):
|
21
|
-
# Note ignore z, if center 2d
|
22
|
-
xx = as_vector([x[i] for i in range(len(self.center))])
|
23
|
-
center_x = xx - self.center
|
24
|
-
return ufl_length(center_x) - self.radius
|
ddfem/geometry/plane.py
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
from ufl import as_vector, dot
|
2
|
-
|
3
|
-
from .primitive_base import SDF
|
4
|
-
|
5
|
-
|
6
|
-
class Plane(SDF):
|
7
|
-
def __init__(self, normal, offset, *args, **kwargs):
|
8
|
-
if isinstance(normal, (list, tuple)):
|
9
|
-
normal = as_vector(normal)
|
10
|
-
self.normal = normal
|
11
|
-
|
12
|
-
self.offset = offset
|
13
|
-
|
14
|
-
super().__init__(*args, **kwargs)
|
15
|
-
|
16
|
-
def __repr__(self):
|
17
|
-
return f"Plane({self.normal}, {self.offset}, {self._repr_core()})"
|
18
|
-
|
19
|
-
def sdf(self, x):
|
20
|
-
return dot(x, self.normal) + self.offset
|
ddfem-0.9.0.dist-info/RECORD
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
ddfem/__init__.py,sha256=N860erjFVjXifNwEQ_ejRF99ub195M6eC9GIOqeIhyU,106
|
2
|
-
ddfem/boundary.py,sha256=qpvvjRBBUZHZULIRovuz1h8U30KQRtYERIJxN5O251c,7570
|
3
|
-
ddfem/dune.py,sha256=oU4bKiG4AndEhMVhAi1Nnmo9cEhjceTW3X2ptv6ombU,67
|
4
|
-
ddfem/model2ufl.py,sha256=lEEmMmZWbcxprHD9pRWwZfIdiLg3ScQkR7V_N48qqAw,4265
|
5
|
-
ddfem/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
ddfem/examples/advection_diffusion.py,sha256=9UPILICF3Sfh3SA7zJk6iDabXmvIa4GowJd62qaWOd8,2081
|
7
|
-
ddfem/examples/beam.py,sha256=awZvrgw92ANJgD1MGhhEVZ0eBsSNmhuwegpS8AHiiPk,4687
|
8
|
-
ddfem/examples/cahn_hilliard.py,sha256=-T6p5-BY98sQ5y9Vcd2YVokamQQ66nA7uUqJDRQjzB0,2308
|
9
|
-
ddfem/examples/chemical_reaction.py,sha256=9zNgGuCT25Z0Z_ru8pNoK1MOOrYA8r3UkfGvmNRQXpw,2488
|
10
|
-
ddfem/examples/constant.py,sha256=6wFiKnsbjMKk9hInJwnCa8d7Thp7uPZGJ-1805V243Y,1508
|
11
|
-
ddfem/examples/five_circle_flat.py,sha256=NbNmmz8jMwfFa7ZfEDUq0g5BF94z_ivvbPA2jVLs6PM,6049
|
12
|
-
ddfem/examples/forchheimer.py,sha256=3mpdYVzRn9tmtq7kQBP-vlx9L7HmAHdqbVVRABRd2TY,1311
|
13
|
-
ddfem/examples/hyperelasticity.py,sha256=YyoZhruTMpTfUIL4ioOkwe9FFPf_ffCMHsMsBV4SZ_w,2373
|
14
|
-
ddfem/examples/linear_elasticity.py,sha256=N3wpzzhD4wRpBqmEYFV39_Nx7RuNgfeEMsTWpdzIdgk,1164
|
15
|
-
ddfem/examples/plaplace.py,sha256=yiuYdJpDrFHl1oLG7WWtAs26x2s9vjSXlTsijXTPBxc,751
|
16
|
-
ddfem/examples/single_circle.py,sha256=m3tg7frVTLnP8Cxfx_6fbvoUb2mJ3ltgNnrX5URAwRw,4601
|
17
|
-
ddfem/examples/triple_circle.py,sha256=bo8ZD1B7biXe1HwVDv97O6B5EVsku5TCft3Oqamay7E,7089
|
18
|
-
ddfem/examples/triple_circle_beam.py,sha256=J9_U2MuRBGnhUT1w_IimuyfTLzds_XD2CCv9o4nWD_w,6607
|
19
|
-
ddfem/geometry/__init__.py,sha256=ePmkipwfdhM88qrStE__n0VFKqvl8AKK4VjsAsivt4Y,295
|
20
|
-
ddfem/geometry/arc.py,sha256=ouK8gxkd2f8RtpAK33p6-zU5RoyMejxEge2IEcCOtR4,1381
|
21
|
-
ddfem/geometry/ball.py,sha256=Q_ped9ay3KypU8sKutAXPH9XkEFJx5hIK7qTCy1Y26E,679
|
22
|
-
ddfem/geometry/box.py,sha256=ecXUMI2a17-hZZyUXol08z7wk3IZn1yHE_CV9YIyR18,915
|
23
|
-
ddfem/geometry/domain.py,sha256=n4Cu1sFy19ONUuQec2EICtoSBYzS-H_sLB2YxU5dads,1363
|
24
|
-
ddfem/geometry/domain_dune.py,sha256=2ArzeRU42o4-TS21DXajPSCXj_3SlgGdehgN7QJhQzc,2600
|
25
|
-
ddfem/geometry/helpers.py,sha256=kunsuciuJJwkcZgDn8A7wbKYSqIAYjdvhei_YfjvVtk,1049
|
26
|
-
ddfem/geometry/pie.py,sha256=WjgYPI6YvkcxPTQB1SjdN22dFQHV0X8kSO6QcXDLBSU,1003
|
27
|
-
ddfem/geometry/plane.py,sha256=hCRLa06yXfXzfms2JIbAusdPf5qFUy9DrjNDfZ-0TGA,500
|
28
|
-
ddfem/geometry/primitive_base.py,sha256=gq3s2CIXk1qBnOEGys217yd_zXQr_UXrDXRpagQ3oiY,9419
|
29
|
-
ddfem/geometry/vesica.py,sha256=g28RxdoDpUiq9QR9sHUJkO05-F3YTDOTOxcNm1tyV4E,1747
|
30
|
-
ddfem/transformers/DDM1.py,sha256=73TW_mCPjdvRGo65D9uMUiw7ygYZCQuGFPIPvEmz43o,1092
|
31
|
-
ddfem/transformers/Fitted.py,sha256=GdaA0znMfw_U_QNAngZSYJB3ZJgH_BAnvrL_viZqals,2908
|
32
|
-
ddfem/transformers/Mix0.py,sha256=ZYeL6jrIIFCvVjCt_evB7sOG0ES3tmm5j-6W8gjK11k,3816
|
33
|
-
ddfem/transformers/NNS.py,sha256=lGQVCd1x6KrzVyOEAIttaDXBFjP9nLBIj9wnp_fvYtg,3416
|
34
|
-
ddfem/transformers/NS.py,sha256=fsih358oeayvmovhTAuddjbx7O0K_faF5qTAMQdHH8s,3612
|
35
|
-
ddfem/transformers/__init__.py,sha256=okno6aFZoIPaJRi_Nw7cM63jpy18rS2yHsSuG7Vb4Og,195
|
36
|
-
ddfem/transformers/transformer_base.py,sha256=Ey6iGk203lnzJOhLjMxyQNgKbclba_RIPpMW22OT7zQ,6347
|
37
|
-
ddfem-0.9.0.dist-info/licenses/LICENSE,sha256=7EI8xVBu6h_7_JlVw-yPhhOZlpY9hP8wal7kHtqKT_E,1074
|
38
|
-
ddfem-0.9.0.dist-info/METADATA,sha256=opemBPw8Y5D8ZSGNGoyYo2t0yosVrtwZqr5_i81_U8E,718
|
39
|
-
ddfem-0.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
40
|
-
ddfem-0.9.0.dist-info/top_level.txt,sha256=LF2T9-5A2Bak81PqbCcsAex8d5Xrla2Wq8yrlQi-ZtY,6
|
41
|
-
ddfem-0.9.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|