PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
VEM_DF_PCC_Utilities.hpp
Go to the documentation of this file.
1// _LICENSE_HEADER_
2//
3// Copyright (C) 2019 - 2025.
4// Terms register on the GPL-3.0 license.
5//
6// This file can be redistributed and/or modified under the license terms.
7//
8// See top level LICENSE file for more details.
9//
10// This file can be used citing references in CITATION.cff file.
11
12#ifndef __VEM_DF_PCC_Utilities_HPP
13#define __VEM_DF_PCC_Utilities_HPP
14
15#include "Eigen/Eigen"
16#include "Gedim_Macro.hpp"
17#include "Monomials_Data.hpp"
18#include "lagrange_1D.hpp"
19
20namespace Polydim
21{
22namespace VEM
23{
24namespace DF_PCC
25{
26
27enum struct ProjectionTypes
28{
29 Pi0km2 = 0,
30 Pi0k = 1,
31 PiNabla = 2,
32 Pi0km1Der = 3
33};
34
36{
37 Eigen::VectorXd ComputeEdgeBasisCoefficients(const unsigned int &order, const Eigen::VectorXd &edgeInternalPoints) const
38 {
39 // Compute basis function coefficients on the generic edge.
40 Eigen::VectorXd interpolation_points_x(order + 1);
41 interpolation_points_x << 0.0, 1.0, edgeInternalPoints;
43 }
44
45 std::vector<Eigen::MatrixXd> ComputeBasisFunctionsDerivativeValues(const unsigned int dimension,
46 const Polydim::VEM::DF_PCC::ProjectionTypes &projectionType,
47 const unsigned int &Nkm1,
48 const Eigen::MatrixXd &vanderInternal,
49 const std::vector<Eigen::MatrixXd> &vanderInternalDerivatives,
50 const std::vector<Eigen::MatrixXd> &piNabla,
51 const std::vector<Eigen::MatrixXd> &pi0km1Der) const
52 {
53 switch (projectionType)
54 {
56 std::vector<Eigen::MatrixXd> basisFunctionDerivativeValues(dimension * dimension);
57
58 for (unsigned short j = 0; j < dimension; ++j)
59 for (unsigned short i = 0; i < dimension; ++i)
60 basisFunctionDerivativeValues[dimension * j + i] = vanderInternalDerivatives[i] * piNabla[j];
61
62 return basisFunctionDerivativeValues;
63 }
65 std::vector<Eigen::MatrixXd> basisFunctionDerivativeValues(dimension * dimension);
66
67 for (unsigned short j = 0; j < dimension; ++j)
68 for (unsigned short i = 0; i < dimension; ++i)
69 basisFunctionDerivativeValues[dimension * j + i] =
70 vanderInternal.leftCols(Nkm1) * pi0km1Der[dimension * j + i];
71
72 return basisFunctionDerivativeValues;
73 }
74 default:
75 throw std::runtime_error("Unknown projector type");
76 }
77 }
78
79 inline Eigen::MatrixXd ComputeBasisFunctionsDivergenceValues(const unsigned int &Nkm1,
80 const Eigen::MatrixXd &vanderInternal,
81 const Eigen::MatrixXd &vmatrix) const
82 {
83 return vanderInternal.leftCols(Nkm1) * vmatrix;
84 }
85
86 inline std::vector<Eigen::MatrixXd> ComputeBasisFunctionsValues(const unsigned int dimension,
87 const Polydim::VEM::DF_PCC::ProjectionTypes &projectionType,
88 const unsigned int &Nkm2,
89 const std::vector<Eigen::MatrixXd> &pi0km2,
90 const std::vector<Eigen::MatrixXd> &pi0k,
91 const Eigen::MatrixXd &vanderInternal) const
92 {
93 std::vector<Eigen::MatrixXd> basisFunctionValues(dimension);
94 switch (projectionType)
95 {
97 for (unsigned short i = 0; i < dimension; ++i)
98 basisFunctionValues[i] = vanderInternal.leftCols(Nkm2) * pi0km2[i];
99 break;
101 for (unsigned short i = 0; i < dimension; ++i)
102 basisFunctionValues[i] = vanderInternal * pi0k[i];
103 break;
104 default:
105 throw std::runtime_error("Unknown projector type");
106 }
107 return basisFunctionValues;
108 }
109
110#if PYBIND == 1
111 template <typename MonomialType>
112 inline Eigen::MatrixXd ComputePolynomialsValues(const Eigen::MatrixXd &vanderInternal, const MonomialType &) const
113 {
114 return vanderInternal;
115 }
116#else
117 inline Eigen::MatrixXd ComputePolynomialsValues(const Eigen::MatrixXd &vanderInternal) const
118 {
119 return vanderInternal;
120 }
121#endif
122
123 template <typename MonomialType>
125 const MonomialType &monomials,
126 const Eigen::Vector3d &centroid,
127 const double &diameter,
128 const Eigen::MatrixXd &points) const
129 {
130 return monomials.Vander(data, points, centroid, diameter);
131 }
132
133#if PYBIND == 1
134 template <typename MonomialType>
135 inline std::vector<Eigen::MatrixXd> ComputePolynomialsDerivativeValues(const std::vector<Eigen::MatrixXd> &vanderInternalDerivatives,
136 const MonomialType &) const
137 {
138 return vanderInternalDerivatives;
139 }
140#else
141 inline std::vector<Eigen::MatrixXd> ComputePolynomialsDerivativeValues(const std::vector<Eigen::MatrixXd> &vanderInternalDerivatives) const
142 {
143 return vanderInternalDerivatives;
144 }
145#endif
146
147 template <typename MonomialType>
148 inline std::vector<Eigen::MatrixXd> ComputePolynomialsDerivativeValues(const Polydim::Utilities::Monomials_Data &data,
149 const MonomialType &monomials,
150 const double &diameter,
151 const Eigen::MatrixXd &vander) const
152 {
153 return monomials.VanderDerivatives(data, vander, diameter);
154 }
155
156 template <typename MonomialType>
158 const MonomialType &monomials,
159 const double &diameter,
160 const Eigen::MatrixXd &vander) const
161 {
162 return monomials.VanderLaplacian(data, vander, diameter);
163 }
164
165 Eigen::MatrixXd ComputeValuesOnEdge(const Eigen::RowVectorXd &edgeInternalPoints,
166 const unsigned int &order,
167 const Eigen::VectorXd &edgeBasisCoefficients,
168 const Eigen::VectorXd &pointsCurvilinearCoordinates) const
169 {
170 Eigen::VectorXd interpolation_points_x(order + 1);
171 interpolation_points_x << 0.0, 1.0, edgeInternalPoints.transpose();
172 return Polydim::Interpolation::Lagrange::Lagrange_1D_values(interpolation_points_x, edgeBasisCoefficients, pointsCurvilinearCoordinates);
173 }
174
175 Eigen::MatrixXd ComputeDofiDofiStabilizationMatrix(const unsigned int dimension,
176 const std::vector<Eigen::MatrixXd> &projector,
177 const double &coefficient,
178 const std::vector<Eigen::MatrixXd> &dmatrix) const
179 {
180 Eigen::MatrixXd staBmatrix = dmatrix[0] * projector[0];
181
182 for (unsigned int d = 1; d < dimension; d++)
183 staBmatrix += dmatrix[d] * projector[d];
184
185 staBmatrix.diagonal().array() -= 1;
186
187 // staBmatrix = (\Pi^{0,dofs}_order - I)^T * (\Pi^{0,dofs}_order - I).
188 staBmatrix = coefficient * staBmatrix.transpose() * staBmatrix;
189
190 return staBmatrix;
191 }
192};
193} // namespace DF_PCC
194} // namespace VEM
195} // namespace Polydim
196
197#endif
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_DF_PCC_Utilities.hpp:28
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition Monomials_Data.hpp:23
Definition VEM_DF_PCC_Utilities.hpp:36
std::vector< Eigen::MatrixXd > ComputePolynomialsDerivativeValues(const std::vector< Eigen::MatrixXd > &vanderInternalDerivatives) const
Definition VEM_DF_PCC_Utilities.hpp:141
std::vector< Eigen::MatrixXd > ComputePolynomialsDerivativeValues(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const double &diameter, const Eigen::MatrixXd &vander) const
Definition VEM_DF_PCC_Utilities.hpp:148
std::vector< Eigen::MatrixXd > ComputeBasisFunctionsValues(const unsigned int dimension, const Polydim::VEM::DF_PCC::ProjectionTypes &projectionType, const unsigned int &Nkm2, const std::vector< Eigen::MatrixXd > &pi0km2, const std::vector< Eigen::MatrixXd > &pi0k, const Eigen::MatrixXd &vanderInternal) const
Definition VEM_DF_PCC_Utilities.hpp:86
Eigen::MatrixXd ComputeDofiDofiStabilizationMatrix(const unsigned int dimension, const std::vector< Eigen::MatrixXd > &projector, const double &coefficient, const std::vector< Eigen::MatrixXd > &dmatrix) const
Definition VEM_DF_PCC_Utilities.hpp:175
Eigen::MatrixXd ComputePolynomialsLaplacianValues(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const double &diameter, const Eigen::MatrixXd &vander) const
Definition VEM_DF_PCC_Utilities.hpp:157
Eigen::MatrixXd ComputeValuesOnEdge(const Eigen::RowVectorXd &edgeInternalPoints, const unsigned int &order, const Eigen::VectorXd &edgeBasisCoefficients, const Eigen::VectorXd &pointsCurvilinearCoordinates) const
Definition VEM_DF_PCC_Utilities.hpp:165
std::vector< Eigen::MatrixXd > ComputeBasisFunctionsDerivativeValues(const unsigned int dimension, const Polydim::VEM::DF_PCC::ProjectionTypes &projectionType, const unsigned int &Nkm1, const Eigen::MatrixXd &vanderInternal, const std::vector< Eigen::MatrixXd > &vanderInternalDerivatives, const std::vector< Eigen::MatrixXd > &piNabla, const std::vector< Eigen::MatrixXd > &pi0km1Der) const
Definition VEM_DF_PCC_Utilities.hpp:45
Eigen::MatrixXd ComputePolynomialsValues(const Polydim::Utilities::Monomials_Data &data, const MonomialType &monomials, const Eigen::Vector3d &centroid, const double &diameter, const Eigen::MatrixXd &points) const
Definition VEM_DF_PCC_Utilities.hpp:124
Eigen::MatrixXd ComputePolynomialsValues(const Eigen::MatrixXd &vanderInternal) const
Definition VEM_DF_PCC_Utilities.hpp:117
Eigen::MatrixXd ComputeBasisFunctionsDivergenceValues(const unsigned int &Nkm1, const Eigen::MatrixXd &vanderInternal, const Eigen::MatrixXd &vmatrix) const
Definition VEM_DF_PCC_Utilities.hpp:79
Eigen::VectorXd ComputeEdgeBasisCoefficients(const unsigned int &order, const Eigen::VectorXd &edgeInternalPoints) const
Definition VEM_DF_PCC_Utilities.hpp:37