LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
dpg_element_vector_provider.h
1#ifndef PROJECTS_DPG_DPG_ELEMENT_VECTOR_PROVIDER
2#define PROJECTS_DPG_DPG_ELEMENT_VECTOR_PROVIDER
3
12#include <lf/mesh/mesh.h>
13
14#include "dpg.h"
15#include "product_element_matrix_provider.h"
16#include "product_element_vector_provider.h"
17
18namespace projects::dpg {
55template <typename SCALAR>
57 public:
65
71
82 std::shared_ptr<ProductElementVectorProvider<SCALAR>>
83 extendedLoadVectorProvider,
84 std::shared_ptr<ProductElementMatrixProvider<SCALAR>>
85 extendedStiffnessMatrixProvider,
86 std::shared_ptr<ProductElementMatrixProvider<SCALAR>> gramianProvider)
87 : extendedLoadVectorProvider_(std::move(extendedLoadVectorProvider)),
89 std::move(extendedStiffnessMatrixProvider)),
90 gramianProvider_(std::move(gramianProvider)) {}
91
98 virtual bool isActive(const lf::mesh::Entity& /*cell*/) { return true; }
99
106 ElemVec Eval(const lf::mesh::Entity& cell);
107
108 virtual ~DpgElementVectorProvider() = default;
109
110 private:
113 std::shared_ptr<ProductElementVectorProvider<SCALAR>>
117 std::shared_ptr<ProductElementMatrixProvider<SCALAR>>
120 std::shared_ptr<ProductElementMatrixProvider<SCALAR>> gramianProvider_;
121};
122
123// template deduction hint:
124template <class PTR1, class PTR2>
125DpgElementVectorProvider(PTR1 eLoadVectorProvider, PTR2 eStiffnessProvider,
126 PTR2 gramianProvider)
128
129// evaluation method
130template <typename SCALAR>
133 // check for nullptrs
134 LF_ASSERT_MSG(extendedLoadVectorProvider_ != nullptr &&
135 extendedStiffnessMatrixProvider_ != nullptr &&
136 gramianProvider_ != nullptr,
137 "nullptr error for some provider");
138 LF_ASSERT_MSG(extendedLoadVectorProvider_->isActive(cell) &&
139 extendedStiffnessMatrixProvider_->isActive(cell) &&
140 gramianProvider_->isActive(cell),
141 "Eval method called on inactive cell");
142
143 // evaluate extended element vector l, extended stiffness matrix B and local
144 // Gramian G.
145 ElemVec extendedLoadVector = extendedLoadVectorProvider_->Eval(cell);
146 ElemMat extendedStiffnessMatrix =
147 extendedStiffnessMatrixProvider_->Eval(cell);
148 ElemMat gramian = gramianProvider_->Eval(cell);
149
150 // perform some size checks.
151 LF_ASSERT_MSG(gramian.rows() == gramian.cols(),
152 "non quadratic gramian of size ("
153 << gramian.rows() << ", " << gramian.cols() << ") on cell "
154 << cell << "\n");
155
156 // evaluate element vector B^T G^-1 l
157 return extendedStiffnessMatrix.transpose() *
158 gramian.ldlt().solve(extendedLoadVector);
159}
160} // namespace projects::dpg
161#endif // PROJECTS_DPG_DPG_ELEMENt_VECTOR_PROVIDER
Interface class representing a topological entity in a cellular complex
Definition: entity.h:39
Class to evaluate element vectors of DPG methods.
std::shared_ptr< ProductElementMatrixProvider< SCALAR > > gramianProvider_
typename ProductElementVectorProvider< SCALAR >::ElemVec ElemVec
Return type of the Eval() method.
typename ProductElementVectorProvider< SCALAR >::elem_vec_t elem_vec_t
internal type for element vectors
std::shared_ptr< ProductElementVectorProvider< SCALAR > > extendedLoadVectorProvider_
virtual bool isActive(const lf::mesh::Entity &)
All cells are considered active in the default implementation.
std::shared_ptr< ProductElementMatrixProvider< SCALAR > > extendedStiffnessMatrixProvider_
ElemVec Eval(const lf::mesh::Entity &cell)
main routine for the computation of DPG element vectors
typename ProductElementMatrixProvider< SCALAR >::ElemMat ElemMat
return type of the Eval() method of the ProductElementMatrixProvider class
DpgElementVectorProvider(DpgElementVectorProvider &&) noexcept=default
DpgElementVectorProvider(const DpgElementVectorProvider &)=delete
standard constructors
Class providing element matrices associated with bilinear forms between cartesian/product spaces.
typename SubElementMatrixProvider< SCALAR >::ElemMat ElemMat
Class providing element vectors associated with linear forms on cartesian/product spaces.
typename SubElementVectorProvider< SCALAR >::ElemVec ElemVec
typename SubElementVectorProvider< SCALAR >::elem_vec_t elem_vec_t
internal type for element vectors
Contains functionality for the implementation of DPG methods.
Definition: primal_dpg.h:33
DpgElementVectorProvider(PTR1 eLoadVectorProvider, PTR2 eStiffnessProvider, PTR2 gramianProvider) -> DpgElementVectorProvider< typename PTR1::element_type::SCALAR >