FE Spaces#
FluxFEM provides two closely related space types:
FESpace: the default space for fixed meshes and standard solves.FESpacePytree: a pytree-compatible space for JAX transformations.
When to use which#
Use FESpace for typical PDE solves where the mesh is fixed. Use
FESpacePytree when the mesh coordinates or basis need to participate in
jax.jit/jax.grad/jax.vmap workflows (e.g., shape optimization,
geometry inference, or coordinate warping).
Building pytree spaces#
The easiest entry point is the pytree helpers:
import fluxfem as ff
mesh, _, _ = ff.load_gmsh_tet_mesh("mesh.msh")
space = ff.make_tet_space_pytree(mesh, dim=3, intorder=2)
If you need to update coordinates inside a JAX function, construct a pytree mesh and space explicitly:
def space_with_coords(coords):
mesh_py = ff.TetMeshPytree(
coords=coords,
conn=mesh.conn,
cell_tags=mesh.cell_tags,
node_tags=mesh.node_tags,
)
return ff.FESpacePytree(
mesh=mesh_py,
basis=space.basis,
elem_dofs=space.elem_dofs,
value_dim=space.value_dim,
_n_dofs=space._n_dofs,
_n_ldofs=space._n_ldofs,
)
Notes#
FESpacePytreeshares the same API asFESpace; only the pytree behavior differs.Prefer
FESpaceunless you need the mesh/basis to be part of a JAX pytree.For same-space Galerkin problems,
space.assemble_*remains the shortest entry point.For role-explicit assembly, prefer the top-level
ff.assemble_*helpers withff.NamedSpaceand the*Spacesfamily, such asff.LinearSpaces,ff.BilinearSpaces,ff.ResidualSpaces, andff.JacobianSpaces.