fluxfem 0.1.4__py3-none-any.whl → 0.2.1__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 (53) hide show
  1. fluxfem/__init__.py +69 -13
  2. fluxfem/core/__init__.py +140 -53
  3. fluxfem/core/assembly.py +691 -97
  4. fluxfem/core/basis.py +75 -54
  5. fluxfem/core/context_types.py +36 -12
  6. fluxfem/core/dtypes.py +9 -1
  7. fluxfem/core/forms.py +10 -0
  8. fluxfem/core/mixed_assembly.py +263 -0
  9. fluxfem/core/mixed_space.py +382 -0
  10. fluxfem/core/mixed_weakform.py +97 -0
  11. fluxfem/core/solver.py +2 -0
  12. fluxfem/core/space.py +315 -30
  13. fluxfem/core/weakform.py +821 -42
  14. fluxfem/helpers_wf.py +49 -0
  15. fluxfem/mesh/__init__.py +54 -2
  16. fluxfem/mesh/base.py +318 -9
  17. fluxfem/mesh/contact.py +841 -0
  18. fluxfem/mesh/dtypes.py +12 -0
  19. fluxfem/mesh/hex.py +17 -16
  20. fluxfem/mesh/io.py +9 -6
  21. fluxfem/mesh/mortar.py +3970 -0
  22. fluxfem/mesh/supermesh.py +318 -0
  23. fluxfem/mesh/surface.py +104 -26
  24. fluxfem/mesh/tet.py +16 -7
  25. fluxfem/physics/diffusion.py +3 -0
  26. fluxfem/physics/elasticity/hyperelastic.py +35 -3
  27. fluxfem/physics/elasticity/linear.py +22 -4
  28. fluxfem/physics/elasticity/stress.py +9 -5
  29. fluxfem/physics/operators.py +12 -5
  30. fluxfem/physics/postprocess.py +29 -3
  31. fluxfem/solver/__init__.py +47 -2
  32. fluxfem/solver/bc.py +38 -2
  33. fluxfem/solver/block_matrix.py +284 -0
  34. fluxfem/solver/block_system.py +477 -0
  35. fluxfem/solver/cg.py +150 -55
  36. fluxfem/solver/dirichlet.py +358 -5
  37. fluxfem/solver/history.py +15 -3
  38. fluxfem/solver/newton.py +260 -70
  39. fluxfem/solver/petsc.py +445 -0
  40. fluxfem/solver/preconditioner.py +109 -0
  41. fluxfem/solver/result.py +18 -0
  42. fluxfem/solver/solve_runner.py +208 -23
  43. fluxfem/solver/solver.py +35 -12
  44. fluxfem/solver/sparse.py +149 -15
  45. fluxfem/tools/jit.py +19 -7
  46. fluxfem/tools/timer.py +14 -12
  47. fluxfem/tools/visualizer.py +16 -4
  48. fluxfem-0.2.1.dist-info/METADATA +314 -0
  49. fluxfem-0.2.1.dist-info/RECORD +59 -0
  50. fluxfem-0.1.4.dist-info/METADATA +0 -127
  51. fluxfem-0.1.4.dist-info/RECORD +0 -48
  52. {fluxfem-0.1.4.dist-info → fluxfem-0.2.1.dist-info}/LICENSE +0 -0
  53. {fluxfem-0.1.4.dist-info → fluxfem-0.2.1.dist-info}/WHEEL +0 -0
