|
SpECTRE
2021.08.02
|
Functionality related to discontinuous Galerkin schemes. More...
Namespaces | |
| namespace | protocols |
| Protocols related to Discontinuous Galerkin functionality | |
Classes | |
| struct | SimpleBoundaryData |
| Distinguishes between field data, which can be projected to a mortar, and extra data, which will not be projected. More... | |
| class | SimpleMortarData |
| Storage of boundary data on two sides of a mortar. More... | |
Typedefs | |
| template<size_t VolumeDim> | |
| using | MortarId = std::pair<::Direction< VolumeDim >, ElementId< VolumeDim > > |
| template<size_t MortarDim> | |
| using | MortarSize = std::array< Spectral::MortarSize, MortarDim > |
| template<size_t VolumeDim, typename ValueType > | |
| using | MortarMap = std::unordered_map< MortarId< VolumeDim >, ValueType, boost::hash< MortarId< VolumeDim > > > |
Enumerations | |
| enum class | Formulation { StrongInertial , WeakInertial } |
| The DG formulation to use. More... | |
Functions | |
| std::ostream & | operator<< (std::ostream &os, Formulation t) noexcept |
| template<typename InboxTag , size_t Dim, typename TemporalIdType , typename... InboxTags> | |
| bool | has_received_from_all_mortars (const TemporalIdType &temporal_id, const Element< Dim > &element, const tuples::TaggedTuple< InboxTags... > &inboxes) noexcept |
Determines if data on all mortars has been received for the InboxTag at time temporal_id. More... | |
| template<size_t Dim> | |
| void | metric_identity_det_jac_times_inv_jac (gsl::not_null< InverseJacobian< DataVector, Dim, Frame::Logical, Frame::Inertial > * > det_jac_times_inverse_jacobian, const Mesh< Dim > &mesh, const tnsr::I< DataVector, Dim, Frame::Inertial > &inertial_coords, const Jacobian< DataVector, Dim, Frame::Logical, Frame::Inertial > &jacobian) noexcept |
| Compute the Jacobian determinant times the inverse Jacobian so that the result is divergence-free. More... | |
| template<size_t Dim> | |
| void | metric_identity_jacobian_quantities (gsl::not_null< InverseJacobian< DataVector, Dim, Frame::Logical, Frame::Inertial > * > det_jac_times_inverse_jacobian, gsl::not_null< InverseJacobian< DataVector, Dim, Frame::Logical, Frame::Inertial > * > inverse_jacobian, gsl::not_null< Jacobian< DataVector, Dim, Frame::Logical, Frame::Inertial > * > jacobian, gsl::not_null< Scalar< DataVector > * > det_jacobian, const Mesh< Dim > &mesh, const tnsr::I< DataVector, Dim, Frame::Inertial > &inertial_coords) noexcept |
| Compute the Jacobian, inverse Jacobian, and determinant of the Jacobian so that they satisfy the metric identities. More... | |
| template<size_t Dim> | |
| Mesh< Dim > | mortar_mesh (const Mesh< Dim > &face_mesh1, const Mesh< Dim > &face_mesh2) noexcept |
| Find a mesh for a mortar capable of representing data from either of two faces. More... | |
| template<size_t Dim> | |
| MortarSize< Dim - 1 > | mortar_size (const ElementId< Dim > &self, const ElementId< Dim > &neighbor, size_t dimension, const OrientationMap< Dim > &orientation) noexcept |
Determine the size of the mortar (i.e., the part of the face it covers) for communicating with a neighbor. This is the size relative to the size of self, and will not generally agree with that determined by neighbor. | |
| template<typename Tags , size_t Dim> | |
| Variables< Tags > | project_to_mortar (const Variables< Tags > &vars, const Mesh< Dim > &face_mesh, const Mesh< Dim > &mortar_mesh, const MortarSize< Dim > &mortar_size) noexcept |
| Project variables from a face to a mortar. | |
| template<typename Tags , size_t Dim> | |
| Variables< Tags > | project_from_mortar (const Variables< Tags > &vars, const Mesh< Dim > &face_mesh, const Mesh< Dim > &mortar_mesh, const MortarSize< Dim > &mortar_size) noexcept |
| Project variables from a mortar to a face. | |
| template<size_t Dim> | |
| void | apply_mass_matrix (const gsl::not_null< DataVector * > data, const Mesh< Dim > &mesh) noexcept |
| Apply the DG mass matrix to the data, in the diagonal mass-matrix approximation ("mass-lumping") More... | |
| template<size_t Dim, typename TagsList > | |
| void | apply_mass_matrix (const gsl::not_null< Variables< TagsList > * > data, const Mesh< Dim > &mesh) noexcept |
| Apply the DG mass matrix to the data, in the diagonal mass-matrix approximation ("mass-lumping") More... | |
| template<typename... BoundaryCorrectionTags> | |
| void | lift_flux (const gsl::not_null< Variables< tmpl::list< BoundaryCorrectionTags... > > * > boundary_correction_terms, const size_t extent_perpendicular_to_boundary, Scalar< DataVector > magnitude_of_face_normal) noexcept |
| Lifts the flux contribution from an interface to the volume. More... | |
| template<typename... FluxTags> | |
| auto | lift_flux (Variables< tmpl::list< FluxTags... > > flux, const size_t extent_perpendicular_to_boundary, Scalar< DataVector > magnitude_of_face_normal) noexcept -> Variables< tmpl::list< db::remove_tag_prefix< FluxTags >... > > |
| Lifts the flux contribution from an interface to the volume. More... | |
Functionality related to discontinuous Galerkin schemes.
|
noexcept |
Apply the DG mass matrix to the data, in the diagonal mass-matrix approximation ("mass-lumping")
The DG mass matrix is:
\begin{equation} M_{pq} = \int_{\Omega_k} \psi_p(\xi) \psi_q(\xi) \mathrm{d}V \end{equation}
where \(\psi_p(\xi)\) are the basis functions on the element \(\Omega_k\). In the diagonal mass-matrix approximation ("mass-lumping") we evaluate the integral directly on the collocation points, i.e. with a Gauss or Gauss-Lobatto quadrature determined by the element mesh. Then it reduces to:
\begin{equation} M_{pq} \approx \delta_{pq} \prod_{i=1}^d w_{p_i} \end{equation}
where \(d\) is the spatial dimension and \(w_{p_i}\) are the quadrature weights in dimension \(i\). To apply the mass matrix in coordinates different than logical, or to account for a curved background metric, the data can be pre-multiplied with the Jacobian determinant and/or a metric determinant.
|
noexcept |
Apply the DG mass matrix to the data, in the diagonal mass-matrix approximation ("mass-lumping")
The DG mass matrix is:
\begin{equation} M_{pq} = \int_{\Omega_k} \psi_p(\xi) \psi_q(\xi) \mathrm{d}V \end{equation}
where \(\psi_p(\xi)\) are the basis functions on the element \(\Omega_k\). In the diagonal mass-matrix approximation ("mass-lumping") we evaluate the integral directly on the collocation points, i.e. with a Gauss or Gauss-Lobatto quadrature determined by the element mesh. Then it reduces to:
\begin{equation} M_{pq} \approx \delta_{pq} \prod_{i=1}^d w_{p_i} \end{equation}
where \(d\) is the spatial dimension and \(w_{p_i}\) are the quadrature weights in dimension \(i\). To apply the mass matrix in coordinates different than logical, or to account for a curved background metric, the data can be pre-multiplied with the Jacobian determinant and/or a metric determinant.