Imported finite-element fields

ImportedFiniteElementFields stores finite-element coefficients supplied by an external file or producer. It owns the imported FE space and coefficient vectors; application code consumes the data as ordinary Field objects and dependency-free frozen observables.

auto imported = std::make_shared<
  ImmersX::ImportedFiniteElementFields<1, 3>>(
    vtk_filename, poisson.triangulation());

const auto path = imported->field("path_length");
const auto frozen_path = ImmersX::frozen(
  path.field(), imported->coefficients("path_length"));

The imported space is separate from the execution adapter. It owns its DoFHandler, finite element, constraints, locally relevant indices, and coefficients, but it does not own a Problem, solver vector, or execution block. FESpaceView remains a non-owning view, so the same FE-space vocabulary is used for native and imported data.

PointData uses a continuous FE_Q field and CellData uses a discontinuous FE_DGQ field. Imported coefficients are transferred across supported distributed refinement through deal.II’s SolutionTransfer. Consumers must use the triangulation associated with the imported space; interpolation or remote point evaluation is not implicit.

The resulting frozen observable has no active dependencies, but it supports the same deal.II FE operations as an active observable:

auto frozen_path_gradient = ImmersX::gradient(frozen_path);

For symbolic combinations, compose the typed observables and the existing symbolic evaluator at the application boundary. The public model remains FieldObservableweak_term; imported storage is an implementation detail of the data source, not a second representation hierarchy.