PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
FEM_Quadrilateral_PCC_2D_LocalSpace.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_Quadrilateral_PCC_2D_LocalSpace_HPP
13#define __FEM_Quadrilateral_PCC_2D_LocalSpace_HPP
14
17#include "MapParallelogram.hpp"
18#include "MapQuadrilateral.hpp"
19
20namespace Polydim
21{
22namespace FEM
23{
24namespace PCC
25{
26
28{
29 private:
30 inline Eigen::MatrixXd MapValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space,
31 const Eigen::MatrixXd &referenceValues) const
32 {
33 return referenceValues(Eigen::all, local_space.DofsMeshOrder);
34 }
35
36 std::vector<Eigen::MatrixXd> MapDerivativeValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space,
37 const std::vector<Eigen::MatrixXd> &referenceDerivateValues,
38 const Eigen::MatrixXd &referencePoints) const;
39
40 Eigen::MatrixXd MapLaplacianValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space,
41 const std::array<Eigen::MatrixXd, 4> &referenceSecondDerivateValues,
42 const Eigen::MatrixXd &referencePoints) const;
43
44 Gedim::Quadrature::QuadratureData InternalQuadrature(const Gedim::Quadrature::QuadratureData &reference_quadrature,
46
47 std::vector<Gedim::Quadrature::QuadratureData> BoundaryQuadrature(const Gedim::Quadrature::QuadratureData &reference_quadrature,
49
50 public:
54
57 {
58 return MapValues(local_space, reference_element_data.ReferenceBasisFunctionValues);
59 }
60
63 {
64 return MapLaplacianValues(local_space,
66 reference_element_data.ReferenceSquareQuadrature.Points);
67 }
68
69 std::vector<Eigen::MatrixXd> ComputeBasisFunctionsDerivativeValues(
72 {
73 return MapDerivativeValues(local_space,
74 reference_element_data.ReferenceBasisFunctionDerivativeValues,
75 reference_element_data.ReferenceSquareQuadrature.Points);
76 }
77
80 const Eigen::MatrixXd &points) const
81 {
82
83 Eigen::MatrixXd referencePoints;
84 switch (local_space.quadrilateral_type)
85 {
87 Gedim::MapParallelogram mapQuadrilateral;
88 referencePoints = mapQuadrilateral.FInv(local_space.MapData, points);
89 }
90 break;
92 Gedim::MapQuadrilateral mapQuadrilateral;
93 referencePoints = mapQuadrilateral.FInv(local_space.Vertices, points);
94 }
95 break;
96 default:
97 throw std::runtime_error("not valid quadrilateral");
98 }
99
101
102 return MapValues(local_space, reference_element.EvaluateBasisFunctions(referencePoints, reference_element_data));
103 }
104
107 const Eigen::MatrixXd &points) const
108 {
109 Eigen::MatrixXd referencePoints;
110 switch (local_space.quadrilateral_type)
111 {
113 Gedim::MapParallelogram mapQuadrilateral;
114 referencePoints = mapQuadrilateral.FInv(local_space.MapData, points);
115 }
116 break;
118 Gedim::MapQuadrilateral mapQuadrilateral;
119 referencePoints = mapQuadrilateral.FInv(local_space.Vertices, points);
120 }
121 break;
122 default:
123 throw std::runtime_error("not valid quadrilateral");
124 }
125
127 return MapLaplacianValues(local_space,
128 reference_element.EvaluateBasisFunctionSecondDerivatives(referencePoints, reference_element_data),
129 referencePoints);
130 }
131
132 std::vector<Eigen::MatrixXd> ComputeBasisFunctionsDerivativeValues(
135 const Eigen::MatrixXd &points) const
136 {
137 Eigen::MatrixXd referencePoints;
138 switch (local_space.quadrilateral_type)
139 {
141 Gedim::MapParallelogram mapQuadrilateral;
142 referencePoints = mapQuadrilateral.FInv(local_space.MapData, points);
143 }
144 break;
146 Gedim::MapQuadrilateral mapQuadrilateral;
147 referencePoints = mapQuadrilateral.FInv(local_space.Vertices, points);
148 }
149 break;
150 default:
151 throw std::runtime_error("not valid quadrilateral");
152 }
153
155
156 return MapDerivativeValues(local_space,
157 reference_element.EvaluateBasisFunctionDerivatives(referencePoints, reference_element_data),
158 referencePoints);
159 }
160
163 const unsigned int edge_local_index) const
164 {
165 const auto &dof_coordinates = local_space.Dofs;
166
167 const unsigned int cell1DStartingLocalIdex = local_space.Dof1DsIndex.at(edge_local_index);
168 const unsigned int num_edge_dofs = reference_element_data.NumDofs1D;
169
170 if (num_edge_dofs == 0)
171 return Eigen::MatrixXd(0, 0);
172
173 const Eigen::MatrixXd edge_dofs_coordinates = dof_coordinates.block(0, cell1DStartingLocalIdex, 3, num_edge_dofs);
174
175 return edge_dofs_coordinates;
176 }
177
180 {
181 const auto &dof_coordinates = local_space.Dofs;
182
183 const unsigned int starting_index = local_space.Dof2DsIndex.at(0);
184 const unsigned int num_internal_dofs = reference_element_data.NumDofs2D;
185
186 if (num_internal_dofs == 0)
187 return Eigen::MatrixXd(0, 0);
188
189 const Eigen::MatrixXd face_dofs_coordinates = dof_coordinates.block(0, starting_index, 3, num_internal_dofs);
190
191 return face_dofs_coordinates;
192 }
193
198
200 const Eigen::VectorXd &pointsCurvilinearCoordinates) const
201 {
202 Eigen::MatrixXd points = Eigen::MatrixXd(3, pointsCurvilinearCoordinates.size());
203 points.row(0) = pointsCurvilinearCoordinates;
205 return reference_element.EvaluateBasisFunctions(points, reference_element_data.BoundaryReferenceElement_Data);
206 }
207};
208} // namespace PCC
209} // namespace FEM
210} // namespace Polydim
211
212#endif
Definition MapParallelogram.hpp:20
static Eigen::MatrixXd FInv(const MapParallelogramData &mapData, const Eigen::MatrixXd &x)
Definition MapParallelogram.hpp:70
Definition MapQuadrilateral.hpp:20
Eigen::MatrixXd FInv(const Eigen::MatrixXd &vertices, const Eigen::MatrixXd &points) const
Definition MapQuadrilateral.cpp:51
Factory that builds the reference element data for a 1D PCC finite element.
Definition FEM_PCC_1D_ReferenceElement.hpp:67
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
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:28
Eigen::MatrixXd EdgeDOFsCoordinates(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space, const unsigned int edge_local_index) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:161
Eigen::MatrixXd ComputeBasisFunctionsValuesOnEdge(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:194
Eigen::MatrixXd ComputeBasisFunctionsLaplacianValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:61
Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data CreateLocalSpace(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_PCC_2D_Polygon_Geometry &polygon) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.cpp:25
Eigen::MatrixXd ComputeBasisFunctionsValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:55
Eigen::MatrixXd ComputeBasisFunctionsLaplacianValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space, const Eigen::MatrixXd &points) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:105
std::vector< Eigen::MatrixXd > ComputeBasisFunctionsDerivativeValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:69
std::vector< Eigen::MatrixXd > ComputeBasisFunctionsDerivativeValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space, const Eigen::MatrixXd &points) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:132
Eigen::MatrixXd ComputeBasisFunctionsValuesOnEdge(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Eigen::VectorXd &pointsCurvilinearCoordinates) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:199
Eigen::MatrixXd ComputeBasisFunctionsValues(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space, const Eigen::MatrixXd &points) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:78
Eigen::MatrixXd InternalDOFsCoordinates(const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Quadrilateral_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Quadrilateral_PCC_2D_LocalSpace.hpp:178
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition QuadratureData.hpp:22
Eigen::MatrixXd Points
Definition QuadratureData.hpp:23
Eigen::MatrixXd ReferenceBasisFunctionValues
Definition FEM_PCC_1D_ReferenceElement.hpp:58
Definition FEM_PCC_2D_LocalSpace_Data.hpp:38
Definition FEM_PCC_2D_LocalSpace_Data.hpp:66
std::vector< unsigned int > DofsMeshOrder
Definition FEM_PCC_2D_LocalSpace_Data.hpp:73
std::array< unsigned int, 5 > Dof1DsIndex
Definition FEM_PCC_2D_LocalSpace_Data.hpp:75
Eigen::MatrixXd Vertices
Definition FEM_PCC_2D_LocalSpace_Data.hpp:67
Gedim::MapParallelogram::MapParallelogramData MapData
Definition FEM_PCC_2D_LocalSpace_Data.hpp:68
std::array< unsigned int, 2 > Dof2DsIndex
Definition FEM_PCC_2D_LocalSpace_Data.hpp:76
Eigen::MatrixXd Dofs
Definition FEM_PCC_2D_LocalSpace_Data.hpp:72
Polydim::FEM::PCC::QuadrilateralType quadrilateral_type
Definition FEM_PCC_2D_LocalSpace_Data.hpp:79
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:28
Eigen::MatrixXd ReferenceBasisFunctionValues
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:44
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
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
Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data BoundaryReferenceElement_Data
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:48
Definition FEM_Quadrilateral_PCC_2D_ReferenceElement.hpp:52
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