21 #include "../common/common.hpp"
23 #include "numerical_test_trial_integrator.hpp"
25 #include "shapeset.hpp"
26 #include "basis_data.hpp"
27 #include "conjugate.hpp"
28 #include "collection_of_shapeset_transformations.hpp"
29 #include "geometrical_data.hpp"
30 #include "opencl_handler.hpp"
31 #include "raw_grid_geometry.hpp"
40 template <
typename BasisFunctionType,
typename ResultType,
typename GeometryFactory>
41 NumericalTestTrialIntegrator<BasisFunctionType, ResultType, GeometryFactory>::
42 NumericalTestTrialIntegrator(
43 const arma::Mat<CoordinateType>& localQuadPoints,
44 const std::vector<CoordinateType> quadWeights,
45 const GeometryFactory& geometryFactory,
46 const RawGridGeometry<CoordinateType>& rawGeometry,
47 const CollectionOfShapesetTransformations<CoordinateType>& testTransformations,
48 const CollectionOfShapesetTransformations<CoordinateType>& trialTransformations,
49 const TestTrialIntegral<BasisFunctionType, ResultType>& integral,
50 const OpenClHandler& openClHandler) :
51 m_localQuadPoints(localQuadPoints),
52 m_quadWeights(quadWeights),
53 m_geometryFactory(geometryFactory),
54 m_rawGeometry(rawGeometry),
55 m_testTransformations(testTransformations),
56 m_trialTransformations(trialTransformations),
58 m_openClHandler(openClHandler)
60 if (localQuadPoints.n_cols != quadWeights.size())
61 throw std::invalid_argument(
"NumericalTestTrialIntegrator::"
62 "NumericalTestTrialIntegrator(): "
63 "numbers of points and weights do not match");
66 template <
typename BasisFunctionType,
typename ResultType,
typename GeometryFactory>
67 void NumericalTestTrialIntegrator<BasisFunctionType, ResultType, GeometryFactory>::integrate(
68 const std::vector<int>& elementIndices,
69 const Shapeset<BasisFunctionType>& testShapeset,
70 const Shapeset<BasisFunctionType>& trialShapeset,
71 arma::Cube<ResultType>& result)
const
73 const size_t pointCount = m_localQuadPoints.n_cols;
74 const size_t elementCount = elementIndices.size();
76 if (pointCount == 0 || elementCount == 0)
82 const int componentCount = m_testTransformations.resultDimension(0);
83 const int testDofCount = testShapeset.size();
84 const int trialDofCount = trialShapeset.size();
91 BasisData<BasisFunctionType> testBasisData, trialBasisData;
92 GeometricalData<CoordinateType> geomData;
94 size_t testBasisDeps = 0, trialBasisDeps = 0;
97 m_testTransformations.addDependencies(testBasisDeps, geomDeps);
98 m_trialTransformations.addDependencies(trialBasisDeps, geomDeps);
99 m_integral.addGeometricalDependencies(geomDeps);
101 typedef typename GeometryFactory::Geometry Geometry;
102 std::auto_ptr<Geometry> geometry(m_geometryFactory.make());
104 CollectionOf3dArrays<BasisFunctionType> testValues, trialValues;
106 result.set_size(testDofCount, trialDofCount, elementCount);
108 testShapeset.evaluate(testBasisDeps, m_localQuadPoints, ALL_DOFS, testBasisData);
109 trialShapeset.evaluate(trialBasisDeps, m_localQuadPoints, ALL_DOFS, trialBasisData);
112 for (
size_t e = 0; e < elementCount; ++e)
114 m_rawGeometry.setupGeometry(elementIndices[e], *geometry);
115 geometry->getData(geomDeps, m_localQuadPoints, geomData);
116 m_testTransformations.evaluate(testBasisData, geomData, testValues);
117 m_trialTransformations.evaluate(trialBasisData, geomData, trialValues);
119 m_integral.evaluate(geomData, testValues, trialValues,
120 m_quadWeights, result.slice(e));