12#ifndef __FEM_PCC_1D_ReferenceElement_HPP
13#define __FEM_PCC_1D_ReferenceElement_HPP
70 const unsigned int order,
72 const unsigned int quadrature_order = 0)
const
79 unsigned int computed_quadrature_order = quadrature_order;
80 if (computed_quadrature_order == 0)
81 computed_quadrature_order = 2 * order;
88 result.
DofPositions = (Eigen::MatrixXd(3, 1) << 0.5, 0.0, 0.0).finished();
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);
111 Eigen::MatrixXd dofPositions = Eigen::MatrixXd::Zero(3, result.
NumBasisFunctions);
116 dofPositions.row(0) = Eigen::VectorXd::LinSpaced(result.
NumBasisFunctions, 0.0, 1.0);
119 dofPositions.row(0) =
123 throw std::runtime_error(
"not valid fem 1D type");
132 nodeDofs.push_back(vertexCount);
137 nodeDofs.push_back(vertexCount);
141 cellDofs.push_back(vertexCount);
146 for (
unsigned int i = 1; i < nodeDofsIndex.size(); i++)
147 nodeDofsIndex[i] = nodeDofsIndex[i] + nodeDofsIndex[i - 1];
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 "
155 unsigned int dofCounter = 0;
156 for (
unsigned int n = 0; n < 2; n++)
158 for (
unsigned int i = nodeDofsIndex[n]; i < nodeDofsIndex[n + 1]; i++)
159 result.
DofPositions.col(dofCounter++) << dofPositions.col(nodeDofs[i]);
162 for (
unsigned int c = 0; c < cellDofs.size(); c++)
163 result.
DofPositions.col(dofCounter++) << dofPositions.col(cellDofs[c]);
179 Eigen::MatrixXd lambda = Eigen::MatrixXd::Zero(points.cols(), 2);
181 lambda.setZero(points.cols(), 2);
183 lambda.col(0) = 1.0 - points.row(0).array();
184 lambda.col(1) = points.row(0);
191 std::vector<Eigen::MatrixXd> gradLambda(1, Eigen::MatrixXd::Zero(points.cols(), 2));
193 gradLambda[0].col(0).setConstant(-1.0);
194 gradLambda[0].col(1).setOnes();
204 points.row(0).transpose());
210 std::vector<Eigen::MatrixXd> values(reference_element_data.
Dimension);
212 for (
unsigned int d = 0; d < reference_element_data.
Dimension; d++)
218 points.row(0).transpose());
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