21 #ifndef fiber_default_kernel_trial_integral_imp_hpp
22 #define fiber_default_kernel_trial_integral_imp_hpp
24 #include "default_kernel_trial_integral.hpp"
26 #include "geometrical_data.hpp"
55 template <
typename IntegrandFunctor>
56 void DefaultKernelTrialIntegral<IntegrandFunctor>::
57 addGeometricalDependencies(
size_t& trialGeomDeps)
const
59 trialGeomDeps |= INTEGRATION_ELEMENTS;
60 m_functor.addGeometricalDependencies(trialGeomDeps);
63 template <
typename IntegrandFunctor>
64 int DefaultKernelTrialIntegral<IntegrandFunctor>::resultDimension()
const
66 return m_functor.resultDimension();
69 template <
typename IntegrandFunctor>
70 void DefaultKernelTrialIntegral<IntegrandFunctor>::evaluate(
71 const GeometricalData<CoordinateType>& trialGeomData,
72 const CollectionOf4dArrays<KernelType>& kernels,
73 const CollectionOf2dArrays<ResultType>& trialTransformations,
74 const std::vector<CoordinateType>& weights,
75 _2dArray<ResultType>& result)
const
77 const size_t evalPointCount = kernels[0].extent(2);
78 const size_t quadPointCount = kernels[0].extent(3);
79 const int resultComponentCount = m_functor.resultDimension();
81 for (
size_t i = 0; i < kernels.size(); ++i) {
82 assert(kernels[i].extent(2) == evalPointCount);
83 assert(kernels[i].extent(3) == quadPointCount);
85 for (
size_t i = 0; i < trialTransformations.size(); ++i) {
86 assert(trialTransformations[i].extent(1) == quadPointCount);
88 assert(weights.size() == quadPointCount);
90 result.set_size(resultComponentCount, evalPointCount);
91 std::fill(result.begin(), result.end(), 0.);
93 std::vector<ResultType> value(resultComponentCount);
95 for (
size_t evalPoint = 0; evalPoint < evalPointCount; ++evalPoint)
96 for (
size_t quadPoint = 0; quadPoint < quadPointCount; ++quadPoint) {
98 trialGeomData.const_slice(quadPoint),
99 kernels.const_slice(evalPoint, quadPoint),
100 trialTransformations.const_slice(quadPoint),
102 for (
int dim = 0; dim < resultComponentCount; ++dim)
103 result(dim, evalPoint) += value[dim] * weights[quadPoint];
107 template <
typename IntegrandFunctor>
108 void DefaultKernelTrialIntegral<IntegrandFunctor>::evaluateWithPureWeights(
109 const GeometricalData<CoordinateType>& trialGeomData,
110 const CollectionOf4dArrays<KernelType>& kernels,
111 const CollectionOf3dArrays<BasisFunctionType>& trialTransformations,
112 const std::vector<CoordinateType>& weights,
113 _3dArray<ResultType>& result)
const
115 const size_t trialDofCount = trialTransformations[0].extent(1);
116 const size_t evalPointCount = kernels[0].extent(2);
117 const size_t quadPointCount = kernels[0].extent(3);
118 const int resultComponentCount = m_functor.resultDimension();
120 for (
size_t i = 0; i < kernels.size(); ++i) {
121 assert(kernels[i].extent(2) == evalPointCount);
122 assert(kernels[i].extent(3) == quadPointCount);
124 for (
size_t i = 0; i < trialTransformations.size(); ++i) {
125 assert(trialTransformations[i].extent(1) == trialDofCount);
126 assert(trialTransformations[i].extent(2) == quadPointCount);
128 assert(weights.size() == quadPointCount);
130 result.set_size(resultComponentCount, trialDofCount, evalPointCount);
131 std::fill(result.begin(), result.end(), 0.);
133 std::vector<ResultType> value(resultComponentCount);
135 for (
size_t trialDof = 0; trialDof < trialDofCount; ++trialDof)
136 for (
size_t evalPoint = 0; evalPoint < evalPointCount; ++evalPoint)
137 for (
size_t quadPoint = 0; quadPoint < quadPointCount; ++quadPoint) {
139 trialGeomData.const_slice(quadPoint),
140 kernels.const_slice(evalPoint, quadPoint),
141 trialTransformations.const_slice(trialDof, quadPoint),
143 for (
int dim = 0; dim < resultComponentCount; ++dim)
144 result(dim, trialDof, evalPoint) += value[dim] *
145 trialGeomData.integrationElements(quadPoint) *