Skip to content

Boundary Integrals

Nils Kohl requested to merge kohl/boundary-integrals into main
  • extend to 3D
  • put (locally implemented) surface area tests somewhere (HyTeG integration tests? HyTeG repo?) postponed until there is a nicer way to generate boundary kernels from scripts
  • update this comment (we do not assume the 0123 BC because an object is passed to the ctor)
  • assert that space_dimension >= dimension in ElementGeometry
  • discuss reordering of micro-element vertices for the Nédélec space -> postponed until we need to think about it
  • test if manifold forms still work after refactoring of the ElementGeometry and removal of the EmbeddedTriangle in ebb5c6f3 -> manifold forms are generated - concrete convergence tests have not been run yet

Boundary Integrals

This MR enables the HOG to generate operators that evaluate integrals over the domain boundary (or parts of it).

The motivation obviously comes from the desire to implement weak boundary conditions.

Usage

Certainly subject to change, but an example of how to write and generate an operator for the "boundary mass"

\int_\Gamma \ uv \ ds

can be found here:

The generated operator will look similar to this:

/// Mass operator.
///
/// Geometry map: AnnulusMap
///
/// Weak formulation
///
///     u: trial function (space: Lagrange, degree: 2)
///     v: test function  (space: Lagrange, degree: 2)
///
///     ∫ uv ds

class P2MassBoundary : public Operator<P2Function<walberla::float64>,
                                       P2Function<walberla::float64>> {
public:
  P2MassBoundary(const std::shared_ptr<PrimitiveStorage> &storage,
                 size_t minLevel, size_t maxLevel,
                 BoundaryCondition boundaryCondition);   // <=== you need to pass a boundary condition object!
// ...

... and can be used just like any other operator.

Note that it is possible now to have volume and boundary integrals executed in the same operator.

How does it work internally?

See comments on high-level boundary handling and low-level implementation details.

Side effects

  • the EmbeddedTriangle class has been replaced in favor of a space_dimension member in ElementGeometry
  • multiple blending maps can now be added to different kernels of the same operator (e.g., AnnulusMap to the 2D kernels and IcoShellMap to the 3D kernels - this can be practical to reduce the number of operators)
Edited by Nils Kohl

Merge request reports