1 #ifndef INTEGRATE_TRIPLE_PRODUCT_HPP
2 #define INTEGRATE_TRIPLE_PRODUCT_HPP
14 typedef Eigen::Map<Eigen::MatrixXd, Eigen::Unaligned, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>
MatrixSlice;
15 typedef Eigen::Map<Eigen::VectorXd, Eigen::Unaligned, Eigen::InnerStride<Eigen::Dynamic>>
VectorSlice;
34 size_t size_dim1 = tensor.shape()[0];
35 size_t size_dim2 = tensor.shape()[1];
36 size_t size_dim3 = tensor.shape()[2];
44 if (fixed_dim == 1 && index < size_dim1){
45 start = index*size_dim2*size_dim3;
49 row_stride = size_dim3;
50 }
else if (fixed_dim == 2 && index < size_dim2){
51 start = index*size_dim3;
55 row_stride = size_dim2*size_dim3;
56 }
else if (fixed_dim == 3 && index < size_dim3){
61 column_stride = size_dim3;
62 row_stride = size_dim2*size_dim3;
64 std::cerr <<
"[IntegrateTripleProduct] ERROR: Multiarray slicing dimension or index out of range" << std::endl;
67 return MatrixSlice(tensor.data() + start, num_rows, num_cols, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(column_stride, row_stride));
80 size_t size_dim1 = tensor.shape()[0];
81 size_t size_dim2 = tensor.shape()[1];
82 size_t size_dim3 = tensor.shape()[2];
88 if (fixed_dim1 == 1 && index1 < size_dim1 && fixed_dim2 == 2 && index2 < size_dim2){
89 start = index1*size_dim2*size_dim3 + index2*size_dim3;
90 num_elements = size_dim3;
92 }
else if (fixed_dim1 == 2 && index1 < size_dim2 && fixed_dim2 == 1 && index2 < size_dim1){
93 start = index2*size_dim2*size_dim3 + index1*size_dim3;
94 num_elements = size_dim3;
96 }
else if (fixed_dim1 == 1 && index1 < size_dim1 && fixed_dim2 == 3 && index2 < size_dim3){
97 start = index1*size_dim2*size_dim3 + index2;
98 num_elements = size_dim2;
100 }
else if (fixed_dim1 == 3 && index1 < size_dim3 && fixed_dim2 == 1 && index2 < size_dim1){
101 start = index1 + index2*size_dim2*size_dim3;
102 num_elements = size_dim2;
104 }
else if (fixed_dim1 == 2 && index1 < size_dim2 && fixed_dim2 == 3 && index2 < size_dim3){
105 start = index1*size_dim3 + index2;
106 num_elements = size_dim1;
107 stride = size_dim2*size_dim3;
108 }
else if (fixed_dim1 == 3 && index1 < size_dim3 && fixed_dim2 == 2 && index2 < size_dim2) {
109 start = index1 + index2*size_dim3;
110 num_elements = size_dim1;
111 stride = size_dim2*size_dim3;
113 std::cerr <<
"[IntegrateTripleProduct] ERROR: Multiarray slicing dimension or index out of range" << std::endl;
116 return VectorSlice(tensor.data()+start, num_elements, Eigen::InnerStride<>(stride));
139 size_t anc_dim2 = basis2.
ancestor().dimension();
142 Scalar3Tensor scalar_integrals(boost::extents[dim1][anc_dim2][anc_dim2]);
148 std::fill_n(integrals.data(), integrals.num_elements(), 0);
150 for (
size_t i = 0; i < dim1; i++) {
151 for (
size_t j = 0; j < anc_dim2; j++) {
152 for (
size_t k = 0; k <= j; k++) {
153 scalar_integrals[i][j][k] = intmap.at(basis1.
powers(i) + basis2.
ancestor().powers(j) + basis2.
ancestor().powers(k));
154 scalar_integrals[i][k][j] = scalar_integrals[i][j][k];
159 for (
size_t i = 0; i < N; i++){
160 integrals[boost::indices[boost::multi_array_types::index_range(0,dim1)][boost::multi_array_types::index_range(i*anc_dim2,i*anc_dim2+anc_dim2)][boost::multi_array_types::index_range(i*anc_dim2,i*anc_dim2+anc_dim2)]] = scalar_integrals;
176 size_t anc_dim1 = tens_family1.
ancestor().dimension();
178 size_t anc_dim2 = tens_family2.
ancestor().dimension();
179 size_t totaldegree = tens_family1.
ancestor().max_degree() + tens_family2.
ancestor().max_degree() + tens_family2.
ancestor().max_degree();
185 std::fill_n(integrals.data(), integrals.num_elements(), 0);
187 Eigen::Matrix3i
id = Eigen::Matrix3i::Identity();
190 for (
size_t i = 0; i < N; i++){
191 for (
size_t j = 0; j < N; j++){
192 for (
size_t k = 0; k < j; k++){
193 int sign =
id.col(i).dot(
id.col(j).cross(
id.col(k)));
196 for (
size_t sub_i = 0; sub_i < anc_dim1; sub_i++){
197 for (
size_t sub_j = 0; sub_j < anc_dim2; sub_j++){
198 for (
size_t sub_k = 0; sub_k < anc_dim2; sub_k++){
199 integrals[i*anc_dim1 + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] =
201 tens_family1.
ancestor().powers(sub_i)
202 + tens_family2.
ancestor().powers(sub_j)
203 + tens_family2.
ancestor().powers(sub_k)
206 integrals[i*anc_dim1 + sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[i*anc_dim1 + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
208 integrals[i*anc_dim1 + sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[i*anc_dim1 + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
209 integrals[i*anc_dim1 + sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[i*anc_dim1 + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
231 size_t anc_dim2 = tens_family.
ancestor().dimension();
232 size_t totaldegree = grad_basis.
ancestor().max_degree()-1 + tens_family.
ancestor().max_degree() + tens_family.
ancestor().max_degree();
238 std::fill_n(integrals.data(), integrals.num_elements(), 0);
240 Eigen::Matrix3i
id = Eigen::Matrix3i::Identity();
243 for (
size_t i = 0; i < N; i++){
244 for (
size_t j = 0; j < N; j++){
245 for (
size_t k = 0; k < j; k++){
246 int sign =
id.col(i).dot(
id.col(j).cross(
id.col(k)));
249 for (
size_t sub_i = 0; sub_i < dim1; sub_i++){
250 if (grad_basis.
ancestor().powers(sub_i)[i]>0){
251 for (
size_t sub_j = 0; sub_j < anc_dim2; sub_j++){
252 for (
size_t sub_k = 0; sub_k < anc_dim2; sub_k++){
253 integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] =
254 sign * grad_basis.
ancestor().powers(sub_i)[i]
256 grad_basis.
ancestor().powers(sub_i)-
id.col(i)
257 + tens_family.
ancestor().powers(sub_j)
258 + tens_family.
ancestor().powers(sub_k)
261 integrals[sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
263 integrals[sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
264 integrals[sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
285 size_t dim1 = golycompl_basis.
dimension();
286 size_t dimPkmo = golycompl_basis.
dimPkmo();
287 size_t dimPkmo2 = dim1 - 2*dimPkmo;
290 size_t anc_dim2 = tens_family.
ancestor().dimension();
297 std::fill_n(integrals.data(), integrals.num_elements(), 0);
299 Eigen::Matrix3i
id = Eigen::Matrix3i::Identity();
302 for (
size_t j = 0; j < N; j++){
303 for (
size_t k = 0; k < N; k++){
304 Eigen::Vector3i direction =
id.col(j).cross(
id.col(k));
305 int sign = direction.sum();
307 for (
size_t sub_j = 0; sub_j < anc_dim2; sub_j++){
308 for (
size_t sub_k = 0; sub_k <= sub_j; sub_k++){
309 if (direction==
id.col(0)){
311 for (
size_t sub_i = 0; sub_i < dimPkmo; sub_i++){
312 integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] = -sign * intmap.at(golycompl_basis.
powers(dimPkmo + sub_i) +
id.col(2) + tens_family.
ancestor().powers(sub_j) + tens_family.
ancestor().powers(sub_k));
313 integrals[dimPkmo + sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
314 integrals[dimPkmo + sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
315 integrals[dimPkmo + sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
318 for (
size_t sub_i = 0; sub_i < dimPkmo2; sub_i++){
319 integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] = sign * intmap.at(golycompl_basis.
powers(2*dimPkmo + sub_i) +
id.col(1) + tens_family.
ancestor().powers(sub_j) + tens_family.
ancestor().powers(sub_k));
320 integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
321 integrals[2*dimPkmo + sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
322 integrals[2*dimPkmo + sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
324 }
else if (direction==
id.col(1)){
326 for (
size_t sub_i = 0; sub_i < dimPkmo; sub_i++){
327 integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] = sign * intmap.at(golycompl_basis.
powers(sub_i)+
id.col(2) + tens_family.
ancestor().powers(sub_j) + tens_family.
ancestor().powers(sub_k));
328 integrals[sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
329 integrals[sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
330 integrals[sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
333 for (
size_t sub_i = 0; sub_i < dimPkmo2; sub_i++){
334 integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] = -sign * intmap.at(golycompl_basis.
powers(2*dimPkmo + sub_i) +
id.col(0) + tens_family.
ancestor().powers(sub_j) + tens_family.
ancestor().powers(sub_k));
335 integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
336 integrals[2*dimPkmo + sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
337 integrals[2*dimPkmo + sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[2*dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
339 }
else if (direction==
id.col(2)){
341 for (
size_t sub_i = 0; sub_i < dimPkmo; sub_i++){
342 integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] = -sign * intmap.at(golycompl_basis.
powers(sub_i)+
id.col(1) + tens_family.
ancestor().powers(sub_j) + tens_family.
ancestor().powers(sub_k));
343 integrals[sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
344 integrals[sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
345 integrals[sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
348 for (
size_t sub_i = 0; sub_i < dimPkmo; sub_i++){
349 integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k] = sign * intmap.at(golycompl_basis.
powers(dimPkmo + sub_i) +
id.col(0) + tens_family.
ancestor().powers(sub_j) + tens_family.
ancestor().powers(sub_k));
350 integrals[dimPkmo + sub_i][j*anc_dim2 + sub_k][k*anc_dim2 + sub_j] = integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
351 integrals[dimPkmo + sub_i][k*anc_dim2 + sub_j][j*anc_dim2 + sub_k] = -integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
352 integrals[dimPkmo + sub_i][k*anc_dim2 + sub_k][j*anc_dim2 + sub_j] = -integrals[dimPkmo + sub_i][j*anc_dim2 + sub_j][k*anc_dim2 + sub_k];
365 template<
typename ScalarBasisType1,
typename ScalarBasisType2,
size_t N>
374 size_t unshifted_dim1 = grad_shift_basis.ancestor().ancestor().dimension();
375 size_t shift = grad_shift_basis.ancestor().shift();
377 GradientBasis<ScalarBasisType1> grad_basis(grad_shift_basis.ancestor().ancestor());
381 Scalar3Tensor integrals = anc_integrals[boost::indices[boost::multi_array_types::index_range(shift,unshifted_dim1)][boost::multi_array_types::index_range(0,dim2)][boost::multi_array_types::index_range(0,dim2)]];
386 template<
typename ScalarBasisType,
typename BasisType>
390 const BasisType & basis2,
394 size_t dim2 = basis2.dimension();
395 size_t unshifted_dim1 = grad_shift_basis.ancestor().ancestor().dimension();
396 size_t shift = grad_shift_basis.ancestor().shift();
398 GradientBasis<ScalarBasisType> grad_basis(grad_shift_basis.ancestor().ancestor());
402 Scalar3Tensor integrals = anc_integrals[boost::indices[boost::multi_array_types::index_range(shift,unshifted_dim1)][boost::multi_array_types::index_range(0,dim2)][boost::multi_array_types::index_range(0,dim2)]];
407 template<
typename BasisType,
typename ScalarBasisType,
size_t N>
410 const BasisType & basis1,
415 size_t dim1 = basis1.dimension();
416 size_t dim2 = basis2.dimension();
417 size_t anc_dim2 = basis2.ancestor().dimension();
418 size_t anc_anc_dim2 = basis2.ancestor().ancestor().dimension();
420 Eigen::MatrixXd M2 = basis2.ancestor().matrix();
423 std::fill_n(integrals.data(), integrals.num_elements(), 0);
425 TensorizedVectorFamily<ScalarBasisType, N> red_basis2(basis2.ancestor().ancestor());
429 for (
size_t j = 0; j < N; j++){
430 for (
size_t k = 0; k < N; k++){
431 Scalar3Tensor anc_scalar_integrals = tensor_integrals[boost::indices[boost::multi_array_types::index_range(0,dim1)][boost::multi_array_types::index_range(j*anc_anc_dim2,(j+1)*anc_anc_dim2)][boost::multi_array_types::index_range(k*anc_anc_dim2,(k+1)*anc_anc_dim2)]];
432 for (
size_t i = 0; i < dim1; i++){
434 for (
size_t sub_j = 0; sub_j < anc_dim2; sub_j++){
435 for (
size_t sub_k = 0; sub_k <= sub_j; sub_k++){
436 integrals[i][anc_dim2*j + sub_j][anc_dim2*k + sub_k] = M2.row(sub_j) * int_jk * M2.row(sub_k).transpose();
437 integrals[i][anc_dim2*j + sub_k][anc_dim2*k + sub_j] = integrals[i][anc_dim2*j + sub_j][anc_dim2*k + sub_k];
446 template<
typename BasisType,
typename ScalarBasisType,
size_t N>
455 size_t dim2 = basis2.dimension();
456 size_t anc_dim1 = basis1.
ancestor().dimension();
457 size_t anc_dim2 = basis2.ancestor().dimension();
459 Eigen::MatrixXd M1 = basis1.
matrix();
460 Eigen::MatrixXd M2 = basis2.matrix();
463 std::fill_n(integrals.data(), integrals.num_elements(), 0);
467 for (
size_t i = 0; i < dim1; i++){
468 Eigen::MatrixXd int_jk = Eigen::MatrixXd::Zero(anc_dim2, anc_dim2);
469 for (
size_t l = 0; l < anc_dim1; l++){
470 int_jk += M1(i, l) *
slice(anc_integrals, 1, l);
473 for (
size_t j = 0; j < dim2; j++){
474 for (
size_t k = 0; k < dim2; k++){
475 integrals[i][j][k] = M2.row(j) * int_jk * M2.row(k).transpose();
482 template<
typename BasisType,
size_t N>
492 size_t anc_dim1 = basis1.
ancestor().dimension();
494 Eigen::MatrixXd M1 = basis1.
matrix();
497 std::fill_n(integrals.data(), integrals.num_elements(), 0);
501 for (
size_t i = 0; i < dim1; i++){
503 for (
size_t l = 0; l < anc_dim1; l++){
504 int_jk += M1(i, l) *
slice(scalar_integrals, 1, l);
510 template<
typename BasisType1,
typename BasisType2>
513 const BasisType1 & basis1,
518 size_t dim1 = basis1.dimension();
521 Eigen::MatrixXd M2 = basis2.
matrix();
524 std::fill_n(integrals.data(), integrals.num_elements(), 0);
528 for (
size_t i = 0; i < dim1; i++){
530 for (
size_t j = 0; j < dim2; j++){
531 for (
size_t k = 0; k <= j; k++){
532 integrals[i][j][k] = M2.row(j) * int_jk * M2.row(k).transpose();
533 integrals[i][k][j] = integrals[i][j][k];
540 template<
size_t N,
typename ScalarBasisType>
549 size_t anc_dim1 = tens_family1.
ancestor().dimension();
550 size_t anc_anc_dim1 = tens_family1.
ancestor().ancestor().dimension();
552 size_t anc_dim2 = tens_family2.
ancestor().dimension();
554 Eigen::MatrixXd M1 = tens_family1.
ancestor().matrix();
557 std::fill_n(integrals.data(), integrals.num_elements(), 0);
559 TensorizedVectorFamily<ScalarBasisType, N> red_basis1(tens_family1.
ancestor().ancestor());
562 Eigen::Matrix3i
id = Eigen::Matrix3i::Identity();
564 for (
size_t i = 0; i < N; i++){
565 for (
size_t j = 0; j < N; j++){
566 for (
size_t k = 0; k < j; k++){
567 int sign =
id.col(i).dot(
id.col(j).cross(
id.col(k)));
569 Scalar3Tensor anc_scalar_integrals = tensor_integrals[boost::indices[boost::multi_array_types::index_range(i*anc_anc_dim1,(i+1)*anc_anc_dim1)][boost::multi_array_types::index_range(j*anc_dim2,(j+1)*anc_dim2)][boost::multi_array_types::index_range(k*anc_dim2,(k+1)*anc_dim2)]];
570 for (
size_t sub_j = 0; sub_j < anc_dim2; sub_j++){
571 Eigen::MatrixXd fam_int_jk = M1 *
slice(anc_scalar_integrals, 2, sub_j);
572 for (
size_t sub_i = 0; sub_i < anc_dim1; sub_i++){
573 for (
size_t sub_k = 0; sub_k < anc_dim2; sub_k++){
574 integrals[i*anc_dim1+sub_i][j*anc_dim2+sub_j][k*anc_dim2+sub_k] = fam_int_jk(sub_i, sub_k);
575 integrals[i*anc_dim1+sub_i][k*anc_dim2+sub_j][j*anc_dim2+sub_k] = -fam_int_jk(sub_i, sub_k);
Family of functions expressed as linear combination of the functions of a given basis.
Definition: basis.hpp:388
Basis for the complement G^{c,k}(T) in P^k(T)^3 of the range of grad.
Definition: basis.hpp:1503
Basis for the space of gradients of polynomials.
Definition: basis.hpp:1228
Scalar monomial basis on a cell.
Definition: basis.hpp:154
Generate a basis where the function indices are shifted.
Definition: basis.hpp:1012
Vector family obtained by tensorization of a scalar family.
Definition: basis.hpp:609
constexpr const BasisType & ancestor() const
Return the ancestor.
Definition: basis.hpp:564
size_t dimPkmo() const
Returns the dimension of P^{k-1}(R^3)
Definition: basis.hpp:1553
size_t dimension() const
Return the dimension of the family.
Definition: basis.hpp:640
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition: basis.hpp:747
VectorZd powers(size_t i) const
Returns the powers of the i-th basis function (its degree can be found using powers(i)....
Definition: basis.hpp:201
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1529
VectorZd powers(size_t i) const
Returns the powers of the i-th basis function (not including the vector part)
Definition: basis.hpp:1547
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition: basis.hpp:1273
size_t dimension() const
Dimension of the family. This is actually the number of functions in the family, not necessarily line...
Definition: basis.hpp:421
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:195
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:180
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1261
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:1541
const Eigen::MatrixXd & matrix() const
Return the coefficient matrix.
Definition: basis.hpp:558
boost::multi_array< double, 3 > Scalar3Tensor
Definition: IntegrateTripleProduct.hpp:13
Scalar3Tensor tripleInt(const Cell &T, const MonomialScalarBasisCell &basis1, const TensorizedVectorFamily< MonomialScalarBasisCell, N > &basis2, MonomialCellIntegralsType mono_int_map={})
Computes the triple integral product of a scalar times the dot product of two vectors - basis1(basis2...
Definition: IntegrateTripleProduct.hpp:130
MonomialCellIntegralsType CheckIntegralsDegree(const Cell &T, const size_t degree, const MonomialCellIntegralsType &mono_int_map={})
Checks if the degree of an existing list of monomial integrals is sufficient, other re-compute and re...
Definition: GMpoly_cell.cpp:160
Eigen::Map< Eigen::VectorXd, Eigen::Unaligned, Eigen::InnerStride< Eigen::Dynamic > > VectorSlice
Definition: IntegrateTripleProduct.hpp:15
MatrixSlice slice(Scalar3Tensor &tensor, size_t fixed_dim, size_t index)
Function to slice a 3-tensor with respect to one index (returns a 2-tensor)
Definition: IntegrateTripleProduct.hpp:28
Eigen::Map< Eigen::MatrixXd, Eigen::Unaligned, Eigen::Stride< Eigen::Dynamic, Eigen::Dynamic > > MatrixSlice
Definition: IntegrateTripleProduct.hpp:14
std::unordered_map< VectorZd, double, VecHash > MonomialCellIntegralsType
Type for list of integrals of monomials.
Definition: GMpoly_cell.hpp:49
Definition: ddr-magnetostatics.hpp:40
MeshND::Cell< 2 > Cell
Definition: Mesh2D.hpp:13