LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
product_element_vector_provider.h
1#ifndef PROJECTS_DPG_PRODUCT_ELEMENT_VECTOR_PROVIDER
2#define PROJECTS_DPG_PRODUCT_ELEMENT_VECTOR_PROVIDER
3
13#include <lf/mesh/mesh.h>
14#include <lf/uscalfe/uscalfe.h>
15
16#include <iostream>
17#include <vector>
18
19#include "dpg.h"
20#include "product_fe_space.h"
21#include "sub_element_vector_provider.h"
22
23namespace projects::dpg {
24
26using size_type = lf::uscalfe::size_type;
27
58template <typename SCALAR>
60 public:
65
69 default;
71 delete;
73 delete;
74
84 std::shared_ptr<ProductUniformFESpace<SCALAR>> fe_space_test,
85 std::vector<std::shared_ptr<SubElementVectorProvider<SCALAR>>>
86 subproviders)
87 : fe_space_test_(std::move(fe_space_test)),
88 subproviders_(std::move(subproviders)) {}
89
96 virtual bool isActive(const lf::mesh::Entity& /*cell*/) { return true; }
97
104 ElemVec Eval(const lf::mesh::Entity& cell);
105
107 virtual ~ProductElementVectorProvider() = default;
108
109 private:
111 std::shared_ptr<ProductUniformFESpace<SCALAR>> fe_space_test_;
114 std::vector<std::shared_ptr<SubElementVectorProvider<SCALAR>>> subproviders_;
115};
116
117// template deduction hint
118template <typename PTR, typename vector>
119ProductElementVectorProvider(PTR fe_space_test, vector subproviders)
121
122// evaluation method
123template <typename SCALAR>
126 // retrive dofhandler(for local assembly with LocalStartIndex method
127 LF_ASSERT_MSG(fe_space_test_ != nullptr,
128 "missing description of the trial space");
129 const ProductUniformFEDofHandler& dof_h{fe_space_test_->LocGlobMap()};
130
131 // initialize the element vector
132 elem_vec_t vec(dof_h.NumLocalDofs(cell));
133 vec.setZero();
134
135 // build the building block from the "building block" subproviders
136 for (const auto& provider : subproviders_) {
137 LF_ASSERT_MSG(provider != nullptr,
138 "invalid subvector provider, is nullptr");
139 if (provider->isActive(cell)) {
140 // extract involved component
141 size_type test_component = provider->TestComponent();
142 // evaluate the subvector
143 elem_vec_t sub_vec = provider->Eval(cell);
144 // add it to the corresponding place in the element vector.
145 vec.segment(dof_h.LocalStartIndex(cell, test_component),
146 sub_vec.size()) += sub_vec;
147 }
148 }
149 return vec;
150}
151
152} // namespace projects::dpg
153
154#endif // PROJECTS_DPG_PRODUCT_ELEMENT_VECTOR_PROVIDER.
Interface class representing a topological entity in a cellular complex
Definition: entity.h:39
Class providing element vectors associated with linear forms on cartesian/product spaces.
virtual bool isActive(const lf::mesh::Entity &)
All cells are considered active in the default implementation.
ProductElementVectorProvider(ProductElementVectorProvider &&) noexcept=default
std::vector< std::shared_ptr< SubElementVectorProvider< SCALAR > > > subproviders_
ElemVec Eval(const lf::mesh::Entity &cell)
main routine for the computation of element vectors
std::shared_ptr< ProductUniformFESpace< SCALAR > > fe_space_test_
virtual ~ProductElementVectorProvider()=default
virtual destructor
typename SubElementVectorProvider< SCALAR >::ElemVec ElemVec
typename SubElementVectorProvider< SCALAR >::elem_vec_t elem_vec_t
internal type for element vectors
ProductElementVectorProvider(const ProductElementVectorProvider &)=delete
Standard constructors.
Dofhandler for uniform finite element spaces that discretizes a cartesian/product space.
cartesian/prodcut space of finite element functions on a hybrid 2D mesh.
Interface class providing element vectors associated with linear forms of a component of a cartesian/...
Eigen::Matrix< SCALAR, Eigen::Dynamic, 1 > elem_vec_t
internal type for element vectors
lf::assemble::size_type size_type
Definition: lagr_fe.h:30
Contains functionality for the implementation of DPG methods.
Definition: primal_dpg.h:33
ProductElementVectorProvider(PTR fe_space_test, vector subproviders) -> ProductElementVectorProvider< typename PTR::element_type::SCALAR >
lf::uscalfe::size_type size_type
Type for vector length/matrix sizes.
Definition: dpg.h:17