27 #include <boost/multi_array.hpp>
74 template<
typename GeometricSupport>
86 std::vector<VectorZd> powers;
88 for (
size_t i = 0; i <=
L; i++)
90 for (
size_t j = 0; i + j <=
L; j++)
92 powers.push_back(
VectorZd(i, j,
L - i - j));
99 static std::vector<VectorZd>
complete(
const size_t degree)
101 std::vector<VectorZd> powers;
103 for (
size_t l = 0; l <= degree; l++)
105 std::vector<VectorZd> pow_hom = homogeneous(l);
120 std::vector<Eigen::Vector2i> powers;
122 for (
size_t i = 0; i <=
L; i++)
124 powers.push_back(Eigen::Vector2i(i,
L - i));
130 static std::vector<Eigen::Vector2i>
complete(
size_t degree)
132 std::vector<Eigen::Vector2i> powers;
134 for (
size_t l = 0; l <= degree; l++)
136 std::vector<Eigen::Vector2i> pow_hom = homogeneous(l);
137 for (Eigen::Vector2i p : pow_hom){
182 return (m_degree >= 0 ? (m_degree * (m_degree + 1) * (2 * m_degree + 1) + 9 * m_degree * (m_degree + 1) + 12 * (m_degree + 1)) / 12 : 0);
210 return (x - m_xT) / m_hT;
217 std::vector<VectorZd> m_powers;
255 return (m_degree + 1) * (m_degree + 2) / 2;
291 return m_jacobian * m_hF;
295 inline Eigen::Vector2i
powers(
size_t i)
const
302 inline Eigen::Vector2d _coordinate_transform(
const VectorRd &x)
const
304 return m_jacobian * (x - m_xF);
312 std::vector<Eigen::Vector2i> m_powers;
363 inline double _coordinate_transform(
const VectorRd &x)
const
365 return (x - m_xE).dot(m_tE) / m_hE;
386 template <
typename BasisType>
402 static const bool hasCurl = BasisType::hasCurl;
411 const BasisType &basis,
412 const Eigen::MatrixXd &
matrix
417 assert((
size_t)
matrix.cols() == basis.dimension() ||
"Inconsistent family initialization");
423 return m_matrix.rows();
429 static_assert(
hasFunction,
"Call to function() not available");
432 for (
auto j = 1; j < m_matrix.cols(); j++)
434 f += m_matrix(i, j) * m_basis.function(j, x);
440 FunctionValue function(
size_t i,
size_t iqn,
const boost::multi_array<FunctionValue, 2> &ancestor_value_quad)
const
442 static_assert(
hasFunction,
"Call to function() not available");
444 FunctionValue f = m_matrix(i, 0) * ancestor_value_quad[0][iqn];
445 for (
auto j = 1; j < m_matrix.cols(); j++)
447 f += m_matrix(i, j) * ancestor_value_quad[j][iqn];
456 static_assert(
hasGradient,
"Call to gradient() not available");
459 for (
auto j = 1; j < m_matrix.cols(); j++)
461 G += m_matrix(i, j) * m_basis.gradient(j, x);
467 GradientValue gradient(
size_t i,
size_t iqn,
const boost::multi_array<GradientValue, 2> &ancestor_gradient_quad)
const
469 static_assert(
hasGradient,
"Call to gradient() not available");
471 GradientValue G = m_matrix(i, 0) * ancestor_gradient_quad[0][iqn];
472 for (
auto j = 1; j < m_matrix.cols(); j++)
474 G += m_matrix(i, j) * ancestor_gradient_quad[j][iqn];
482 static_assert(
hasCurl,
"Call to curl() not available");
484 CurlValue C = m_matrix(i, 0) * m_basis.curl(0, x);
485 for (
auto j = 1; j < m_matrix.cols(); j++)
487 C += m_matrix(i, j) * m_basis.curl(j, x);
493 CurlValue curl(
size_t i,
size_t iqn,
const boost::multi_array<CurlValue, 2> &ancestor_curl_quad)
const
495 static_assert(
hasCurl,
"Call to curl() not available");
497 CurlValue C = m_matrix(i, 0) * ancestor_curl_quad[0][iqn];
498 for (
auto j = 1; j < m_matrix.cols(); j++)
500 C += m_matrix(i, j) * ancestor_curl_quad[j][iqn];
508 static_assert(
hasDivergence,
"Call to divergence() not available");
511 for (
auto j = 1; j < m_matrix.cols(); j++)
513 D += m_matrix(i, j) * m_basis.divergence(j, x);
521 static_assert(
hasDivergence,
"Call to divergence() not available");
524 for (
auto j = 1; j < m_matrix.cols(); j++)
526 D += m_matrix(i, j) * ancestor_divergence_quad[j][iqn];
534 static_assert(
hasHessian,
"Call to hessian() not available");
536 HessianValue H = m_matrix(i, 0) * m_basis.hessian(0, x);
537 for (
auto j = 1; j < m_matrix.cols(); j++)
539 H += m_matrix(i, j) * m_basis.hessian(j, x);
545 HessianValue hessian(
size_t i,
size_t iqn,
const boost::multi_array<HessianValue, 2> &ancestor_hessian_quad)
const
547 static_assert(
hasHessian,
"Call to hessian() not available");
549 HessianValue H = m_matrix(i, 0) * ancestor_hessian_quad[0][iqn];
550 for (
auto j = 1; j < m_matrix.cols(); j++)
552 H += m_matrix(i, j) * ancestor_hessian_quad[j][iqn];
558 inline const Eigen::MatrixXd &
matrix()
const
572 return m_basis.max_degree();
577 Eigen::MatrixXd m_matrix;
607 template <
typename ScalarFamilyType,
size_t N>
633 : m_scalar_family(scalar_family)
635 static_assert(ScalarFamilyType::tensorRank ==
Scalar,
636 "Vector family can only be constructed from scalar families");
642 return m_scalar_family.dimension() * N;
648 static_assert(
hasFunction,
"Call to function() not available");
651 ek(i / m_scalar_family.dimension()) = 1.;
652 return ek * m_scalar_family.function(i % m_scalar_family.dimension(), x);
656 FunctionValue function(
size_t i,
size_t iqn,
const boost::multi_array<double, 2> &ancestor_value_quad)
const
658 static_assert(
hasFunction,
"Call to function() not available");
661 ek(i / m_scalar_family.dimension()) = 1.;
662 return ek * ancestor_value_quad[i % m_scalar_family.dimension()][iqn];
668 static_assert(
hasGradient,
"Call to gradient() not available");
670 GradientValue G = Eigen::Matrix<double, N, dimspace>::Zero();
671 G.row(i / m_scalar_family.dimension()) = m_scalar_family.gradient(i % m_scalar_family.dimension(), x);
678 static_assert(
hasGradient,
"Call to gradient() not available");
680 GradientValue G = Eigen::Matrix<double, N, dimspace>::Zero();
681 G.row(i / m_scalar_family.dimension()) = ancestor_gradient_quad[i % m_scalar_family.dimension()][iqn];
688 static_assert(
hasCurl,
"Call to curl() not available");
691 ek(i / m_scalar_family.dimension()) = 1.;
692 return m_scalar_family.gradient(i % m_scalar_family.dimension(), x).cross(ek);
696 CurlValue curl(
size_t i,
size_t iqn,
const boost::multi_array<VectorRd, 2> &ancestor_gradient_quad)
const
698 static_assert(
hasCurl,
"Call to curl() not available");
701 ek(i / m_scalar_family.dimension()) = 1.;
702 return ancestor_gradient_quad[i % m_scalar_family.dimension()][iqn].cross(ek);
708 static_assert(
hasDivergence,
"Call to divergence() not available");
710 return m_scalar_family.gradient(i % m_scalar_family.dimension(), x)(i / m_scalar_family.dimension());
716 static_assert(
hasDivergence,
"Call to divergence() not available");
718 return ancestor_gradient_quad[i % m_scalar_family.dimension()][iqn](i / m_scalar_family.dimension());
724 static_assert(
hasCurlCurl,
"Call to curlcurl() not available");
727 int p = i / m_scalar_family.dimension();
729 typename ScalarFamilyType::HessianValue hess = m_scalar_family.hessian(i % m_scalar_family.dimension(), x);
730 return - hess.trace() * ek + hess.col(p);
734 CurlValue curlcurl(
size_t i,
size_t iqn,
const boost::multi_array<typename ScalarFamilyType::HessianValue, 2> &ancestor_hessian_quad)
const
736 static_assert(
hasCurlCurl,
"Call to curlcurl() not available");
739 int p = i / m_scalar_family.dimension();
741 typename ScalarFamilyType::HessianValue hess = ancestor_hessian_quad[i % m_scalar_family.dimension()][iqn];
742 return - hess.trace() * ek + hess.col(p);
747 constexpr
inline const ScalarFamilyType &
ancestor()
const
749 return m_scalar_family;
755 return m_scalar_family.max_degree();
759 ScalarFamilyType m_scalar_family;
774 template<
typename ScalarFamilyType,
size_t N>
798 : m_scalar_family(scalar_family),
800 m_transposeOperator(Eigen::MatrixXd::Zero(scalar_family.
dimension()*N*N, scalar_family.
dimension()*N*N))
802 static_assert(ScalarFamilyType::tensorRank ==
Scalar,
803 "Vector family can only be constructed from scalar families");
806 for (
size_t j = 0; j < N; j++){
807 for (
size_t i = 0; i < N; i++){
808 m_E[j*N + i] = Eigen::Matrix<double, N, N>::Zero();
809 m_E[j*N + i](i,j) = 1.;
814 for (
size_t i = 0; i <
dimension(); i++){
816 size_t r = m_scalar_family.dimension();
817 size_t j = ( ( (i/r)%N )*N + (i/r)/N ) * r + (i%r);
818 m_transposeOperator(i,j) = 1.;
825 return m_scalar_family.dimension() * N * N;
831 static_assert(
hasFunction,
"Call to function() not available");
833 return m_scalar_family.function(i % m_scalar_family.dimension(), x) * m_E[i / m_scalar_family.dimension()];
837 FunctionValue function(
size_t i,
size_t iqn,
const boost::multi_array<double, 2> &ancestor_value_quad)
const
839 static_assert(
hasFunction,
"Call to function() not available");
841 return ancestor_value_quad[i % m_scalar_family.dimension()][iqn] * m_E[i / m_scalar_family.dimension()];
847 static_assert(
hasDivergence,
"Call to divergence() not available");
849 Eigen::Matrix<double, N, 1> V = m_E[i/m_scalar_family.dimension()].col( (i/m_scalar_family.dimension()) /N);
850 return m_scalar_family.gradient(i % m_scalar_family.dimension(), x)( (i / m_scalar_family.dimension()) / N) * V;
856 static_assert(
hasDivergence,
"Call to divergence() not available");
858 Eigen::Matrix<double, N, 1> V = m_E[i/m_scalar_family.dimension()].col( (i/m_scalar_family.dimension()) /N);
859 return ancestor_gradient_quad[i % m_scalar_family.dimension()][iqn]( (i / m_scalar_family.dimension()) / N) * V;
865 return m_scalar_family;
877 return m_transposeOperator;
889 size_t dim_scalar = m_scalar_family.dimension();
892 Eigen::MatrixXd SB = Eigen::MatrixXd::Zero(dim_scalar * N*(N+1)/2,
dimension());
898 for (
size_t i = 0; i<N; i++){
900 SB.middleRows(position, (N-i)*dim_scalar) = symOpe.middleRows(i*(N+1)*dim_scalar, (N-i)*dim_scalar);
902 position += (N-i)*dim_scalar;
909 ScalarFamilyType m_scalar_family;
910 std::vector<Eigen::Matrix<double, N, N>> m_E;
911 Eigen::MatrixXd m_transposeOperator;
918 template <
typename ScalarFamilyType>
943 const ScalarFamilyType &scalar_family,
944 const Eigen::Matrix<double, 2, dimspace> &
generators
946 : m_scalar_family(scalar_family),
950 static_assert(ScalarFamilyType::hasFunction,
"Call to function() not available");
951 static_assert(std::is_same<typename ScalarFamilyType::GeometricSupport, Face>::value,
952 "Tangent families can only be defined on faces");
958 return m_scalar_family.dimension() * 2;
964 return m_generators.row(i / m_scalar_family.dimension()) * m_scalar_family.function(i % m_scalar_family.dimension(), x);
970 return m_generators.row(i / m_scalar_family.dimension()).dot(m_scalar_family.gradient(i % m_scalar_family.dimension(), x));
976 return m_normal.cross(
977 m_scalar_family.hessian(i % m_scalar_family.dimension(), x) *
978 (m_normal.cross(m_generators.row(i / m_scalar_family.dimension())) ) );
982 constexpr
inline const ScalarFamilyType &
ancestor()
const
984 return m_scalar_family;
990 return m_scalar_family.max_degree();
1001 ScalarFamilyType m_scalar_family;
1002 Eigen::Matrix<double, 2, dimspace> m_generators;
1010 template <
typename BasisType>
1035 const BasisType &basis,
1047 return m_basis.dimension() - m_shift;
1065 return m_basis.max_degree();
1071 static_assert(
hasFunction,
"Call to function() not available");
1073 return m_basis.function(i + m_shift, x);
1079 static_assert(
hasGradient,
"Call to gradient() not available");
1081 return m_basis.gradient(i + m_shift, x);
1087 static_assert(
hasCurl,
"Call to curl() not available");
1089 return m_basis.curl(i + m_shift, x);
1095 static_assert(
hasDivergence,
"Call to divergence() not available");
1097 return m_basis.divergence(i + m_shift, x);
1103 static_assert(
hasHessian,
"Call to hessian() not available");
1105 return m_basis.hessian(i + m_shift, x);
1117 template <
typename BasisType>
1142 const BasisType &basis,
1179 static_assert(
hasFunction,
"Call to function() not available");
1181 return m_basis.function(i, x);
1187 static_assert(
hasGradient,
"Call to gradient() not available");
1189 return m_basis.gradient(i, x);
1195 static_assert(
hasCurl,
"Call to curl() not available");
1197 return m_basis.curl(i, x);
1203 static_assert(
hasDivergence,
"Call to divergence() not available");
1205 return m_basis.divergence(i, x);
1211 static_assert(
hasHessian,
"Call to hessian() not available");
1213 return m_basis.hessian(i, x);
1226 template <
typename BasisType>
1251 : m_scalar_basis(basis)
1253 static_assert(BasisType::tensorRank ==
Scalar || BasisType::tensorRank ==
Vector,
1254 "Gradient basis can only be constructed starting from scalar or vector bases");
1255 static_assert(BasisType::hasGradient,
1256 "Gradient basis requires gradient() for the original basis to be available");
1263 return m_scalar_basis.dimension();
1269 return m_scalar_basis.gradient(i, x);
1275 return m_scalar_basis;
1280 BasisType m_scalar_basis;
1288 template <
typename BasisType>
1294 typedef Eigen::Matrix<double, dimspace, dimspace>
CurlValue;
1315 static_assert((BasisType::tensorRank ==
Vector && std::is_same<typename BasisType::GeometricSupport, Cell>::value) ||
1316 (BasisType::tensorRank ==
Scalar && std::is_same<typename BasisType::GeometricSupport, Face>::value),
1317 "Curl basis can only be constructed starting from vector bases on elements or scalar bases on faces");
1318 static_assert(BasisType::hasCurl,
1319 "Curl basis requires curl() for the original basis to be available");
1325 return m_basis.dimension();
1331 return m_basis.curl(i, x);
1351 template <
typename BasisType>
1376 : m_vector_basis(basis)
1378 static_assert(BasisType::tensorRank ==
Vector || BasisType::tensorRank ==
Matrix,
1379 "Divergence basis can only be constructed starting from vector bases");
1380 static_assert(BasisType::hasDivergence,
1381 "Divergence basis requires divergence() for the original basis to be available");
1388 return m_vector_basis.dimension();
1394 return m_vector_basis.divergence(i, x);
1400 return m_vector_basis;
1405 BasisType m_vector_basis;
1411 template <
typename ScalarFamilyType>
1415 Eigen::MatrixXd gen = tangent_family.
generators();
1417 Eigen::MatrixXd rotated_gen = Eigen::MatrixXd::Zero(2, 3);
1418 rotated_gen.row(0) =
VectorRd(gen.row(0)).cross(nF);
1419 rotated_gen.row(1) =
VectorRd(gen.row(1)).cross(nF);
1436 typedef Eigen::Matrix<double, dimspace, dimspace>
CurlValue;
1485 return (x - m_xT) / m_hT;
1491 std::vector<VectorZd> m_powers;
1562 return (x - m_xT) / m_hT;
1574 std::vector<VectorZd> m_powers;
1584 typedef Eigen::Matrix<double, dimspace, dimspace>
CurlValue;
1632 inline Eigen::Vector2i
powers(
size_t i)
const
1639 inline Eigen::Vector2d _coordinate_transform(
const VectorRd &x)
const
1641 return m_jacobian * (x - m_xF);
1648 std::vector<Eigen::Vector2i> m_powers;
1658 typedef Eigen::Matrix<double, dimspace, dimspace>
CurlValue;
1697 inline const std::shared_ptr<RolyComplBasisFace> &
rck()
const
1705 std::shared_ptr<RolyComplBasisFace> m_Rck_basis;
1723 template <
typename outValue,
typename inValue,
typename FunctionType>
1725 const boost::multi_array<inValue, 2> &B_quad,
1726 const FunctionType &F
1729 boost::multi_array<outValue, 2> transformed_B_quad( boost::extents[B_quad.shape()[0]][B_quad.shape()[1]] );
1731 std::transform( B_quad.origin(), B_quad.origin() + B_quad.num_elements(), transformed_B_quad.origin(), F);
1733 return transformed_B_quad;
1738 template <
typename ScalarBasisType,
size_t N>
1740 const ScalarBasisType & B,
1741 const std::vector<Eigen::VectorXd> & v
1744 size_t r = B.dimension();
1745 size_t k = v.size();
1747 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(r*k, r*N);
1749 for (
size_t i=0; i < k; i++){
1751 assert(v[i].size() == N);
1754 for (
size_t j=0; j < N; j++){
1755 M.block(i*r, j*r, r, r) = v[i](j) * Eigen::MatrixXd::Identity(r,r);
1765 inline static std::function<Eigen::MatrixXd(
const Eigen::MatrixXd &)>
1766 symmetrise_matrix = [](
const Eigen::MatrixXd & x)->Eigen::MatrixXd {
return 0.5*(x+x.transpose());};
1769 inline static std::function<Eigen::MatrixXd(
const Eigen::MatrixXd &)>
1774 template <
typename ScalarBasisType,
size_t N>
1776 const ScalarBasisType & B
1779 size_t r = B.dimension();
1780 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(r, r*N*N);
1782 for (
size_t k=0; k < N; k++){
1783 M.block(0, k*r*(N+1), r, r) = Eigen::MatrixXd::Identity(r, r);
1800 template <
typename BasisType, BasisFunctionE BasisFunction>
1806 template <
typename BasisType>
1809 static_assert(BasisType::hasFunction,
"Call to function not available");
1813 return basis.function(i, x);
1818 const BasisType &basis,
1821 const boost::multi_array<ReturnValue, 2> &ancestor_value_quad
1824 return basis.function(i, iqn, ancestor_value_quad);
1830 template <
typename BasisType>
1833 static_assert(BasisType::hasGradient,
"Call to gradient not available");
1837 return basis.gradient(i, x);
1842 const BasisType &basis,
1845 const boost::multi_array<ReturnValue, 2> &ancestor_gradient_quad
1848 return basis.gradient(i, iqn, ancestor_gradient_quad);
1853 template <
typename BasisType>
1856 static_assert(BasisType::hasCurl,
"Call to curl not available");
1860 return basis.curl(i, x);
1865 const BasisType &basis,
1868 const boost::multi_array<ReturnValue, 2> &ancestor_curl_quad
1871 return basis.curl(i, iqn, ancestor_curl_quad);
1876 template <
typename BasisType>
1879 static_assert(BasisType::hasDivergence,
"Call to divergence not available");
1883 return basis.divergence(i, x);
1888 const BasisType &basis,
1891 const boost::multi_array<ReturnValue, 2> &ancestor_divergence_quad
1894 return basis.divergence(i, iqn, ancestor_divergence_quad);
1900 template <
typename BasisType>
1903 static_assert(BasisType::hasHessian,
"Call to hessian not available");
1907 return basis.hessian(i, x);
1912 const BasisType &basis,
1915 const boost::multi_array<ReturnValue, 2> &ancestor_hessian_quad
1918 return basis.hessian(i, iqn, ancestor_hessian_quad);
1924 template <
typename BasisType>
1927 static_assert(BasisType::hasCurlCurl,
"Call to curl curl not available");
1931 return basis.curlcurl(i, x);
1936 const BasisType &basis,
1939 const boost::multi_array<ReturnValue, 2> &ancestor_curlcurl_quad
1942 return basis.curlcurl(i, iqn, ancestor_curlcurl_quad);
1949 template <
typename ScalarBasisType,
size_t N>
1973 const boost::multi_array<double, 2> &ancestor_basis_quad
1976 return basis.
function(i, iqn, ancestor_basis_quad);
1981 template <
typename ScalarBasisType,
size_t N>
2005 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2008 return basis.
gradient(i, iqn, ancestor_basis_quad);
2013 template <
typename ScalarBasisType,
size_t N>
2029 return basis.
curl(i, x);
2037 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2040 return basis.
curl(i, iqn, ancestor_basis_quad);
2046 template <
typename ScalarBasisType,
size_t N>
2070 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2073 return basis.
divergence(i, iqn, ancestor_basis_quad);
2079 template <
typename ScalarBasisType,
size_t N>
2103 const boost::multi_array<MatrixRd, 2> &ancestor_basis_quad
2106 return basis.
curlcurl(i, iqn, ancestor_basis_quad);
2113 template <
typename ScalarBasisType,
size_t N>
2137 const boost::multi_array<double, 2> &ancestor_basis_quad
2140 return basis.
function(i, iqn, ancestor_basis_quad);
2145 template <
typename ScalarBasisType,
size_t N>
2169 const boost::multi_array<VectorRd, 2> &ancestor_basis_quad
2172 return basis.
divergence(i, iqn, ancestor_basis_quad);
2183 template <BasisFunctionE BasisFunction>
2187 template <
typename BasisType>
2188 static boost::multi_array<typename detail::basis_evaluation_traits<BasisType, BasisFunction>::ReturnValue, 2>
2190 const BasisType &basis,
2196 boost::multi_array<typename traits::ReturnValue, 2>
2197 basis_quad(boost::extents[basis.dimension()][quad.size()]);
2199 for (
size_t i = 0; i < basis.dimension(); i++)
2201 for (
size_t iqn = 0; iqn < quad.size(); iqn++)
2203 basis_quad[i][iqn] = traits::evaluate(basis, i, quad[iqn].vector());
2211 template <
typename BasisType>
2212 static boost::multi_array<typename detail::basis_evaluation_traits<Family<BasisType>, BasisFunction>::ReturnValue, 2>
2220 boost::multi_array<typename traits::ReturnValue, 2>
2221 basis_quad(boost::extents[basis.
dimension()][quad.size()]);
2224 const auto &ancestor_basis = basis.
ancestor();
2225 boost::multi_array<typename traits::ReturnValue, 2>
2228 for (
size_t iqn = 0; iqn < quad.size(); iqn++)
2230 for (
size_t i = 0; i < size_t(basis.
matrix().rows()); i++){
2231 basis_quad[i][iqn] = traits::evaluate(basis, i, iqn, ancestor_basis_quad);
2238 template <
typename BasisType,
size_t N>
2239 static boost::multi_array<typename detail::basis_evaluation_traits<TensorizedVectorFamily<BasisType, N>, BasisFunction>::ReturnValue, 2>
2247 boost::multi_array<typename traits::ReturnValue, 2>
2248 basis_quad(boost::extents[basis.
dimension()][quad.size()]);
2250 const auto &ancestor_basis = basis.
ancestor();
2251 const boost::multi_array<typename traits::AncestorBasisFunctionValue, 2> ancestor_basis_quad
2254 for (
size_t i = 0; i < basis.
dimension(); i++){
2255 for (
size_t iqn = 0; iqn < quad.size(); iqn++){
2256 basis_quad[i][iqn] = traits::evaluate(basis, i, iqn, ancestor_basis_quad);
2263 template <
typename BasisType,
size_t N>
2264 static boost::multi_array<typename detail::basis_evaluation_traits<MatrixFamily<BasisType, N>, BasisFunction>::ReturnValue, 2>
2272 boost::multi_array<typename traits::ReturnValue, 2>
2273 basis_quad(boost::extents[basis.
dimension()][quad.size()]);
2275 const auto &ancestor_basis = basis.
ancestor();
2276 const boost::multi_array<typename traits::AncestorBasisFunctionValue, 2> ancestor_basis_quad
2279 for (
size_t i = 0; i < basis.
dimension(); i++){
2280 for (
size_t iqn = 0; iqn < quad.size(); iqn++){
2281 basis_quad[i][iqn] = traits::evaluate(basis, i, iqn, ancestor_basis_quad);
2302 template <
typename T>
2304 boost::multi_array<T, 2> &basis_eval,
2305 const std::function<
double(
size_t,
size_t)> &inner_product
2308 auto induced_norm = [inner_product](
size_t i) ->
double {
2309 return std::sqrt(inner_product(i, i));
2313 size_t Nb = basis_eval.shape()[0];
2315 size_t Nqn = basis_eval.shape()[1];
2317 Eigen::MatrixXd B = Eigen::MatrixXd::Zero(Nb, Nb);
2320 double norm = induced_norm(0);
2321 for (
size_t iqn = 0; iqn < Nqn; iqn++)
2323 basis_eval[0][iqn] /= norm;
2325 B(0, 0) = 1. / norm;
2327 for (
size_t ib = 1; ib < Nb; ib++)
2330 Eigen::RowVectorXd coeffs = Eigen::RowVectorXd::Zero(ib);
2331 for (
size_t pb = 0; pb < ib; pb++)
2333 coeffs(pb) = -inner_product(ib, pb);
2337 for (
size_t pb = 0; pb < ib; pb++)
2339 for (
size_t iqn = 0; iqn < Nqn; iqn++)
2341 basis_eval[ib][iqn] += coeffs(pb) * basis_eval[pb][iqn];
2346 double norm = induced_norm(ib);
2347 for (
size_t iqn = 0; iqn < Nqn; iqn++)
2349 basis_eval[ib][iqn] /= norm;
2356 B.block(ib, 0, 1, ib) = coeffs * B.topLeftCorner(ib, ib);
2357 B(ib, ib) = 1. / norm;
2368 double scalar_product(
const double &x,
const Eigen::Matrix<double, 1, 1> &y);
2375 double scalar_product(
const Eigen::Matrix<double, N, N> & x,
const Eigen::Matrix<double, N, N> & y)
2377 return (x.transpose() * y).trace();
2381 template <
typename Value>
2383 const boost::multi_array<Value, 2> &basis_quad,
2387 boost::multi_array<double, 2> basis_dot_v_quad(boost::extents[basis_quad.shape()[0]][basis_quad.shape()[1]]);
2388 std::transform(basis_quad.origin(), basis_quad.origin() + basis_quad.num_elements(),
2389 basis_dot_v_quad.origin(), [&v](
const Value &x) ->
double { return scalar_product(x,v); });
2390 return basis_dot_v_quad;
2395 boost::multi_array<VectorRd, 2>
2397 const boost::multi_array<VectorRd, 2> &basis_quad,
2402 template <
typename BasisType>
2404 const BasisType &basis,
2406 boost::multi_array<typename BasisType::FunctionValue, 2> &basis_quad
2410 assert(basis.dimension() == basis_quad.shape()[0] && qr.size() == basis_quad.shape()[1]);
2413 std::function<double(
size_t,
size_t)> inner_product = [&basis_quad, &qr](
size_t i,
size_t j) ->
double {
2415 for (
size_t iqn = 0; iqn < qr.size(); iqn++)
2417 r += qr[iqn].w *
scalar_product(basis_quad[i][iqn], basis_quad[j][iqn]);
2422 Eigen::MatrixXd B =
gram_schmidt(basis_quad, inner_product);
2429 template <
typename BasisType>
2431 const BasisType &basis,
2432 const Eigen::MatrixXd & GM
2436 assert(basis.dimension() ==
size_t(GM.rows()) && GM.rows() == GM.cols());
2438 Eigen::MatrixXd
L = GM.llt().matrixL();
2450 template <
typename FunctionValue>
2452 const boost::multi_array<FunctionValue, 2> &B2,
2456 const std::string sym =
"nonsym"
2460 assert(qr.size() == B1.shape()[1] && qr.size() == B2.shape()[1]);
2462 assert(nrows <= B1.shape()[0] && ncols <= B2.shape()[0]);
2465 Eigen::ArrayXd qr_weights = Eigen::ArrayXd::Zero(qr.size());
2466 for (
size_t iqn = 0; iqn < qr.size(); iqn++)
2468 qr_weights(iqn) = qr[iqn].w;
2471 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(nrows, ncols);
2472 for (
size_t i = 0; i < nrows; i++)
2477 for (
size_t j = 0; j < jcut; j++)
2481 for (
size_t j = jcut; j < ncols; j++)
2483 std::vector<double> tmp(B1.shape()[1]);
2485 auto B1i = B1[boost::indices[i][boost::multi_array_types::index_range(0, B1.shape()[1])]];
2486 auto B2j = B2[boost::indices[j][boost::multi_array_types::index_range(0, B1.shape()[1])]];
2488 std::transform(B1i.begin(), B1i.end(), B2j.begin(), tmp.begin(), [](FunctionValue a, FunctionValue b) ->
double { return scalar_product(a, b); });
2489 Eigen::ArrayXd tmp_array = Eigen::Map<Eigen::ArrayXd, Eigen::Unaligned>(tmp.data(), tmp.size());
2491 M(i, j) = (qr_weights * tmp_array).sum();
2508 template <
typename FunctionValue>
2510 const boost::multi_array<FunctionValue, 2> &B2,
2512 const std::string sym =
"nonsym"
2515 return compute_gram_matrix<FunctionValue>(B1, B2, qr, B1.shape()[0], B2.shape()[0], sym);
2519 template <
typename FunctionValue>
2524 return compute_gram_matrix<FunctionValue>(B, B, qr,
"sym");
2529 const boost::multi_array<double, 2> &B2,
2537 const boost::multi_array<double, 2> &B2,
2541 const std::string sym =
"nonsym"
2548 const boost::multi_array<double, 2> &B2,
2550 const std::string sym =
"nonsym"
2557 const boost::multi_array<VectorRd, 2> &B2,
2561 const std::string sym =
"nonsym"
2566 const boost::multi_array<VectorRd, 2> &B2,
2568 const std::string sym =
"nonsym"
2572 template<
typename ScalarFamilyType,
size_t N>
2574 const boost::multi_array<double, 2> & scalar_family_quad,
2578 Eigen::MatrixXd Gram = Eigen::MatrixXd::Zero(MatFam.
dimension(), MatFam.
dimension());
2581 Eigen::MatrixXd scalarGram = compute_gram_matrix<double>(scalar_family_quad, qr);
2582 for (
size_t i = 0; i < MatFam.
dimension(); i = i+scalarGram.rows()){
2583 Gram.block(i, i, scalarGram.rows(), scalarGram.cols()) = scalarGram;
2590 template <
typename T>
2601 n_rows = B.shape()[0];
2605 const size_t num_quads = qr.size();
2608 assert(num_quads == B.shape()[1]);
2611 assert(n_rows <= B.shape()[0]);
2613 Eigen::VectorXd V = Eigen::VectorXd::Zero(n_rows);
2615 for (
size_t iqn = 0; iqn < num_quads; iqn++)
2617 double qr_weight = qr[iqn].w;
2618 T f_on_qr = f(qr[iqn].vector());
2619 for (
size_t i = 0; i < n_rows; i++)
2629 template <
typename T,
typename U>
2637 const std::string sym =
"nonsym"
2641 if (n_rows == 0 && n_cols == 0)
2643 n_rows = B1.shape()[0];
2644 n_cols = B2.shape()[0];
2648 const size_t num_quads = qr.size();
2650 assert(num_quads == B1.shape()[1] && num_quads == B2.shape()[1]);
2652 assert(n_rows <= B1.shape()[0] && n_cols <= B2.shape()[0]);
2654 Eigen::MatrixXd M = Eigen::MatrixXd::Zero(n_rows, n_cols);
2655 for (
size_t iqn = 0; iqn < num_quads; iqn++)
2657 double qr_weight = qr[iqn].w;
2658 U f_on_qr = f(qr[iqn].vector());
2659 for (
size_t i = 0; i < n_rows; i++)
2661 T f_B1 = f_on_qr * B1[i][iqn];
2665 for (
size_t j = 0; j < jcut; j++)
2669 for (
size_t j = jcut; j < n_cols; j++)
2679 template <
typename T,
typename U>
2685 const std::string sym
2693 const FType<VectorRd> &f,
2694 const BasisQuad<VectorRd> &B1,
2695 const BasisQuad<double> &B2,
2703 const FType<VectorRd> &f,
2704 const BasisQuad<double> &B1,
2705 const BasisQuad<VectorRd> &B2,
2716 template <
typename BasisType>
2718 const std::function<
typename BasisType::FunctionValue(
const VectorRd &)> &f,
2719 const BasisType &basis,
2721 const boost::multi_array<typename BasisType::FunctionValue, 2> &basis_quad,
2722 const Eigen::MatrixXd &mass_basis = Eigen::MatrixXd::Zero(1,1)
2725 Eigen::MatrixXd Mass = mass_basis;
2726 if (Mass.norm() < 1e-13){
2729 Eigen::LDLT<Eigen::MatrixXd> cholesky_mass(Mass);
2730 Eigen::VectorXd b = Eigen::VectorXd::Zero(basis.dimension());
2731 for (
size_t i = 0; i < basis.dimension(); i++)
2733 for (
size_t iqn = 0; iqn < quad.size(); iqn++)
2735 b(i) += quad[iqn].w *
scalar_product(f(quad[iqn].vector()), basis_quad[i][iqn]);
2738 return cholesky_mass.solve(b);
2751 template <
typename BasisType>
2762 const BasisType &basis
2764 m_dim(basis.dimension()),
2777 VectorRd tF = F.edge(0)->tangent();
2779 VectorRd x0 = F.center_mass() - F.diam()*(tF+nF)/3.0;
2785 VectorRd xi = x0 + F.diam()*(double(indices[i](0)) * tF + double(indices[i](1)) * nF)/std::max(1.,
double(basis.max_degree()));
2786 m_nodes.emplace_back(xi.x(), xi.y(), xi.z(), 1.);
2798 const BasisType &basis
2800 m_dim(basis.dimension()),
2815 VectorRd xT = T.center_mass() - T.diam()*(e0+e1+e2)/3.0;
2821 VectorRd xi = xT + T.diam()*(double(indices[i](0)) * e0 + double(indices[i](1)) * e1 + double(indices[i](2)) * e2)/std::max(1.,
double(basis.max_degree()));
2822 m_nodes.emplace_back(xi.x(), xi.y(), xi.z(), 1.);
2839 boost::multi_array<typename BasisType::FunctionValue, 2> &values
2847 Eigen::MatrixXd
L = Gram_onbasis.ldlt().solve(Gram_P_onbasis.transpose());
Basis for the space of curls of polynomials.
Definition: basis.hpp:1290
Basis (or rather family) of divergence of an existing basis.
Definition: basis.hpp:1353
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 complement G^{c,k}(F) in P^k(F)^2 of the range of the gradient on a face.
Definition: basis.hpp:1654
Basis for the space of gradients of polynomials.
Definition: basis.hpp:1228
Matrix family obtained from a scalar family.
Definition: basis.hpp:776
Scalar monomial basis on a cell.
Definition: basis.hpp:154
Scalar monomial basis on an edge.
Definition: basis.hpp:319
Scalar monomial basis on a face.
Definition: basis.hpp:225
Generate a basis restricted to the first "dimension" functions.
Definition: basis.hpp:1119
Basis for the complement R^{c,k}(T) in P^k(T)^3 of the range of curl.
Definition: basis.hpp:1432
Basis for the complement R^{c,k}(F) in P^k(F)^2 of the range of the vectorial rotational on a face.
Definition: basis.hpp:1580
Generate a basis where the function indices are shifted.
Definition: basis.hpp:1012
Vector family for polynomial functions that are tangent to a certain place (determined by the generat...
Definition: basis.hpp:920
Vector family obtained by tensorization of a scalar family.
Definition: basis.hpp:609
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:2265
Eigen::Matrix< double, dimspace, dimspace *dimspace > HessianValue
Definition: basis.hpp:1438
TensorizedVectorFamily< ScalarBasisType, N >::FunctionValue ReturnValue
Definition: basis.hpp:1952
void GradientValue
Definition: basis.hpp:1231
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition: basis.hpp:1201
double DivergenceValue
Definition: basis.hpp:1659
double DivergenceValue
Definition: basis.hpp:1508
VectorRd FunctionValue
Definition: basis.hpp:1434
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:2403
const std::shared_ptr< RolyComplBasisFace > & rck() const
Return the Rck basis.
Definition: basis.hpp:1697
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:357
static const bool hasCurlCurl
Definition: basis.hpp:1307
MatrixRd AncestorBasisFunctionValue
Definition: basis.hpp:2086
VectorRd CurlValue
Definition: basis.hpp:1507
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:881
Eigen::Matrix< double, dimspace, dimspace *dimspace > HessianValue
Definition: basis.hpp:1586
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:519
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_hessian_quad)
Definition: basis.hpp:1911
static const bool hasGradient
Definition: basis.hpp:1241
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:930
static const bool hasHessian
Definition: basis.hpp:1519
size_t dimension() const
Return the dimension of the family.
Definition: basis.hpp:956
Eigen::Matrix< double, 2, dimspace > JacobianType
Definition: basis.hpp:1664
size_t dimension() const
Return the dimension of the basis.
Definition: basis.hpp:1045
static const bool hasCurl
Definition: basis.hpp:1446
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1442
double DivergenceValue
Definition: basis.hpp:159
const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition: basis.hpp:863
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:2023
VectorRd FunctionValue
Definition: basis.hpp:1582
constexpr const BasisType & ancestor() const
Return the ancestor.
Definition: basis.hpp:564
MatrixRd HessianValue
Definition: basis.hpp:160
VectorRd FunctionValue
Definition: basis.hpp:922
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:2133
static const bool hasHessian
Definition: basis.hpp:1028
TensorizedVectorFamily< ScalarBasisType, N >::GradientValue ReturnValue
Definition: basis.hpp:1984
static const bool hasDivergence
Definition: basis.hpp:1671
static const bool hasHessian
Definition: basis.hpp:1598
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1022
void CurlValue
Definition: basis.hpp:780
VectorRd CurlValue
Definition: basis.hpp:229
Eigen::Matrix< double, dimspace, dimspace *dimspace > HessianValue
Definition: basis.hpp:1660
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:2165
BasisType::FunctionValue FunctionValue
Definition: basis.hpp:1121
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the two-dimensional curl of the i-th basis function at point x.
Definition: basis.cpp:91
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:2189
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1835
Face GeometricSupport
Definition: basis.hpp:928
static const bool hasHessian
Definition: basis.hpp:1448
static const bool hasGradient
Definition: basis.hpp:332
static const bool hasCurlCurl
Definition: basis.hpp:1136
size_t dimPkmo() const
Returns the dimension of P^{k-1}(R^3)
Definition: basis.hpp:1553
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:2099
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:2240
BasisType::DivergenceValue ReturnValue
Definition: basis.hpp:1879
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition: basis.hpp:1077
size_t dimension() const
Return the dimension of the family.
Definition: basis.hpp:640
constexpr static const bool hasAncestor
Definition: basis.hpp:1239
boost::multi_array< T, 2 > BasisQuad
type for bases evaluated on quadrature nodes
Definition: basis.hpp:60
static const bool hasDivergence
Definition: basis.hpp:334
constexpr int dimspace
Dimension, and generic types for vector in correct dimension (makes it easier to translate a code bet...
Definition: basis.hpp:50
static std::vector< Eigen::Vector2i > homogeneous(const size_t L)
Definition: basis.hpp:118
static const bool hasGradient
Definition: basis.hpp:933
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition: basis.cpp:81
BasisType AncestorType
Definition: basis.hpp:1138
static std::function< Eigen::MatrixXd(const Eigen::MatrixXd &)> symmetrise_matrix
Function to symmetrise a matrix (useful together with transform_values_quad)
Definition: basis.hpp:1766
static const bool hasHessian
Definition: basis.hpp:1306
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:854
const VectorRd & normal() const
Return the normal to the face used in the computation of the curl.
Definition: basis.hpp:277
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:1470
VectorRd CurlValue
Definition: basis.hpp:613
void GradientValue
Definition: basis.hpp:1356
Eigen::Matrix< double, dimspace, dimspace *dimspace > HessianValue
Definition: basis.hpp:1509
BasisType::FunctionValue FunctionValue
Definition: basis.hpp:390
CurlValue 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:734
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th basis function at point x.
Definition: basis.hpp:686
static const bool hasDivergence
Definition: basis.hpp:1368
TensorizedVectorFamily(const ScalarFamilyType &scalar_family)
Definition: basis.hpp:632
static const bool hasFunction
Definition: basis.hpp:331
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition: basis.hpp:747
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:875
constexpr static const bool hasAncestor
Definition: basis.hpp:1301
static const bool hasDivergence
Definition: basis.hpp:169
double DivergenceValue
Definition: basis.hpp:230
Eigen::Matrix< double, dimspace, dimspace > CurlValue
Definition: basis.hpp:1436
ScalarFamilyType AncestorType
Definition: basis.hpp:939
BasisType::GeometricSupport GeometricSupport
Definition: basis.hpp:1298
static const bool hasFunction
Definition: basis.hpp:1594
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition: basis.hpp:1335
double DivergenceValue
Definition: basis.hpp:614
static const bool hasCurlCurl
Definition: basis.hpp:171
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
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:329
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1592
static const bool hasCurl
Definition: basis.hpp:333
static const bool hasDivergence
Definition: basis.hpp:1243
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1529
BasisType::DivergenceValue FunctionValue
Definition: basis.hpp:1355
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1129
static const bool hasGradient
Definition: basis.hpp:401
size_t dimension() const
Dimension of the basis.
Definition: basis.hpp:253
static const bool hasGradient
Definition: basis.hpp:1303
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition: basis.hpp:1398
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1363
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition: basis.hpp:666
static const bool hasHessian
Definition: basis.hpp:1135
static const bool hasCurlCurl
Definition: basis.hpp:628
VectorRd GradientValue
Definition: basis.hpp:228
static const bool hasCurl
Definition: basis.hpp:1596
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:1063
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:1739
constexpr static const bool hasAncestor
Definition: basis.hpp:330
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition: basis.hpp:829
DecomposePoly(const Face &F, const BasisType &basis)
Constructor for face.
Definition: basis.hpp:2760
double scalar_product(const double &x, const double &y)
Scalar product between two reals.
Definition: basis.cpp:308
DivergenceBasis< TangentFamily< ScalarFamilyType > > ScalarRotFamily(const TangentFamily< ScalarFamilyType > &tangent_family, const Face &F)
The following function creates the "scalar rot" basis of a TangentFamily on a face.
Definition: basis.hpp:1412
VectorRd GradientValue
Definition: basis.hpp:923
static const bool hasFunction
Definition: basis.hpp:1444
static const bool hasCurl
Definition: basis.hpp:168
CurlValue curlcurl(size_t i, const VectorRd &x) const
Evaluate the curl curl of the i-th basis function at point x.
Definition: basis.hpp:974
Face GeometricSupport
Definition: basis.hpp:233
RolyComplBasisFace(const Face &F, size_t degree)
Constructor.
Definition: basis.cpp:251
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1666
Eigen::Matrix< double, N, 1 > DivergenceValue
Definition: basis.hpp:781
VectorRd CurlValue
Definition: basis.hpp:158
std::function< T(const VectorRd &, const Cell *)> CellFType
type for function of point. T is the return type of the function
Definition: basis.hpp:57
static const bool hasHessian
Definition: basis.hpp:627
Eigen::MatrixXd gram_schmidt(boost::multi_array< T, 2 > &basis_eval, const std::function< double(size_t, size_t)> &inner_product)
Definition: basis.hpp:2303
BasisType::HessianValue ReturnValue
Definition: basis.hpp:1903
static const bool hasFunction
Definition: basis.hpp:1515
Eigen::Matrix< double, dimspace, dimspace > CurlValue
Definition: basis.hpp:1294
VectorRd CurlValue
Definition: basis.hpp:323
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition: basis.hpp:1293
BasisType::CurlValue CurlValue
Definition: basis.hpp:1123
Eigen::Matrix< double, N, 1 > FunctionValue
Definition: basis.hpp:611
static const bool hasDivergence
Definition: basis.hpp:1305
static std::vector< VectorZd > complete(const size_t degree)
Definition: basis.hpp:99
std::function< T(const VectorRd &)> FType
type for function of point. T is the return type of the function
Definition: basis.hpp:54
MonomialScalarBasisEdge(const Edge &E, size_t degree)
Constructor.
Definition: basis.cpp:113
BasisType::HessianValue HessianValue
Definition: basis.hpp:1018
VectorRd AncestorBasisFunctionValue
Definition: basis.hpp:1988
double DivergenceValue
Definition: basis.hpp:1295
BasisType::HessianValue HessianValue
Definition: basis.hpp:394
double AncestorBasisFunctionValue
Definition: basis.hpp:1956
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:696
VectorZd powers(size_t i) const
Returns the powers of the i-th basis function (not including the vector part)
Definition: basis.hpp:1547
const JacobianType coordinates_system() const
Return the system of coordinates (basis in rows) on the face.
Definition: basis.hpp:289
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:2089
void DivergenceValue
Definition: basis.hpp:1358
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:753
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:2717
MatrixFamily(const ScalarFamilyType &scalar_family)
Definition: basis.hpp:797
static const bool hasGradient
Definition: basis.hpp:1132
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition: basis.hpp:1093
double DivergenceValue
Definition: basis.hpp:1585
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family used for the tangent)
Definition: basis.hpp:982
BasisType::GeometricSupport GeometricSupport
Definition: basis.hpp:1020
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th basis function at point x.
Definition: basis.hpp:1193
Eigen::VectorXd integrate(const FType< T > &f, const BasisQuad< T > &B, const QuadratureRule &qr, size_t n_rows=0)
Computes the vector of integrals (f, phi_i)
Definition: basis.hpp:2591
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:619
static const bool hasCurl
Definition: basis.hpp:402
static const bool hasGradient
Definition: basis.hpp:1366
size_t dimension() const
Dimension of the basis.
Definition: basis.hpp:1682
boost::multi_array< typename BasisType::FunctionValue, 2 > m_on_basis_nodes
Definition: basis.hpp:2856
double DivergenceValue
Definition: basis.hpp:1437
constexpr static const bool hasAncestor
Definition: basis.hpp:238
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1905
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:2123
VectorRd GradientValue
Definition: basis.hpp:322
static const bool hasGradient
Definition: basis.hpp:1445
VectorZd powers(size_t i) const
Returns the powers of the i-th basis function (not including the vector part)
Definition: basis.hpp:1476
static const bool hasCurlCurl
Definition: basis.hpp:405
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the Hessian of the i-th basis function at point x.
Definition: basis.cpp:96
double FunctionValue
Definition: basis.hpp:227
BasisType::GeometricSupport GeometricSupport
Definition: basis.hpp:1361
static const bool hasCurlCurl
Definition: basis.hpp:937
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition: basis.hpp:1583
ScalarFamilyType AncestorType
Definition: basis.hpp:630
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:237
Eigen::Matrix< double, dimspace, dimspace > CurlValue
Definition: basis.hpp:1584
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:676
BasisType::HessianValue HessianValue
Definition: basis.hpp:1125
static const bool hasHessian
Definition: basis.hpp:1672
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition: basis.hpp:968
static const bool hasFunction
Definition: basis.hpp:788
BasisFunctionE
Definition: basis.hpp:1713
constexpr static const bool hasAncestor
Definition: basis.hpp:1364
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition: basis.hpp:706
constexpr static const bool hasAncestor
Definition: basis.hpp:1667
static const bool hasFunction
Definition: basis.hpp:1365
BasisType AncestorType
Definition: basis.hpp:1309
static const bool hasGradient
Definition: basis.hpp:1025
static ReturnValue evaluate(const MatrixFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:2155
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1991
VectorRd FunctionValue
Definition: basis.hpp:1292
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th function at point x.
Definition: basis.hpp:454
double FunctionValue
Definition: basis.hpp:156
BasisType::GradientValue GradientValue
Definition: basis.hpp:1122
VectorRd FunctionValue
Definition: basis.hpp:1505
static const bool hasFunction
Definition: basis.hpp:239
BasisType m_basis
Definition: basis.hpp:2854
boost::multi_array< VectorRd, 2 > vector_product(const boost::multi_array< VectorRd, 2 > &basis_quad, const VectorRd &v)
Compute the vector (cross) product between the evaluation of a basis and a constant vector.
Definition: basis.cpp:324
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1858
static const bool hasDivergence
Definition: basis.hpp:1447
static const bool hasCurlCurl
Definition: basis.hpp:1245
DivergenceBasis(const BasisType &basis)
Constructor.
Definition: basis.hpp:1375
TensorRankE
Definition: basis.hpp:63
static const bool hasCurlCurl
Definition: basis.hpp:1599
VectorRd CurlValue
Definition: basis.hpp:924
static const bool hasFunction
Definition: basis.hpp:1668
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1300
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition: basis.hpp:845
static const bool hasCurl
Definition: basis.hpp:1517
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition: basis.hpp:1273
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th function at point x.
Definition: basis.hpp:506
Eigen::Matrix< double, N, dimspace > GradientValue
Definition: basis.hpp:612
CurlValue 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:722
MonomialScalarBasisCell(const Cell &T, size_t degree)
Constructor.
Definition: basis.cpp:12
void CurlValue
Definition: basis.hpp:1357
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:2001
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:493
double DivergenceValue
Definition: basis.hpp:324
BasisType::DivergenceValue DivergenceValue
Definition: basis.hpp:393
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1929
Eigen::Matrix2d HessianValue
Definition: basis.hpp:926
VectorRd AncestorBasisFunctionValue
Definition: basis.hpp:2020
BasisType::CurlValue ReturnValue
Definition: basis.hpp:1856
Family< BasisType > m_on_basis
Definition: basis.hpp:2855
const VectorRd & normal() const
Return the normal to the face used in the computation of the curl.
Definition: basis.hpp:1691
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:1724
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1458
constexpr static const bool hasAncestor
Definition: basis.hpp:1514
BasisType::GeometricSupport GeometricSupport
Definition: basis.hpp:1127
QuadratureRule get_nodes() const
Return the set of nodes (useful to compute value of polynomial to decompose via evaluate_quad)
Definition: basis.hpp:2832
RolyComplBasisCell(const Cell &T, size_t degree)
Constructor.
Definition: basis.cpp:137
static const bool hasCurlCurl
Definition: basis.hpp:1449
constexpr const BasisType & ancestor() const
Return the underlying complete basis.
Definition: basis.hpp:1160
static const bool hasCurl
Definition: basis.hpp:241
constexpr static const bool hasAncestor
Definition: basis.hpp:931
BasisType::CurlValue ReturnValue
Definition: basis.hpp:1927
void CurlValue
Definition: basis.hpp:1232
constexpr static const bool hasAncestor
Definition: basis.hpp:1130
static const bool hasFunction
Definition: basis.hpp:621
Eigen::Matrix< double, 2, dimspace > JacobianType
Definition: basis.hpp:1590
Eigen::Vector2i powers(size_t i) const
Returns the powers of the i-th basis function.
Definition: basis.hpp:1632
BasisType::GeometricSupport GeometricSupport
Definition: basis.hpp:396
size_t dimension() const
Dimension of the basis.
Definition: basis.hpp:345
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th basis function at point x.
Definition: basis.cpp:229
double FunctionValue
Definition: basis.hpp:321
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_value_quad)
Definition: basis.hpp:1817
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_divergence_quad)
Definition: basis.hpp:1887
Family(const BasisType &basis, const Eigen::MatrixXd &matrix)
Constructor.
Definition: basis.hpp:410
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1513
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:2213
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition: basis.cpp:278
static const bool hasGradient
Definition: basis.hpp:1595
void DivergenceValue
Definition: basis.hpp:1233
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:1969
static const bool hasFunction
Definition: basis.hpp:1302
BasisType::GradientValue GradientValue
Definition: basis.hpp:391
void HessianValue
Definition: basis.hpp:1359
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:2056
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
void HessianValue
Definition: basis.hpp:615
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:180
constexpr static const bool hasAncestor
Definition: basis.hpp:787
const JacobianType & jacobian() const
Return the Jacobian of the coordinate system transformation.
Definition: basis.hpp:283
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_gradient_quad)
Definition: basis.hpp:1841
const size_t matrixSize() const
Return the dimension of the matrices in the family.
Definition: basis.hpp:869
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:2838
static const bool hasGradient
Definition: basis.hpp:167
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the hessian of the i-th basis function at point x.
Definition: basis.cpp:40
static const bool hasCurl
Definition: basis.hpp:791
static const bool hasDivergence
Definition: basis.hpp:1518
BasisType AncestorType
Definition: basis.hpp:1247
ScalarFamilyType::GeometricSupport GeometricSupport
Definition: basis.hpp:784
const JacobianType & jacobian() const
Return the Jacobian of the coordinate system transformation.
Definition: basis.hpp:1620
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:714
static const bool hasFunction
Definition: basis.hpp:400
size_t m_dim
Definition: basis.hpp:2849
static const bool hasCurl
Definition: basis.hpp:1242
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:164
BasisType::DivergenceValue DivergenceValue
Definition: basis.hpp:1124
static const bool hasGradient
Definition: basis.hpp:789
Eigen::Matrix< double, 2, dimspace > generators() const
Returns the generators of the basis functions.
Definition: basis.hpp:994
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition: basis.hpp:1435
constexpr static const bool hasAncestor
Definition: basis.hpp:399
static const bool hasCurl
Definition: basis.hpp:1304
Eigen::Matrix3d MatrixRd
Definition: basis.hpp:51
static std::vector< Eigen::Vector2i > complete(size_t degree)
Definition: basis.hpp:130
BasisType::GradientValue FunctionValue
Definition: basis.hpp:1230
static const bool hasHessian
Definition: basis.hpp:170
static const bool hasDivergence
Definition: basis.hpp:1027
static const bool hasDivergence
Definition: basis.hpp:242
static const bool hasGradient
Definition: basis.hpp:1669
Eigen::Vector2i 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:295
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1261
static const bool hasHessian
Definition: basis.hpp:936
constexpr static const bool hasAncestor
Definition: basis.hpp:165
constexpr const BasisType & ancestor() const
Return the underlying complete basis.
Definition: basis.hpp:1057
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:271
static const bool hasCurl
Definition: basis.hpp:1133
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th basis function at point x.
Definition: basis.hpp:646
static const bool hasFunction
Definition: basis.hpp:1024
size_t m_nb_nodes
Definition: basis.hpp:2857
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:1541
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:1775
void GradientValue
Definition: basis.hpp:779
static const bool hasCurl
Definition: basis.hpp:626
Edge GeometricSupport
Definition: basis.hpp:327
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_curlcurl_quad)
Definition: basis.hpp:1935
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition: basis.hpp:1506
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:570
TensorizedVectorFamily< ScalarBasisType, N >::DivergenceValue ReturnValue
Definition: basis.hpp:2049
VectorRd GradientValue
Definition: basis.hpp:157
static const bool hasFunction
Definition: basis.hpp:1131
static const bool hasFunction
Definition: basis.hpp:1240
ScalarFamilyType::GeometricSupport GeometricSupport
Definition: basis.hpp:617
size_t dimension() const
Dimension of the basis.
Definition: basis.hpp:1608
static const bool hasDivergence
Definition: basis.hpp:403
RestrictedBasis(const BasisType &basis, const size_t &dimension)
Constructor.
Definition: basis.hpp:1141
TensorizedVectorFamily< ScalarBasisType, N >::CurlValue ReturnValue
Definition: basis.hpp:2082
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the hessian of the i-th function at point x.
Definition: basis.hpp:532
static const bool hasFunction
Definition: basis.hpp:166
size_t shift() const
Return the shift.
Definition: basis.hpp:1051
Eigen::Matrix< double, dimspace, dimspace *dimspace > HessianValue
Definition: basis.hpp:1296
BasisType::DivergenceValue DivergenceValue
Definition: basis.hpp:1017
static const bool hasDivergence
Definition: basis.hpp:935
static const bool hasCurl
Definition: basis.hpp:1670
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:477
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the hessian of the i-th basis function at point x.
Definition: basis.hpp:1101
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:1238
BasisType::GradientValue GradientValue
Definition: basis.hpp:1015
static const bool hasGradient
Definition: basis.hpp:240
static const bool hasCurl
Definition: basis.hpp:934
DecomposePoly(const Cell &T, const BasisType &basis)
Constructor for cell.
Definition: basis.hpp:2796
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:398
static const bool hasDivergence
Definition: basis.hpp:1597
static const bool hasFunction
Definition: basis.hpp:932
static ReturnValue evaluate(const BasisType &basis, size_t i, size_t iqn, const boost::multi_array< ReturnValue, 2 > &ancestor_curl_quad)
Definition: basis.hpp:1864
Eigen::Matrix< double, dimspace, dimspace > GradientValue
Definition: basis.hpp:1657
static const bool hasHessian
Definition: basis.hpp:404
static std::vector< VectorZd > homogeneous(const size_t L)
Definition: basis.hpp:84
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:988
static const bool hasHessian
Definition: basis.hpp:335
BasisType AncestorType
Definition: basis.hpp:407
MonomialScalarBasisFace(const Face &F, size_t degree)
Constructor.
Definition: basis.cpp:60
static const bool hasHessian
Definition: basis.hpp:792
static const bool hasGradient
Definition: basis.hpp:622
static const bool hasCurlCurl
Definition: basis.hpp:336
Face GeometricSupport
Definition: basis.hpp:1588
static const bool hasCurlCurl
Definition: basis.hpp:244
BasisType::FunctionValue ReturnValue
Definition: basis.hpp:1809
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:2033
constexpr static const bool hasAncestor
Definition: basis.hpp:620
BasisType::GeometricSupport GeometricSupport
Definition: basis.hpp:1236
constexpr static const TensorRankE tensorRank
Definition: basis.hpp:786
static const bool hasGradient
Definition: basis.hpp:1516
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th basis function at point x.
Definition: basis.hpp:1085
static ReturnValue evaluate(const TensorizedVectorFamily< ScalarBasisType, N > &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1959
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1386
TangentFamily(const ScalarFamilyType &scalar_family, const Eigen::Matrix< double, 2, dimspace > &generators)
Constructor.
Definition: basis.hpp:942
BasisType::FunctionValue FunctionValue
Definition: basis.hpp:1014
VectorRd AncestorBasisFunctionValue
Definition: basis.hpp:2152
static const bool hasDivergence
Definition: basis.hpp:790
BasisType AncestorType
Definition: basis.hpp:1372
static const bool hasCurlCurl
Definition: basis.hpp:1029
void HessianValue
Definition: basis.hpp:782
VectorRd AncestorBasisFunctionValue
Definition: basis.hpp:2053
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition: basis.cpp:127
BasisType AncestorType
Definition: basis.hpp:1031
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:467
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition: basis.hpp:1185
HessianValue hessian(size_t i, const VectorRd &x) const
Evaluate the hessian of the i-th basis function at point x.
Definition: basis.hpp:1209
static const bool hasCurlCurl
Definition: basis.hpp:1673
MatrixFamily< ScalarBasisType, N >::FunctionValue ReturnValue
Definition: basis.hpp:2116
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:545
Eigen::Matrix< double, dimspace, dimspace > CurlValue
Definition: basis.hpp:1658
ScalarFamilyType AncestorType
Definition: basis.hpp:795
TensorizedVectorFamily< ScalarBasisType, N >::CurlValue ReturnValue
Definition: basis.hpp:2016
static const bool hasCurl
Definition: basis.hpp:1026
Eigen::Matrix< double, N, N > FunctionValue
Definition: basis.hpp:778
GolyComplBasisCell(const Cell &T, size_t degree)
Constructor.
Definition: basis.cpp:170
DivergenceValue divergence(size_t i, const VectorRd &x) const
Evaluate the divergence of the i-th basis function at point x.
Definition: basis.cpp:158
ShiftedBasis(const BasisType &basis, const int shift)
Constructor.
Definition: basis.hpp:1034
static const bool hasCurl
Definition: basis.hpp:1367
static const bool hasCurlCurl
Definition: basis.hpp:793
BasisType::CurlValue CurlValue
Definition: basis.hpp:392
BasisType::GradientValue ReturnValue
Definition: basis.hpp:1833
BasisType::CurlValue CurlValue
Definition: basis.hpp:1016
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:1770
double AncestorBasisFunctionValue
Definition: basis.hpp:2120
CurlBasis(const BasisType &basis)
Constructor.
Definition: basis.hpp:1312
static const bool hasHessian
Definition: basis.hpp:1369
const Eigen::MatrixXd & matrix() const
Return the coefficient matrix.
Definition: basis.hpp:558
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:1626
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:2066
Cell GeometricSupport
Definition: basis.hpp:162
size_t dimension() const
Return the dimension of the basis.
Definition: basis.hpp:1154
GradientBasis(const BasisType &basis)
Constructor.
Definition: basis.hpp:1250
constexpr static const bool hasAncestor
Definition: basis.hpp:1593
void HessianValue
Definition: basis.hpp:1234
constexpr static const bool hasAncestor
Definition: basis.hpp:1023
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1323
static const bool hasHessian
Definition: basis.hpp:243
CurlValue curl(size_t i, const VectorRd &x) const
Evaluate the curl of the i-th function at point x.
Definition: basis.hpp:480
static const bool hasDivergence
Definition: basis.hpp:1134
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:339
Face GeometricSupport
Definition: basis.hpp:1662
Cell GeometricSupport
Definition: basis.hpp:1440
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1811
static const bool hasDivergence
Definition: basis.hpp:625
QuadratureRule m_nodes
Nodes for the interpolation.
Definition: basis.hpp:2858
MatrixRd HessianValue
Definition: basis.hpp:231
static const bool hasCurlCurl
Definition: basis.hpp:1370
double DivergenceValue
Definition: basis.hpp:925
GolyComplBasisFace(const Face &F, size_t degree)
Constructor.
Definition: basis.cpp:290
double HessianValue
Definition: basis.hpp:325
static const bool hasHessian
Definition: basis.hpp:1244
size_t dimension() const
Return the dimension of the family.
Definition: basis.hpp:823
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:887
VectorRd FunctionValue
Definition: basis.hpp:1656
Cell GeometricSupport
Definition: basis.hpp:1511
static ReturnValue evaluate(const BasisType &basis, size_t i, const VectorRd &x)
Definition: basis.hpp:1881
static const bool hasCurlCurl
Definition: basis.hpp:1520
Eigen::Matrix< double, 2, dimspace > JacobianType
Definition: basis.hpp:235
constexpr static const bool hasAncestor
Definition: basis.hpp:1443
GradientValue gradient(size_t i, const VectorRd &x) const
Evaluate the gradient of the i-th basis function at point x.
Definition: basis.cpp:29
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:1166
MatrixFamily< ScalarBasisType, N >::DivergenceValue ReturnValue
Definition: basis.hpp:2148
@ CurlCurl
Definition: basis.hpp:1719
@ Function
Definition: basis.hpp:1714
@ Hessian
Definition: basis.hpp:1718
@ Gradient
Definition: basis.hpp:1715
@ Divergence
Definition: basis.hpp:1717
@ Curl
Definition: basis.hpp:1716
@ Matrix
Definition: basis.hpp:66
@ Vector
Definition: basis.hpp:65
@ Scalar
Definition: basis.hpp:64
size_t L
Definition: HHO_DiffAdvecReac.hpp:46
std::vector< QuadratureNode > QuadratureRule
Definition: quadraturerule.hpp:61
Definition: ddr-magnetostatics.hpp:40
MeshND::VectorZd< 2 > VectorZd
Definition: Mesh2D.hpp:15
MeshND::VectorRd< 2 > VectorRd
Definition: Mesh2D.hpp:14
MeshND::Edge< 2 > Edge
Definition: Mesh2D.hpp:11
MeshND::Face< 2 > Face
Definition: Mesh2D.hpp:12
MeshND::Cell< 2 > Cell
Definition: Mesh2D.hpp:13
Structure to decompose a set of polynomials on a basis on a face or a cell.
Definition: basis.hpp:2753
Compute vectors listing the powers of monomial basis functions (for a cell or face,...
Definition: basis.hpp:76
Basis dimensions for various polynomial spaces on edges/faces/elements (when relevant): Pk,...
Definition: polynomialspacedimension.hpp:54
Basis evaluation traits. Only specialization of 'BasisFunction' (=Function, Gradient,...
Definition: basis.hpp:1802
Evaluate a basis at quadrature nodes. 'BasisFunction' (=Function, Gradient, Curl, Divergence or Hessi...
Definition: basis.hpp:2185