fluxfem/__init__.py CHANGED
@@ -12,19 +12,25 @@ __all__ = [
12
12
  "trial_ref",
13
13
  "test_ref",
14
14
  "unknown_ref",
15
+ "zero_ref",
15
16
  "Params",
16
17
  "LinearForm",
17
18
  "BilinearForm",
18
19
  "ResidualForm",
19
20
  "MixedWeakForm",
21
+ "make_mixed_residuals",
22
+ "kernel",
23
+ "MixedFESpace",
24
+ "MixedProblem",
25
+ "MixedDirichletBC",
26
+ "MixedBlockSystem",
20
27
  "compile_bilinear",
21
28
  "compile_linear",
22
29
  "compile_residual",
23
30
  "compile_surface_linear",
31
+ "compile_surface_bilinear",
32
+ "compile_mixed_surface_residual",
24
33
  "compile_mixed_residual",
25
- "outer",
26
- "sdot",
27
- "dOmega",
28
34
  "FormContext",
29
35
  "MixedFormContext",
30
36
  "VolumeContext",
@@ -58,10 +64,15 @@ __all__ = [
58
64
  "BasisData",
59
65
  "SpaceData",
60
66
  "make_element_residual_kernel",
67
+ "make_element_bilinear_kernel",
68
+ "make_element_linear_kernel",
61
69
  "make_element_jacobian_kernel",
70
+ "make_element_kernel",
62
71
  "element_residual",
63
72
  "element_jacobian",
64
73
  "make_sparsity_pattern",
74
+ "chunk_pad_stats",
75
+ "BatchedAssembler",
65
76
  "assemble_functional",
66
77
  "assemble_mass_matrix",
67
78
  "scalar_body_force_form",
@@ -71,11 +82,6 @@ __all__ = [
71
82
  "constant_body_force_form",
72
83
  "constant_body_force_vector_form",
73
84
  "diffusion_form",
74
- "dot",
75
- "ddot",
76
- "transpose_last2",
77
- "sym_grad",
78
- "sym_grad_u",
79
85
  "right_cauchy_green",
80
86
  "green_lagrange_strain",
81
87
  "deformation_gradient",
@@ -88,21 +94,54 @@ __all__ = [
88
94
  "StructuredHexBox",
89
95
  "SurfaceMesh",
90
96
  "SurfaceMeshPytree",
97
+ "SurfaceWithElemConn",
98
+ "surface_with_elem_conn",
91
99
  "SurfaceFormField",
92
100
  "SurfaceFormContext",
101
+ "SurfaceBilinearContext",
102
+ "SurfaceSupermesh",
93
103
  "vector_surface_load_form",
94
104
  "make_vector_surface_load_form",
95
105
  "assemble_surface_linear_form",
106
+ "assemble_surface_bilinear_form",
107
+ "MortarMatrix",
108
+ "assemble_mortar_matrices",
109
+ "assemble_contact_onesided_floor",
110
+ "assemble_mixed_surface_residual",
111
+ "assemble_mixed_surface_jacobian",
112
+ "map_surface_facets_to_tet_elements",
113
+ "map_surface_facets_to_hex_elements",
114
+ "tri_area",
115
+ "tri_quadrature",
116
+ "facet_triangles",
117
+ "facet_shape_values",
118
+ "volume_shape_values_at_points",
119
+ "quad_shape_and_local",
120
+ "quad9_shape_values",
121
+ "hex27_gradN",
122
+ "ContactSurfaceSpace",
123
+ "ContactSide",
124
+ "OneSidedContact",
125
+ "OneSidedContactSurfaceSpace",
126
+ "facet_gap_values",
127
+ "active_contact_facets",
96
128
  "tag_axis_minmax_facets",
97
129
  "load_gmsh_mesh",
98
130
  "load_gmsh_hex_mesh",
99
131
  "load_gmsh_tet_mesh",
100
132
  "make_surface_from_facets",
133
+ "build_surface_supermesh",
134
+ "MortarMatrix",
135
+ "assemble_mortar_matrices",
136
+ "assemble_mixed_surface_residual",
137
+ "assemble_mixed_surface_jacobian",
138
+ "map_surface_facets_to_tet_elements",
101
139
  "TetMesh",
102
140
  "TetMeshPytree",
103
141
  "StructuredTetBox",
104
142
  "StructuredTetTensorBox",
105
143
  "BaseMeshPytree",
144
+ "SurfaceWithFacetMap",
106
145
  "bbox_predicate",
107
146
  "plane_predicate",
108
147
  "axis_plane_predicate",
@@ -125,15 +164,36 @@ __all__ = [
125
164
  "coo_to_csr",
126
165
  "SparsityPattern",
127
166
  "FluxSparseMatrix",
167
+ "FluxBlockMatrix",
168
+ "coalesce_coo",
169
+ "concat_flux",
170
+ "block_diag_flux",
171
+ "build_block_system",
172
+ "split_block_matrix",
173
+ "BlockSystem",
128
174
  "LinearSolver",
129
175
  "NonlinearSolver",
176
+ "petsc_solve",
177
+ "petsc_shell_solve",
178
+ "petsc_is_available",
179
+ "DirichletBC",
130
180
  "enforce_dirichlet_dense",
181
+ "enforce_dirichlet_dense_jax",
182
+ "enforce_dirichlet_fluxsparse",
131
183
  "enforce_dirichlet_sparse",
184
+ "enforce_dirichlet_system",
185
+ "split_dirichlet_matrix",
132
186
  "free_dofs",
133
187
  "condense_dirichlet_fluxsparse",
188
+ "condense_dirichlet_fluxsparse_coo",
134
189
  "condense_dirichlet_dense",
190
+ "restrict_flux_to_free",
135
191
  "expand_dirichlet_solution",
192
+ "condense_dirichlet_system",
136
193
  "cg_solve",
194
+ "make_block_jacobi_preconditioner",
195
+ "build_cg_operator",
196
+ "CGOperator",
137
197
  "NonlinearAnalysis",
138
198
  "NewtonLoopConfig",
139
199
  "LoadStepResult",
@@ -148,6 +208,7 @@ __all__ = [
148
208
  "write_displacement_vtu",
149
209
  "make_jitted_residual",
150
210
  "make_jitted_jacobian",
211
+ "block",
151
212
  "make_elastic_point_data",
152
213
  "write_elastic_vtu",
153
214
  "make_point_data_displacement",
@@ -165,11 +226,6 @@ _PHYSICS_EXPORTS = {
165
226
  "vector_body_force_form",
166
227
  "constant_body_force_vector_form",
167
228
  "diffusion_form",
168
- "dot",
169
- "ddot",
170
- "transpose_last2",
171
- "sym_grad",
172
- "sym_grad_u",
173
229
  "right_cauchy_green",
174
230
  "green_lagrange_strain",
175
231
  "deformation_gradient",
fluxfem/core/__init__.py CHANGED
@@ -17,6 +17,7 @@ from .space import (
17
17
  make_hex27_space,
18
18
  make_hex27_space_pytree,
19
19
  )
20
+ from .mixed_space import MixedFESpace, MixedProblem, MixedDirichletBC, MixedBlockSystem
20
21
  from .data import MeshData, BasisData, SpaceData
21
22
  from .basis import (
22
23
  make_hex_basis,
@@ -38,20 +39,24 @@ from .assembly import (
38
39
  assemble_jacobian,
39
40
  assemble_residual_scatter,
40
41
  assemble_jacobian_scatter,
41
- assemble_residual_elementwise_xla,
42
- assemble_jacobian_elementwise_xla,
42
+ assemble_residual_elementwise,
43
+ assemble_jacobian_elementwise,
43
44
  make_element_residual_kernel,
45
+ make_element_bilinear_kernel,
46
+ make_element_linear_kernel,
44
47
  make_element_jacobian_kernel,
48
+ make_element_kernel,
45
49
  element_residual,
46
50
  element_jacobian,
47
51
  make_sparsity_pattern,
52
+ chunk_pad_stats,
53
+ BatchedAssembler,
48
54
  assemble_jacobian_values,
49
55
  assemble_mass_matrix,
50
56
  scalar_body_force_form,
51
57
  make_scalar_body_force_form,
52
58
  constant_body_force_form,
53
59
  )
54
- from ..physics.elasticity.linear import vector_body_force_form, constant_body_force_vector_form
55
60
  from .interp import eval_shape_functions_hex8, interpolate_field_at_element_points
56
61
  from .weakform import (
57
62
  Expr,
@@ -60,58 +65,21 @@ from .weakform import (
60
65
  trial_ref,
61
66
  test_ref,
62
67
  unknown_ref,
68
+ zero_ref,
63
69
  Params,
64
70
  LinearForm,
65
71
  BilinearForm,
66
72
  ResidualForm,
73
+ kernel,
67
74
  compile_surface_linear,
75
+ compile_surface_bilinear,
76
+ compile_mixed_surface_residual,
68
77
  MixedWeakForm,
78
+ make_mixed_residuals,
69
79
  compile_bilinear,
70
80
  compile_linear,
71
81
  compile_residual,
72
82
  compile_mixed_residual,
73
- grad,
74
- sym_grad,
75
- outer,
76
- dot,
77
- sdot,
78
- ddot,
79
- inner,
80
- action,
81
- gaction,
82
- normal,
83
- ds,
84
- dOmega,
85
- I,
86
- det,
87
- inv,
88
- transpose,
89
- log,
90
- transpose_last2,
91
- matmul,
92
- matmul_std,
93
- einsum,
94
- )
95
- from ..mesh import (
96
- BaseMeshPytree,
97
- bbox_predicate,
98
- plane_predicate,
99
- axis_plane_predicate,
100
- slab_predicate,
101
- HexMesh,
102
- HexMeshPytree,
103
- StructuredHexBox,
104
- SurfaceMesh,
105
- SurfaceMeshPytree,
106
- tag_axis_minmax_facets,
107
- TetMesh,
108
- TetMeshPytree,
109
- StructuredTetBox,
110
- StructuredTetTensorBox,
111
- load_gmsh_mesh,
112
- load_gmsh_hex_mesh,
113
- load_gmsh_tet_mesh,
114
- make_surface_from_facets,
115
83
  )
116
84
  from .basis import (
117
85
  HexTriLinearBasis,
@@ -127,22 +95,90 @@ from .basis import (
127
95
  )
128
96
  import importlib
129
97
 
130
- from ..physics import lame_parameters, isotropic_3d_D
131
98
  from .solver import spdirect_solve_cpu, spdirect_solve_gpu, spdirect_solve_jax, coo_to_csr
132
99
 
100
+ _MESH_EXPORTS = {
101
+ "BaseMeshPytree",
102
+ "SurfaceWithFacetMap",
103
+ "bbox_predicate",
104
+ "plane_predicate",
105
+ "axis_plane_predicate",
106
+ "slab_predicate",
107
+ "HexMesh",
108
+ "HexMeshPytree",
109
+ "StructuredHexBox",
110
+ "SurfaceMesh",
111
+ "SurfaceMeshPytree",
112
+ "SurfaceWithElemConn",
113
+ "surface_with_elem_conn",
114
+ "SurfaceSupermesh",
115
+ "build_surface_supermesh",
116
+ "tag_axis_minmax_facets",
117
+ "TetMesh",
118
+ "TetMeshPytree",
119
+ "StructuredTetBox",
120
+ "StructuredTetTensorBox",
121
+ "load_gmsh_mesh",
122
+ "load_gmsh_hex_mesh",
123
+ "load_gmsh_tet_mesh",
124
+ "make_surface_from_facets",
125
+ "MortarMatrix",
126
+ "assemble_mortar_matrices",
127
+ "assemble_contact_onesided_floor",
128
+ "assemble_mixed_surface_residual",
129
+ "assemble_mixed_surface_jacobian",
130
+ "map_surface_facets_to_tet_elements",
131
+ "map_surface_facets_to_hex_elements",
132
+ "tri_area",
133
+ "tri_quadrature",
134
+ "facet_triangles",
135
+ "facet_shape_values",
136
+ "volume_shape_values_at_points",
137
+ "quad_shape_and_local",
138
+ "quad9_shape_values",
139
+ "hex27_gradN",
140
+ "ContactSurfaceSpace",
141
+ "ContactSide",
142
+ "OneSidedContact",
143
+ "OneSidedContactSurfaceSpace",
144
+ "facet_gap_values",
145
+ "active_contact_facets",
146
+ }
147
+
133
148
  _SOLVER_EXPORTS = {
134
149
  "SparsityPattern",
135
150
  "FluxSparseMatrix",
151
+ "FluxBlockMatrix",
152
+ "coalesce_coo",
153
+ "concat_flux",
154
+ "block_diag_flux",
155
+ "build_block_system",
156
+ "split_block_matrix",
157
+ "BlockSystem",
158
+ "DirichletBC",
136
159
  "LinearSolver",
137
160
  "NonlinearSolver",
161
+ "petsc_solve",
162
+ "petsc_shell_solve",
163
+ "petsc_is_available",
138
164
  "enforce_dirichlet_dense",
165
+ "enforce_dirichlet_dense_jax",
166
+ "enforce_dirichlet_fluxsparse",
139
167
  "enforce_dirichlet_sparse",
168
+ "enforce_dirichlet_system",
169
+ "split_dirichlet_matrix",
140
170
  "free_dofs",
171
+ "restrict_flux_to_free",
172
+ "condense_dirichlet_system",
141
173
  "condense_dirichlet_fluxsparse",
174
+ "condense_dirichlet_fluxsparse_coo",
142
175
  "condense_dirichlet_dense",
143
176
  "expand_dirichlet_solution",
144
177
  "cg_solve",
145
178
  "cg_solve_jax",
179
+ "build_cg_operator",
180
+ "CGOperator",
181
+ "make_block_jacobi_preconditioner",
146
182
  "NonlinearAnalysis",
147
183
  "NewtonLoopConfig",
148
184
  "LoadStepResult",
@@ -153,19 +189,26 @@ _SOLVER_EXPORTS = {
153
189
  "LinearStepResult",
154
190
  "LinearSolveRunner",
155
191
  "newton_solve",
192
+ "petsc_solve",
193
+ "petsc_shell_solve",
194
+ "petsc_is_available",
156
195
  }
157
196
 
158
197
  _SOLVER_BC_EXPORTS = {
159
198
  "SurfaceFormField",
160
199
  "SurfaceFormContext",
200
+ "SurfaceBilinearContext",
161
201
  "vector_surface_load_form",
162
202
  "make_vector_surface_load_form",
163
203
  "assemble_surface_linear_form",
204
+ "assemble_surface_bilinear_form",
164
205
  }
165
206
 
166
207
 
167
208
  def __getattr__(name: str):
168
- if name in _SOLVER_EXPORTS:
209
+ if name in _MESH_EXPORTS:
210
+ module = importlib.import_module("..mesh", __name__)
211
+ elif name in _SOLVER_EXPORTS:
169
212
  module = importlib.import_module("..solver", __name__)
170
213
  elif name in _SOLVER_BC_EXPORTS:
171
214
  module = importlib.import_module("..solver.bc", __name__)
@@ -180,6 +223,10 @@ __all__ = [
180
223
  "FESpace",
181
224
  "FESpaceBase",
182
225
  "FESpacePytree",
226
+ "MixedFESpace",
227
+ "MixedProblem",
228
+ "MixedDirichletBC",
229
+ "MixedBlockSystem",
183
230
  "FormContext",
184
231
  "MixedFormContext",
185
232
  "VolumeContext",
@@ -218,9 +265,9 @@ __all__ = [
218
265
  "assemble_jacobian",
219
266
  "assemble_residual_scatter",
220
267
  "assemble_jacobian_scatter",
221
- "assemble_residual_elementwise_xla",
222
- "assemble_jacobian_elementwise_xla",
223
268
  "make_element_residual_kernel",
269
+ "make_element_bilinear_kernel",
270
+ "make_element_linear_kernel",
224
271
  "make_element_jacobian_kernel",
225
272
  "element_residual",
226
273
  "element_jacobian",
@@ -232,8 +279,6 @@ __all__ = [
232
279
  "scalar_body_force_form",
233
280
  "make_scalar_body_force_form",
234
281
  "constant_body_force_form",
235
- "vector_body_force_form",
236
- "constant_body_force_vector_form",
237
282
  "eval_shape_functions_hex8",
238
283
  "interpolate_field_at_element_points",
239
284
  "Expr",
@@ -242,15 +287,20 @@ __all__ = [
242
287
  "trial_ref",
243
288
  "test_ref",
244
289
  "unknown_ref",
290
+ "zero_ref",
245
291
  "Params",
246
292
  "LinearForm",
247
293
  "BilinearForm",
248
294
  "ResidualForm",
249
295
  "MixedWeakForm",
296
+ "make_mixed_residuals",
297
+ "kernel",
250
298
  "compile_bilinear",
251
299
  "compile_linear",
252
300
  "compile_residual",
253
301
  "compile_surface_linear",
302
+ "compile_surface_bilinear",
303
+ "compile_mixed_surface_residual",
254
304
  "compile_mixed_residual",
255
305
  "grad",
256
306
  "sym_grad",
@@ -278,21 +328,49 @@ __all__ = [
278
328
  "StructuredHexBox",
279
329
  "SurfaceMesh",
280
330
  "SurfaceMeshPytree",
331
+ "SurfaceWithElemConn",
332
+ "surface_with_elem_conn",
281
333
  "SurfaceFormField",
282
334
  "SurfaceFormContext",
335
+ "SurfaceBilinearContext",
283
336
  "vector_surface_load_form",
284
337
  "make_vector_surface_load_form",
285
338
  "assemble_surface_linear_form",
339
+ "assemble_surface_bilinear_form",
286
340
  "load_gmsh_mesh",
287
341
  "load_gmsh_hex_mesh",
288
342
  "load_gmsh_tet_mesh",
289
343
  "make_surface_from_facets",
344
+ "SurfaceSupermesh",
345
+ "build_surface_supermesh",
346
+ "MortarMatrix",
347
+ "assemble_mortar_matrices",
348
+ "assemble_contact_onesided_floor",
349
+ "assemble_mixed_surface_residual",
350
+ "assemble_mixed_surface_jacobian",
351
+ "map_surface_facets_to_tet_elements",
352
+ "map_surface_facets_to_hex_elements",
353
+ "tri_area",
354
+ "tri_quadrature",
355
+ "facet_triangles",
356
+ "facet_shape_values",
357
+ "volume_shape_values_at_points",
358
+ "quad_shape_and_local",
359
+ "quad9_shape_values",
360
+ "hex27_gradN",
361
+ "ContactSurfaceSpace",
362
+ "ContactSide",
363
+ "OneSidedContact",
364
+ "OneSidedContactSurfaceSpace",
365
+ "facet_gap_values",
366
+ "active_contact_facets",
290
367
  "TetMesh",
291
368
  "TetMeshPytree",
292
369
  "StructuredTetBox",
293
370
  "StructuredTetTensorBox",
294
371
  "tag_axis_minmax_facets",
295
372
  "BaseMeshPytree",
373
+ "SurfaceWithFacetMap",
296
374
  "bbox_predicate",
297
375
  "plane_predicate",
298
376
  "axis_plane_predicate",
@@ -307,20 +385,29 @@ __all__ = [
307
385
  "TetLinearBasisPytree",
308
386
  "TetQuadraticBasis10",
309
387
  "TetQuadraticBasis10Pytree",
310
- "lame_parameters",
311
- "isotropic_3d_D",
312
388
  "spdirect_solve_cpu",
313
389
  "spdirect_solve_gpu",
314
390
  "spdirect_solve_jax",
315
391
  "coo_to_csr",
316
392
  "SparsityPattern",
317
393
  "FluxSparseMatrix",
394
+ "FluxBlockMatrix",
395
+ "coalesce_coo",
396
+ "concat_flux",
397
+ "block_diag_flux",
318
398
  "LinearSolver",
319
399
  "NonlinearSolver",
320
400
  "enforce_dirichlet_dense",
401
+ "enforce_dirichlet_dense_jax",
402
+ "enforce_dirichlet_fluxsparse",
321
403
  "enforce_dirichlet_sparse",
404
+ "enforce_dirichlet_system",
405
+ "split_dirichlet_matrix",
322
406
  "free_dofs",
407
+ "restrict_flux_to_free",
408
+ "condense_dirichlet_system",
323
409
  "condense_dirichlet_fluxsparse",
410
+ "condense_dirichlet_fluxsparse_coo",
324
411
  "condense_dirichlet_dense",
325
412
  "expand_dirichlet_solution",
326
413
  "cg_solve",