SpECTRE  v2021.11.01
elliptic::protocols::FirstOrderSystem Struct Reference

A system of elliptic equations in first-order "flux" formulation. More...

#include <FirstOrderSystem.hpp>

Classes

struct  test
 

Detailed Description

A system of elliptic equations in first-order "flux" formulation.

Classes conforming to this protocol represent a set of elliptic partial differential equations in first-order "flux" formulation:

\begin{equation} -\partial_i F^i_\alpha + S_\alpha = f_\alpha(x) \end{equation}

in terms of fluxes \(F_\alpha^i\), sources \(S_\alpha\) and fixed-sources \(f_\alpha(x)\). It resembles closely formulations of hyperbolic conservation laws but allows the fluxes \(F_\alpha^i\) to be higher-rank tensor fields. The fluxes and sources are functionals of the "primal" system variables \(u_A(x)\) and their corresponding "auxiliary" variables \(v_A(x)\). The fixed-sourced \(f_\alpha(x)\) are independent of the system variables. We enumerate the variables with uppercase letters such that \(v_A\) is the auxiliary variable corresponding to \(u_A\). Greek letters enumerate all variables. In documentation related to particular elliptic systems we generally use the canonical system-specific symbols for the fields in place of these indices. See the Poisson::FirstOrderSystem and the Elasticity::FirstOrderSystem for examples.

Conforming classes must have these static member variables:

  • size_t volume_dim: The number of spatial dimensions.

Conforming classes must have these type aliases:

  • primal_fields: A list of tags representing the primal fields. These are the fields we solve for, e.g. \(u\) for a Poisson equation.
  • auxiliary_fields: A list of tags representing the auxiliary fields, which are typically gradients of the primal fields, e.g. \(v_i = \partial_i u\) for a Poisson equation. These must follow the order of the primal_fields. Specifically, each auxiliary field must have one rank higher than its corresponding primal field.
  • primal_fluxes: A list of tags representing the primal fluxes \(F_{u_A}^i\). These are typically some linear combination of the auxiliary fields with raised indices, e.g. \(v^i = g^{ij}v_j\) for a curved-space Poisson equation on a background metric \(g_{ij}\). They must have the same rank as the auxiliary_fields but with an upper-spatial first index, because their divergence defines the elliptic equation.
  • auxiliary_fluxes: A list of tags representing the auxiliary fluxes \(F_{v_A}^i\), e.g. \(\delta^i_j u\) for a Poisson equation. These must have one rank higher than the auxiliary_fields and have an upper-spatial first index because their divergence defines the auxiliary fields.
  • background_fields: A list of tags representing the variable-independent background fields in the equations. Examples are a background metric, associated fixed geometry quantities such as Christoffel symbols or the Ricci scalar, or any other fixed field that determines the problem to be solved such as matter sources in the Einstein constraint equations.
  • inv_metric_tag: The tag that defines the background geometry, i.e. the the geometry that the elliptic equations are formulated on. This is the metric responsible for normalizing one-forms, such as face normals.
  • fluxes_computer: A class that defines the primal and auxiliary fluxes \(F_\alpha^i\). Must have an argument_tags type alias and two apply function overloads: One that computes the primal fluxes and another that computes the auxiliary fluxes. The first apply function takes these arguments in this order:

    1. The primal_fluxes as not-null pointer
    2. The argument_tags
    3. The auxiliary_fields

    The second apply function takes these arguments in this order:

    1. The auxiliary_fluxes as not-null pointer
    2. The argument_tags
    3. The primal_fields

    The functions can assume the output buffers are already correctly sized, but no guarantee is made on the values that the buffers hold at input. The class must have an additional volume_tags type alias that lists the subset of argument_tags that will be retrieved directly from the DataBox, instead of retrieving it from the face of an element.

  • sources_computer: A class that defines the primal and auxiliary sources \(S_\alpha\). Must have an argument_tags type alias and two apply function overloads: One that adds the primal sources and another that adds the auxiliary sources to the equations. The first apply function takes these arguments in this order:

    1. The types of the primal_fields as not-null pointer. These are the primal equations.
    2. The argument_tags
    3. The primal_fields
    4. The primal_fluxes

    The second apply function takes these arguments in this order:

    1. The types of the auxiliary_fields as not-null pointer. These are the auxiliary equations.
    2. The argument_tags
    3. The primal_fields

    The functions are expected to add the sources \(S_\alpha\) to the output buffers.

  • boundary_conditions_base: A base class representing the supported boundary conditions. Boundary conditions can be factory-created from this base class. Currently this should be a specialization of elliptic::BoundaryConditions::BoundaryCondition.

The documentation for this struct was generated from the following file: