SpECTRE  v2024.04.12
elliptic::dg::subdomain_operator::SubdomainOperator< System, OptionsGroup, BoundaryConditionClasses > Struct Template Reference

The elliptic DG operator on an element-centered subdomain. More...

#include <SubdomainOperator.hpp>

Public Types

using system = System
 
using options_group = OptionsGroup
 

Public Member Functions

template<typename ResultTags , typename OperandTags , typename DbTagsList >
void operator() (const gsl::not_null< LinearSolver::Schwarz::ElementCenteredSubdomainData< Dim, ResultTags > * > result, const LinearSolver::Schwarz::ElementCenteredSubdomainData< Dim, OperandTags > &operand, const db::DataBox< DbTagsList > &box, const std::unordered_map< std::pair< size_t, Direction< Dim > >, const BoundaryConditionsBase &, boost::hash< std::pair< size_t, Direction< Dim > > > > &override_boundary_conditions={}) const
 
void pup (PUP::er &)
 

Additional Inherited Members

- Static Public Attributes inherited from LinearSolver::Schwarz::SubdomainOperator< System::volume_dim >
static constexpr size_t volume_dim
 

Detailed Description

template<typename System, typename OptionsGroup, typename BoundaryConditionClasses = tmpl::list<>>
struct elliptic::dg::subdomain_operator::SubdomainOperator< System, OptionsGroup, BoundaryConditionClasses >

The elliptic DG operator on an element-centered subdomain.

This operator is a restriction of the full (linearized) DG-operator to an element-centered subdomain with a few points overlap into neighboring elements. It is a LinearSolver::Schwarz::SubdomainOperator to be used with the Schwarz linear solver when it solves the elliptic DG operator.

This operator requires the following tags are available on overlap regions with neighboring elements:

  • Geometric quantities provided by elliptic::dg::subdomain_operator::InitializeSubdomain.
  • All System::fluxes_computer::argument_tags and System::sources_computer::argument_tags (or System::sources_computer_linearized::argument_tags for nonlinear systems), except those listed in ArgsTagsFromCenter. The latter will be taken from the central element's DataBox, so they don't need to be made available on overlaps.
  • The System::fluxes_computer::argument_tags on internal and external interfaces, except those listed in System::fluxes_computer::volume_tags.

Some of these tags may require communication between elements. For example, nonlinear system fields are constant background fields for the linearized DG operator, but are updated in every nonlinear solver iteration. Therefore, the updated nonlinear fields must be communicated across overlaps between nonlinear solver iterations. To perform the communication you can use LinearSolver::Schwarz::Actions::SendOverlapFields and LinearSolver::Schwarz::Actions::ReceiveOverlapFields, setting RestrictToOverlap to false. See LinearSolver::Schwarz::SubdomainOperator for details.

Overriding boundary conditions
Sometimes the subdomain operator should not use the boundary conditions that have been selected when setting up the domain. For example, when the subdomain operator is cached between non-linear solver iterations but the boundary conditions depend on the non-linear fields, the preconditioning can become ineffective (see LinearSolver::Schwarz::Actions::ResetSubdomainSolver). Another example is elliptic::subdomain_preconditioners::MinusLaplacian, where an auxiliary Poisson system is used for preconditioning that doesn't have boundary conditions set up in the domain. In these cases, the boundary conditions used for the subdomain operator can be overridden with the optional override_boundary_conditions argument to the operator(). If the overriding boundary conditions are different from those listed in Metavariables::factory_creation, you can supply the list of boundary-condition classes to the BoundaryConditionClasses template parameter. Note that the subdomain operator always applies the linearized boundary conditions.
Warning
The subdomain operator hasn't been tested with periodic boundary conditions so far.

Member Function Documentation

◆ operator()()

template<typename System , typename OptionsGroup , typename BoundaryConditionClasses = tmpl::list<>>
template<typename ResultTags , typename OperandTags , typename DbTagsList >
void elliptic::dg::subdomain_operator::SubdomainOperator< System, OptionsGroup, BoundaryConditionClasses >::operator() ( const gsl::not_null< LinearSolver::Schwarz::ElementCenteredSubdomainData< Dim, ResultTags > * >  result,
const LinearSolver::Schwarz::ElementCenteredSubdomainData< Dim, OperandTags > &  operand,
const db::DataBox< DbTagsList > &  box,
const std::unordered_map< std::pair< size_t, Direction< Dim > >, const BoundaryConditionsBase &, boost::hash< std::pair< size_t, Direction< Dim > > > > &  override_boundary_conditions = {} 
) const
inline
Warning
This function is not thread-safe because it accesses mutable memory buffers.

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