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.
Files changed (46) hide show
  1. fluxfem/__init__.py +136 -161
  2. fluxfem/core/__init__.py +172 -41
  3. fluxfem/core/assembly.py +676 -91
  4. fluxfem/core/basis.py +73 -52
  5. fluxfem/core/context_types.py +36 -0
  6. fluxfem/core/dtypes.py +9 -1
  7. fluxfem/core/forms.py +15 -1
  8. fluxfem/core/mixed_assembly.py +263 -0
  9. fluxfem/core/mixed_space.py +348 -0
  10. fluxfem/core/mixed_weakform.py +97 -0
  11. fluxfem/core/solver.py +2 -0
  12. fluxfem/core/space.py +262 -17
  13. fluxfem/core/weakform.py +1503 -312
  14. fluxfem/helpers_wf.py +53 -0
  15. fluxfem/mesh/__init__.py +54 -2
  16. fluxfem/mesh/base.py +322 -8
  17. fluxfem/mesh/contact.py +825 -0
  18. fluxfem/mesh/dtypes.py +12 -0
  19. fluxfem/mesh/hex.py +18 -16
  20. fluxfem/mesh/io.py +8 -4
  21. fluxfem/mesh/mortar.py +3907 -0
  22. fluxfem/mesh/supermesh.py +316 -0
  23. fluxfem/mesh/surface.py +22 -4
  24. fluxfem/mesh/tet.py +10 -4
  25. fluxfem/physics/diffusion.py +3 -0
  26. fluxfem/physics/elasticity/hyperelastic.py +3 -0
  27. fluxfem/physics/elasticity/linear.py +9 -2
  28. fluxfem/solver/__init__.py +42 -2
  29. fluxfem/solver/bc.py +38 -2
  30. fluxfem/solver/block_matrix.py +132 -0
  31. fluxfem/solver/block_system.py +454 -0
  32. fluxfem/solver/cg.py +115 -33
  33. fluxfem/solver/dirichlet.py +334 -4
  34. fluxfem/solver/newton.py +237 -60
  35. fluxfem/solver/petsc.py +439 -0
  36. fluxfem/solver/preconditioner.py +106 -0
  37. fluxfem/solver/result.py +18 -0
  38. fluxfem/solver/solve_runner.py +168 -1
  39. fluxfem/solver/solver.py +12 -1
  40. fluxfem/solver/sparse.py +124 -9
  41. fluxfem-0.2.0.dist-info/METADATA +303 -0
  42. fluxfem-0.2.0.dist-info/RECORD +59 -0
  43. fluxfem-0.1.3.dist-info/METADATA +0 -125
  44. fluxfem-0.1.3.dist-info/RECORD +0 -47
  45. {fluxfem-0.1.3.dist-info → fluxfem-0.2.0.dist-info}/LICENSE +0 -0
  46. {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 .core import (
2
- FESpaceBase,
3
- FESpace,
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()