12#ifndef __FEM_Quadrilateral_PCC_2D_ReferenceElement_HPP
13#define __FEM_Quadrilateral_PCC_2D_ReferenceElement_HPP
37 std::vector<std::array<unsigned int, 2>>
DofTypes;
39 std::map<std::pair<unsigned int, unsigned int>, std::pair<unsigned int, bool>>
Edges_by_vertices;
58 Vertices = Eigen::MatrixXd::Zero(3, 4);
59 Vertices << 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0;
67 throw std::runtime_error(
"not valid order");
76 result.
NumDofs2D = (order - 1) * (order - 1);
97 for (
unsigned int d1 = 0; d1 < 2; d1++)
101 for (
unsigned int d2 = 0; d2 < 2; d2++)
103 result.
DofPositions.col(2 * d1 + d2) << reference_edge_dofs_poisitions(d2),
104 reference_edge_dofs_poisitions(d1), 0.0;
105 result.
DofTypes[2 * d1 + d2] = {d2, d1};
110 for (
unsigned int d2 = 0; d2 < 2; d2++)
112 const unsigned int index = (d2 == 0) ? 1 : 0;
113 result.
DofPositions.col(2 * d1 + d2) << reference_edge_dofs_poisitions(index),
114 reference_edge_dofs_poisitions(d1), 0.0;
115 result.
DofTypes[2 * d1 + d2] = {index, d1};
123 for (
unsigned int d1 = 0; d1 < 2; d1++)
126 reference_edge_dofs_poisitions.segment(2, result.
NumDofs1D);
128 Eigen::VectorXd::Ones(result.
NumDofs1D) * reference_edge_dofs_poisitions(d1);
134 for (
int d1 = 0; d1 < 2; d1++)
136 const unsigned index = (d1 == 1) ? 0 : 1;
138 Eigen::VectorXd::Ones(result.
NumDofs1D) * reference_edge_dofs_poisitions(index);
140 reference_edge_dofs_poisitions.segment(2, result.
NumDofs1D);
146 unsigned int dof = 4 + 4 * result.
NumDofs1D;
151 result.
DofPositions.col(dof) << reference_edge_dofs_poisitions(d2), reference_edge_dofs_poisitions(d1), 0.0;
160 std::vector<Eigen::Matrix3d> polygonTriangulationVertices(2);
161 polygonTriangulationVertices[0] =
Vertices.leftCols(3);
163 result.ReferenceTriangleQuadrature =
166 result.ReferenceSquareQuadrature =
169 result.ReferenceBasisFunctionValues =
EvaluateBasisFunctions(result.ReferenceSquareQuadrature.Points, result);
170 result.ReferenceBasisFunctionDerivativeValues =
183 const unsigned int num_points = points.cols();
184 Eigen::MatrixXd x = Eigen::MatrixXd::Zero(3, num_points);
185 x.row(0) = points.row(0);
186 Eigen::MatrixXd y = Eigen::MatrixXd::Zero(3, num_points);
187 y.row(0) = points.row(1);
190 const Eigen::MatrixXd values_x =
192 const Eigen::MatrixXd values_y =
195 Eigen::MatrixXd values = Eigen::MatrixXd::Ones(num_points, reference_element_data.
NumBasisFunctions);
199 const auto &dofType = reference_element_data.
DofTypes[d];
200 values.col(d) = values_x.col(dofType[0]).array() * values_y.col(dofType[1]).array();
207 const Eigen::MatrixXd &points,
210 const unsigned int num_points = points.cols();
211 Eigen::MatrixXd x = Eigen::MatrixXd::Zero(3, num_points);
212 x.row(0) = points.row(0);
213 Eigen::MatrixXd y = Eigen::MatrixXd::Zero(3, num_points);
214 y.row(0) = points.row(1);
217 const Eigen::MatrixXd values_x =
219 const std::vector<Eigen::MatrixXd> values_x_dx =
221 const Eigen::MatrixXd values_y =
223 const std::vector<Eigen::MatrixXd> values_y_dy =
226 std::vector<Eigen::MatrixXd> grad_values(reference_element_data.
Dimension,
231 const auto &dofType = reference_element_data.
DofTypes[d];
232 grad_values[0].col(d) = values_x_dx[0].col(dofType[0]).array() * values_y.col(dofType[1]).array();
233 grad_values[1].col(d) = values_x.col(dofType[0]).array() * values_y_dy[0].col(dofType[1]).array();
242 throw std::runtime_error(
"not implemented method");
static QuadratureData FillPointsAndWeights(const unsigned int &order)
Definition Quadrature_Gauss2D_Triangle.cpp:18
Factory that builds the reference element data for a 1D PCC finite element.
Definition FEM_PCC_1D_ReferenceElement.hpp:67
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
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
Definition VEM_Quadrature_2D.hpp:40
Gedim::Quadrature::QuadratureData PolygonInternalQuadrature(const Gedim::Quadrature::QuadratureData &data, const std::vector< Eigen::Matrix3d > &polygonTriangulationVertices) const
Definition VEM_Quadrature_2D.cpp:139
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition QuadratureData.hpp:22
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 NumBasisFunctions
Definition FEM_PCC_1D_ReferenceElement.hpp:52
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:28
Eigen::MatrixXd ReferenceBasisFunctionValues
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:44
std::map< std::pair< unsigned int, unsigned int >, std::pair< unsigned int, bool > > Edges_by_vertices
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:39
Eigen::MatrixXd DofPositions
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:36
std::vector< std::array< unsigned int, 2 > > DofTypes
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:37
unsigned int Dimension
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:29
std::array< Eigen::MatrixXd, 4 > ReferenceBasisFunctionSecondDerivativeValues
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:46
Gedim::Quadrature::QuadratureData ReferenceSquareQuadrature
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:42
unsigned int Order
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:30
std::vector< Eigen::MatrixXd > ReferenceBasisFunctionDerivativeValues
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:45
unsigned int NumDofs2D
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:33
unsigned int NumDofs1D
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:32
Gedim::Quadrature::QuadratureData ReferenceTriangleQuadrature
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:41
unsigned int NumDofs0D
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:31
Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data BoundaryReferenceElement_Data
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:48
unsigned int NumBasisFunctions
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:35
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:52
FEM_Quadrilateral_PCC_2D_ReferenceElement()
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:56
Eigen::MatrixXd Vertices
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:54
std::vector< Eigen::MatrixXd > EvaluateBasisFunctionDerivatives(const Eigen::MatrixXd &points, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data) const
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:206
std::array< Eigen::MatrixXd, 4 > EvaluateBasisFunctionSecondDerivatives(const Eigen::MatrixXd &, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &) const
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:239
Eigen::MatrixXd EvaluateBasisFunctions(const Eigen::MatrixXd &points, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data) const
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:179
~FEM_Quadrilateral_PCC_2D_ReferenceElement()
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:61
Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data Create(const unsigned int order) const
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:63