22 #include "default_local_assembler_for_grid_functions_on_surfaces.hpp"
24 #include "../common/common.hpp"
26 #include "numerical_test_function_integrator.hpp"
27 #include "quadrature_descriptor_selector_for_grid_functions.hpp"
28 #include "single_quadrature_rule_family.hpp"
36 template <
typename BasisFunctionType,
typename UserFunctionType,
37 typename ResultType,
typename GeometryFactory>
38 DefaultLocalAssemblerForGridFunctionsOnSurfaces<
39 BasisFunctionType, UserFunctionType, ResultType, GeometryFactory>::
40 DefaultLocalAssemblerForGridFunctionsOnSurfaces(
41 const shared_ptr<const GeometryFactory>& geometryFactory,
42 const shared_ptr<
const RawGridGeometry<CoordinateType> >& rawGeometry,
43 const shared_ptr<
const std::vector<
const Shapeset<BasisFunctionType>*> >& testShapesets,
44 const shared_ptr<
const CollectionOfShapesetTransformations<CoordinateType> >& testTransformations,
45 const shared_ptr<
const Function<UserFunctionType> >&
function,
46 const shared_ptr<const OpenClHandler>& openClHandler,
47 const shared_ptr<
const QuadratureDescriptorSelectorForGridFunctions<CoordinateType> >& quadDescSelector,
48 const shared_ptr<
const SingleQuadratureRuleFamily<CoordinateType> >& quadRuleFamily) :
49 m_geometryFactory(geometryFactory),
50 m_rawGeometry(rawGeometry),
51 m_testShapesets(testShapesets),
52 m_testTransformations(testTransformations),
54 m_openClHandler(openClHandler),
55 m_quadDescSelector(quadDescSelector),
56 m_quadRuleFamily(quadRuleFamily)
60 template <
typename BasisFunctionType,
typename UserFunctionType,
61 typename ResultType,
typename GeometryFactory>
62 DefaultLocalAssemblerForGridFunctionsOnSurfaces<
63 BasisFunctionType, UserFunctionType, ResultType, GeometryFactory>::
64 ~DefaultLocalAssemblerForGridFunctionsOnSurfaces()
69 for (
typename IntegratorMap::const_iterator it = m_testFunctionIntegrators.begin();
70 it != m_testFunctionIntegrators.end(); ++it)
72 m_testFunctionIntegrators.clear();
75 template <
typename BasisFunctionType,
typename UserFunctionType,
76 typename ResultType,
typename GeometryFactory>
78 DefaultLocalAssemblerForGridFunctionsOnSurfaces<
79 BasisFunctionType, UserFunctionType, ResultType, GeometryFactory>::
80 evaluateLocalWeakForms(
81 const std::vector<int>& elementIndices,
82 std::vector<arma::Col<ResultType> >& result)
86 const int elementCount = elementIndices.
size();
87 result.resize(elementCount);
90 typedef std::pair<const Integrator*, const Shapeset*> QuadVariant;
91 std::vector<QuadVariant> quadVariants(elementCount);
93 for (
int testIndex = 0; testIndex < elementCount; ++testIndex)
95 const int activeTestElementIndex = elementIndices[testIndex];
97 &selectIntegrator(activeTestElementIndex);
98 quadVariants[testIndex] =
99 QuadVariant(integrator, (*m_testShapesets)[activeTestElementIndex]);
106 typedef std::set<QuadVariant> QuadVariantSet;
108 QuadVariantSet uniqueQuadVariants(quadVariants.begin(), quadVariants.end());
110 std::vector<int> activeElementIndices;
111 activeElementIndices.reserve(elementCount);
114 for (
typename QuadVariantSet::const_iterator it = uniqueQuadVariants.begin();
115 it != uniqueQuadVariants.end(); ++it)
117 const QuadVariant activeQuadVariant = *it;
118 const Integrator& activeIntegrator = *it->first;
119 const Shapeset& activeTestShapeset = *it->second;
123 activeElementIndices.clear();
124 for (
int e = 0; e < elementCount; ++e)
125 if (quadVariants[e] == activeQuadVariant)
126 activeElementIndices.push_back(elementIndices[e]);
129 arma::Mat<ResultType> localResult;
130 activeIntegrator.integrate(activeElementIndices,
137 for (
int e = 0; e < elementCount; ++e)
138 if (quadVariants[e] == activeQuadVariant)
139 result[e] = localResult.col(i++);
143 template <
typename BasisFunctionType,
typename UserFunctionType,
144 typename ResultType,
typename GeometryFactory>
147 BasisFunctionType, UserFunctionType, ResultType, GeometryFactory>::
148 selectIntegrator(
int elementIndex)
151 m_quadDescSelector->quadratureDescriptor(elementIndex);
152 return getIntegrator(desc);
155 template <
typename BasisFunctionType,
typename UserFunctionType,
156 typename ResultType,
typename GeometryFactory>
157 const TestFunctionIntegrator<BasisFunctionType, ResultType>&
158 DefaultLocalAssemblerForGridFunctionsOnSurfaces<
159 BasisFunctionType, UserFunctionType, ResultType, GeometryFactory>::
160 getIntegrator(
const SingleQuadratureDescriptor& desc)
162 typename IntegratorMap::iterator it = m_testFunctionIntegrators.find(desc);
163 if (it != m_testFunctionIntegrators.end())
171 arma::Mat<CoordinateType> points;
172 std::vector<CoordinateType> weights;
173 m_quadRuleFamily->fillQuadraturePointsAndWeights(desc, points, weights);
175 typedef NumericalTestFunctionIntegrator<BasisFunctionType, UserFunctionType,
176 ResultType, GeometryFactory> ConcreteIntegrator;
177 Integrator* integrator(
178 new ConcreteIntegrator(points, weights,
179 *m_geometryFactory, *m_rawGeometry,
180 *m_testTransformations, *m_function,
184 std::pair<typename IntegratorMap::iterator, bool> result =
185 m_testFunctionIntegrators.insert(std::make_pair(desc, integrator));
196 return *result.first->second;
virtual int size() const =0
Return the number of shape functions.
Integration of products of test functions and arbitrary functions over elements.
Definition: test_function_integrator.hpp:41
Definition: default_local_assembler_for_grid_functions_on_surfaces.hpp:51
Collection of shape functions defined on a reference element.
Definition: default_local_assembler_for_operators_on_surfaces_utilities.hpp:34
Parameters of a quadrature rule used in the evaluation of integrals over single elements.
Definition: single_quadrature_descriptor.hpp:34