PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
FEM_PCC_1D_ReferenceElement.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 __FEM_PCC_1D_ReferenceElement_HPP
13#define __FEM_PCC_1D_ReferenceElement_HPP
14
15#include "Eigen/Eigen"
16#include "IOUtilities.hpp"
17#include "QuadratureData.hpp"
20#include "lagrange_1D.hpp"
21#include <cassert>
22
23namespace Polydim
24{
25namespace FEM
26{
27namespace PCC
28{
29
35{
36 Equispaced = 0,
37 GaussLobatto = 1
38};
39
46{
47 unsigned int Dimension;
48 unsigned int Order;
49 unsigned int NumDofs0D;
50 unsigned int NumDofs1D;
51
52 unsigned int NumBasisFunctions;
53 Eigen::MatrixXd DofPositions;
55
57
59 std::vector<Eigen::MatrixXd> ReferenceBasisFunctionDerivativeValues;
60};
61
67{
68 public:
70 const unsigned int order,
72 const unsigned int quadrature_order = 0) const
73 {
75
76 result.Dimension = 1;
77 result.Order = order;
78
79 unsigned int computed_quadrature_order = quadrature_order;
80 if (computed_quadrature_order == 0)
81 computed_quadrature_order = 2 * order;
82
83 if (order == 0)
84 {
85 result.NumDofs0D = 0;
86 result.NumDofs1D = 1;
87 result.NumBasisFunctions = 1;
88 result.DofPositions = (Eigen::MatrixXd(3, 1) << 0.5, 0.0, 0.0).finished();
89
92
93 result.Interpolation_coefficients = Eigen::VectorXd::Zero(1);
94
98
99 return result;
100 }
101
102 unsigned int vertexCount = 0;
103 std::vector<unsigned int> nodeDofs;
104 std::vector<unsigned int> cellDofs;
105 std::vector<unsigned int> nodeDofsIndex(3, 0);
106
107 result.NumDofs0D = 1;
108 result.NumDofs1D = order - 1;
109 result.NumBasisFunctions = order + 1;
110
111 Eigen::MatrixXd dofPositions = Eigen::MatrixXd::Zero(3, result.NumBasisFunctions);
112
113 switch (type)
114 {
116 dofPositions.row(0) = Eigen::VectorXd::LinSpaced(result.NumBasisFunctions, 0.0, 1.0);
117 break;
119 dofPositions.row(0) =
121 break;
122 default:
123 throw std::runtime_error("not valid fem 1D type");
124 }
125
126 Gedim::Output::Assert(dofPositions.row(0).size() == result.NumBasisFunctions);
127
128 for (unsigned int i = 0; i < result.NumBasisFunctions; i++)
129 {
130 if (i == 0)
131 {
132 nodeDofs.push_back(vertexCount);
133 nodeDofsIndex[1]++;
134 }
135 else if (i == result.NumBasisFunctions - 1)
136 {
137 nodeDofs.push_back(vertexCount);
138 nodeDofsIndex[2]++;
139 }
140 else
141 cellDofs.push_back(vertexCount);
142
143 vertexCount++;
144 }
145
146 for (unsigned int i = 1; i < nodeDofsIndex.size(); i++)
147 nodeDofsIndex[i] = nodeDofsIndex[i] + nodeDofsIndex[i - 1];
148
149 if (vertexCount != result.NumBasisFunctions || nodeDofs.size() != nodeDofsIndex.back())
150 throw std::runtime_error("Wrong initialization in FE reference element. Number of DOFs found is not "
151 "correct.");
152
153 result.DofPositions.resize(3, result.NumBasisFunctions);
154
155 unsigned int dofCounter = 0;
156 for (unsigned int n = 0; n < 2; n++)
157 {
158 for (unsigned int i = nodeDofsIndex[n]; i < nodeDofsIndex[n + 1]; i++)
159 result.DofPositions.col(dofCounter++) << dofPositions.col(nodeDofs[i]);
160 }
161
162 for (unsigned int c = 0; c < cellDofs.size(); c++)
163 result.DofPositions.col(dofCounter++) << dofPositions.col(cellDofs[c]);
164
167
169
173
174 return result;
175 }
176 // ***************************************************************************
177 Eigen::MatrixXd EvaluateLambda(const Eigen::MatrixXd &points) const
178 {
179 Eigen::MatrixXd lambda = Eigen::MatrixXd::Zero(points.cols(), 2);
180
181 lambda.setZero(points.cols(), 2);
182
183 lambda.col(0) = 1.0 - points.row(0).array();
184 lambda.col(1) = points.row(0);
185
186 return lambda;
187 }
188 // ***************************************************************************
189 std::vector<Eigen::MatrixXd> EvaluateGradLambda(const Eigen::MatrixXd &points) const
190 {
191 std::vector<Eigen::MatrixXd> gradLambda(1, Eigen::MatrixXd::Zero(points.cols(), 2));
192
193 gradLambda[0].col(0).setConstant(-1.0);
194 gradLambda[0].col(1).setOnes();
195
196 return gradLambda;
197 }
198 // ***************************************************************************
199 Eigen::MatrixXd EvaluateBasisFunctions(const Eigen::MatrixXd &points,
200 const Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data &reference_element_data) const
201 {
202 return Polydim::Interpolation::Lagrange::Lagrange_1D_values(reference_element_data.DofPositions.row(0).transpose(),
203 reference_element_data.Interpolation_coefficients,
204 points.row(0).transpose());
205 }
206 // ***************************************************************************
207 std::vector<Eigen::MatrixXd> EvaluateBasisFunctionDerivatives(const Eigen::MatrixXd &points,
208 const Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data &reference_element_data) const
209 {
210 std::vector<Eigen::MatrixXd> values(reference_element_data.Dimension);
211
212 for (unsigned int d = 0; d < reference_element_data.Dimension; d++)
213 values[d].setZero(points.cols(), reference_element_data.NumBasisFunctions);
214
216 reference_element_data.DofPositions.row(0).transpose(),
217 reference_element_data.Interpolation_coefficients,
218 points.row(0).transpose());
219
220 return values;
221 }
222 // ***************************************************************************
223};
224} // namespace PCC
225} // namespace FEM
226} // namespace Polydim
227
228#endif
static void Assert(const bool &logicResult)
Assert for all code, generate exception if something goes wrong.
Definition IOUtilities.hpp:126
static QuadratureData FillPointsAndWeights(const unsigned int &order)
Definition Quadrature_Gauss1D.hpp:25
static QuadratureData FillPointsAndWeights(const unsigned int &order)
Definition Quadrature_GaussLobatto1D.hpp:25
Factory that builds the reference element data for a 1D PCC finite element.
Definition FEM_PCC_1D_ReferenceElement.hpp:67
std::vector< Eigen::MatrixXd > EvaluateGradLambda(const Eigen::MatrixXd &points) const
Definition FEM_PCC_1D_ReferenceElement.hpp:189
Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data Create(const unsigned int order, const Polydim::FEM::PCC::FEM_PCC_1D_Types type=Polydim::FEM::PCC::FEM_PCC_1D_Types::Equispaced, const unsigned int quadrature_order=0) const
Definition FEM_PCC_1D_ReferenceElement.hpp:69
Eigen::MatrixXd EvaluateBasisFunctions(const Eigen::MatrixXd &points, const Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data &reference_element_data) const
Definition FEM_PCC_1D_ReferenceElement.hpp:199
Eigen::MatrixXd EvaluateLambda(const Eigen::MatrixXd &points) const
Definition FEM_PCC_1D_ReferenceElement.hpp:177
std::vector< Eigen::MatrixXd > EvaluateBasisFunctionDerivatives(const Eigen::MatrixXd &points, const Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data &reference_element_data) const
Definition FEM_PCC_1D_ReferenceElement.hpp:207
FEM_PCC_1D_Types
Node distribution used to build the 1D PCC (primal/continuous) Lagrange reference element.
Definition FEM_PCC_1D_ReferenceElement.hpp:35
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
Eigen::MatrixXd Lagrange_1D_derivative_values(const Eigen::VectorXd &interpolation_points_x, const Eigen::VectorXd &lagrange_1D_coefficients, const Eigen::VectorXd &evaluation_points_x)
Evaluate the derivatives of the 1D Lagrange basis functions at given points.
Definition lagrange_1D.cpp:84
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition QuadratureData.hpp:22
Eigen::MatrixXd Points
Definition QuadratureData.hpp:23
Reference element data for a 1D PCC finite element.
Definition FEM_PCC_1D_ReferenceElement.hpp:46
Eigen::MatrixXd DofPositions
Definition FEM_PCC_1D_ReferenceElement.hpp:53
unsigned int NumDofs1D
Definition FEM_PCC_1D_ReferenceElement.hpp:50
unsigned int Dimension
Definition FEM_PCC_1D_ReferenceElement.hpp:47
unsigned int NumDofs0D
Definition FEM_PCC_1D_ReferenceElement.hpp:49
unsigned int Order
Definition FEM_PCC_1D_ReferenceElement.hpp:48
unsigned int NumBasisFunctions
Definition FEM_PCC_1D_ReferenceElement.hpp:52
Eigen::MatrixXd ReferenceBasisFunctionValues
Definition FEM_PCC_1D_ReferenceElement.hpp:58
Eigen::VectorXd Interpolation_coefficients
Definition FEM_PCC_1D_ReferenceElement.hpp:54
Gedim::Quadrature::QuadratureData ReferenceSegmentQuadrature
Definition FEM_PCC_1D_ReferenceElement.hpp:56
std::vector< Eigen::MatrixXd > ReferenceBasisFunctionDerivativeValues
Definition FEM_PCC_1D_ReferenceElement.hpp:59