fluxfem 0.1.3__py3-none-any.whl → 0.2.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.
- fluxfem/__init__.py +136 -161
- fluxfem/core/__init__.py +172 -41
- fluxfem/core/assembly.py +676 -91
- fluxfem/core/basis.py +73 -52
- fluxfem/core/context_types.py +36 -0
- fluxfem/core/dtypes.py +9 -1
- fluxfem/core/forms.py +15 -1
- fluxfem/core/mixed_assembly.py +263 -0
- fluxfem/core/mixed_space.py +348 -0
- fluxfem/core/mixed_weakform.py +97 -0
- fluxfem/core/solver.py +2 -0
- fluxfem/core/space.py +262 -17
- fluxfem/core/weakform.py +1503 -312
- fluxfem/helpers_wf.py +53 -0
- fluxfem/mesh/__init__.py +54 -2
- fluxfem/mesh/base.py +322 -8
- fluxfem/mesh/contact.py +825 -0
- fluxfem/mesh/dtypes.py +12 -0
- fluxfem/mesh/hex.py +18 -16
- fluxfem/mesh/io.py +8 -4
- fluxfem/mesh/mortar.py +3907 -0
- fluxfem/mesh/supermesh.py +316 -0
- fluxfem/mesh/surface.py +22 -4
- fluxfem/mesh/tet.py +10 -4
- fluxfem/physics/diffusion.py +3 -0
- fluxfem/physics/elasticity/hyperelastic.py +3 -0
- fluxfem/physics/elasticity/linear.py +9 -2
- fluxfem/solver/__init__.py +42 -2
- fluxfem/solver/bc.py +38 -2
- fluxfem/solver/block_matrix.py +132 -0
- fluxfem/solver/block_system.py +454 -0
- fluxfem/solver/cg.py +115 -33
- fluxfem/solver/dirichlet.py +334 -4
- fluxfem/solver/newton.py +237 -60
- fluxfem/solver/petsc.py +439 -0
- fluxfem/solver/preconditioner.py +106 -0
- fluxfem/solver/result.py +18 -0
- fluxfem/solver/solve_runner.py +168 -1
- fluxfem/solver/solver.py +12 -1
- fluxfem/solver/sparse.py +124 -9
- fluxfem-0.2.0.dist-info/METADATA +303 -0
- fluxfem-0.2.0.dist-info/RECORD +59 -0
- fluxfem-0.1.3.dist-info/METADATA +0 -125
- fluxfem-0.1.3.dist-info/RECORD +0 -47
- {fluxfem-0.1.3.dist-info → fluxfem-0.2.0.dist-info}/LICENSE +0 -0
- {fluxfem-0.1.3.dist-info → fluxfem-0.2.0.dist-info}/WHEEL +0 -0
fluxfem/__init__.py
CHANGED
|
@@ -1,159 +1,6 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
FESpacePytree,
|
|
5
|
-
Expr,
|
|
6
|
-
FieldRef,
|
|
7
|
-
ParamRef,
|
|
8
|
-
trial_ref,
|
|
9
|
-
test_ref,
|
|
10
|
-
unknown_ref,
|
|
11
|
-
Params,
|
|
12
|
-
LinearForm,
|
|
13
|
-
BilinearForm,
|
|
14
|
-
ResidualForm,
|
|
15
|
-
MixedWeakForm,
|
|
16
|
-
compile_bilinear,
|
|
17
|
-
compile_linear,
|
|
18
|
-
compile_residual,
|
|
19
|
-
compile_surface_linear,
|
|
20
|
-
compile_mixed_residual,
|
|
21
|
-
sdot,
|
|
22
|
-
dOmega,
|
|
23
|
-
FormContext,
|
|
24
|
-
MixedFormContext,
|
|
25
|
-
FieldPair,
|
|
26
|
-
ElementVector,
|
|
27
|
-
vector_load_form,
|
|
28
|
-
make_space,
|
|
29
|
-
make_space_pytree,
|
|
30
|
-
make_hex_basis,
|
|
31
|
-
make_hex_basis_pytree,
|
|
32
|
-
make_hex_space,
|
|
33
|
-
make_hex_space_pytree,
|
|
34
|
-
make_hex20_basis,
|
|
35
|
-
make_hex20_basis_pytree,
|
|
36
|
-
make_hex20_space,
|
|
37
|
-
make_hex20_space_pytree,
|
|
38
|
-
make_hex27_basis,
|
|
39
|
-
make_hex27_basis_pytree,
|
|
40
|
-
make_hex27_space,
|
|
41
|
-
make_hex27_space_pytree,
|
|
42
|
-
make_tet_basis,
|
|
43
|
-
make_tet_basis_pytree,
|
|
44
|
-
make_tet_space,
|
|
45
|
-
make_tet_space_pytree,
|
|
46
|
-
make_tet10_basis,
|
|
47
|
-
make_tet10_basis_pytree,
|
|
48
|
-
make_tet10_space,
|
|
49
|
-
make_tet10_space_pytree,
|
|
50
|
-
make_element_residual_kernel,
|
|
51
|
-
make_element_jacobian_kernel,
|
|
52
|
-
element_residual,
|
|
53
|
-
element_jacobian,
|
|
54
|
-
make_sparsity_pattern,
|
|
55
|
-
assemble_functional,
|
|
56
|
-
assemble_mass_matrix,
|
|
57
|
-
scalar_body_force_form,
|
|
58
|
-
make_scalar_body_force_form,
|
|
59
|
-
constant_body_force_form,
|
|
60
|
-
vector_body_force_form,
|
|
61
|
-
BaseMeshPytree,
|
|
62
|
-
bbox_predicate,
|
|
63
|
-
plane_predicate,
|
|
64
|
-
axis_plane_predicate,
|
|
65
|
-
slab_predicate,
|
|
66
|
-
HexMesh,
|
|
67
|
-
HexMeshPytree,
|
|
68
|
-
StructuredHexBox,
|
|
69
|
-
SurfaceMesh,
|
|
70
|
-
SurfaceMeshPytree,
|
|
71
|
-
load_gmsh_mesh,
|
|
72
|
-
load_gmsh_hex_mesh,
|
|
73
|
-
load_gmsh_tet_mesh,
|
|
74
|
-
make_surface_from_facets,
|
|
75
|
-
TetMesh,
|
|
76
|
-
TetMeshPytree,
|
|
77
|
-
StructuredTetBox,
|
|
78
|
-
StructuredTetTensorBox,
|
|
79
|
-
tag_axis_minmax_facets,
|
|
80
|
-
HexTriLinearBasis,
|
|
81
|
-
HexTriLinearBasisPytree,
|
|
82
|
-
HexSerendipityBasis20,
|
|
83
|
-
HexSerendipityBasis20Pytree,
|
|
84
|
-
HexTriQuadraticBasis27,
|
|
85
|
-
HexTriQuadraticBasis27Pytree,
|
|
86
|
-
TetLinearBasis,
|
|
87
|
-
TetLinearBasisPytree,
|
|
88
|
-
TetQuadraticBasis10,
|
|
89
|
-
TetQuadraticBasis10Pytree,
|
|
90
|
-
MeshData,
|
|
91
|
-
BasisData,
|
|
92
|
-
SpaceData,
|
|
93
|
-
MeshData,
|
|
94
|
-
BasisData,
|
|
95
|
-
SpaceData,
|
|
96
|
-
lame_parameters,
|
|
97
|
-
isotropic_3d_D,
|
|
98
|
-
spdirect_solve_cpu,
|
|
99
|
-
spdirect_solve_gpu,
|
|
100
|
-
spdirect_solve_jax,
|
|
101
|
-
coo_to_csr,
|
|
102
|
-
SparsityPattern,
|
|
103
|
-
FluxSparseMatrix,
|
|
104
|
-
LinearSolver,
|
|
105
|
-
NonlinearSolver,
|
|
106
|
-
enforce_dirichlet_dense,
|
|
107
|
-
enforce_dirichlet_sparse,
|
|
108
|
-
free_dofs,
|
|
109
|
-
condense_dirichlet_fluxsparse,
|
|
110
|
-
condense_dirichlet_dense,
|
|
111
|
-
expand_dirichlet_solution,
|
|
112
|
-
cg_solve,
|
|
113
|
-
cg_solve_jax,
|
|
114
|
-
NonlinearAnalysis,
|
|
115
|
-
NewtonLoopConfig,
|
|
116
|
-
LoadStepResult,
|
|
117
|
-
NewtonSolveRunner,
|
|
118
|
-
solve_nonlinear,
|
|
119
|
-
LinearAnalysis,
|
|
120
|
-
LinearSolveConfig,
|
|
121
|
-
LinearStepResult,
|
|
122
|
-
LinearSolveRunner,
|
|
123
|
-
newton_solve,
|
|
124
|
-
SurfaceFormField,
|
|
125
|
-
SurfaceFormContext,
|
|
126
|
-
vector_surface_load_form,
|
|
127
|
-
make_vector_surface_load_form,
|
|
128
|
-
assemble_surface_linear_form,
|
|
129
|
-
)
|
|
130
|
-
from .tools.visualizer import write_vtu, write_displacement_vtu
|
|
131
|
-
from .tools.jit import make_jitted_residual, make_jitted_jacobian
|
|
132
|
-
from .physics import (
|
|
133
|
-
linear_elasticity_form,
|
|
134
|
-
vector_body_force_form,
|
|
135
|
-
constant_body_force_vector_form,
|
|
136
|
-
diffusion_form,
|
|
137
|
-
dot,
|
|
138
|
-
ddot,
|
|
139
|
-
transpose_last2,
|
|
140
|
-
sym_grad,
|
|
141
|
-
sym_grad_u,
|
|
142
|
-
right_cauchy_green,
|
|
143
|
-
green_lagrange_strain,
|
|
144
|
-
deformation_gradient,
|
|
145
|
-
pk2_neo_hookean,
|
|
146
|
-
neo_hookean_residual_form,
|
|
147
|
-
make_elastic_point_data,
|
|
148
|
-
write_elastic_vtu,
|
|
149
|
-
make_point_data_displacement,
|
|
150
|
-
write_point_data_vtu,
|
|
151
|
-
interpolate_at_points,
|
|
152
|
-
principal_stresses,
|
|
153
|
-
principal_sum,
|
|
154
|
-
max_shear_stress,
|
|
155
|
-
von_mises_stress,
|
|
156
|
-
)
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib
|
|
157
4
|
|
|
158
5
|
__all__ = [
|
|
159
6
|
"FESpaceBase",
|
|
@@ -165,20 +12,32 @@ __all__ = [
|
|
|
165
12
|
"trial_ref",
|
|
166
13
|
"test_ref",
|
|
167
14
|
"unknown_ref",
|
|
15
|
+
"zero_ref",
|
|
168
16
|
"Params",
|
|
169
17
|
"LinearForm",
|
|
170
18
|
"BilinearForm",
|
|
171
19
|
"ResidualForm",
|
|
172
20
|
"MixedWeakForm",
|
|
21
|
+
"make_mixed_residuals",
|
|
22
|
+
"kernel",
|
|
23
|
+
"MixedFESpace",
|
|
24
|
+
"MixedProblem",
|
|
25
|
+
"MixedDirichletBC",
|
|
26
|
+
"MixedBlockSystem",
|
|
173
27
|
"compile_bilinear",
|
|
174
28
|
"compile_linear",
|
|
175
29
|
"compile_residual",
|
|
176
30
|
"compile_surface_linear",
|
|
31
|
+
"compile_surface_bilinear",
|
|
32
|
+
"compile_mixed_surface_residual",
|
|
177
33
|
"compile_mixed_residual",
|
|
34
|
+
"outer",
|
|
178
35
|
"sdot",
|
|
179
36
|
"dOmega",
|
|
180
37
|
"FormContext",
|
|
181
38
|
"MixedFormContext",
|
|
39
|
+
"VolumeContext",
|
|
40
|
+
"SurfaceContext",
|
|
182
41
|
"FieldPair",
|
|
183
42
|
"ElementVector",
|
|
184
43
|
"vector_load_form",
|
|
@@ -208,10 +67,15 @@ __all__ = [
|
|
|
208
67
|
"BasisData",
|
|
209
68
|
"SpaceData",
|
|
210
69
|
"make_element_residual_kernel",
|
|
70
|
+
"make_element_bilinear_kernel",
|
|
71
|
+
"make_element_linear_kernel",
|
|
211
72
|
"make_element_jacobian_kernel",
|
|
73
|
+
"make_element_kernel",
|
|
212
74
|
"element_residual",
|
|
213
75
|
"element_jacobian",
|
|
214
76
|
"make_sparsity_pattern",
|
|
77
|
+
"chunk_pad_stats",
|
|
78
|
+
"BatchedAssembler",
|
|
215
79
|
"assemble_functional",
|
|
216
80
|
"assemble_mass_matrix",
|
|
217
81
|
"scalar_body_force_form",
|
|
@@ -238,20 +102,54 @@ __all__ = [
|
|
|
238
102
|
"StructuredHexBox",
|
|
239
103
|
"SurfaceMesh",
|
|
240
104
|
"SurfaceMeshPytree",
|
|
105
|
+
"SurfaceWithElemConn",
|
|
106
|
+
"surface_with_elem_conn",
|
|
241
107
|
"SurfaceFormField",
|
|
242
108
|
"SurfaceFormContext",
|
|
109
|
+
"SurfaceBilinearContext",
|
|
110
|
+
"SurfaceSupermesh",
|
|
243
111
|
"vector_surface_load_form",
|
|
244
112
|
"make_vector_surface_load_form",
|
|
245
113
|
"assemble_surface_linear_form",
|
|
114
|
+
"assemble_surface_bilinear_form",
|
|
115
|
+
"MortarMatrix",
|
|
116
|
+
"assemble_mortar_matrices",
|
|
117
|
+
"assemble_contact_onesided_floor",
|
|
118
|
+
"assemble_mixed_surface_residual",
|
|
119
|
+
"assemble_mixed_surface_jacobian",
|
|
120
|
+
"map_surface_facets_to_tet_elements",
|
|
121
|
+
"map_surface_facets_to_hex_elements",
|
|
122
|
+
"tri_area",
|
|
123
|
+
"tri_quadrature",
|
|
124
|
+
"facet_triangles",
|
|
125
|
+
"facet_shape_values",
|
|
126
|
+
"volume_shape_values_at_points",
|
|
127
|
+
"quad_shape_and_local",
|
|
128
|
+
"quad9_shape_values",
|
|
129
|
+
"hex27_gradN",
|
|
130
|
+
"ContactSurfaceSpace",
|
|
131
|
+
"ContactSide",
|
|
132
|
+
"OneSidedContact",
|
|
133
|
+
"OneSidedContactSurfaceSpace",
|
|
134
|
+
"facet_gap_values",
|
|
135
|
+
"active_contact_facets",
|
|
136
|
+
"tag_axis_minmax_facets",
|
|
246
137
|
"load_gmsh_mesh",
|
|
247
138
|
"load_gmsh_hex_mesh",
|
|
248
139
|
"load_gmsh_tet_mesh",
|
|
249
140
|
"make_surface_from_facets",
|
|
141
|
+
"build_surface_supermesh",
|
|
142
|
+
"MortarMatrix",
|
|
143
|
+
"assemble_mortar_matrices",
|
|
144
|
+
"assemble_mixed_surface_residual",
|
|
145
|
+
"assemble_mixed_surface_jacobian",
|
|
146
|
+
"map_surface_facets_to_tet_elements",
|
|
250
147
|
"TetMesh",
|
|
251
148
|
"TetMeshPytree",
|
|
252
149
|
"StructuredTetBox",
|
|
253
150
|
"StructuredTetTensorBox",
|
|
254
151
|
"BaseMeshPytree",
|
|
152
|
+
"SurfaceWithFacetMap",
|
|
255
153
|
"bbox_predicate",
|
|
256
154
|
"plane_predicate",
|
|
257
155
|
"axis_plane_predicate",
|
|
@@ -274,15 +172,35 @@ __all__ = [
|
|
|
274
172
|
"coo_to_csr",
|
|
275
173
|
"SparsityPattern",
|
|
276
174
|
"FluxSparseMatrix",
|
|
175
|
+
"coalesce_coo",
|
|
176
|
+
"concat_flux",
|
|
177
|
+
"block_diag_flux",
|
|
178
|
+
"build_block_system",
|
|
179
|
+
"split_block_matrix",
|
|
180
|
+
"BlockSystem",
|
|
277
181
|
"LinearSolver",
|
|
278
182
|
"NonlinearSolver",
|
|
183
|
+
"petsc_solve",
|
|
184
|
+
"petsc_shell_solve",
|
|
185
|
+
"petsc_is_available",
|
|
186
|
+
"DirichletBC",
|
|
279
187
|
"enforce_dirichlet_dense",
|
|
188
|
+
"enforce_dirichlet_dense_jax",
|
|
189
|
+
"enforce_dirichlet_fluxsparse",
|
|
280
190
|
"enforce_dirichlet_sparse",
|
|
191
|
+
"enforce_dirichlet_system",
|
|
192
|
+
"split_dirichlet_matrix",
|
|
281
193
|
"free_dofs",
|
|
282
194
|
"condense_dirichlet_fluxsparse",
|
|
195
|
+
"condense_dirichlet_fluxsparse_coo",
|
|
283
196
|
"condense_dirichlet_dense",
|
|
197
|
+
"restrict_flux_to_free",
|
|
284
198
|
"expand_dirichlet_solution",
|
|
199
|
+
"condense_dirichlet_system",
|
|
285
200
|
"cg_solve",
|
|
201
|
+
"make_block_jacobi_preconditioner",
|
|
202
|
+
"build_cg_operator",
|
|
203
|
+
"CGOperator",
|
|
286
204
|
"NonlinearAnalysis",
|
|
287
205
|
"NewtonLoopConfig",
|
|
288
206
|
"LoadStepResult",
|
|
@@ -297,6 +215,7 @@ __all__ = [
|
|
|
297
215
|
"write_displacement_vtu",
|
|
298
216
|
"make_jitted_residual",
|
|
299
217
|
"make_jitted_jacobian",
|
|
218
|
+
"block",
|
|
300
219
|
"make_elastic_point_data",
|
|
301
220
|
"write_elastic_vtu",
|
|
302
221
|
"make_point_data_displacement",
|
|
@@ -307,11 +226,71 @@ __all__ = [
|
|
|
307
226
|
"von_mises_stress",
|
|
308
227
|
]
|
|
309
228
|
|
|
229
|
+
_PHYSICS_EXPORTS = {
|
|
230
|
+
"lame_parameters",
|
|
231
|
+
"isotropic_3d_D",
|
|
232
|
+
"linear_elasticity_form",
|
|
233
|
+
"vector_body_force_form",
|
|
234
|
+
"constant_body_force_vector_form",
|
|
235
|
+
"diffusion_form",
|
|
236
|
+
"dot",
|
|
237
|
+
"ddot",
|
|
238
|
+
"transpose_last2",
|
|
239
|
+
"sym_grad",
|
|
240
|
+
"sym_grad_u",
|
|
241
|
+
"right_cauchy_green",
|
|
242
|
+
"green_lagrange_strain",
|
|
243
|
+
"deformation_gradient",
|
|
244
|
+
"pk2_neo_hookean",
|
|
245
|
+
"neo_hookean_residual_form",
|
|
246
|
+
"make_elastic_point_data",
|
|
247
|
+
"write_elastic_vtu",
|
|
248
|
+
"make_point_data_displacement",
|
|
249
|
+
"write_point_data_vtu",
|
|
250
|
+
"interpolate_at_points",
|
|
251
|
+
"principal_stresses",
|
|
252
|
+
"principal_sum",
|
|
253
|
+
"max_shear_stress",
|
|
254
|
+
"von_mises_stress",
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
_TOOLS_VIS_EXPORTS = {
|
|
258
|
+
"write_vtu",
|
|
259
|
+
"write_displacement_vtu",
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
_TOOLS_JIT_EXPORTS = {
|
|
263
|
+
"make_jitted_residual",
|
|
264
|
+
"make_jitted_jacobian",
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
_CORE_EXPORTS = set(__all__) - _PHYSICS_EXPORTS - _TOOLS_VIS_EXPORTS - _TOOLS_JIT_EXPORTS
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def __getattr__(name: str):
|
|
271
|
+
if name in _PHYSICS_EXPORTS:
|
|
272
|
+
module = importlib.import_module(".physics", __name__)
|
|
273
|
+
elif name in _TOOLS_VIS_EXPORTS:
|
|
274
|
+
module = importlib.import_module(".tools.visualizer", __name__)
|
|
275
|
+
elif name in _TOOLS_JIT_EXPORTS:
|
|
276
|
+
module = importlib.import_module(".tools.jit", __name__)
|
|
277
|
+
elif name in _CORE_EXPORTS:
|
|
278
|
+
module = importlib.import_module(".core", __name__)
|
|
279
|
+
else:
|
|
280
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
281
|
+
|
|
282
|
+
value = getattr(module, name)
|
|
283
|
+
globals()[name] = value
|
|
284
|
+
return value
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def __dir__():
|
|
288
|
+
return sorted(set(globals()) | set(__all__))
|
|
289
|
+
|
|
310
290
|
|
|
311
291
|
try:
|
|
312
292
|
from importlib.metadata import version, PackageNotFoundError
|
|
313
293
|
except ImportError:
|
|
314
|
-
# old python
|
|
315
294
|
from importlib_metadata import version, PackageNotFoundError
|
|
316
295
|
|
|
317
296
|
|
|
@@ -320,21 +299,17 @@ def read_version_from_pyproject():
|
|
|
320
299
|
import re
|
|
321
300
|
|
|
322
301
|
root = pathlib.Path(__file__).resolve().parent.parent
|
|
323
|
-
# while root != root.parent and depth < max_depth:
|
|
324
302
|
pyproject_path = root / "pyproject.toml"
|
|
325
303
|
if pyproject_path.exists():
|
|
326
304
|
content = pyproject_path.read_text()
|
|
327
305
|
match = re.search(r'version\s*=\s*"(.*?)"', content)
|
|
328
306
|
if match:
|
|
329
307
|
return match.group(1)
|
|
330
|
-
# root = root.parent
|
|
331
|
-
# depth += 1
|
|
332
308
|
return "0.0.0"
|
|
333
309
|
|
|
334
310
|
|
|
335
311
|
def get_version(package_name):
|
|
336
312
|
try:
|
|
337
|
-
# print("version-", version(package_name))
|
|
338
313
|
return version(package_name)
|
|
339
314
|
except PackageNotFoundError:
|
|
340
315
|
return read_version_from_pyproject()
|