12#ifndef __VEM_PCC_Utilities_HPP
13#define __VEM_PCC_Utilities_HPP
16#include "Gedim_Macro.hpp"
41 Eigen::VectorXd interpolation_points_x(order + 1);
42 interpolation_points_x << 0.0, 1.0, edgeInternalPoints;
47 const unsigned int &order,
48 const unsigned int &Nkm1,
49 const unsigned int &Nk,
50 const unsigned int &NumInternalBasisFunctions,
51 const unsigned int &NumBasisFunctions,
52 const Eigen::MatrixXd &Hmatrix,
54 Eigen::MatrixXd &Cmatrix,
56 Eigen::MatrixXd &
Pi0k)
const
58 Cmatrix = Eigen::MatrixXd::Zero(Nk, NumBasisFunctions);
60 Cmatrix.bottomRows(Nk - NumInternalBasisFunctions) = Hmatrix.bottomRows(Nk - NumInternalBasisFunctions) *
PiNabla;
64 Cmatrix.topLeftCorner(NumInternalBasisFunctions, NumBasisFunctions - NumInternalBasisFunctions).setZero();
66 Cmatrix.topRightCorner(NumInternalBasisFunctions, NumInternalBasisFunctions) =
67 measure * Eigen::MatrixXd::Identity(NumInternalBasisFunctions, NumInternalBasisFunctions);
70 Pi0km1 = Hmatrix.topLeftCorner(Nkm1, Nkm1).llt().solve(Cmatrix.topRows(Nkm1));
71 Pi0k = Hmatrix.llt().solve(Cmatrix);
75 const Eigen::MatrixXd &vertices,
76 const Eigen::MatrixXi &edges,
77 const std::vector<bool> &edgesDirection,
78 const Eigen::MatrixXd &edgesTangent,
79 const unsigned int &edge_local_index)
const
82 const unsigned int num_edge_dofs = referenceEdgeDOFsPoint.cols();
84 if (num_edge_dofs == 0)
85 return Eigen::MatrixXd(0, 0);
87 const Eigen::Vector3d edge_origin = edgesDirection.at(edge_local_index) ? vertices.col(edges(0, edge_local_index))
88 : vertices.col(edges(1, edge_local_index));
90 const Eigen::Vector3d edge_tangent = edgesTangent.col(edge_local_index);
91 const double edge_direction = edgesDirection[edge_local_index] ? 1.0 : -1.0;
93 Eigen::MatrixXd edge_dofs_coordinates = Eigen::MatrixXd::Zero(3, num_edge_dofs);
94 for (
unsigned int r = 0; r < num_edge_dofs; r++)
96 edge_dofs_coordinates.col(r) << edge_origin + edge_direction * referenceEdgeDOFsPoint(0, r) * edge_tangent;
98 return edge_dofs_coordinates;
103 const unsigned int &Nkm1,
104 const Eigen::MatrixXd &vanderInternal,
105 const std::vector<Eigen::MatrixXd> &vanderInternalDerivatives,
106 const Eigen::MatrixXd &piNabla,
107 const std::vector<Eigen::MatrixXd> &pi0km1Der)
const
109 switch (projectionType)
112 std::vector<Eigen::MatrixXd> basisFunctionsDerivativeValues(dimension);
114 for (
unsigned short i = 0; i < dimension; ++i)
115 basisFunctionsDerivativeValues[i] = vanderInternalDerivatives[i] * piNabla;
117 return basisFunctionsDerivativeValues;
120 std::vector<Eigen::MatrixXd> basisFunctionsDerivativeValues(dimension);
122 for (
unsigned short i = 0; i < dimension; ++i)
123 basisFunctionsDerivativeValues[i] = vanderInternal.leftCols(Nkm1) * pi0km1Der[i];
125 return basisFunctionsDerivativeValues;
128 throw std::runtime_error(
"Unknown projector type");
134 const unsigned int &Nkm1,
135 const std::vector<Eigen::MatrixXd> &vanderInternalDerivatives,
136 const std::vector<Eigen::MatrixXd> &pi0km1Der)
const
138 switch (projectionType)
141 Eigen::MatrixXd basisFunctionsLaplacianValues = vanderInternalDerivatives[0].leftCols(Nkm1) * pi0km1Der[0];
142 for (
unsigned int d = 1; d < dimension; ++d)
143 basisFunctionsLaplacianValues += vanderInternalDerivatives[d].leftCols(Nkm1) * pi0km1Der[d];
145 return basisFunctionsLaplacianValues;
148 throw std::runtime_error(
"Unknown projector type");
153 const unsigned int &Nkm1,
154 const Eigen::MatrixXd &pi0km1,
155 const Eigen::MatrixXd &pi0k,
156 const Eigen::MatrixXd &vanderInternal)
const
158 switch (projectionType)
161 return vanderInternal.leftCols(Nkm1) * pi0km1;
163 return vanderInternal * pi0k;
165 throw std::runtime_error(
"Unknown projector type");
170 template <
typename MonomialType>
173 return vanderInternal;
178 return vanderInternal;
182 template <
typename MonomialType>
184 const MonomialType &monomials,
185 const Eigen::Vector3d ¢roid,
186 const double &diameter,
187 const Eigen::MatrixXd &points)
const
189 return monomials.Vander(data, points, centroid, diameter);
193 template <
typename MonomialType>
195 const MonomialType &)
const
197 return vanderInternalDerivatives;
202 return vanderInternalDerivatives;
206 template <
typename MonomialType>
208 const MonomialType &monomials,
209 const double &diameter,
210 const Eigen::MatrixXd &vander)
const
212 return monomials.VanderDerivatives(data, vander, diameter);
215 template <
typename MonomialType>
217 const MonomialType &monomials,
218 const double &diameter,
219 const Eigen::MatrixXd &vander)
const
221 return monomials.VanderLaplacian(data, vander, diameter);
225 const unsigned int &order,
226 const Eigen::VectorXd &edgeBasisCoefficients,
227 const Eigen::VectorXd &pointsCurvilinearCoordinates)
const
229 Eigen::VectorXd interpolation_points_x(order + 1);
230 interpolation_points_x << 0.0, 1.0, edgeInternalPoints.transpose();
235 const double &coefficient,
236 const Eigen::MatrixXd &Dmatrix)
const
238 Eigen::MatrixXd stabMatrix = Dmatrix * projector;
239 stabMatrix.diagonal().array() -= 1;
241 stabMatrix = coefficient * stabMatrix.transpose() * stabMatrix;
246 const Eigen::MatrixXd &coercivity_matrix,
247 const Eigen::VectorXd &vector_coefficients,
248 const Eigen::MatrixXd &Dmatrix)
const
250 Eigen::MatrixXd stabMatrix = Dmatrix * projector;
251 stabMatrix.diagonal().array() -= 1;
253 const Eigen::VectorXd diagonal_coercivity = coercivity_matrix.diagonal();
254 Eigen::MatrixXd max_matrix = Eigen::MatrixXd::Zero(coercivity_matrix.cols(), 2);
255 max_matrix << diagonal_coercivity, vector_coefficients;
257 const Eigen::VectorXd weights = max_matrix.rowwise().maxCoeff();
260 stabMatrix = stabMatrix.transpose() * weights.asDiagonal() * stabMatrix;
Eigen::VectorXd Lagrange_1D_coefficients(const Eigen::VectorXd &interpolation_points_x)
Compute the barycentric weights of the 1D Lagrange basis.
Definition lagrange_1D.cpp:21
Eigen::MatrixXd Lagrange_1D_values(const Eigen::VectorXd &interpolation_points_x, const Eigen::VectorXd &lagrange_1D_coefficients, const Eigen::VectorXd &evaluation_points_x)
Evaluate the 1D Lagrange basis functions at given points.
Definition lagrange_1D.cpp:55
ProjectionTypes
Definition VEM_PCC_Utilities.hpp:28
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition Monomials_Data.hpp:23
Definition VEM_PCC_Utilities.hpp:37
Eigen::MatrixXd ComputePolynomialsValues(const Eigen::MatrixXd &vanderInternal) const
Definition VEM_PCC_Utilities.hpp:176
std::vector< Eigen::MatrixXd > ComputePolynomialsDerivativeValues(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const double &diameter, const Eigen::MatrixXd &vander) const
Definition VEM_PCC_Utilities.hpp:207
std::vector< Eigen::MatrixXd > ComputeBasisFunctionsDerivativeValues(const unsigned int dimension, const Polydim::VEM::PCC::ProjectionTypes &projectionType, const unsigned int &Nkm1, const Eigen::MatrixXd &vanderInternal, const std::vector< Eigen::MatrixXd > &vanderInternalDerivatives, const Eigen::MatrixXd &piNabla, const std::vector< Eigen::MatrixXd > &pi0km1Der) const
Definition VEM_PCC_Utilities.hpp:101
Eigen::MatrixXd ComputeBasisFunctionsLaplacianValues(const unsigned int dimension, const Polydim::VEM::PCC::ProjectionTypes &projectionType, const unsigned int &Nkm1, const std::vector< Eigen::MatrixXd > &vanderInternalDerivatives, const std::vector< Eigen::MatrixXd > &pi0km1Der) const
Definition VEM_PCC_Utilities.hpp:132
std::vector< Eigen::MatrixXd > ComputePolynomialsDerivativeValues(const std::vector< Eigen::MatrixXd > &vanderInternalDerivatives) const
Definition VEM_PCC_Utilities.hpp:200
void ComputeL2Projectors(const double &measure, const unsigned int &order, const unsigned int &Nkm1, const unsigned int &Nk, const unsigned int &NumInternalBasisFunctions, const unsigned int &NumBasisFunctions, const Eigen::MatrixXd &Hmatrix, const Eigen::MatrixXd &PiNabla, Eigen::MatrixXd &Cmatrix, Eigen::MatrixXd &Pi0km1, Eigen::MatrixXd &Pi0k) const
Definition VEM_PCC_Utilities.hpp:46
Eigen::MatrixXd ComputeBasisFunctionsValues(const Polydim::VEM::PCC::ProjectionTypes &projectionType, const unsigned int &Nkm1, const Eigen::MatrixXd &pi0km1, const Eigen::MatrixXd &pi0k, const Eigen::MatrixXd &vanderInternal) const
Definition VEM_PCC_Utilities.hpp:152
Eigen::MatrixXd ComputeDRecipeStabilizationMatrix(const Eigen::MatrixXd &projector, const Eigen::MatrixXd &coercivity_matrix, const Eigen::VectorXd &vector_coefficients, const Eigen::MatrixXd &Dmatrix) const
Definition VEM_PCC_Utilities.hpp:245
Eigen::VectorXd ComputeEdgeBasisCoefficients(const unsigned int &order, const Eigen::VectorXd &edgeInternalPoints) const
Definition VEM_PCC_Utilities.hpp:38
Eigen::MatrixXd EdgeDOFsCoordinates(const Eigen::RowVectorXd &referenceEdgeDOFsPoint, const Eigen::MatrixXd &vertices, const Eigen::MatrixXi &edges, const std::vector< bool > &edgesDirection, const Eigen::MatrixXd &edgesTangent, const unsigned int &edge_local_index) const
Definition VEM_PCC_Utilities.hpp:74
Eigen::MatrixXd ComputeValuesOnEdge(const Eigen::RowVectorXd &edgeInternalPoints, const unsigned int &order, const Eigen::VectorXd &edgeBasisCoefficients, const Eigen::VectorXd &pointsCurvilinearCoordinates) const
Definition VEM_PCC_Utilities.hpp:224
Eigen::MatrixXd ComputePolynomialsValues(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const Eigen::Vector3d ¢roid, const double &diameter, const Eigen::MatrixXd &points) const
Definition VEM_PCC_Utilities.hpp:183
Eigen::MatrixXd ComputePolynomialsLaplacianValues(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const double &diameter, const Eigen::MatrixXd &vander) const
Definition VEM_PCC_Utilities.hpp:216
Eigen::MatrixXd ComputeDofiDofiStabilizationMatrix(const Eigen::MatrixXd &projector, const double &coefficient, const Eigen::MatrixXd &Dmatrix) const
Definition VEM_PCC_Utilities.hpp:234