HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
discrete-space-descriptor.hpp
Go to the documentation of this file.
1// -*- C++ -*-
2#ifndef DISCRETE_SPACE_DESCRIPTOR_HPP
3#define DISCRETE_SPACE_DESCRIPTOR_HPP
4
5#include <iostream>
6
7#include <list>
8#include <map>
9
10#include <boost/fusion/include/sequence.hpp>
11#include <boost/fusion/include/map.hpp>
12
13#include <basis.hpp>
14
15namespace HArDCore2D {
16
17 namespace DSL {
18
28 typedef double RealVertexType;
31 // TODO: Family of basis functions corresponding to symmetric gradient operator
32 // Idea 1: try to build symmetric gradient basis from gradient of basis in each dimension
33 // typedef Family<GradientBasis<ShiftedBasis<TensorizedVectorFamily<PolyCellType, dimspace> > > > SymPolynxnCellType;
34 // Idea 2: since dimension of R_s^{dxd} is equal to nchoosek(d+1,2),
35 // encode the basis of P^k(T;R_s^{dxd}) as a vector v of length nchoosek(d+1,2) and then
36 // "unpack" the matrix basis as [ v[0] , v[1] ; v[1] , v[2] ]
38
39 typedef boost::fusion::vector<PolyCellType, PolyEdgeType, PolynCellType, PolynxnCellType, PolynEdgeType, RolyCellType, RolyComplCellType, GolyCellType, GolyComplCellType, RealVertexType, RealnVertexType, RealnxnVertexType, SymPolynxnCellType> LocalPolynomialSpaces;
40
41 //------------------------------------------------------------------------------
42
44 public:
46 {
48 std::string _name,
49 size_t _degree,
50 bool _is_dof
51 ) :
52 name(_name),
53 degree(_degree),
54 is_dof(_is_dof)
55 {
56 // Do nothing
57 }
58
59 std::string name;
60 size_t degree;
61 bool is_dof;
62 };
63
65 const std::string & name,
66 const Mesh & mesh,
67 std::ostream & output = std::cout
68 );
69
70 inline const std::string & name() const {
71 return m_name;
72 }
73
74 inline const Mesh & mesh() const {
75 return m_mesh;
76 }
77
78 inline std::ostream & output() {
79 return m_output;
80 }
81
82
83 DiscreteSpaceDescriptor & addPolyCell(const LocalPolynomialSpaceDescriptor & descriptor);
84
85 DiscreteSpaceDescriptor & addPolyCell(const std::string & name,size_t degree, bool is_dof = false);
86
87 DiscreteSpaceDescriptor & addPolyEdge(const LocalPolynomialSpaceDescriptor & descriptor);
88
89 DiscreteSpaceDescriptor & addPolyEdge(const std::string & name,size_t degree, bool is_dof = false);
90
91 DiscreteSpaceDescriptor & addPolynCell(const LocalPolynomialSpaceDescriptor & descriptor);
92
93 DiscreteSpaceDescriptor & addPolynCell(const std::string & name,size_t degree, bool is_dof = false);
94
95 DiscreteSpaceDescriptor & addPolynxnCell(const LocalPolynomialSpaceDescriptor & descriptor);
96
97 DiscreteSpaceDescriptor & addPolynxnCell(const std::string & name,size_t degree, bool is_dof = false);
98
99 DiscreteSpaceDescriptor & addPolynEdge(const LocalPolynomialSpaceDescriptor & descriptor);
100
101 DiscreteSpaceDescriptor & addPolynEdge(const std::string & name,size_t degree, bool is_dof = false);
102
103 DiscreteSpaceDescriptor & addRolyCell(const LocalPolynomialSpaceDescriptor & descriptor);
104
105 DiscreteSpaceDescriptor & addRolyCell(const std::string & name,size_t degree, bool is_dof = false);
106
107 DiscreteSpaceDescriptor & addRolyComplCell(const LocalPolynomialSpaceDescriptor & descriptor);
108
109 DiscreteSpaceDescriptor & addRolyComplCell(const std::string & name,size_t degree, bool is_dof = false);
110
111 DiscreteSpaceDescriptor & addGolyCell(const LocalPolynomialSpaceDescriptor & descriptor);
112
113 DiscreteSpaceDescriptor & addGolyCell(const std::string & name,size_t degree, bool is_dof = false);
114
115 DiscreteSpaceDescriptor & addGolyComplCell(const LocalPolynomialSpaceDescriptor & descriptor);
116
117 DiscreteSpaceDescriptor & addGolyComplCell(const std::string & name,size_t degree, bool is_dof = false);
118
119 DiscreteSpaceDescriptor & addRealVertex(const LocalPolynomialSpaceDescriptor & descriptor);
120
121 DiscreteSpaceDescriptor & addRealVertex(const std::string & name, bool is_dof = false);
122
123 DiscreteSpaceDescriptor & addRealnVertex(const LocalPolynomialSpaceDescriptor & descriptor);
124
125 DiscreteSpaceDescriptor & addRealnVertex(const std::string & name, bool is_dof = false);
126
127 DiscreteSpaceDescriptor & addRealnxnVertex(const LocalPolynomialSpaceDescriptor & descriptor);
128
129 DiscreteSpaceDescriptor & addRealnxnVertex(const std::string & name, bool is_dof = false);
130
131 DiscreteSpaceDescriptor & addSymPolynxnCell(const LocalPolynomialSpaceDescriptor & descriptor);
132
133 DiscreteSpaceDescriptor & addSymPolynxnCell(const std::string & name, size_t degree, bool is_dof = false);
134
135
137 {
138 return m_n_cell_dofs;
139 }
140
141 size_t numberOfLocalCellDofs(const std::string & dof_name) const
142 {
143 return m_cell_dofs.at(dof_name);
144 }
145
147 {
148 return m_n_edge_dofs;
149 }
150
151 size_t numberOfLocalEdgeDofs(const std::string & dof_name) const
152 {
153 return m_edge_dofs.at(dof_name);
154 }
155
157 {
158 return m_n_vertex_dofs;
159 }
160
161 size_t numberOfLocalVertexDofs(const std::string & dof_name) const
162 {
163 return m_vertex_dofs.at(dof_name);
164 }
165
166 template<typename T>
167 const std::list<LocalPolynomialSpaceDescriptor> & getDescriptor() const
168 {
169 return boost::fusion::at_key<T>(m_dofs);
170 }
171
172 const std::map<std::string, size_t> & cellDofs() const {
173 return m_cell_dofs;
174 }
175
176 const std::map<std::string, size_t> & edgeDofs() const {
177 return m_edge_dofs;
178 }
179
180 const std::map<std::string, size_t> & vertexDofs() const {
181 return m_vertex_dofs;
182 }
183
184 private:
185 std::string m_name;
186 const Mesh & m_mesh;
187 std::ostream & m_output;
188
189 std::map<std::string, size_t> m_cell_dofs;
190 std::map<std::string, size_t> m_edge_dofs;
191 std::map<std::string, size_t> m_vertex_dofs;
192
193 // TO BE REMOVED WHEN THE NEW IMPLEMENTATION IS COMPLETE
194 size_t m_n_cell_dofs;
195 size_t m_n_edge_dofs;
196 size_t m_n_vertex_dofs;
197
198 boost::fusion::map<
199 boost::fusion::pair<PolyCellType, std::list<LocalPolynomialSpaceDescriptor> >,
200 boost::fusion::pair<PolyEdgeType, std::list<LocalPolynomialSpaceDescriptor> >,
201 boost::fusion::pair<PolynCellType, std::list<LocalPolynomialSpaceDescriptor> >,
202 boost::fusion::pair<PolynxnCellType, std::list<LocalPolynomialSpaceDescriptor> >,
203 boost::fusion::pair<PolynEdgeType, std::list<LocalPolynomialSpaceDescriptor> >,
204 boost::fusion::pair<RolyCellType, std::list<LocalPolynomialSpaceDescriptor> >,
205 boost::fusion::pair<RolyComplCellType, std::list<LocalPolynomialSpaceDescriptor> >,
206 boost::fusion::pair<GolyCellType, std::list<LocalPolynomialSpaceDescriptor> >,
207 boost::fusion::pair<GolyComplCellType, std::list<LocalPolynomialSpaceDescriptor> >,
208 boost::fusion::pair<RealVertexType, std::list<LocalPolynomialSpaceDescriptor> >,
209 boost::fusion::pair<RealnVertexType, std::list<LocalPolynomialSpaceDescriptor> >,
210 boost::fusion::pair<RealnxnVertexType, std::list<LocalPolynomialSpaceDescriptor> >,
211 boost::fusion::pair<SymPolynxnCellType, std::list<LocalPolynomialSpaceDescriptor> >
212 > m_dofs;
213 };
214
215 DiscreteSpaceDescriptor::LocalPolynomialSpaceDescriptor make_dof(const std::string name, size_t degree);
216
217 } // namespace DSL
218} // namespace HArDCore2D
219#endif
Definition discrete-space-descriptor.hpp:43
std::ostream & output()
Definition discrete-space-descriptor.hpp:78
size_t numberOfLocalEdgeDofs() const
Definition discrete-space-descriptor.hpp:146
DiscreteSpaceDescriptor & addPolynEdge(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:92
DiscreteSpaceDescriptor & addPolyEdge(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:41
const std::map< std::string, size_t > & vertexDofs() const
Definition discrete-space-descriptor.hpp:180
DiscreteSpaceDescriptor & addRolyCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:109
DiscreteSpaceDescriptor & addPolynxnCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:75
DiscreteSpaceDescriptor & addRealnVertex(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:194
const std::map< std::string, size_t > & edgeDofs() const
Definition discrete-space-descriptor.hpp:176
DiscreteSpaceDescriptor & addGolyComplCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:160
DiscreteSpaceDescriptor & addPolynCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:58
size_t numberOfLocalVertexDofs(const std::string &dof_name) const
Definition discrete-space-descriptor.hpp:161
DiscreteSpaceDescriptor & addGolyCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:143
size_t numberOfLocalCellDofs(const std::string &dof_name) const
Definition discrete-space-descriptor.hpp:141
DiscreteSpaceDescriptor & addPolyCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:24
size_t numberOfLocalCellDofs() const
Definition discrete-space-descriptor.hpp:136
size_t numberOfLocalEdgeDofs(const std::string &dof_name) const
Definition discrete-space-descriptor.hpp:151
const Mesh & mesh() const
Definition discrete-space-descriptor.hpp:74
const std::map< std::string, size_t > & cellDofs() const
Definition discrete-space-descriptor.hpp:172
DiscreteSpaceDescriptor & addRealVertex(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:177
const std::string & name() const
Definition discrete-space-descriptor.hpp:70
size_t numberOfLocalVertexDofs() const
Definition discrete-space-descriptor.hpp:156
DiscreteSpaceDescriptor & addSymPolynxnCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:228
DiscreteSpaceDescriptor & addRealnxnVertex(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:211
DiscreteSpaceDescriptor & addRolyComplCell(const LocalPolynomialSpaceDescriptor &descriptor)
Definition discrete-space-descriptor.cpp:126
const std::list< LocalPolynomialSpaceDescriptor > & getDescriptor() const
Definition discrete-space-descriptor.hpp:167
Definition basis.hpp:311
Matrix family obtained from a scalar family.
Definition basis.hpp:719
Vector family obtained by tensorization of a scalar family.
Definition basis.hpp:559
Definition Mesh2D.hpp:26
Eigen::Vector2d VectorRd
Definition basis.hpp:55
Eigen::Matrix2d MatrixRd
Definition basis.hpp:54
constexpr int dimspace
Dimension, and generic types for vector in correct dimension (makes it easier to translate a code bet...
Definition basis.hpp:53
boost::fusion::vector< PolyCellType, PolyEdgeType, PolynCellType, PolynxnCellType, PolynEdgeType, RolyCellType, RolyComplCellType, GolyCellType, GolyComplCellType, RealVertexType, RealnVertexType, RealnxnVertexType, SymPolynxnCellType > LocalPolynomialSpaces
Definition discrete-space-descriptor.hpp:39
TensorizedVectorFamily< PolyCellType, static_cast< size_t >(dimspace+1)> SymPolynxnCellType
Definition discrete-space-descriptor.hpp:37
Family< GradientBasis< ShiftedBasis< MonomialScalarBasisCell > > > GolyCellType
Definition discrete-space-descriptor.hpp:19
TensorizedVectorFamily< PolyCellType, dimspace > PolynCellType
Definition discrete-space-descriptor.hpp:23
VectorRd RealnVertexType
Definition discrete-space-descriptor.hpp:26
MatrixRd RealnxnVertexType
Definition discrete-space-descriptor.hpp:27
Family< GolyComplBasisCell > GolyComplCellType
Definition discrete-space-descriptor.hpp:20
double RealVertexType
Definition discrete-space-descriptor.hpp:28
TensorizedVectorFamily< Family< MonomialScalarBasisEdge >, dimspace > PolynEdgeType
Definition discrete-space-descriptor.hpp:24
Family< RolyComplBasisCell > RolyComplCellType
Definition discrete-space-descriptor.hpp:30
Family< CurlBasis< ShiftedBasis< MonomialScalarBasisCell > > > RolyCellType
Definition discrete-space-descriptor.hpp:29
Family< MonomialScalarBasisCell > PolyCellType
Definition discrete-space-descriptor.hpp:21
MatrixFamily< PolyCellType, dimspace > PolynxnCellType
Definition discrete-space-descriptor.hpp:25
DiscreteSpaceDescriptor::LocalPolynomialSpaceDescriptor make_dof(const std::string name, size_t degree)
Definition discrete-space-descriptor.cpp:249
Family< MonomialScalarBasisEdge > PolyEdgeType
Definition discrete-space-descriptor.hpp:22
Definition ddr-klplate.hpp:27
bool is_dof
Definition discrete-space-descriptor.hpp:61
std::string name
Definition discrete-space-descriptor.hpp:59
LocalPolynomialSpaceDescriptor(std::string _name, size_t _degree, bool _is_dof)
Definition discrete-space-descriptor.hpp:47
size_t degree
Definition discrete-space-descriptor.hpp:60