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/core/__init__.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from .forms import FormContext, MixedFormContext, FieldPair, ElementVector, vector_load_form
2
+ from .context_types import VolumeContext, SurfaceContext
2
3
  from .space import (
3
4
  FESpaceBase,
4
5
  FESpace,
@@ -16,6 +17,7 @@ from .space import (
16
17
  make_hex27_space,
17
18
  make_hex27_space_pytree,
18
19
  )
20
+ from .mixed_space import MixedFESpace, MixedProblem, MixedDirichletBC, MixedBlockSystem
19
21
  from .data import MeshData, BasisData, SpaceData
20
22
  from .basis import (
21
23
  make_hex_basis,
@@ -37,20 +39,24 @@ from .assembly import (
37
39
  assemble_jacobian,
38
40
  assemble_residual_scatter,
39
41
  assemble_jacobian_scatter,
40
- assemble_residual_elementwise_xla,
41
- assemble_jacobian_elementwise_xla,
42
+ assemble_residual_elementwise,
43
+ assemble_jacobian_elementwise,
42
44
  make_element_residual_kernel,
45
+ make_element_bilinear_kernel,
46
+ make_element_linear_kernel,
43
47
  make_element_jacobian_kernel,
48
+ make_element_kernel,
44
49
  element_residual,
45
50
  element_jacobian,
46
51
  make_sparsity_pattern,
52
+ chunk_pad_stats,
53
+ BatchedAssembler,
47
54
  assemble_jacobian_values,
48
55
  assemble_mass_matrix,
49
56
  scalar_body_force_form,
50
57
  make_scalar_body_force_form,
51
58
  constant_body_force_form,
52
59
  )
53
- from ..physics.elasticity.linear import vector_body_force_form, constant_body_force_vector_form
54
60
  from .interp import eval_shape_functions_hex8, interpolate_field_at_element_points
55
61
  from .weakform import (
56
62
  Expr,
@@ -59,18 +65,24 @@ from .weakform import (
59
65
  trial_ref,
60
66
  test_ref,
61
67
  unknown_ref,
68
+ zero_ref,
62
69
  Params,
63
70
  LinearForm,
64
71
  BilinearForm,
65
72
  ResidualForm,
73
+ kernel,
66
74
  compile_surface_linear,
75
+ compile_surface_bilinear,
76
+ compile_mixed_surface_residual,
67
77
  MixedWeakForm,
78
+ make_mixed_residuals,
68
79
  compile_bilinear,
69
80
  compile_linear,
70
81
  compile_residual,
71
82
  compile_mixed_residual,
72
83
  grad,
73
84
  sym_grad,
85
+ outer,
74
86
  dot,
75
87
  sdot,
76
88
  ddot,
@@ -87,10 +99,12 @@ from .weakform import (
87
99
  log,
88
100
  transpose_last2,
89
101
  matmul,
102
+ matmul_std,
90
103
  einsum,
91
104
  )
92
105
  from ..mesh import (
93
106
  BaseMeshPytree,
107
+ SurfaceWithFacetMap,
94
108
  bbox_predicate,
95
109
  plane_predicate,
96
110
  axis_plane_predicate,
@@ -100,6 +114,10 @@ from ..mesh import (
100
114
  StructuredHexBox,
101
115
  SurfaceMesh,
102
116
  SurfaceMeshPytree,
117
+ SurfaceWithElemConn,
118
+ surface_with_elem_conn,
119
+ SurfaceSupermesh,
120
+ build_surface_supermesh,
103
121
  tag_axis_minmax_facets,
104
122
  TetMesh,
105
123
  TetMeshPytree,
@@ -109,6 +127,29 @@ from ..mesh import (
109
127
  load_gmsh_hex_mesh,
110
128
  load_gmsh_tet_mesh,
111
129
  make_surface_from_facets,
130
+ SurfaceSupermesh,
131
+ build_surface_supermesh,
132
+ MortarMatrix,
133
+ assemble_mortar_matrices,
134
+ assemble_contact_onesided_floor,
135
+ assemble_mixed_surface_residual,
136
+ assemble_mixed_surface_jacobian,
137
+ map_surface_facets_to_tet_elements,
138
+ map_surface_facets_to_hex_elements,
139
+ tri_area,
140
+ tri_quadrature,
141
+ facet_triangles,
142
+ facet_shape_values,
143
+ volume_shape_values_at_points,
144
+ quad_shape_and_local,
145
+ quad9_shape_values,
146
+ hex27_gradN,
147
+ ContactSurfaceSpace,
148
+ ContactSide,
149
+ OneSidedContact,
150
+ OneSidedContactSurfaceSpace,
151
+ facet_gap_values,
152
+ active_contact_facets,
112
153
  )
113
154
  from .basis import (
114
155
  HexTriLinearBasis,
@@ -122,46 +163,95 @@ from .basis import (
122
163
  TetQuadraticBasis10,
123
164
  TetQuadraticBasis10Pytree,
124
165
  )
125
- from ..physics import lame_parameters, isotropic_3d_D
166
+ import importlib
167
+
126
168
  from .solver import spdirect_solve_cpu, spdirect_solve_gpu, spdirect_solve_jax, coo_to_csr
127
- from ..solver import (
128
- SparsityPattern,
129
- FluxSparseMatrix,
130
- LinearSolver,
131
- NonlinearSolver,
132
- enforce_dirichlet_dense,
133
- enforce_dirichlet_sparse,
134
- free_dofs,
135
- condense_dirichlet_fluxsparse,
136
- condense_dirichlet_dense,
137
- expand_dirichlet_solution,
138
- cg_solve,
139
- cg_solve_jax,
140
- NonlinearAnalysis,
141
- NewtonLoopConfig,
142
- LoadStepResult,
143
- NewtonSolveRunner,
144
- solve_nonlinear,
145
- LinearAnalysis,
146
- LinearSolveConfig,
147
- LinearStepResult,
148
- LinearSolveRunner,
149
- newton_solve,
150
- )
151
- from ..solver.bc import (
152
- SurfaceFormField,
153
- SurfaceFormContext,
154
- vector_surface_load_form,
155
- make_vector_surface_load_form,
156
- assemble_surface_linear_form,
157
- )
169
+
170
+ _SOLVER_EXPORTS = {
171
+ "SparsityPattern",
172
+ "FluxSparseMatrix",
173
+ "coalesce_coo",
174
+ "concat_flux",
175
+ "block_diag_flux",
176
+ "build_block_system",
177
+ "split_block_matrix",
178
+ "BlockSystem",
179
+ "DirichletBC",
180
+ "LinearSolver",
181
+ "NonlinearSolver",
182
+ "petsc_solve",
183
+ "petsc_shell_solve",
184
+ "petsc_is_available",
185
+ "enforce_dirichlet_dense",
186
+ "enforce_dirichlet_dense_jax",
187
+ "enforce_dirichlet_fluxsparse",
188
+ "enforce_dirichlet_sparse",
189
+ "enforce_dirichlet_system",
190
+ "split_dirichlet_matrix",
191
+ "free_dofs",
192
+ "restrict_flux_to_free",
193
+ "condense_dirichlet_system",
194
+ "condense_dirichlet_fluxsparse",
195
+ "condense_dirichlet_fluxsparse_coo",
196
+ "condense_dirichlet_dense",
197
+ "expand_dirichlet_solution",
198
+ "cg_solve",
199
+ "cg_solve_jax",
200
+ "build_cg_operator",
201
+ "CGOperator",
202
+ "make_block_jacobi_preconditioner",
203
+ "NonlinearAnalysis",
204
+ "NewtonLoopConfig",
205
+ "LoadStepResult",
206
+ "NewtonSolveRunner",
207
+ "solve_nonlinear",
208
+ "LinearAnalysis",
209
+ "LinearSolveConfig",
210
+ "LinearStepResult",
211
+ "LinearSolveRunner",
212
+ "newton_solve",
213
+ "petsc_solve",
214
+ "petsc_shell_solve",
215
+ "petsc_is_available",
216
+ }
217
+
218
+ _SOLVER_BC_EXPORTS = {
219
+ "SurfaceFormField",
220
+ "SurfaceFormContext",
221
+ "SurfaceBilinearContext",
222
+ "vector_surface_load_form",
223
+ "make_vector_surface_load_form",
224
+ "assemble_surface_linear_form",
225
+ "assemble_surface_bilinear_form",
226
+ }
227
+
228
+
229
+ def __getattr__(name: str):
230
+ if name in _SOLVER_EXPORTS:
231
+ module = importlib.import_module("..solver", __name__)
232
+ elif name in _SOLVER_BC_EXPORTS:
233
+ module = importlib.import_module("..solver.bc", __name__)
234
+ else:
235
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
236
+
237
+ value = getattr(module, name)
238
+ globals()[name] = value
239
+ return value
158
240
 
159
241
  __all__ = [
160
242
  "FESpace",
161
243
  "FESpaceBase",
162
244
  "FESpacePytree",
245
+ "MixedFESpace",
246
+ "MixedProblem",
247
+ "MixedDirichletBC",
248
+ "MixedBlockSystem",
163
249
  "FormContext",
164
250
  "MixedFormContext",
251
+ "VolumeContext",
252
+ "SurfaceContext",
253
+ "VolumeContext",
254
+ "SurfaceContext",
165
255
  "FieldPair",
166
256
  "ElementVector",
167
257
  "vector_load_form",
@@ -194,9 +284,9 @@ __all__ = [
194
284
  "assemble_jacobian",
195
285
  "assemble_residual_scatter",
196
286
  "assemble_jacobian_scatter",
197
- "assemble_residual_elementwise_xla",
198
- "assemble_jacobian_elementwise_xla",
199
287
  "make_element_residual_kernel",
288
+ "make_element_bilinear_kernel",
289
+ "make_element_linear_kernel",
200
290
  "make_element_jacobian_kernel",
201
291
  "element_residual",
202
292
  "element_jacobian",
@@ -208,8 +298,6 @@ __all__ = [
208
298
  "scalar_body_force_form",
209
299
  "make_scalar_body_force_form",
210
300
  "constant_body_force_form",
211
- "vector_body_force_form",
212
- "constant_body_force_vector_form",
213
301
  "eval_shape_functions_hex8",
214
302
  "interpolate_field_at_element_points",
215
303
  "Expr",
@@ -218,18 +306,24 @@ __all__ = [
218
306
  "trial_ref",
219
307
  "test_ref",
220
308
  "unknown_ref",
309
+ "zero_ref",
221
310
  "Params",
222
311
  "LinearForm",
223
312
  "BilinearForm",
224
313
  "ResidualForm",
225
314
  "MixedWeakForm",
315
+ "make_mixed_residuals",
316
+ "kernel",
226
317
  "compile_bilinear",
227
318
  "compile_linear",
228
319
  "compile_residual",
229
320
  "compile_surface_linear",
321
+ "compile_surface_bilinear",
322
+ "compile_mixed_surface_residual",
230
323
  "compile_mixed_residual",
231
324
  "grad",
232
325
  "sym_grad",
326
+ "outer",
233
327
  "dot",
234
328
  "sdot",
235
329
  "ddot",
@@ -246,27 +340,56 @@ __all__ = [
246
340
  "log",
247
341
  "transpose_last2",
248
342
  "matmul",
343
+ "matmul_std",
249
344
  "einsum",
250
345
  "HexMesh",
251
346
  "HexMeshPytree",
252
347
  "StructuredHexBox",
253
348
  "SurfaceMesh",
254
349
  "SurfaceMeshPytree",
350
+ "SurfaceWithElemConn",
351
+ "surface_with_elem_conn",
255
352
  "SurfaceFormField",
256
353
  "SurfaceFormContext",
354
+ "SurfaceBilinearContext",
257
355
  "vector_surface_load_form",
258
356
  "make_vector_surface_load_form",
259
357
  "assemble_surface_linear_form",
358
+ "assemble_surface_bilinear_form",
260
359
  "load_gmsh_mesh",
261
360
  "load_gmsh_hex_mesh",
262
361
  "load_gmsh_tet_mesh",
263
362
  "make_surface_from_facets",
363
+ "SurfaceSupermesh",
364
+ "build_surface_supermesh",
365
+ "MortarMatrix",
366
+ "assemble_mortar_matrices",
367
+ "assemble_contact_onesided_floor",
368
+ "assemble_mixed_surface_residual",
369
+ "assemble_mixed_surface_jacobian",
370
+ "map_surface_facets_to_tet_elements",
371
+ "map_surface_facets_to_hex_elements",
372
+ "tri_area",
373
+ "tri_quadrature",
374
+ "facet_triangles",
375
+ "facet_shape_values",
376
+ "volume_shape_values_at_points",
377
+ "quad_shape_and_local",
378
+ "quad9_shape_values",
379
+ "hex27_gradN",
380
+ "ContactSurfaceSpace",
381
+ "ContactSide",
382
+ "OneSidedContact",
383
+ "OneSidedContactSurfaceSpace",
384
+ "facet_gap_values",
385
+ "active_contact_facets",
264
386
  "TetMesh",
265
387
  "TetMeshPytree",
266
388
  "StructuredTetBox",
267
389
  "StructuredTetTensorBox",
268
390
  "tag_axis_minmax_facets",
269
391
  "BaseMeshPytree",
392
+ "SurfaceWithFacetMap",
270
393
  "bbox_predicate",
271
394
  "plane_predicate",
272
395
  "axis_plane_predicate",
@@ -281,20 +404,28 @@ __all__ = [
281
404
  "TetLinearBasisPytree",
282
405
  "TetQuadraticBasis10",
283
406
  "TetQuadraticBasis10Pytree",
284
- "lame_parameters",
285
- "isotropic_3d_D",
286
407
  "spdirect_solve_cpu",
287
408
  "spdirect_solve_gpu",
288
409
  "spdirect_solve_jax",
289
410
  "coo_to_csr",
290
411
  "SparsityPattern",
291
412
  "FluxSparseMatrix",
413
+ "coalesce_coo",
414
+ "concat_flux",
415
+ "block_diag_flux",
292
416
  "LinearSolver",
293
417
  "NonlinearSolver",
294
418
  "enforce_dirichlet_dense",
419
+ "enforce_dirichlet_dense_jax",
420
+ "enforce_dirichlet_fluxsparse",
295
421
  "enforce_dirichlet_sparse",
422
+ "enforce_dirichlet_system",
423
+ "split_dirichlet_matrix",
296
424
  "free_dofs",
425
+ "restrict_flux_to_free",
426
+ "condense_dirichlet_system",
297
427
  "condense_dirichlet_fluxsparse",
428
+ "condense_dirichlet_fluxsparse_coo",
298
429
  "condense_dirichlet_dense",
299
430
  "expand_dirichlet_solution",
300
431
  "cg_solve",