LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
product_element_matrix_provider_builder.h
1#ifndef PROJECTS_DPG_PRODUCT_ELEMENT_MATRIX_PROVIDER_BUILDER
2#define PROJECTS_DPG_PRODUCT_ELEMENT_MATRIX_PROVIDER_BUILDER
3
4#include "dpg.h"
5#include "loc_comp_dpg.h"
6#include "product_element_matrix_provider.h"
7
8namespace projects::dpg {
31template <typename SCALAR>
33 public:
38 ProductElementMatrixProviderBuilder&&) noexcept = delete;
43
52 std::shared_ptr<ProductUniformFESpace<SCALAR>> fe_space_trial,
53 std::shared_ptr<ProductUniformFESpace<SCALAR>> fe_space_test)
54 : fe_space_trial_(std::move(fe_space_trial)),
55 fe_space_test_(std::move(fe_space_test)) {}
56
83 template <typename DIFF_COEFF>
85 size_type trial_component, size_type test_component, DIFF_COEFF alpha);
86
116 template <typename CONVECTION_COEFF_1, typename CONVECTION_COEFF_2>
118 size_type trial_component, size_type test_component,
119 CONVECTION_COEFF_1 beta_1, CONVECTION_COEFF_2 beta_2);
120
144 template <typename REACTION_COEFF>
146 size_type trial_component, size_type test_component,
147 REACTION_COEFF gamma);
148
176 template <typename DIFF_COEFF>
178 size_type trial_component, size_type test_component, DIFF_COEFF alpha);
179
203 template <typename COEFF>
205 size_type trial_component, size_type test_component, COEFF beta);
206
211 std::shared_ptr<ProductElementMatrixProvider<SCALAR>> Build();
212
215
216 private:
218 std::shared_ptr<ProductUniformFESpace<SCALAR>> fe_space_trial_;
220 std::shared_ptr<ProductUniformFESpace<SCALAR>> fe_space_test_;
223 std::vector<std::shared_ptr<SubElementMatrixProvider<SCALAR>>> subproviders_;
224};
225
226template <typename SCALAR>
227template <typename DIFF_COEFF>
230 size_type trial_component, size_type test_component, DIFF_COEFF alpha) {
231 subproviders_.push_back(
233 fe_space_trial_, fe_space_test_, trial_component, test_component,
234 alpha));
235
236 return *this;
237}
238
239template <typename SCALAR>
240template <typename CONVECTION_COEFF_1, typename CONVECTION_COEFF_2>
243 size_type trial_component, size_type test_component,
244 CONVECTION_COEFF_1 beta_1, CONVECTION_COEFF_2 beta_2) {
245 subproviders_.push_back(std::make_shared<ConvectionElementMatrixProvider<
246 SCALAR, CONVECTION_COEFF_1, CONVECTION_COEFF_2>>(
247 fe_space_trial_, fe_space_test_, trial_component, test_component, beta_1,
248 beta_2));
249 return *this;
250}
251
252template <typename SCALAR>
253template <typename REACTION_COEFF>
256 size_type trial_component, size_type test_component, REACTION_COEFF gamma) {
257 subproviders_.push_back(
259 fe_space_trial_, fe_space_test_, trial_component, test_component,
260 gamma));
261 return *this;
262}
263
264template <typename SCALAR>
265template <typename DIFF_COEFF>
268 size_type trial_component, size_type test_component, DIFF_COEFF alpha) {
269 subproviders_.push_back(
271 fe_space_trial_, fe_space_test_, trial_component, test_component,
272 alpha));
273 return *this;
274}
275
276template <typename SCALAR>
277template <typename COEFF>
280 size_type trial_component, size_type test_component, COEFF beta) {
281 subproviders_.push_back(
283 fe_space_trial_, fe_space_test_, trial_component, test_component,
284 beta));
285 return *this;
286}
287
288template <typename SCALAR>
289std::shared_ptr<ProductElementMatrixProvider<SCALAR>>
291 auto provider = std::make_shared<ProductElementMatrixProvider<SCALAR>>(
292 fe_space_trial_, fe_space_test_, subproviders_);
293 // clear supplied information
294 subproviders_ = {};
295 return provider;
296}
297
298} // namespace projects::dpg
299
300#endif // PROJECTS_DPG_PRODUCT_ELEMENT_MATRIX_PROVIDER_BUILDER
Class for local quadrature based computations sub element matrices corresponding to convection-like e...
Definition: loc_comp_dpg.h:532
Class for local quadrature based computations of sub element matrices corresponding to diffusion elem...
Definition: loc_comp_dpg.h:70
class for local quadrature based computations of sub element matrices corresponding to element matric...
Definition: loc_comp_dpg.h:789
Builder class to build a ProductElementMatrixProvider.
std::shared_ptr< ProductUniformFESpace< SCALAR > > fe_space_trial_
collection of specifications for the trial space
ProductElementMatrixProviderBuilder & AddReactionElementMatrixProvider(size_type trial_component, size_type test_component, REACTION_COEFF gamma)
std::shared_ptr< ProductElementMatrixProvider< SCALAR > > Build()
Build the ProdcutElementMatrixProvider for the bilinear form based on the provided bilinear forms .
ProductElementMatrixProviderBuilder & AddFluxElementMatrixProvider(size_type trial_component, size_type test_component, DIFF_COEFF alpha)
ProductElementMatrixProviderBuilder & AddConvectionElementMatrixProvider(size_type trial_component, size_type test_component, CONVECTION_COEFF_1 beta_1, CONVECTION_COEFF_2 beta_2)
ProductElementMatrixProviderBuilder(const ProductElementMatrixProviderBuilder &)=delete
standard constructor
ProductElementMatrixProviderBuilder & AddTraceElementMatrixProvider(size_type trial_component, size_type test_component, COEFF beta)
~ProductElementMatrixProviderBuilder()=default
virtual destructor
std::vector< std::shared_ptr< SubElementMatrixProvider< SCALAR > > > subproviders_
vector of Element Matrix Providers representing already added bilinear forms
ProductElementMatrixProviderBuilder & AddDiffusionElementMatrixProvider(size_type trial_component, size_type test_component, DIFF_COEFF alpha)
std::shared_ptr< ProductUniformFESpace< SCALAR > > fe_space_test_
collection of specifications for the test space
ProductElementMatrixProviderBuilder(ProductElementMatrixProviderBuilder &&) noexcept=delete
cartesian/prodcut space of finite element functions on a hybrid 2D mesh.
Class for local quadrature based computations of sub element matrices corresponding to reaction eleme...
Definition: loc_comp_dpg.h:303
Class for local quadrature based computations of sub element matrices corresponding to element matric...
Contains functionality for the implementation of DPG methods.
Definition: primal_dpg.h:33
lf::uscalfe::size_type size_type
Type for vector length/matrix sizes.
Definition: dpg.h:17