FiniteElementDiscretization

The FiniteElementDiscretization class extends MeshDiscretization to handle the lifetime of finite element collections and spaces. It provides a high-level interface for creating and managing finite element spaces on meshes or submeshes.

Main Features

  • Finite Element Space Management: Creates and manages finite element spaces for both sequential and parallel computations.

  • Finite Element Collection Handling: Stores and provides access to finite element collections.

  • Submesh Support: Allows creation of finite element spaces on submeshes defined by material or boundary identifiers.

  • Reusability: Reuses existing finite element spaces when possible to optimize memory and performance.

  • Integration with MeshDiscretization: Inherits all mesh management capabilities from MeshDiscretization.

Key Methods

  • getFiniteElementSpace<parallel>(): Returns the finite element space (parallel or sequential).

  • getFiniteElementCollection(): Returns the underlying finite element collection.

  • getFiniteElementSpacesManager(): Returns the manager for finite element spaces.

  • getVSize() / getTrueVSize(): Returns the total number of unknowns.

Usage Example

The following example demonstrates basic usage of FiniteElementDiscretization:

using namespace mfem_mgis;
auto ctx = mgis::Context{};
auto ofed = construct<FiniteElementDiscretization>(
    ctx, dict{{"MeshFileName", "mesh.mesh"},
              {"FiniteElementFamily", "H1"},
              {"FiniteElementOrder", 2},
              {"UnknownsSize", 2},
              {"NumberOfUniformRefinements", 0},
              {"Materials", dict{{"Attr1", 1}, {"Attr2", 2}}},
              {"Boundaries", dict{{"left", 1}, {"right", 2}}},
              {"Parallel", false}});

// Get the finite element space
auto& fes = ofed->getFiniteElementSpace<false>();

// Get the finite element spaces manager
auto fespaces = ofed->getFiniteElementSpacesManager();

// Create a finite element space on a submesh
auto fes1 = fespaces.getFiniteElementSpace<false>(
    ctx, {.location = MeshDiscretization::Location::ON_MATERIALS,
          .identifiers = list{"Attr1"},
          .number_of_components = 3});

Parameters

In addition to the parameters supported by MeshDiscretization, FiniteElementDiscretization supports:

  • FiniteElementFamily (string): Name of the finite element family (e.g., H1).

  • FiniteElementOrder (int): Order of the polynomial approximation.

  • UnknownsSize (int): Number of components of the unknowns.

Note

The FiniteElementDiscretization class is designed to be lightweight and integrates seamlessly with the FiniteElementSpacesManager for advanced finite element space management.