PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
FEM_Triangle_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_Triangle_PCC_2D_LocalSpace_HPP
13#define __FEM_Triangle_PCC_2D_LocalSpace_HPP
14
17#include "MapTriangle.hpp"
18
19namespace Polydim
20{
21namespace FEM
22{
23namespace PCC
24{
25
27{
28 private:
29 Gedim::MapTriangle mapTriangle;
31
32 inline Eigen::MatrixXd MapValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space,
33 const Eigen::MatrixXd &referenceValues) const
34 {
35 return referenceValues(Eigen::all, local_space.DofsMeshOrder);
36 }
37
38 std::vector<Eigen::MatrixXd> MapDerivativeValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space,
39 const std::vector<Eigen::MatrixXd> &referenceDerivateValues) const;
40
41 Eigen::MatrixXd MapLaplacianValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space,
42 const std::array<Eigen::MatrixXd, 4> &referenceSecondDerivateValues) const;
43
44 Gedim::Quadrature::QuadratureData InternalQuadrature(const Gedim::Quadrature::QuadratureData &reference_quadrature,
45 const Gedim::MapTriangle::MapTriangleData &mapData) const;
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 const unsigned int edge_local_index) const
64 {
65 const auto &dof_coordinates = local_space.Dofs;
66
67 const unsigned int cell1DStartingLocalIdex = local_space.Dof1DsIndex.at(edge_local_index);
68 const unsigned int num_edge_dofs = reference_element_data.NumDofs1D;
69
70 if (num_edge_dofs == 0)
71 return Eigen::MatrixXd(0, 0);
72
73 const Eigen::MatrixXd edge_dofs_coordinates = dof_coordinates.block(0, cell1DStartingLocalIdex, 3, num_edge_dofs);
74
75 return edge_dofs_coordinates;
76 }
77
80 {
81 const auto &dof_coordinates = local_space.Dofs;
82
83 const unsigned int starting_index = local_space.Dof2DsIndex.at(0);
84 const unsigned int num_internal_dofs = reference_element_data.NumDofs2D;
85
86 if (num_internal_dofs == 0)
87 return Eigen::MatrixXd(0, 0);
88
89 const Eigen::MatrixXd face_dofs_coordinates = dof_coordinates.block(0, starting_index, 3, num_internal_dofs);
90
91 return face_dofs_coordinates;
92 }
93
96 {
97 if (local_space.Order > 3)
98 throw std::runtime_error("Unsupported order");
99
100 return MapLaplacianValues(local_space, reference_element_data.ReferenceBasisFunctionSecondDerivativeValues);
101 }
102
103 std::vector<Eigen::MatrixXd> ComputeBasisFunctionsDerivativeValues(
106 {
107 return MapDerivativeValues(local_space, reference_element_data.ReferenceBasisFunctionDerivativeValues);
108 }
109
112 const Eigen::MatrixXd &points) const
113 {
114 const Eigen::MatrixXd referencePoints = mapTriangle.FInv(local_space.MapData, points);
115
116 return MapValues(local_space, reference_element.EvaluateBasisFunctions(referencePoints, reference_element_data));
117 }
118
121 const Eigen::MatrixXd &points) const
122 {
123 if (local_space.Order > 3)
124 throw std::runtime_error("Unsupported order");
125
126 const Eigen::MatrixXd referencePoints = mapTriangle.FInv(local_space.MapData, points);
127
128 return MapLaplacianValues(local_space, reference_element.EvaluateBasisFunctionSecondDerivatives(referencePoints, reference_element_data));
129 }
130
131 std::vector<Eigen::MatrixXd> ComputeBasisFunctionsDerivativeValues(
134 const Eigen::MatrixXd &points) const
135 {
136 const Eigen::MatrixXd referencePoints = mapTriangle.FInv(local_space.MapData, points);
137
138 return MapDerivativeValues(local_space, reference_element.EvaluateBasisFunctionDerivatives(referencePoints, reference_element_data));
139 }
140
142 {
144 }
145
147 const Eigen::VectorXd &pointsCurvilinearCoordinates) const
148 {
149 Eigen::MatrixXd points = Eigen::MatrixXd(3, pointsCurvilinearCoordinates.size());
150 points.row(0) = pointsCurvilinearCoordinates;
152 return reference_element.EvaluateBasisFunctions(points, reference_element_data.BoundaryReferenceElement_Data);
153 }
154};
155} // namespace PCC
156} // namespace FEM
157} // namespace Polydim
158
159#endif
Definition MapTriangle.hpp:20
static Eigen::MatrixXd FInv(const MapTriangleData &mapData, const Eigen::MatrixXd &x)
Definition MapTriangle.hpp:76
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_Triangle_PCC_2D_LocalSpace.hpp:27
Eigen::MatrixXd InternalDOFsCoordinates(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:78
std::vector< Eigen::MatrixXd > ComputeBasisFunctionsDerivativeValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:103
Eigen::MatrixXd ComputeBasisFunctionsLaplacianValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space, const Eigen::MatrixXd &points) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:119
Eigen::MatrixXd ComputeBasisFunctionsValuesOnEdge(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:141
Eigen::MatrixXd ComputeBasisFunctionsLaplacianValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:94
Eigen::MatrixXd ComputeBasisFunctionsValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:55
Eigen::MatrixXd ComputeBasisFunctionsValuesOnEdge(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Eigen::VectorXd &pointsCurvilinearCoordinates) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:146
Eigen::MatrixXd EdgeDOFsCoordinates(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space, const unsigned int edge_local_index) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:61
Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data CreateLocalSpace(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_PCC_2D_Polygon_Geometry &polygon) const
Definition FEM_Triangle_PCC_2D_LocalSpace.cpp:23
std::vector< Eigen::MatrixXd > ComputeBasisFunctionsDerivativeValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space, const Eigen::MatrixXd &points) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:131
Eigen::MatrixXd ComputeBasisFunctionsValues(const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_LocalSpace_Data &local_space, const Eigen::MatrixXd &points) const
Definition FEM_Triangle_PCC_2D_LocalSpace.hpp:110
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:52
Eigen::MatrixXd EvaluateBasisFunctions(const Eigen::MatrixXd &points, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data) const
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:173
std::vector< Eigen::MatrixXd > EvaluateBasisFunctionDerivatives(const Eigen::MatrixXd &points, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data) const
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:217
std::array< Eigen::MatrixXd, 4 > EvaluateBasisFunctionSecondDerivatives(const Eigen::MatrixXd &points, const Polydim::FEM::PCC::FEM_Triangle_PCC_2D_ReferenceElement_Data &reference_element_data) const
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:293
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition MapTriangle.hpp:23
Definition QuadratureData.hpp:22
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:49
std::array< unsigned int, 2 > Dof2DsIndex
Definition FEM_PCC_2D_LocalSpace_Data.hpp:60
unsigned int Order
Definition FEM_PCC_2D_LocalSpace_Data.hpp:52
std::array< unsigned int, 4 > Dof1DsIndex
Definition FEM_PCC_2D_LocalSpace_Data.hpp:59
Gedim::MapTriangle::MapTriangleData MapData
Definition FEM_PCC_2D_LocalSpace_Data.hpp:50
std::vector< unsigned int > DofsMeshOrder
Definition FEM_PCC_2D_LocalSpace_Data.hpp:57
Eigen::MatrixXd Dofs
Definition FEM_PCC_2D_LocalSpace_Data.hpp:56
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:28
Polydim::FEM::PCC::FEM_PCC_1D_ReferenceElement_Data BoundaryReferenceElement_Data
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:45
unsigned int NumDofs2D
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:33
unsigned int NumDofs1D
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:32
std::array< Eigen::MatrixXd, 4 > ReferenceBasisFunctionSecondDerivativeValues
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:43
std::vector< Eigen::MatrixXd > ReferenceBasisFunctionDerivativeValues
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:42
Eigen::MatrixXd ReferenceBasisFunctionValues
Definition FEM_Triangle_PCC_2D_ReferenceElement.hpp:41