28#include <boost/multi_array.hpp>
79 template<
typename GeometricSupport>
88 static std::vector<VectorZd>
complete(
size_t degree)
90 std::vector<VectorZd> powers;
92 for (
size_t l = 0; l <= degree; l++)
94 for (
size_t i = 0;
i <= l;
i++)
116 Eigen::Matrix<double, N, N> diff_x,
117 Eigen::Matrix<double, N, N> diff_y
149 Eigen::Matrix<double, N, N>
dx;
150 Eigen::Matrix<double, N, N>
dy;
198 return ( m_degree >= 0 ? (m_degree + 1) * (m_degree + 2) / 2 : 0);
229 return (x - m_xT) / m_hT;
235 std::vector<VectorZd> m_powers;
236 Eigen::Matrix2d m_rot;
289 inline double _coordinate_transform(
const VectorRd &x)
const
291 return (x - m_xE).dot(m_tE) / m_hE;
313 template <
typename BasisType>
330 static const bool hasCurl = BasisType::hasCurl;
340 const BasisType &basis,
341 const Eigen::MatrixXd &
matrix
346 assert((
size_t)
matrix.cols() == basis.dimension() ||
"Inconsistent family initialization");
352 return m_matrix.rows();
358 static_assert(
hasFunction,
"Call to function() not available");
361 for (
auto j = 1;
j < m_matrix.cols();
j++)
363 f += m_matrix(
i,
j) * m_basis.function(
j, x);
371 static_assert(
hasFunction,
"Call to function() not available");
374 for (
auto j = 1;
j < m_matrix.cols();
j++)
376 f += m_matrix(
i,
j) * ancestor_value_quad[
j][iqn];
385 static_assert(
hasGradient,
"Call to gradient() not available");
388 for (
auto j = 1;
j < m_matrix.cols();
j++)
390 G += m_matrix(
i,
j) * m_basis.gradient(
j, x);
398 static_assert(
hasGradient,
"Call to gradient() not available");
400 GradientValue G = m_matrix(
i, 0) * ancestor_gradient_quad[0][iqn];
401 for (
auto j = 1;
j < m_matrix.cols();
j++)
403 G += m_matrix(
i,
j) * ancestor_gradient_quad[
j][iqn];
411 static_assert(
hasCurl,
"Call to curl() not available");
413 CurlValue C = m_matrix(
i, 0) * m_basis.curl(0, x);
414 for (
auto j = 1;
j < m_matrix.cols();
j++)
416 C += m_matrix(
i,
j) * m_basis.curl(
j, x);
422 CurlValue curl(
size_t i,
size_t iqn,
const boost::multi_array<CurlValue, 2> &ancestor_curl_quad)
const
424 static_assert(
hasCurl,
"Call to curl() not available");
426 CurlValue C = m_matrix(
i, 0) * ancestor_curl_quad[0][iqn];
427 for (
auto j = 1;
j < m_matrix.cols();
j++)
429 C += m_matrix(
i,
j) * ancestor_curl_quad[
j][iqn];
437 static_assert(
hasDivergence,
"Call to divergence() not available");
440 for (
auto j = 1;
j < m_matrix.cols();
j++)
442 D += m_matrix(
i,
j) * m_basis.divergence(
j, x);
450 static_assert(
hasDivergence,
"Call to divergence() not available");
453 for (
auto j = 1;
j < m_matrix.cols();
j++)
455 D += m_matrix(
i,
j) * ancestor_divergence_quad[
j][iqn];
463 static_assert(
hasRotor,
"Call to rotor() not available");
465 RotorValue R = m_matrix(
i, 0) * m_basis.rotor(0, x);
466 for (
auto j = 1;
j < m_matrix.cols();
j++)
468 R += m_matrix(
i,
j) * m_basis.rotor(
j, x);
474 RotorValue rotor(
size_t i,
size_t iqn,
const boost::multi_array<RotorValue, 2> &ancestor_rotor_quad)
const
476 static_assert(
hasRotor,
"Call to rotor() not available");
478 RotorValue R = m_matrix(
i, 0) * ancestor_rotor_quad[0][iqn];
479 for (
auto j = 1;
j < m_matrix.cols();
j++)
481 R += m_matrix(
i,
j) * ancestor_rotor_quad[
j][iqn];
489 static_assert(
hasHessian,
"Call to hessian() not available");
492 for (
auto j = 1;
j < m_matrix.cols();
j++)
494 H += m_matrix(
i,
j) * m_basis.hessian(
j, x);
500 HessianValue hessian(
size_t i,
size_t iqn,
const boost::multi_array<HessianValue, 2> &ancestor_hessian_quad)
const
502 static_assert(
hasHessian,
"Call to hessian() not available");
504 HessianValue H = m_matrix(
i, 0) * ancestor_hessian_quad[0][iqn];
505 for (
auto j = 1;
j < m_matrix.cols();
j++)
507 H += m_matrix(
i,
j) * ancestor_hessian_quad[
j][iqn];
513 inline const Eigen::MatrixXd &
matrix()
const
527 return m_basis.max_degree();
532 Eigen::MatrixXd m_matrix;
562 template <
typename ScalarFamilyType,
size_t N>
592 : m_scalar_family(scalar_family)
594 static_assert(ScalarFamilyType::tensorRank ==
Scalar,
595 "Vector family can only be constructed from scalar families");
596 m_rot.row(0) << 0., 1.;
597 m_rot.row(1) << -1., 0.;
604 return m_scalar_family.dimension() * N;
610 static_assert(
hasFunction,
"Call to function() not available");
613 ek(
i / m_scalar_family.dimension()) = 1.;
614 return ek * m_scalar_family.function(
i % m_scalar_family.dimension(), x);
620 static_assert(
hasFunction,
"Call to function() not available");
623 ek(
i / m_scalar_family.dimension()) = 1.;
624 return ek * ancestor_value_quad[
i % m_scalar_family.dimension()][iqn];
630 static_assert(
hasGradient,
"Call to gradient() not available");
632 GradientValue G = Eigen::Matrix<double, N, dimspace>::Zero();
633 G.row(
i / m_scalar_family.dimension()) = m_scalar_family.gradient(
i % m_scalar_family.dimension(), x);
640 static_assert(
hasGradient,
"Call to gradient() not available");
642 GradientValue G = Eigen::Matrix<double, N, dimspace>::Zero();
643 G.row(
i / m_scalar_family.dimension()) = ancestor_gradient_quad[
i % m_scalar_family.dimension()][iqn];
650 static_assert(
hasCurl,
"Call to curl() not available");
656 CurlValue curl(
size_t i,
size_t iqn,
const boost::multi_array<VectorRd, 2> &ancestor_gradient_quad)
const
658 static_assert(
hasCurl,
"Call to curl() not available");
660 return m_rot * ancestor_gradient_quad[
i][iqn];
666 static_assert(
hasDivergence,
"Call to divergence() not available");
668 return m_scalar_family.gradient(
i % m_scalar_family.dimension(), x)(
i / m_scalar_family.dimension());
674 static_assert(
hasDivergence,
"Call to divergence() not available");
676 return ancestor_gradient_quad[
i % m_scalar_family.dimension()][iqn](
i / m_scalar_family.dimension());
684 return curl(
i, x).trace();
688 RotorValue rotor(
size_t i,
size_t iqn,
const boost::multi_array<VectorRd, 2> &ancestor_gradient_quad)
const
690 static_assert(
hasRotor,
"Call to rotor() not available");
692 return curl(
i, iqn, ancestor_gradient_quad).trace();
698 static_assert(
hasCurlCurl,
"Call to curlcurl() not available");
701 int p =
i / m_scalar_family.dimension();
703 typename ScalarFamilyType::HessianValue hess = m_scalar_family.hessian(
i % m_scalar_family.dimension(), x);
704 return - hess.trace() * ek + hess.col(p);
708 CurlCurlValue curlcurl(
size_t i,
size_t iqn,
const boost::multi_array<typename ScalarFamilyType::HessianValue, 2> &ancestor_hessian_quad)
const
710 static_assert(
hasCurlCurl,
"Call to curlcurl() not available");
713 int p =
i / m_scalar_family.dimension();
715 typename ScalarFamilyType::HessianValue hess = ancestor_hessian_quad[
i % m_scalar_family.dimension()][iqn];
716 return - hess.trace() * ek + hess.col(p);
720 constexpr inline const ScalarFamilyType &
ancestor()
const
722 return m_scalar_family;
728 return m_scalar_family.max_degree();
732 ScalarFamilyType m_scalar_family;
733 Eigen::Matrix2d m_rot;
748 template<
typename ScalarFamilyType,
size_t N>
774 : m_scalar_family(scalar_family),
778 static_assert(ScalarFamilyType::tensorRank ==
Scalar,
779 "Vector family can only be constructed from scalar families");
782 for (
size_t j = 0;
j < N;
j++){
783 for (
size_t i = 0;
i < N;
i++){
784 m_E[
j*N +
i] = Eigen::Matrix<double, N, N>::Zero();
785 m_E[
j*N +
i](
i,
j) = 1.;
792 size_t r = m_scalar_family.dimension();
793 size_t j = ( ( (
i/r)%N )*N + (
i/r)/N ) * r + (
i%r);
794 m_transposeOperator(
i,
j) = 1.;
801 return m_scalar_family.dimension() * N * N;
807 static_assert(
hasFunction,
"Call to function() not available");
809 return m_scalar_family.function(
i % m_scalar_family.dimension(), x) * m_E[
i / m_scalar_family.dimension()];
815 static_assert(
hasFunction,
"Call to function() not available");
817 return ancestor_value_quad[
i % m_scalar_family.dimension()][iqn] * m_E[
i / m_scalar_family.dimension()];
823 static_assert(
hasDivergence,
"Call to divergence() not available");
825 Eigen::Matrix<double, N, 1> V = m_E[
i/m_scalar_family.dimension()].col( (
i/m_scalar_family.dimension()) /N);
826 return m_scalar_family.gradient(
i % m_scalar_family.dimension(), x)( (
i / m_scalar_family.dimension()) / N) * V;
832 static_assert(
hasDivergence,
"Call to divergence() not available");
834 Eigen::Matrix<double, N, 1> V = m_E[
i/m_scalar_family.dimension()].col( (
i/m_scalar_family.dimension()) /N);
835 return ancestor_gradient_quad[
i % m_scalar_family.dimension()][iqn]( (
i / m_scalar_family.dimension()) / N) * V;
841 static_assert(
hasGradient,
"Call to gradient() not available");
843 const VectorRd gradient_scalar_function = m_scalar_family.gradient(
i % m_scalar_family.dimension(), x);
844 const Eigen::Matrix<double, N, N> matrix_basis = m_E[
i / m_scalar_family.dimension()];
845 return GradientValue(gradient_scalar_function.x() * matrix_basis, gradient_scalar_function.y() * matrix_basis);
851 static_assert(
hasGradient,
"Call to gradient() not available");
853 const VectorRd gradient_scalar_function = ancestor_gradient_quad[
i % m_scalar_family.dimension()][iqn];
854 const Eigen::Matrix<double, N, N> matrix_basis = m_E[
i / m_scalar_family.dimension()];
855 return GradientValue(gradient_scalar_function.x() * matrix_basis, gradient_scalar_function.y() * matrix_basis);
861 return m_scalar_family;
873 return m_transposeOperator;
885 size_t dim_scalar = m_scalar_family.dimension();
888 Eigen::MatrixXd SB = Eigen::MatrixXd::Zero(dim_scalar * N*(N+1)/2,
dimension());
894 for (
size_t i = 0;
i<N;
i++){
896 SB.middleRows(position, (N-
i)*dim_scalar) = symOpe.middleRows(
i*(N+1)*dim_scalar, (N-
i)*dim_scalar);
898 position += (N-
i)*dim_scalar;
910 size_t r = m_scalar_family.dimension();
912 Eigen::MatrixXd Tr = Eigen::MatrixXd::Zero(r,
dimension());
921 if (
size_t(l/r)%N == size_t(
size_t(l/r)/N) ){
931 ScalarFamilyType m_scalar_family;
932 std::vector<Eigen::Matrix<double, N, N>> m_E;
933 Eigen::MatrixXd m_transposeOperator;
940 template <
typename ScalarFamilyType>
967 const ScalarFamilyType &scalar_family,
970 : m_scalar_family(scalar_family),
973 static_assert(ScalarFamilyType::hasFunction,
"Call to function() not available");
974 static_assert(std::is_same<typename ScalarFamilyType::GeometricSupport, Edge>::value,
975 "Tangent families can only be defined on edges");
981 return m_scalar_family.dimension();
987 return m_scalar_family.function(
i, x) * m_generator;
991 constexpr inline const ScalarFamilyType &
ancestor()
const
993 return m_scalar_family;
999 return m_scalar_family.max_degree();
1009 ScalarFamilyType m_scalar_family;
1018 template <
typename BasisType>
1045 const BasisType &basis,
1057 return m_basis.dimension() - m_shift;
1069 return m_basis.max_degree();
1075 static_assert(
hasFunction,
"Call to function() not available");
1077 return m_basis.function(
i + m_shift, x);
1083 static_assert(
hasGradient,
"Call to gradient() not available");
1085 return m_basis.gradient(
i + m_shift, x);
1091 static_assert(
hasCurl,
"Call to curl() not available");
1093 return m_basis.curl(
i + m_shift, x);
1099 static_assert(
hasDivergence,
"Call to divergence() not available");
1101 return m_basis.divergence(
i + m_shift, x);
1107 static_assert(
hasRotor,
"Call to rotor() not available");
1109 return m_basis.rotor(
i + m_shift, x);
1115 static_assert(
hasHessian,
"Call to hessian() not available");
1117 return m_basis.hessian(
i + m_shift, x);
1129 template <
typename BasisType>
1156 const BasisType &basis,
1193 static_assert(
hasFunction,
"Call to function() not available");
1195 return m_basis.function(
i, x);
1201 static_assert(
hasGradient,
"Call to gradient() not available");
1203 return m_basis.gradient(
i, x);
1209 static_assert(
hasCurl,
"Call to curl() not available");
1211 return m_basis.curl(
i, x);
1217 static_assert(
hasDivergence,
"Call to divergence() not available");
1219 return m_basis.divergence(
i, x);
1225 static_assert(
hasRotor,
"Call to rotor() not available");
1227 return m_basis.rotor(
i, x);
1240 template <
typename BasisType>
1269 : m_scalar_basis(basis)
1271 static_assert(BasisType::hasGradient,
1272 "Gradient basis requires gradient() for the original basis to be available");
1279 return m_scalar_basis.dimension();
1285 return m_scalar_basis.gradient(
i, x);
1291 return m_scalar_basis;
1296 BasisType m_scalar_basis;
1303 template <
typename BasisType>
1309 typedef Eigen::Matrix<double, dimspace, dimspace>
CurlValue;
1332 static_assert(BasisType::tensorRank ==
Scalar && std::is_same<typename BasisType::GeometricSupport, Cell>::value,
1333 "Curl basis can only be constructed starting from scalar bases on elements");
1334 static_assert(BasisType::hasCurl,
1335 "Curl basis requires curl() for the original basis to be available");
1341 return m_basis.dimension();
1347 return m_basis.curl(
i, x);
1367 template <
typename BasisType>
1392 : m_vector_basis(basis)
1394 static_assert(BasisType::tensorRank ==
Vector || BasisType::tensorRank ==
Matrix,
1395 "Divergence basis can only be constructed starting from vector bases");
1396 static_assert(BasisType::hasDivergence,
1397 "Divergence basis requires divergence() for the original basis to be available");
1404 return m_vector_basis.dimension();
1410 return m_vector_basis.divergence(
i, x);
1416 return m_vector_basis;
1420 BasisType m_vector_basis;
1428 template <
typename BasisType>
1455 : m_vector_basis(basis)
1457 static_assert(BasisType::tensorRank ==
Vector,
1458 "Rotor basis can only be constructed starting from vector bases");
1459 static_assert(BasisType::hasRotor,
1460 "Rotor basis requires rotor() for the original basis to be available");
1467 return m_vector_basis.dimension();
1473 return m_vector_basis.rotor(
i, x);
1479 return m_vector_basis;
1483 BasisType m_vector_basis;
1492 template <
typename BasisType>
1521 : m_scalar_basis(basis)
1523 static_assert(BasisType::tensorRank ==
Scalar,
1524 "Hessian basis can only be constructed starting from scalar bases");
1525 static_assert(BasisType::hasHessian,
1526 "Hessian basis requires hessian() for the original basis to be available");
1533 return m_scalar_basis.dimension();
1539 return m_scalar_basis.hessian(
i, x);
1545 return m_scalar_basis;
1550 BasisType m_scalar_basis;
1562 typedef Eigen::Matrix<double, dimspace, dimspace>
CurlValue;
1613 return (x - m_xT) / m_hT;
1619 std::vector<VectorZd> m_powers;
1629 typedef Eigen::Matrix<double, dimspace, dimspace>
CurlValue;
1666 inline const std::shared_ptr<RolyComplBasisCell> &
rck()
const
1673 Eigen::Matrix2d m_rot;
1674 std::shared_ptr<RolyComplBasisCell> m_Rck_basis;
1725 return (x - m_xT) / m_hT;
1731 Eigen::Matrix2d m_rot;
1732 TensorizedVectorFamily<MonomialScalarBasisCell, dimspace> m_Pkmo;
1753 template <
typename outValue,
typename inValue,
typename FunctionType>
1755 const boost::multi_array<inValue, 2> &B_quad,
1756 const FunctionType &F
1759 boost::multi_array<outValue, 2> transformed_B_quad( boost::extents[B_quad.shape()[0]][B_quad.shape()[1]] );
1761 std::transform( B_quad.origin(), B_quad.origin() + B_quad.num_elements(), transformed_B_quad.origin(), F);
1763 return transformed_B_quad;
1768 template <
typename ScalarBasisType,
size_t N>
1770 const ScalarBasisType & B,
1771 const std::vector<Eigen::VectorXd> &
v
1775 size_t k =
v.size();
1777 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(r*k, r*N);
1779 for (
size_t i=0;
i < k;
i++){
1781 assert(
v[
i].size() == N);
1784 for (
size_t j=0;
j < N;
j++){
1785 M.block(
i*r,
j*r, r, r) =
v[
i](
j) * Eigen::MatrixXd::Identity(r,r);
1802 inline static std::function<Eigen::MatrixXd(
const Eigen::MatrixXd &)>
1803 symmetrise_matrix = [](
const Eigen::MatrixXd & x)->Eigen::MatrixXd {
return 0.5*(x+x.transpose());};
1806 inline static std::function<Eigen::MatrixXd(
const Eigen::MatrixXd &)>
1811 template <
typename ScalarBasisType,
size_t N>
1813 const ScalarBasisType & B
1817 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(r, r*N*N);
1819 for (
size_t k=0; k < N; k++){
1820 M.block(0, k*r*(N+1), r, r) = Eigen::MatrixXd::Identity(r, r);
1833 template<
typename BasisType, BasisFunctionE BasisFunction>
1838 template<
typename BasisType>
1841 static_assert(BasisType::hasFunction,
"Call to function not available");
1845 return basis.function(
i, x);
1850 const BasisType &basis,
1853 const boost::multi_array<ReturnValue, 2> &ancestor_value_quad
1856 return basis.function(
i, iqn, ancestor_value_quad);
1862 template<
typename BasisType>
1865 static_assert(BasisType::hasGradient,
"Call to gradient not available");
1869 return basis.gradient(
i, x);
1874 const BasisType &basis,
1877 const boost::multi_array<ReturnValue, 2> &ancestor_gradient_quad
1880 return basis.gradient(
i, iqn, ancestor_gradient_quad);
1886 template<
typename BasisType>
1889 static_assert(BasisType::hasGradient,
"Call to gradient not available");
1893 return 0.5 * (basis.gradient(
i, x) + basis.gradient(
i, x).transpose());
1898 const BasisType &basis,
1901 const boost::multi_array<ReturnValue, 2> &ancestor_gradient_quad
1904 return 0.5 * (basis.gradient(
i, iqn, ancestor_gradient_quad) + basis.gradient(
i, iqn, ancestor_gradient_quad).transpose());
1910 template<
typename BasisType>
1913 static_assert(BasisType::hasGradient,
"Call to gradient not available");
1917 return 0.5 * (basis.gradient(
i, x) - basis.gradient(
i, x).transpose());
1922 const BasisType &basis,
1925 const boost::multi_array<ReturnValue, 2> &ancestor_gradient_quad
1928 return 0.5 * (basis.gradient(
i, iqn, ancestor_gradient_quad) - basis.gradient(
i, iqn, ancestor_gradient_quad).transpose());
1933 template<
typename BasisType>
1936 static_assert(BasisType::hasCurl,
"Call to curl not available");
1940 return basis.curl(
i, x);
1945 const BasisType &basis,
1948 const boost::multi_array<ReturnValue, 2> &ancestor_curl_quad
1951 return basis.curl(
i, iqn, ancestor_curl_quad);
1956 template<
typename BasisType>
1959 static_assert(BasisType::hasDivergence,
"Call to divergence not available");
1963 return basis.divergence(
i, x);
1968 const BasisType &basis,
1971 const boost::multi_array<ReturnValue, 2> &ancestor_divergence_quad
1974 return basis.divergence(
i, iqn, ancestor_divergence_quad);
1979 template<
typename BasisType>
1982 static_assert(BasisType::hasRotor,
"Call to rotor not available");
1986 return basis.rotor(
i, x);
1991 const BasisType &basis,
1994 const boost::multi_array<ReturnValue, 2> &ancestor_rotor_quad
1997 return basis.rotor(
i, iqn, ancestor_rotor_quad);
2002 template<
typename BasisType>
2005 static_assert(BasisType::hasHessian,
"Call to Hessian not available");
2009 return basis.hessian(
i, x);
2014 const BasisType &basis,
2017 const boost::multi_array<ReturnValue, 2> &ancestor_hessian_quad
2020 return basis.hessian(
i, iqn, ancestor_hessian_quad);
2025 template <
typename BasisType>
2028 static_assert(BasisType::hasCurlCurl,
"Call to curl curl not available");
2032 return basis.curlcurl(
i, x);
2037 const BasisType &basis,
2040 const boost::multi_array<ReturnValue, 2> &ancestor_curlcurl_quad
2043 return basis.curlcurl(
i, iqn, ancestor_curlcurl_quad);
2050 template <
typename ScalarBasisType,
size_t N>
2074 const boost::multi_array<double, 2> &ancestor_basis_quad
2077 return basis.
function(
i, iqn, ancestor_basis_quad);
2082 template <
typename ScalarBasisType,
size_t N>
2106 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2109 return basis.
gradient(
i, iqn, ancestor_basis_quad);
2115 template <
typename ScalarBasisType,
size_t N>
2139 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2142 return 0.5 * (basis.
gradient(
i, iqn, ancestor_basis_quad) + basis.
gradient(
i, iqn, ancestor_basis_quad).transpose());
2148 template <
typename ScalarBasisType,
size_t N>
2172 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2175 return 0.5 * (basis.
gradient(
i, iqn, ancestor_basis_quad) - basis.
gradient(
i, iqn, ancestor_basis_quad).transpose());
2180 template <
typename ScalarBasisType,
size_t N>
2196 return basis.
curl(
i, x);
2204 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2207 return basis.
curl(
i, iqn, ancestor_basis_quad);
2213 template <
typename ScalarBasisType,
size_t N>
2237 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2240 return basis.
divergence(
i, iqn, ancestor_basis_quad);
2246 template <
typename ScalarBasisType,
size_t N>
2262 return basis.
rotor(
i, x);
2270 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2273 return basis.
rotor(
i, iqn, ancestor_basis_quad);
2279 template <
typename ScalarBasisType,
size_t N>
2305 const boost::multi_array<MatrixRd, 2> &ancestor_basis_quad
2308 return basis.
curlcurl(
i, iqn, ancestor_basis_quad);
2316 template <
typename ScalarBasisType,
size_t N>
2340 const boost::multi_array<double, 2> &ancestor_basis_quad
2343 return basis.
function(
i, iqn, ancestor_basis_quad);
2348 template <
typename ScalarBasisType,
size_t N>
2372 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2375 return basis.
divergence(
i, iqn, ancestor_basis_quad);
2382 template <
typename ScalarBasisType,
size_t N>
2406 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2409 return basis.
gradient(
i, iqn, ancestor_basis_quad);
2420 template<BasisFunctionE BasisFunction>
2423 template<
typename BasisType>
2424 static boost::multi_array<typename detail::basis_evaluation_traits<BasisType, BasisFunction>::ReturnValue, 2>
2426 const BasisType & basis,
2432 boost::multi_array<typename traits::ReturnValue, 2>
2433 basis_quad( boost::extents[basis.dimension()][quad.size()] );
2435 for (
size_t i = 0;
i < basis.dimension();
i++) {
2436 for (
size_t iqn = 0; iqn < quad.size(); iqn++) {
2437 basis_quad[
i][iqn] = traits::evaluate(basis,
i, quad[iqn].vector());
2445 template<
typename BasisType>
2446 static boost::multi_array<typename detail::basis_evaluation_traits<Family<BasisType>, BasisFunction>::ReturnValue, 2>
2454 boost::multi_array<typename traits::ReturnValue, 2>
2455 basis_quad( boost::extents[basis.
dimension()][quad.size()] );
2458 const auto & ancestor_basis = basis.
ancestor();
2459 boost::multi_array<typename traits::ReturnValue, 2>
2462 Eigen::MatrixXd M = basis.
matrix();
2463 for (
size_t i = 0;
i < size_t(M.rows());
i++) {
2464 for (
size_t iqn = 0; iqn < quad.size(); iqn++) {
2465 basis_quad[
i][iqn] = M(
i,0) * ancestor_basis_quad[0][iqn];
2467 for (
size_t j = 1;
j < size_t(M.cols());
j++) {
2468 for (
size_t iqn = 0; iqn < quad.size(); iqn++) {
2469 basis_quad[
i][iqn] += M(
i,
j) * ancestor_basis_quad[
j][iqn];
2478 template <
typename BasisType,
size_t N>
2479 static boost::multi_array<typename detail::basis_evaluation_traits<TensorizedVectorFamily<BasisType, N>, BasisFunction>::ReturnValue, 2>
2487 boost::multi_array<typename traits::ReturnValue, 2>
2488 basis_quad(boost::extents[basis.
dimension()][quad.size()]);
2490 const auto &ancestor_basis = basis.
ancestor();
2491 const boost::multi_array<typename traits::AncestorBasisFunctionValue, 2> ancestor_basis_quad
2495 for (
size_t iqn = 0; iqn < quad.size(); iqn++){
2496 basis_quad[
i][iqn] = traits::evaluate(basis,
i, iqn, ancestor_basis_quad);
2503 template <
typename BasisType,
size_t N>
2504 static boost::multi_array<typename detail::basis_evaluation_traits<MatrixFamily<BasisType, N>, BasisFunction>::ReturnValue, 2>
2512 boost::multi_array<typename traits::ReturnValue, 2>
2513 basis_quad(boost::extents[basis.
dimension()][quad.size()]);
2515 const auto &ancestor_basis = basis.
ancestor();
2516 const boost::multi_array<typename traits::AncestorBasisFunctionValue, 2> ancestor_basis_quad
2520 for (
size_t iqn = 0; iqn < quad.size(); iqn++){
2521 basis_quad[
i][iqn] = traits::evaluate(basis,
i, iqn, ancestor_basis_quad);
2540 template<
typename T>
2542 boost::multi_array<T, 2> & basis_eval,
2543 const std::function<
double(
size_t,
size_t)> & inner_product
2546 auto induced_norm = [inner_product](
size_t i)->
double
2548 return std::sqrt( inner_product(
i,
i) );
2552 size_t Nb = basis_eval.shape()[0];
2554 size_t Nqn = basis_eval.shape()[1];
2556 Eigen::MatrixXd B = Eigen::MatrixXd::Zero(Nb, Nb);
2559 double norm = induced_norm(0);
2560 for (
size_t iqn = 0; iqn < Nqn; iqn++) {
2561 basis_eval[0][iqn] /= norm;
2565 for (
size_t ib = 1; ib < Nb; ib++) {
2567 Eigen::RowVectorXd coeffs = Eigen::RowVectorXd::Zero(ib);
2568 for (
size_t pb = 0; pb < ib; pb++) {
2569 coeffs(pb) = - inner_product(ib, pb);
2573 for (
size_t pb = 0; pb < ib; pb++) {
2574 for (
size_t iqn = 0; iqn < Nqn; iqn++) {
2575 basis_eval[ib][iqn] += coeffs(pb) * basis_eval[pb][iqn];
2580 double norm = induced_norm(ib);
2581 for (
size_t iqn = 0; iqn < Nqn; iqn++) {
2582 basis_eval[ib][iqn] /= norm;
2589 B.block(ib, 0, 1, ib) = coeffs * B.topLeftCorner(ib, ib);
2590 B(ib, ib) = 1./norm;
2605 double scalar_product(
const Eigen::Matrix<double, N, N> & x,
const Eigen::Matrix<double, N, N> & y)
2607 return (x.transpose() * y).trace();
2611 template <
typename Value>
2613 const boost::multi_array<Value, 2> &basis_quad,
2617 boost::multi_array<double, 2> basis_dot_v_quad(boost::extents[basis_quad.shape()[0]][basis_quad.shape()[1]]);
2618 std::transform(basis_quad.origin(), basis_quad.origin() + basis_quad.num_elements(),
2619 basis_dot_v_quad.origin(), [&
v](
const Value &x) ->
double { return scalar_product(x,v); });
2620 return basis_dot_v_quad;
2624 template <
typename Value>
2626 const boost::multi_array<Value, 2> & basis_quad,
2627 const std::vector<Value> &
v
2630 boost::multi_array<double, 2> basis_dot_v_quad(boost::extents[basis_quad.shape()[0]][basis_quad.shape()[1]]);
2631 for (std::size_t
i = 0;
i < basis_quad.shape()[0];
i++) {
2632 for (std::size_t iqn = 0; iqn < basis_quad.shape()[1]; iqn++) {
2636 return basis_dot_v_quad;
2641 const boost::multi_array<MatrixRd, 2> & basis_quad,
2642 const std::vector<VectorRd> & v_quad
2647 const std::vector<MatrixRd> & m_quad,
2648 const boost::multi_array<VectorRd, 2> & basis_quad
2653 const std::vector<VectorRd> & v_quad,
2654 const boost::multi_array<MatrixRd, 2> & basis_quad
2658 template<
typename BasisType>
2660 const BasisType & basis,
2662 boost::multi_array<typename BasisType::FunctionValue, 2> & basis_quad
2666 assert ( basis.dimension() == basis_quad.shape()[0] && qr.size() == basis_quad.shape()[1] );
2669 std::function<double(
size_t,
size_t)> inner_product
2670 = [&basis_quad, &qr](
size_t i,
size_t j)->
double
2673 for(
size_t iqn = 0; iqn < qr.size(); iqn++) {
2679 Eigen::MatrixXd B =
gram_schmidt(basis_quad, inner_product);
2686 template <
typename BasisType>
2688 const BasisType &basis,
2689 const Eigen::MatrixXd & GM
2693 assert(basis.dimension() ==
size_t(GM.rows()) && GM.rows() == GM.cols());
2695 Eigen::MatrixXd
L = GM.llt().matrixL();
2706 template<
typename FunctionValue>
2708 const boost::multi_array<FunctionValue, 2> & B2,
2712 const std::string sym =
"nonsym"
2716 assert ( qr.size() == B1.shape()[1] && qr.size() == B2.shape()[1] );
2718 assert ( nrows <= B1.shape()[0] && ncols <= B2.shape()[0] );
2721 Eigen::ArrayXd qr_weights = Eigen::ArrayXd::Zero(qr.size());
2722 for (
size_t iqn = 0; iqn < qr.size(); iqn++){
2723 qr_weights(iqn) = qr[iqn].w;
2726 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(nrows, ncols);
2727 for (
size_t i = 0;
i < nrows;
i++) {
2729 if ( sym==
"sym" ) jcut =
i;
2730 for (
size_t j = 0;
j < jcut;
j++){
2733 for(
size_t j = jcut;
j < ncols;
j++) {
2734 std::vector<double> tmp(B1.shape()[1]);
2736 auto B1i = B1[ boost::indices[
i][boost::multi_array_types::index_range(0, B1.shape()[1])] ];
2737 auto B2j = B2[ boost::indices[
j][boost::multi_array_types::index_range(0, B1.shape()[1])] ];
2739 std::transform(B1i.begin(), B1i.end(), B2j.begin(), tmp.begin(), [](FunctionValue a, FunctionValue b)->double { return scalar_product(a,b);});
2740 Eigen::ArrayXd tmp_array = Eigen::Map<Eigen::ArrayXd, Eigen::Unaligned>(tmp.data(), tmp.size());
2742 M(
i,
j) = (qr_weights * tmp_array).sum();
2758 template<
typename FunctionValue>
2760 const boost::multi_array<FunctionValue, 2> & B2,
2762 const std::string sym =
"nonsym"
2765 return compute_gram_matrix<FunctionValue>(B1, B2, qr, B1.shape()[0], B2.shape()[0], sym);
2769 template<
typename FunctionValue>
2774 return compute_gram_matrix<FunctionValue>(B, B, qr,
"sym");
2779 const boost::multi_array<double, 2> & B2,
2785 const boost::multi_array<double, 2> & B2,
2789 const std::string sym =
"nonsym"
2794 const boost::multi_array<double, 2> & B2,
2796 const std::string sym =
"nonsym"
2801 const boost::multi_array<VectorRd, 2> & B2,
2805 const std::string sym =
"nonsym"
2810 const boost::multi_array<VectorRd, 2> & B2,
2812 const std::string sym =
"nonsym"
2816 template<
typename ScalarFamilyType,
size_t N>
2818 const boost::multi_array<double, 2> & scalar_family_quad,
2822 Eigen::MatrixXd Gram = Eigen::MatrixXd::Zero(MatFam.
dimension(), MatFam.
dimension());
2825 Eigen::MatrixXd scalarGram = compute_gram_matrix<double>(scalar_family_quad, qr);
2826 for (
size_t i = 0;
i < MatFam.
dimension();
i =
i+scalarGram.rows()){
2827 Gram.block(
i,
i, scalarGram.rows(), scalarGram.cols()) = scalarGram;
2836 template <
typename T>
2847 n_rows = B.shape()[0];
2851 const size_t num_quads = qr.size();
2854 assert(num_quads == B.shape()[1]);
2857 assert(n_rows <= B.shape()[0]);
2859 Eigen::VectorXd V = Eigen::VectorXd::Zero(n_rows);
2861 for (
size_t iqn = 0; iqn < num_quads; iqn++)
2863 double qr_weight = qr[iqn].w;
2864 T f_on_qr = f(qr[iqn].vector());
2865 for (
size_t i = 0;
i < n_rows;
i++)
2875 template <
typename T,
typename U>
2883 const std::string sym =
"nonsym"
2887 if (n_rows == 0 && n_cols == 0)
2889 n_rows = B1.shape()[0];
2890 n_cols = B2.shape()[0];
2894 const size_t num_quads = qr.size();
2896 assert(num_quads == B1.shape()[1] && num_quads == B2.shape()[1]);
2898 assert(n_rows <= B1.shape()[0] && n_cols <= B2.shape()[0]);
2900 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(n_rows, n_cols);
2901 for (
size_t iqn = 0; iqn < num_quads; iqn++)
2903 double qr_weight = qr[iqn].w;
2904 U f_on_qr = f(qr[iqn].vector());
2905 for (
size_t i = 0;
i < n_rows;
i++)
2907 T f_B1 = f_on_qr * B1[
i][iqn];
2911 for (
size_t j = 0;
j < jcut;
j++)
2915 for (
size_t j = jcut;
j < n_cols;
j++)
2925 template <
typename T,
typename U>
2931 const std::string sym
2939 const FType<VectorRd> &f,
2940 const BasisQuad<VectorRd> &B1,
2941 const BasisQuad<double> &B2,
2950 const FType<VectorRd> &f,
2951 const BasisQuad<double> &B1,
2952 const BasisQuad<VectorRd> &B2,
2959 template <
typename Value>
2961 const boost::multi_array<Value, 2> & f_quad,
2962 const boost::multi_array<Value, 2> & g_quad,
2967 const size_t dimf = f_quad.shape()[0];
2968 const size_t dimg = g_quad.shape()[0];
2969 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(dimf, dimg);
2971 std::vector<Value> int_f(dimf);
2972 for (
size_t i = 0;
i < dimf;
i++){
2973 int_f[
i] = qr_f[0].w * f_quad[
i][0];
2974 for (
size_t iqn = 1; iqn < qr_f.size(); iqn++){
2975 int_f[
i] += qr_f[iqn].w * f_quad[
i][iqn];
2978 std::vector<Value> int_g(dimg);
2979 for (
size_t j = 0;
j < dimg;
j++){
2980 int_g[
j] = qr_g[0].w * g_quad[
j][0];
2981 for (
size_t iqn = 1; iqn < qr_g.size(); iqn++){
2982 int_g[
j] += qr_g[iqn].w * g_quad[
j][iqn];
2987 for (
size_t i = 0;
i < dimf;
i++){
2988 for (
size_t j = 0;
j < dimg;
j++){
2997 template <
typename Value>
2999 const boost::multi_array<Value, 2> & f_quad,
3000 const boost::multi_array<Value, 2> & g_quad,
3008 template <
typename Value>
3010 const boost::multi_array<Value, 2> & f_quad,
3022 template<
typename BasisType>
3024 const std::function<
typename BasisType::FunctionValue(
const VectorRd &)> & f,
3025 const BasisType & basis,
3027 const boost::multi_array<typename BasisType::FunctionValue, 2> & basis_quad,
3028 const Eigen::MatrixXd &mass_basis = Eigen::MatrixXd::Zero(1,1)
3031 Eigen::MatrixXd Mass = mass_basis;
3032 if (Mass.norm() < 1e-13){
3036 Eigen::LDLT<Eigen::MatrixXd> cholesky_mass(Mass);
3037 Eigen::VectorXd b = Eigen::VectorXd::Zero(basis.dimension());
3038 for (
size_t i = 0;
i < basis.dimension();
i++) {
3039 for (
size_t iqn = 0; iqn < quad.size(); iqn++) {
3040 b(
i) += quad[iqn].w *
scalar_product(f(quad[iqn].vector()), basis_quad[
i][iqn]);
3044 return cholesky_mass.solve(b);
3057 template <
typename BasisType>
3068 const BasisType &basis
3070 m_dim(basis.dimension()),
3083 double h = 1./std::max(1.,
double(basis.max_degree()));
3085 VectorRd xi = E.vertex(0)->coords() + double(
i) * h * (E.vertex(1)->coords() - E.vertex(0)->coords());
3086 m_nodes.emplace_back(xi.x(), xi.y(), 1.);
3098 const BasisType &basis
3100 m_dim(basis.dimension()),
3120 VectorRd xi = x0 +
T.diam()*(double(indices[
i](0)) * e1 + double(indices[
i](1)) * e2)/std::max(1.,
double(basis.max_degree()));
3121 m_nodes.emplace_back(xi.x(), xi.y(), 1.);
3138 boost::multi_array<typename BasisType::FunctionValue, 2> &values
3146 Eigen::MatrixXd
L = Gram_onbasis.ldlt().solve(Gram_P_onbasis.transpose());
Basis for the space of curls (vectorial rot) of polynomials.
Definition basis.hpp:1305
Basis (or rather family) of divergence of an existing basis.
Definition basis.hpp:1369
Basis for the complement G^{c,k}(T) in P^k(F)^2 of the range of the gradient on a face.
Definition basis.hpp:1625
Basis for the space of gradients of polynomials.
Definition basis.hpp:1242
Basis for the space of Hessians of polynomials.
Definition basis.hpp:1494
Basis for the complement H^{c,k}(T) in P^k(T)^{2x2} of the range of the Hessian on a face.
Definition basis.hpp:1679
Matrix family obtained from a scalar family.
Definition basis.hpp:750
Scalar monomial basis on a cell.
Definition basis.hpp:168
Scalar monomial basis on an edge.
Definition basis.hpp:243
Generate a basis restricted to the first "dimension" functions.
Definition basis.hpp:1131
Basis for the complement R^{c,k}(T) in P^k(T)^2 of the range of the vectorial rotational on a face.
Definition basis.hpp:1558
Basis (or rather family) of scalar rotor of an existing basis.
Definition basis.hpp:1430
Generate a basis where the function indices are shifted.
Definition basis.hpp:1020
Vector family for polynomial functions that are tangent to an edge (determined by the generator)
Definition basis.hpp:942
Vector family obtained by tensorization of a scalar family.
Definition basis.hpp:564
Compute max and min eigenvalues of all matrices for i
Definition compute_eigs.m:5
function[maxeig, mineig, cond, mat]
Definition compute_eigs.m:1
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2092
void RotorValue
Definition basis.hpp:1501
static constexpr const TensorRankE tensorRank
Definition basis.hpp:576
VectorRd CurlValue
Definition basis.hpp:1434
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1636
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1277
TensorizedVectorFamily< ScalarBasisType, N >::GradientValue ReturnValue
Definition basis.hpp:2120
static const bool hasRotor
Definition basis.hpp:1575
Eigen::Matrix< double, N, dimspace > GradientValue
Definition basis.hpp:567
static const bool hasGradient
Definition basis.hpp:1572
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< MatrixRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2301
MatrixGradient(Eigen::Matrix< double, N, N > diff_x, Eigen::Matrix< double, N, N > diff_y)
Constructor.
Definition basis.hpp:115
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th function at point x.
Definition basis.hpp:383
BasisType::GradientValue GradientValue
Definition basis.hpp:318
Cell GeometricSupport
Definition basis.hpp:1689
static const bool hasFunction
Definition basis.hpp:256
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:283
BasisType AncestorType
Definition basis.hpp:1451
static boost::multi_array< typename detail::basis_evaluation_traits< TensorizedVectorFamily< BasisType, N >, BasisFunction >::ReturnValue, 2 > compute(const TensorizedVectorFamily< BasisType, N > &basis, const QuadratureRule &quad)
Evaluate a tensorized family at quadrature nodes (optimised compared the generic basis evaluation,...
Definition basis.hpp:2480
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2135
static const bool hasDivergence
Definition basis.hpp:1147
MatrixFamily< ScalarBasisType, N >::GradientValue ReturnValue
Definition basis.hpp:2387
VectorRd FunctionValue
Definition basis.hpp:1560
static const bool hasFunction
Definition basis.hpp:1033
static constexpr const bool hasAncestor
Definition basis.hpp:1692
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:979
double DivergenceValue
Definition basis.hpp:1374
VectorRd CurlValue
Definition basis.hpp:247
static const bool hasCurlCurl
Definition basis.hpp:587
BasisType::RotorValue ReturnValue
Definition basis.hpp:1983
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the Hessian of the i-th basis function at point x.
Definition basis.hpp:487
static const bool hasGradient
Definition basis.hpp:579
static const bool hasFunction
Definition basis.hpp:578
const size_t matrixSize() const
Return the dimension of the matrices in the family.
Definition basis.hpp:865
static const bool hasCurlCurl
Definition basis.hpp:1150
DivergenceValue divergence(size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_gradient_quad) const
Evaluate the divergence of the i-th basis function at a quadrature point iqn, knowing all the gradien...
Definition basis.hpp:672
BasisType m_basis
Definition basis.hpp:3153
static constexpr const bool hasAncestor
Definition basis.hpp:954
BasisType::FunctionValue FunctionValue
Definition basis.hpp:317
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1569
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1531
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th function at point x.
Definition basis.hpp:356
static std::vector< VectorZd > complete(size_t degree)
Definition basis.hpp:88
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2358
BasisType::FunctionValue ReturnValue
Definition basis.hpp:1842
static constexpr const bool hasAncestor
Definition basis.hpp:762
static const bool hasHessian
Definition basis.hpp:1576
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th basis function at point x.
Definition basis.hpp:648
static const bool hasDivergence
Definition basis.hpp:184
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:799
void RotorValue
Definition basis.hpp:1564
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:1314
Eigen::MatrixXd compute_closure_matrix(const boost::multi_array< Value, 2 > &f_quad, const boost::multi_array< Value, 2 > &g_quad, const QuadratureRule &qr_f, const QuadratureRule &qr_g)
Computes closure equation matrices, from evaluations at quadrature nodes. For two families of functio...
Definition basis.hpp:2960
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:1191
CurlBasis(const BasisType &basis)
Constructor.
Definition basis.hpp:1329
void HessianValue
Definition basis.hpp:572
BasisType::HessianValue HessianValue
Definition basis.hpp:322
MatrixGradient()
Default constructor.
Definition basis.hpp:125
static const bool hasCurlCurl
Definition basis.hpp:1263
VectorRd CurlValue
Definition basis.hpp:1373
BasisFunctionE
Definition basis.hpp:1740
double FunctionValue
Definition basis.hpp:1371
void RotorValue
Definition basis.hpp:174
static const bool hasHessian
Definition basis.hpp:1698
static const bool hasCurl
Definition basis.hpp:1512
static const bool hasFunction
Definition basis.hpp:1381
TensorizedVectorFamily< ScalarBasisType, N >::CurlCurlValue ReturnValue
Definition basis.hpp:2284
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_hessian_quad)
Definition basis.hpp:2013
static const bool hasDivergence
Definition basis.hpp:958
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:324
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_gradient_quad)
Definition basis.hpp:1921
static const bool hasRotor
Definition basis.hpp:1514
static constexpr const TensorRankE tensorRank
Definition basis.hpp:953
DivergenceBasis(const BasisType &basis)
Constructor.
Definition basis.hpp:1391
static constexpr const bool hasAncestor
Definition basis.hpp:1442
static constexpr const bool hasAncestor
Definition basis.hpp:1143
VectorRd CurlValue
Definition basis.hpp:946
static const bool hasGradient
Definition basis.hpp:1319
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_divergence_quad)
Definition basis.hpp:1967
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1441
void HessianValue
Definition basis.hpp:949
Eigen::Vector2d VectorRd
Definition basis.hpp:55
Eigen::Vector2i VectorZd
Definition basis.hpp:56
BasisType::RotorValue RotorValue
Definition basis.hpp:1026
void DivergenceValue
Definition basis.hpp:1630
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:1439
Eigen::Matrix< double, dimspace, dimspace > CurlValue
Definition basis.hpp:1309
static const bool hasHessian
Definition basis.hpp:960
static const bool hasGradient
Definition basis.hpp:956
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition basis.hpp:1308
boost::multi_array< VectorRd, 2 > matrix_vector_product(const boost::multi_array< MatrixRd, 2 > &basis_quad, const std::vector< VectorRd > &v_quad)
Take the product of a matrix-valued basis with a vector.
Definition basis.cpp:175
BasisType::DivergenceValue DivergenceValue
Definition basis.hpp:320
Family(const BasisType &basis, const Eigen::MatrixXd &matrix)
Constructor.
Definition basis.hpp:339
TensorizedVectorFamily< ScalarBasisType, N >::GradientValue ReturnValue
Definition basis.hpp:2087
BasisType::GradientValue GradientValue
Definition basis.hpp:1134
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2392
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:1915
static const bool hasRotor
Definition basis.hpp:1148
static const bool hasRotor
Definition basis.hpp:766
BasisType AncestorType
Definition basis.hpp:1517
static boost::multi_array< typename detail::basis_evaluation_traits< Family< BasisType >, BasisFunction >::ReturnValue, 2 > compute(const Family< BasisType > &basis, const QuadratureRule &quad)
Evaluate a 'Family' of functions at quadrature nodes (optimised compared the generic basis evaluation...
Definition basis.hpp:2447
void GradientValue
Definition basis.hpp:1683
static const bool hasFunction
Definition basis.hpp:1693
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_curl_quad)
Definition basis.hpp:1944
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition basis.cpp:31
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition basis.hpp:720
static const bool hasRotor
Definition basis.hpp:1322
BasisType AncestorType
Definition basis.hpp:336
static const bool hasDivergence
Definition basis.hpp:259
static const bool hasCurl
Definition basis.hpp:258
void HessianValue
Definition basis.hpp:1249
static const bool hasCurl
Definition basis.hpp:957
size_t dimension() const
Dimension of the family. This is actually the number of functions in the family, not necessarily line...
Definition basis.hpp:350
static const bool hasDivergence
Definition basis.hpp:1513
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1289
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< double, 2 > &ancestor_basis_quad)
Definition basis.hpp:2336
static const bool hasCurl
Definition basis.hpp:1640
void GradientValue
Definition basis.hpp:1498
RotorValue rotor(size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_gradient_quad) const
Evaluate the scalar rotor of the i-th basis function at a quadrature point iqn, knowing all the gradi...
Definition basis.hpp:688
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2289
void HessianValue
Definition basis.hpp:250
RestrictedBasis(const BasisType &basis, const size_t &dimension)
Constructor.
Definition basis.hpp:1155
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2256
BasisType::CurlValue CurlValue
Definition basis.hpp:1024
static const bool hasFunction
Definition basis.hpp:1255
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2030
BasisType::HessianValue HessianValue
Definition basis.hpp:1138
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:1345
Edge GeometricSupport
Definition basis.hpp:951
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2125
const Eigen::MatrixXd symmetriseOperator() const
Return the symmetrisation operator, the rN^2 square matrix that to a given vector of coefficients on ...
Definition basis.hpp:877
GradientBasis(const BasisType &basis)
Constructor.
Definition basis.hpp:1268
boost::multi_array< T, 2 > BasisQuad
type for a family of basis functions evaluated on quadrature nodes
Definition basis.hpp:61
DivergenceValue divergence(size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_gradient_quad) const
Evaluate the divergence of the i-th basis function at a quadrature point iqn, knowing all the gradien...
Definition basis.hpp:830
VectorRd generator() const
Returns the generator of the basis functions.
Definition basis.hpp:1003
static const bool hasCurl
Definition basis.hpp:583
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1316
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition basis.hpp:628
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition basis.cpp:76
static const bool hasDivergence
Definition basis.hpp:331
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1465
TensorizedVectorFamily< ScalarBasisType, N >::FunctionValue ReturnValue
Definition basis.hpp:2055
void DivergenceValue
Definition basis.hpp:248
static const bool hasHessian
Definition basis.hpp:1385
VectorRd FunctionValue
Definition basis.hpp:1627
static const bool hasHessian
Definition basis.hpp:1262
Cell GeometricSupport
Definition basis.hpp:1634
const Eigen::MatrixXd transposeOperator() const
Return the transpose operator, the rN^2 square matrix that to a given vector of coefficients on the M...
Definition basis.hpp:871
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition basis.hpp:839
MatrixGradient & operator+=(const MatrixGradient &G)
Increment.
Definition basis.hpp:137
void RotorValue
Definition basis.hpp:948
static const bool hasCurlCurl
Definition basis.hpp:1577
RotorBasis(const BasisType &basis)
Constructor.
Definition basis.hpp:1454
VectorRd GradientValue
Definition basis.hpp:1433
ScalarFamilyType AncestorType
Definition basis.hpp:771
size_t dimension() const
Return the dimension of the basis.
Definition basis.hpp:1168
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2389
GradientValue gradient(size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_gradient_quad) const
Evaluate the gradient of the i-th basis function at a quadrature point iqn, knowing all the gradients...
Definition basis.hpp:638
Cell GeometricSupport
Definition basis.hpp:177
GradientValue gradient(size_t i, size_t iqn, const boost::multi_array< GradientValue, 2 > &ancestor_gradient_quad) const
Evaluate the gradient of the i-th function at a quadrature point iqn, knowing all the gradients of an...
Definition basis.hpp:396
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:608
MatrixGradient< N > GradientValue
Definition basis.hpp:753
double scalar_product(const double &x, const double &y)
Scalar product between two reals.
Definition basis.cpp:163
VectorRd CurlCurlValue
Definition basis.hpp:569
void HessianValue
Definition basis.hpp:1502
size_t dimension() const
Dimension of the basis.
Definition basis.hpp:1654
Eigen::Matrix< double, N, 1 > FunctionValue
Definition basis.hpp:566
void DivergenceValue
Definition basis.hpp:1685
FunctionValue function(size_t i, size_t iqn, const boost::multi_array< double, 2 > &ancestor_value_quad) const
Evaluate the i-th basis function at a quadrature point iqn, knowing all the values of ancestor basis ...
Definition basis.hpp:618
Eigen::MatrixXd compute_gram_matrix(const boost::multi_array< VectorRd, 2 > &B1, const boost::multi_array< double, 2 > &B2, const QuadratureRule &qr)
Compute the Gram-like matrix given a family of vector-valued and one of scalar-valued functions by te...
Definition basis.cpp:239
void DivergenceValue
Definition basis.hpp:173
BasisType::FunctionValue FunctionValue
Definition basis.hpp:1133
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:1504
static constexpr const bool hasAncestor
Definition basis.hpp:1254
QuadratureRule m_nodes
Nodes for the interpolation.
Definition basis.hpp:3157
Family< MatrixFamily< ScalarBasisType, N > > IsotropicMatrixFamily(const ScalarBasisType &B)
From a scalar family B, constructs a "Family" of "MatrixFamily" (built on B, of size NxN) that repres...
Definition basis.hpp:1812
BasisType AncestorType
Definition basis.hpp:1152
BasisType::GradientValue ReturnValue
Definition basis.hpp:1866
TensorizedVectorFamily< ScalarBasisType, N >::CurlValue ReturnValue
Definition basis.hpp:2185
static constexpr const bool hasAncestor
Definition basis.hpp:577
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1031
MatrixRd HessianValue
Definition basis.hpp:175
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:1283
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition basis.hpp:1245
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2233
BasisType::RotorValue RotorValue
Definition basis.hpp:321
MatrixRd AncestorBasisFunctionValue
Definition basis.hpp:2286
static const bool hasGradient
Definition basis.hpp:1145
BasisType::DivergenceValue ReturnValue
Definition basis.hpp:1960
static const bool hasCurl
Definition basis.hpp:767
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:726
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_gradient_quad)
Definition basis.hpp:1897
static const bool hasHessian
Definition basis.hpp:333
static const std::vector< VectorRd > basisRd
Definition basis.hpp:58
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:1029
static const bool hasDivergence
Definition basis.hpp:581
static const bool hasDivergence
Definition basis.hpp:1446
static const bool hasHessian
Definition basis.hpp:768
static constexpr const bool hasAncestor
Definition basis.hpp:1507
void HessianValue
Definition basis.hpp:1312
static const bool hasHessian
Definition basis.hpp:1323
static const bool hasCurlCurl
Definition basis.hpp:1386
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1142
HessianValue hessian(size_t i, size_t iqn, const boost::multi_array< HessianValue, 2 > &ancestor_hessian_quad) const
Evaluate the hessian of the i-th function at a quadrature point iqn, knowing all the hessian of ances...
Definition basis.hpp:500
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:1180
static const bool hasCurlCurl
Definition basis.hpp:262
TangentFamily(const ScalarFamilyType &scalar_family, const VectorRd &generator)
Constructor.
Definition basis.hpp:966
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:985
RotorValue rotor(size_t i, const VectorRd &x) const
Evaluate the scalar rotor of the i-th basis function at point x.
Definition basis.hpp:680
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1707
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition basis.hpp:664
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1586
MatrixFamily< ScalarBasisType, N >::DivergenceValue ReturnValue
Definition basis.hpp:2353
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2102
CurlCurlValue curlcurl(size_t i, size_t iqn, const boost::multi_array< typename ScalarFamilyType::HessianValue, 2 > &ancestor_hessian_quad) const
Evaluate the curl curl of the i-th basis function at a quadrature point iqn, knowing all the values o...
Definition basis.hpp:708
Eigen::MatrixXd compute_weighted_gram_matrix(const FType< VectorRd > &f, const BasisQuad< VectorRd > &B1, const BasisQuad< double > &B2, const QuadratureRule &qr, size_t n_rows, size_t n_cols)
Computes the Gram-like matrix of integrals (f dot phi_i, phi_j)
Definition basis.cpp:368
BasisType::FunctionValue FunctionValue
Definition basis.hpp:1022
void HessianValue
Definition basis.hpp:1565
static const bool hasHessian
Definition basis.hpp:1643
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1253
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:1073
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2326
boost::multi_array< outValue, 2 > transform_values_quad(const boost::multi_array< inValue, 2 > &B_quad, const FunctionType &F)
Takes an array B_quad of values at quadrature nodes and applies the function F to all of them....
Definition basis.hpp:1754
static const bool hasDivergence
Definition basis.hpp:1384
static constexpr const TensorRankE tensorRank
Definition basis.hpp:254
size_t dimension() const
Return the dimension of the basis.
Definition basis.hpp:1055
VectorRd FunctionValue
Definition basis.hpp:944
static const bool hasHessian
Definition basis.hpp:261
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2155
static boost::multi_array< typename detail::basis_evaluation_traits< MatrixFamily< BasisType, N >, BasisFunction >::ReturnValue, 2 > compute(const MatrixFamily< BasisType, N > &basis, const QuadratureRule &quad)
Evaluate a Matrix family at quadrature nodes (optimised compared the generic basis evaluation,...
Definition basis.hpp:2505
static const bool hasFunction
Definition basis.hpp:955
RotorValue rotor(size_t i, const VectorRd &x) const
Evaluate the scalar rotor of the i-th basis function at point x.
Definition basis.hpp:1105
static const bool hasFunction
Definition basis.hpp:763
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:196
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:1067
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1691
static const bool hasCurlCurl
Definition basis.hpp:769
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition basis.hpp:1081
ScalarFamilyType::GeometricSupport GeometricSupport
Definition basis.hpp:759
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th basis function at point x.
Definition basis.hpp:1089
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2402
double AncestorBasisFunctionValue
Definition basis.hpp:2323
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:1537
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:805
boost::multi_array< typename BasisType::FunctionValue, 2 > m_on_basis_nodes
Definition basis.hpp:3155
double RotorValue
Definition basis.hpp:1631
void RotorValue
Definition basis.hpp:1311
Eigen::Matrix2d MatrixRd
Definition basis.hpp:54
BasisType::DivergenceValue DivergenceValue
Definition basis.hpp:1025
GradientValue CurlValue
Definition basis.hpp:568
BasisType::CurlValue ReturnValue
Definition basis.hpp:1937
RotorValue rotor(size_t i, size_t iqn, const boost::multi_array< RotorValue, 2 > &ancestor_rotor_quad) const
Evaluate the scalar rotor of the i-th function at a quadrature point iqn, knowing all the scalar roto...
Definition basis.hpp:474
static const bool hasDivergence
Definition basis.hpp:765
TensorizedVectorFamily< ScalarBasisType, N >::RotorValue ReturnValue
Definition basis.hpp:2251
CurlCurlValue curlcurl(size_t i, const VectorRd &x) const
Evaluate the curl curl of the i-th basis function at point x. We use the formula curl curl = - Laplac...
Definition basis.hpp:696
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2200
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th basis function at point x.
Definition basis.hpp:1207
static const bool hasRotor
Definition basis.hpp:1261
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2158
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2060
void RotorValue
Definition basis.hpp:1686
static std::function< Eigen::MatrixXd(const Eigen::MatrixXd &)> symmetrise_matrix
Function to symmetrise a matrix (useful together with transform_values_quad)
Definition basis.hpp:1803
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition basis.hpp:1097
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2089
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:220
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th function at point x.
Definition basis.hpp:435
static constexpr const bool hasAncestor
Definition basis.hpp:1032
BasisType::GradientValue FunctionValue
Definition basis.hpp:1244
static const bool hasGradient
Definition basis.hpp:1639
Eigen::Matrix< double, dimspace, dimspace > CurlValue
Definition basis.hpp:1629
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:214
VectorRd FunctionValue
Definition basis.hpp:1307
void DivergenceValue
Definition basis.hpp:1247
void DivergenceValue
Definition basis.hpp:947
constexpr const BasisType & ancestor() const
Return the underlying complete basis.
Definition basis.hpp:1061
BasisType::GradientValue GradientValue
Definition basis.hpp:1023
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2168
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition basis.hpp:1199
static const bool hasHessian
Definition basis.hpp:1448
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2220
double DivergenceValue
Definition basis.hpp:1563
static constexpr const bool hasAncestor
Definition basis.hpp:180
DivergenceValue rotor(size_t i, const VectorRd &x) const
Evaluate the scalar rotor of the i-th function at point x.
Definition basis.hpp:461
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2266
VectorRd GradientValue
Definition basis.hpp:945
constexpr const BasisType & ancestor() const
Return the underlying complete basis.
Definition basis.hpp:1174
Eigen::VectorXd l2_projection(const std::function< typename BasisType::FunctionValue(const VectorRd &)> &f, const BasisType &basis, QuadratureRule &quad, const boost::multi_array< typename BasisType::FunctionValue, 2 > &basis_quad, const Eigen::MatrixXd &mass_basis=Eigen::MatrixXd::Zero(1, 1))
Compute the L2-projection of a function.
Definition basis.hpp:3023
void CurlValue
Definition basis.hpp:1684
BasisType AncestorType
Definition basis.hpp:1326
static const bool hasCurlCurl
Definition basis.hpp:961
static const bool hasCurl
Definition basis.hpp:1146
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1506
static const bool hasCurl
Definition basis.hpp:1259
static const bool hasFunction
Definition basis.hpp:1571
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl (vector rot) of the i-th basis function at point x.
Definition basis.cpp:41
static const bool hasRotor
Definition basis.hpp:1447
void DivergenceValue
Definition basis.hpp:1500
FunctionValue function(size_t i, size_t iqn, const boost::multi_array< double, 2 > &ancestor_value_quad) const
Evaluate the i-th basis function at a quadrature point iqn, knowing all the values of ancestor basis ...
Definition basis.hpp:813
static const bool hasGradient
Definition basis.hpp:257
Eigen::MatrixXd PermuteTensorization(const size_t a, const size_t b)
Returns the matrix giving the permutation of the tensorization of a family of size a with a family of...
Definition basis.cpp:224
Cell GeometricSupport
Definition basis.hpp:1567
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2122
MatrixFamily(const ScalarFamilyType &scalar_family)
Definition basis.hpp:773
constexpr int dimspace
Dimension, and generic types for vector in correct dimension (makes it easier to translate a code bet...
Definition basis.hpp:53
TensorRankE
Definition basis.hpp:67
MatrixGradient< N > operator*(double scalar, MatrixGradient< N > const &G)
Multiplication of a MatrixGradient from the left (non-member function to be able to multiply from the...
Definition basis.hpp:156
RotorValue rotor(size_t i, const VectorRd &x) const
Evaluate the rotor of the i-th basis function at point x.
Definition basis.cpp:131
double FunctionValue
Definition basis.hpp:170
const Eigen::MatrixXd traceOperator() const
Returns the matrix corresponding to the trace, expressed as a linear operator between that MatrixFami...
Definition basis.hpp:908
Eigen::MatrixXd gram_schmidt(boost::multi_array< T, 2 > &basis_eval, const std::function< double(size_t, size_t)> &inner_product)
Definition basis.hpp:2541
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th function at point x.
Definition basis.hpp:409
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2190
VectorRd CurlValue
Definition basis.hpp:754
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2187
static const bool hasRotor
Definition basis.hpp:185
BasisType::GradientValue ReturnValue
Definition basis.hpp:1890
static constexpr const bool hasAncestor
Definition basis.hpp:1637
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition basis.hpp:1215
void RotorValue
Definition basis.hpp:1248
MatrixGradient operator+(const MatrixGradient &G)
Addition.
Definition basis.hpp:132
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1351
static const bool hasCurl
Definition basis.hpp:330
BasisType::CurlValue CurlValue
Definition basis.hpp:319
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:1938
static const bool hasGradient
Definition basis.hpp:1258
MatrixRd FunctionValue
Definition basis.hpp:1681
static const bool hasGradient
Definition basis.hpp:1382
Family< BasisType > m_on_basis
Definition basis.hpp:3154
static std::function< Eigen::MatrixXd(const Eigen::MatrixXd &)> skew_symmetrise_matrix
Function to skew-symmetrise a matrix (useful together with transform_values_quad)
Definition basis.hpp:1807
static const bool hasCurl
Definition basis.hpp:1573
void RotorValue
Definition basis.hpp:756
static constexpr const bool hasAncestor
Definition basis.hpp:255
BasisType::HessianValue HessianValue
Definition basis.hpp:1027
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2223
DivergenceValue divergence(size_t i, size_t iqn, const boost::multi_array< DivergenceValue, 2 > &ancestor_divergence_quad) const
Evaluate the divergence of the i-th function at a quadrature point iqn, knowing all the divergences o...
Definition basis.hpp:448
static const bool hasCurlCurl
Definition basis.hpp:334
double DivergenceValue
Definition basis.hpp:570
std::function< T(const VectorRd &)> FType
type for function of point. T is the type of value of the function
Definition basis.hpp:64
BasisType AncestorType
Definition basis.hpp:1265
static const bool hasHessian
Definition basis.hpp:186
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition basis.hpp:821
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1414
RotorValue rotor(size_t i, const VectorRd &x) const
Evaluate the rotor of the i-th basis function at point x.
Definition basis.hpp:1223
CurlValue curl(size_t i, size_t iqn, const boost::multi_array< CurlValue, 2 > &ancestor_curl_quad) const
Evaluate the curl of the i-th function at a quadrature point iqn, knowing all the curls of ancestor b...
Definition basis.hpp:422
static constexpr const TensorRankE tensorRank
Definition basis.hpp:761
static const bool hasRotor
Definition basis.hpp:582
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition basis.hpp:1561
Eigen::Matrix< double, N, N > dx
Definition basis.hpp:149
static const bool hasGradient
Definition basis.hpp:1444
Family< BasisType > l2_orthonormalize(const BasisType &basis, const QuadratureRule &qr, boost::multi_array< typename BasisType::FunctionValue, 2 > &basis_quad)
-orthonormalization: simply consists in using gram_schmidt() with the specific l2 inner product
Definition basis.hpp:2659
static const bool hasDivergence
Definition basis.hpp:1696
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:1377
static constexpr const TensorRankE tensorRank
Definition basis.hpp:179
constexpr const BasisType & ancestor() const
Return the ancestor.
Definition basis.hpp:519
static const bool hasDivergence
Definition basis.hpp:1321
static const bool hasCurl
Definition basis.hpp:1035
Eigen::Matrix< double, N, N > FunctionValue
Definition basis.hpp:752
VectorRd GradientValue
Definition basis.hpp:1372
Family< TensorizedVectorFamily< ScalarBasisType, N > > GenericTensorization(const ScalarBasisType &B, const std::vector< Eigen::VectorXd > &v)
From a scalar family B=(B_1..B_r) and vectors (v_1..v_k) in R^N, constructs a "Family" of "Tensorized...
Definition basis.hpp:1769
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:1984
Family< BasisType > family(boost::multi_array< typename BasisType::FunctionValue, 2 > &values)
Returns the decomposed polynomials as a Family of the provided basis.
Definition basis.hpp:3137
static const bool hasRotor
Definition basis.hpp:332
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1339
static const bool hasFunction
Definition basis.hpp:1318
ScalarFamilyType AncestorType
Definition basis.hpp:963
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:602
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:2007
static const bool hasCurl
Definition basis.hpp:1320
const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition basis.hpp:859
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1402
static const bool hasGradient
Definition basis.hpp:1511
static const bool hasFunction
Definition basis.hpp:181
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition basis.cpp:106
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_rotor_quad)
Definition basis.hpp:1990
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:1140
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2253
VectorRd CurlValue
Definition basis.hpp:1246
BasisType AncestorType
Definition basis.hpp:1041
void HessianValue
Definition basis.hpp:1375
FunctionValue function(size_t i, size_t iqn, const boost::multi_array< FunctionValue, 2 > &ancestor_value_quad) const
Evaluate the i-th function at a quadrature point iqn, knowing all the values of ancestor basis functi...
Definition basis.hpp:369
GradientValue gradient(size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_gradient_quad) const
Evaluate the gradient of the i-th basis function at a quadrature point iqn, knowing all the gradients...
Definition basis.hpp:849
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:1598
MatrixRd FunctionValue
Definition basis.hpp:1496
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition basis.hpp:1628
VectorRd GradientValue
Definition basis.hpp:246
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:1716
DecomposePoly(const Cell &T, const BasisType &basis)
Constructor for cell.
Definition basis.hpp:3096
static const bool hasGradient
Definition basis.hpp:764
static const bool hasRotor
Definition basis.hpp:260
static const bool hasCurlCurl
Definition basis.hpp:1644
static const bool hasCurl
Definition basis.hpp:1445
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:1961
static const bool hasRotor
Definition basis.hpp:1697
void RotorValue
Definition basis.hpp:1436
TensorizedVectorFamily< ScalarBasisType, N >::GradientValue ReturnValue
Definition basis.hpp:2153
static const bool hasDivergence
Definition basis.hpp:1260
static const bool hasHessian
Definition basis.hpp:1038
void HessianValue
Definition basis.hpp:1632
static const bool hasFunction
Definition basis.hpp:1144
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_gradient_quad)
Definition basis.hpp:1873
const Eigen::MatrixXd symmetricBasis() const
Returns the matrix that can be used, in a Family of this MatrixBasis, to create a basis of the subspa...
Definition basis.hpp:883
static const bool hasRotor
Definition basis.hpp:1642
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:997
VectorRd GradientValue
Definition basis.hpp:171
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the Hessian of the i-th basis function at point x.
Definition basis.cpp:46
double RotorValue
Definition basis.hpp:571
BasisType::DivergenceValue DivergenceValue
Definition basis.hpp:1136
BasisType::GradientValue ReturnValue
Definition basis.hpp:1914
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:1843
ScalarFamilyType::GeometricSupport GeometricSupport
Definition basis.hpp:574
Eigen::VectorXd integrate(const FType< T > &f, const BasisQuad< T > &B, const QuadratureRule &qr, size_t n_rows=0)
Compute the integral of a given function against all functions from a family.
Definition basis.hpp:2837
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_value_quad)
Definition basis.hpp:1849
BasisType::CurlCurlValue ReturnValue
Definition basis.hpp:2029
VectorZd powers(size_t i) const
Returns the powers of the i-th basis function (not including the vector part)
Definition basis.hpp:1604
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:1471
static const bool hasHessian
Definition basis.hpp:586
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:525
HessianBasis(const BasisType &basis)
Constructor.
Definition basis.hpp:1520
double AncestorBasisFunctionValue
Definition basis.hpp:2057
static const bool hasRotor
Definition basis.hpp:959
void HessianValue
Definition basis.hpp:757
Eigen::Matrix< double, N, N > dy
Definition basis.hpp:150
BasisType::GeometricSupport GeometricSupport
Definition basis.hpp:1251
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:1891
static const bool hasFunction
Definition basis.hpp:328
static const bool hasGradient
Definition basis.hpp:182
ShiftedBasis(const BasisType &basis, const int shift)
Constructor.
Definition basis.hpp:1044
static constexpr const bool hasAncestor
Definition basis.hpp:1570
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition basis.hpp:1408
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the Hessian of the i-th basis function at point x.
Definition basis.hpp:1113
ScalarFamilyType AncestorType
Definition basis.hpp:589
void HessianValue
Definition basis.hpp:1687
const std::shared_ptr< RolyComplBasisCell > & rck() const
Return the Rck basis.
Definition basis.hpp:1666
void CurlValue
Definition basis.hpp:1499
static const bool hasHessian
Definition basis.hpp:1515
CurlValue curl(size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_gradient_quad) const
Evaluate the curl of the i-th basis function at a quadrature point iqn, knowing all the gradients of ...
Definition basis.hpp:656
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1477
static const bool hasGradient
Definition basis.hpp:329
static const bool hasCurlCurl
Definition basis.hpp:1039
static constexpr const TensorRankE tensorRank
Definition basis.hpp:326
static constexpr const TensorRankE tensorRank
Definition basis.hpp:1379
size_t dimension() const
Dimension of the basis.
Definition basis.hpp:271
static constexpr const bool hasAncestor
Definition basis.hpp:1317
static const bool hasCurlCurl
Definition basis.hpp:1449
void DivergenceValue
Definition basis.hpp:1310
static const bool hasFunction
Definition basis.hpp:1508
BasisType AncestorType
Definition basis.hpp:1388
static const bool hasDivergence
Definition basis.hpp:1574
QuadratureRule get_nodes() const
Return the set of nodes (useful to compute value of polynomial to decompose via evaluate_quad)
Definition basis.hpp:3131
static const bool hasFunction
Definition basis.hpp:1638
DecomposePoly(const Edge &E, const BasisType &basis)
Constructor for edge.
Definition basis.hpp:3066
void HessianValue
Definition basis.hpp:1437
VectorRd AncestorBasisFunctionValue
Definition basis.hpp:2355
size_t m_dim
Definition basis.hpp:3152
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_curlcurl_quad)
Definition basis.hpp:2036
static const bool hasCurlCurl
Definition basis.hpp:187
static const bool hasCurl
Definition basis.hpp:1695
static const bool hasCurl
Definition basis.hpp:183
Edge GeometricSupport
Definition basis.hpp:252
static const bool hasCurlCurl
Definition basis.hpp:1324
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< double, 2 > &ancestor_basis_quad)
Definition basis.hpp:2070
boost::multi_array< VectorRd, 2 > vector_matrix_product(const std::vector< VectorRd > &v_quad, const boost::multi_array< MatrixRd, 2 > &basis_quad)
Take the product of (the transposed of) a vector with a matrix-valued basis.
Definition basis.cpp:205
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family used for the tangent)
Definition basis.hpp:991
static boost::multi_array< typename detail::basis_evaluation_traits< BasisType, BasisFunction >::ReturnValue, 2 > compute(const BasisType &basis, const QuadratureRule &quad)
Generic basis evaluation.
Definition basis.hpp:2425
double FunctionValue
Definition basis.hpp:1432
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, size_t iqn, const boost::multi_array< VectorRd, 2 > &ancestor_basis_quad)
Definition basis.hpp:2368
BasisType::HessianValue ReturnValue
Definition basis.hpp:2006
Eigen::Matrix< double, N, 1 > DivergenceValue
Definition basis.hpp:755
static const bool hasDivergence
Definition basis.hpp:1036
const Eigen::MatrixXd & matrix() const
Return the coefficient matrix.
Definition basis.hpp:513
size_t m_nb_nodes
Definition basis.hpp:3156
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1543
static const bool hasDivergence
Definition basis.hpp:1641
static const bool hasRotor
Definition basis.hpp:1037
static const bool hasGradient
Definition basis.hpp:1034
MatrixGradient operator-(const MatrixGradient &G)
Subtraction.
Definition basis.hpp:144
MatrixFamily< ScalarBasisType, N >::FunctionValue ReturnValue
Definition basis.hpp:2321
double FunctionValue
Definition basis.hpp:245
static const bool hasCurl
Definition basis.hpp:1383
static constexpr const bool hasAncestor
Definition basis.hpp:327
static constexpr const bool hasAncestor
Definition basis.hpp:1380
static const bool hasHessian
Definition basis.hpp:1149
static const bool hasGradient
Definition basis.hpp:1694
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition basis.hpp:1867
TensorizedVectorFamily< ScalarBasisType, N >::DivergenceValue ReturnValue
Definition basis.hpp:2218
TensorizedVectorFamily(const ScalarFamilyType &scalar_family)
Definition basis.hpp:591
static const bool hasFunction
Definition basis.hpp:1443
BasisType::CurlValue CurlValue
Definition basis.hpp:1135
Eigen::Matrix< double, dimspace, dimspace > CurlValue
Definition basis.hpp:1562
void RotorValue
Definition basis.hpp:249
void DivergenceValue
Definition basis.hpp:1435
BasisType::RotorValue RotorValue
Definition basis.hpp:1137
VectorRd CurlValue
Definition basis.hpp:172
@ Curl
Definition basis.hpp:1745
@ Function
Definition basis.hpp:1741
@ CurlCurl
Definition basis.hpp:1749
@ Gradient
Definition basis.hpp:1742
@ SkewsymmetricGradient
Definition basis.hpp:1744
@ Rotor
Definition basis.hpp:1747
@ Divergence
Definition basis.hpp:1746
@ SymmetricGradient
Definition basis.hpp:1743
@ Hessian
Definition basis.hpp:1748
@ Scalar
Definition basis.hpp:68
@ Vector
Definition basis.hpp:69
@ Matrix
Definition basis.hpp:70
size_t L
Definition HHO_DiffAdvecReac.hpp:46
std::vector< QuadratureNode > QuadratureRule
Definition quadraturerule.hpp:55
if(strcmp(field, 'real')) % real valued entries T
Definition mmread.m:93
for j
Definition mmread.m:174
Definition PastixInterface.hpp:16
Definition ddr-klplate.hpp:27
static auto v
Definition ddrcore-test.hpp:32
Structure to decompose a set of polynomials on a basis on an edge or a cell.
Definition basis.hpp:3059
Structure to store the gradient of a matrix-valued function.
Definition basis.hpp:113
Compute vectors listing the powers of monomial basis functions (for a cell, only this specialization ...
Definition basis.hpp:81
Basis dimensions for various polynomial spaces on edges/faces/elements (when relevant): Pk,...
Definition polynomialspacedimension.hpp:55
Basis evaluation traits. Only specialization of 'BasisFunction' (=Function, Gradient,...
Definition basis.hpp:1834
Evaluate a basis at quadrature nodes. 'BasisFunction' (=Function, Gradient, Curl, Divergence,...
Definition basis.hpp:2421