LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
dpg_element_matrix_provider.h
1#ifndef PROJECTS_DPG_DPG_ELEMENT_MATRIX_PROVIDER
2#define PROJECTS_DPG_DPG_ELEMENT_MATRIX_PROVIDER
3
12#include <lf/mesh/mesh.h>
13
14#include "dpg.h"
15#include "product_element_matrix_provider.h"
16
17namespace projects::dpg {
18
51template <typename SCALAR>
53 public:
58
64
73 std::shared_ptr<ProductElementMatrixProvider<SCALAR>>
74 extendedStiffnessMatrixProvider,
75 std::shared_ptr<ProductElementMatrixProvider<SCALAR>> gramianProvider)
77 std::move(extendedStiffnessMatrixProvider)),
78 gramianProvider_(std::move(gramianProvider)) {}
79
86 virtual bool isActive(const lf::mesh::Entity& /*cell*/) { return true; }
87
94 ElemMat Eval(const lf::mesh::Entity& cell);
95
96 virtual ~DpgElementMatrixProvider() = default;
97
98 private:
101 std::shared_ptr<ProductElementMatrixProvider<SCALAR>>
105 std::shared_ptr<ProductElementMatrixProvider<SCALAR>> gramianProvider_;
106};
107
108// template deduction hint
109template <class PTR>
110DpgElementMatrixProvider(PTR stiffness_provider, PTR gramianProvider)
112
113// evaluation method.
114template <typename SCALAR>
117 // check for nullptrs
118 LF_ASSERT_MSG(extendedStiffnessMatrixProvider_ != nullptr &&
119 gramianProvider_ != nullptr,
120 "nullptr error for some provider");
121 // check that the method is called on an active cell
122 LF_ASSERT_MSG(gramianProvider_->isActive(cell) &&
123 extendedStiffnessMatrixProvider_->isActive(cell),
124 "Eval method called on inactive cell. " << cell);
125
126 // evaluate extended stiffness matrix B and local Gramian G
127 ElemMat extendedStiffnessMatrix =
128 extendedStiffnessMatrixProvider_->Eval(cell);
129 ElemMat gramian = gramianProvider_->Eval(cell);
130
131 // perform some size checks.
132 LF_ASSERT_MSG(gramian.rows() == gramian.cols(),
133 "non quadratic gramian of size ("
134 << gramian.rows() << ", " << gramian.cols() << ") on cell "
135 << cell << "\n");
136 LF_ASSERT_MSG(
137 extendedStiffnessMatrix.rows() == gramian.cols(),
138 "size missmatch between gramian & extended Stiffness matrix on cell "
139 << cell);
140
141 // evaluate DPG element matrix A = B^T G^-1 B
142 return extendedStiffnessMatrix.transpose() *
143 gramian.ldlt().solve(extendedStiffnessMatrix);
144}
145
146} // namespace projects::dpg
147
148#endif // PROJECTS_DPG_ELEMENT_MATRIX_PROVIDER
Interface class representing a topological entity in a cellular complex
Definition: entity.h:39
Class to evaluate element matrices for DPG methods.
std::shared_ptr< ProductElementMatrixProvider< SCALAR > > extendedStiffnessMatrixProvider_
DpgElementMatrixProvider(const DpgElementMatrixProvider &)=delete
standard constructors
virtual bool isActive(const lf::mesh::Entity &)
All cells are considered active in the default implementation.
DpgElementMatrixProvider(DpgElementMatrixProvider &&) noexcept=default
ElemMat Eval(const lf::mesh::Entity &cell)
main routine for the computation of DPG element matrices
typename ProductElementMatrixProvider< SCALAR >::elem_mat_t elem_mat_t
internal type for element matrices
std::shared_ptr< ProductElementMatrixProvider< SCALAR > > gramianProvider_
typename ProductElementMatrixProvider< SCALAR >::ElemMat ElemMat
Class providing element matrices associated with bilinear forms between cartesian/product spaces.
typename SubElementMatrixProvider< SCALAR >::ElemMat ElemMat
typename SubElementMatrixProvider< SCALAR >::elem_mat_t elem_mat_t
internal type for element matrices
Contains functionality for the implementation of DPG methods.
Definition: primal_dpg.h:33
DpgElementMatrixProvider(PTR stiffness_provider, PTR gramianProvider) -> DpgElementMatrixProvider< typename PTR::element_type::SCALAR >