12#ifndef __Monomials_Utilities_HPP
13#define __Monomials_Utilities_HPP
54 const Eigen::MatrixXd &points,
55 const Eigen::Vector3d ¢roid,
56 const double &diam)
const
58 Eigen::MatrixXd vander;
59 const unsigned int numPoints = points.cols();
65 std::vector<Eigen::MatrixXd> VanderPartial(data.
PolynomialDegree + 1, Eigen::MatrixXd(dimension, numPoints));
66 double inverseDiam = 1.0 / diam;
67 VanderPartial[0].setOnes(dimension, numPoints);
68 VanderPartial[1] = (points.colwise() - centroid) * inverseDiam;
71 VanderPartial[i] = VanderPartial[i - 1].cwiseProduct(VanderPartial[1]);
74 vander.col(0).setOnes();
77 const Eigen::VectorXi expo = data.
Exponents[i];
79 vander.col(i) = (VanderPartial[expo[0]].row(0)).transpose();
81 vander.col(i) = vander.col(i).cwiseProduct(VanderPartial[expo[1]].row(1).transpose());
83 vander.col(i) = vander.col(i).cwiseProduct(VanderPartial[expo[2]].row(2).transpose());
87 vander.setOnes(numPoints, 1);
107 template <
typename MonomialType>
109 const MonomialType &monomials,
110 const Eigen::MatrixXd &
Vander,
111 const double &diam)
const
113 std::vector<Eigen::MatrixXd> vanderDerivatives;
114 vanderDerivatives.resize(dimension);
115 for (
unsigned int i = 0; i < dimension; i++)
117 vanderDerivatives[i].resizeLike(
Vander);
118 vanderDerivatives[i].col(0).setZero();
122 double inverseDiam = 1.0 / diam;
125 std::vector<int> derIndices = monomials.DerivativeIndices(data, k);
126 for (
unsigned int i = 0; i < dimension; i++)
128 if (derIndices[i] >= 0)
129 vanderDerivatives[i].col(k) =
130 inverseDiam * monomials.DerivativeMatrix(data, i)(k, derIndices[i]) *
Vander.col(derIndices[i]);
132 vanderDerivatives[i].col(k).setZero();
137 return vanderDerivatives;
154 template <
typename MonomialType>
156 const MonomialType &monomials,
157 const Eigen::MatrixXd &
Vander,
158 const double &diam)
const
160 Eigen::MatrixXd vanderLaplacian;
162 vanderLaplacian.resizeLike(
Vander);
163 vanderLaplacian.block(0, 0,
Vander.rows(), 3).setZero();
164 Eigen::MatrixXd laplacian = data.
Laplacian;
168 const double inverseDiamSqrd = 1.0 / (diam * diam);
171 std::vector<int> secondDerIndices = monomials.SecondDerivativeIndices(data, k);
172 if (secondDerIndices[0] >= 0)
173 vanderLaplacian.col(k) =
174 inverseDiamSqrd * laplacian(k, secondDerIndices[0]) *
Vander.col(secondDerIndices[0]);
176 vanderLaplacian.col(k).setZero();
177 for (
unsigned int i = 1; i < dimension; i++)
179 if (secondDerIndices[i] >= 0)
180 vanderLaplacian.col(k) +=
181 inverseDiamSqrd * laplacian(k, secondDerIndices[i]) *
Vander.col(secondDerIndices[i]);
186 return vanderLaplacian;
203 const Eigen::MatrixXd &
Vander,
204 Eigen::MatrixXd &Hmatrix,
205 Eigen::MatrixXd &QmatrixInv,
206 Eigen::MatrixXd &Qmatrix)
const
217 Hmatrix = Q2.transpose() * Q2;
219 QmatrixInv = (R2 * R1).transpose();
void inverseTri(const Eigen::MatrixXd A, Eigen::MatrixXd &InvA, const char &UPLO, const char &DIAG)
Compute inverse of triangular matrix.
Definition LAPACK_utilities.cpp:198
void MGS(const Eigen::MatrixXd &X, Eigen::MatrixXd &Q, Eigen::MatrixXd &R)
Compute the modified Gram-Schmidt factorization of matrix X.
Definition LAPACK_utilities.cpp:92
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition Monomials_Data.hpp:23
Eigen::MatrixXd Laplacian
Matrix used to compute the laplacian of monomials.
Definition Monomials_Data.hpp:29
std::vector< Eigen::VectorXi > Exponents
Table of exponents of each monomial.
Definition Monomials_Data.hpp:27
unsigned int PolynomialDegree
Monomial space order.
Definition Monomials_Data.hpp:24
unsigned int NumMonomials
Number of monomials in the basis.
Definition Monomials_Data.hpp:26
Definition Monomials_Utilities.hpp:23
Eigen::MatrixXd VanderLaplacian(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const Eigen::MatrixXd &Vander, const double &diam) const
Evaluate the Vandermonde matrix of the monomial Laplacian.
Definition Monomials_Utilities.hpp:155
void MGSOrthonormalize(const Eigen::VectorXd &weights, const Eigen::MatrixXd &Vander, Eigen::MatrixXd &Hmatrix, Eigen::MatrixXd &QmatrixInv, Eigen::MatrixXd &Qmatrix) const
-orthonormalize the monomial basis via modified Gram–Schmidt.
Definition Monomials_Utilities.hpp:202
Eigen::MatrixXi Exponents(const Polydim::Utilities::Monomials_Data &data) const
Collect the monomial exponents into a single matrix.
Definition Monomials_Utilities.hpp:29
Eigen::MatrixXd Vander(const Polydim::Utilities::Monomials_Data &data, const Eigen::MatrixXd &points, const Eigen::Vector3d ¢roid, const double &diam) const
Evaluate the Vandermonde matrix of the scaled monomial basis.
Definition Monomials_Utilities.hpp:53
std::vector< Eigen::MatrixXd > VanderDerivatives(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const Eigen::MatrixXd &Vander, const double &diam) const
Evaluate the Vandermonde matrices of the first-order partial derivatives.
Definition Monomials_Utilities.hpp:108