Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
Simplex.h
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MoDELib is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8#ifndef model_Simplex_H_
9#define model_Simplex_H_
10
11#include <memory> // shared_ptr
12#include <set>
13#include <map>
14#include <vector>
15#include <float.h>
16#include <Eigen/Dense>
17#include <SimplexTraits.h>
18#include <SimplexReader.h>
19#include <SimplexFactory.h>
20#include <SimplexBase.h>
21#include <SimplexParent.h>
22#include <SimplexChild.h>
23#include <Polyhedron.h>
24//#include <VertexReader.h>
25#include <BarycentricTraits.h>
26#include <SimplexVolume.h>
27
28namespace model
29{
30
31 /**************************************************************************/
32 /**************************************************************************/
33 template<short int dim>
34 class Simplex<dim,0> :
35 /* inheritance */ public SimplexBase<dim,0>,
36 /* inheritance */ public SimplexChild <dim,0>
37 {
38
39 public:
40
41
42 enum{order=0};
46
47 const Eigen::Matrix<double,dim,1> P0;
48
49 private:
50 friend struct WeakPtrFactory<SimplexFactory<dim,order>,Simplex<dim,order>>;
51 Simplex(SimplicialMesh<dim>* const m,
52 const SimplexIDType& vIN);
53 Simplex(SimplexFactory<dim,order>* factory, const SimplexIDType& id)
54 : Simplex(factory->mesh,id)
55 {
56 }
57 public:
58 ~Simplex();
59 const Eigen::Matrix<double,dim,1>& center() const
60 {
61 return P0;
62 }
63 std::set<const Simplex<dim,0>*> regionBoundaryNeighbors() const
64 {
65 return {};
66 }
67 std::set<const Simplex<dim,0>*> boundaryNeighbors() const;
68 Eigen::Matrix<double,dim,1> outNormal() const;
69 Eigen::Matrix<double,dim,1> outNormal(const size_t& rID) const;
70 };
71
72 /**************************************************************************/
73 /**************************************************************************/
74 template<short int dim, short int order>
75 class Simplex : public SimplexParent<dim,order>
76 /* */, public SimplexBase<dim,order>
77 /* */, public SimplexChild <dim,order>
78 {
79
80 typedef typename SimplexTraits<dim,order>::BaseArrayType BaseArrayType;
81
82
83 public:
84
85
86 // enum{nVertices=SimplexTraits<dim,order>::nVertices};
89 // enum{nFaces=SimplexTraits<dim,order>::nFaces};
91
92 typedef Simplex<dim,order-1> ChildSimplexType;
94
95 double vol0; // SHOULD BE CONST, SEE BELOW
96
97 /**********************************************************************/
98 private:
99 friend struct WeakPtrFactory<SimplexFactory<dim,order>,Simplex<dim,order>>;
100 Simplex(SimplicialMesh<dim>* const m,
101 const SimplexIDType& vIN);
102 Simplex(SimplexFactory<dim,order>* factory, const SimplexIDType& id)
103 : Simplex(factory->mesh,id)
104 {
105 }
106 public:
108 // BaseArrayType& children();
109 // const BaseArrayType& children() const;
110 // ChildSimplexType& child(const int& n);
111 // const ChildSimplexType& child(const int& n) const;
112 // const std::shared_ptr<ChildSimplexType>& child(const ChildIDType& xID) const;
113 size_t childOrder(const ChildIDType& childID) const;
114 std::vector<int> boundaryFaces() const;
115 std::set<const Simplex<dim,order>*> spouses() const;
116 std::set<const Simplex<dim,order>*> boundaryNeighbors() const;
117 std::set<const Simplex<dim,order>*> regionBoundaryNeighbors() const;
118 Eigen::Matrix<double,dim,1> outNormal() const;
119 Eigen::Matrix<double,dim,1> outNormal(const size_t& rID) const;
120
121 };
122
123 /**************************************************************************/
124 /**************************************************************************/
125 template<short int dim>
126 class Simplex<dim,dim> : public SimplexParent<dim,dim>
127 /* */, public SimplexBase<dim,dim>
128 {
129
130 typedef typename SimplexTraits<dim,dim>::BaseArrayType BaseArrayType;
131
132 /**********************************************************************/
133 const Eigen::Matrix<double,dim,dim+1> get_nda() const;
134
135 public:
136
137
138 enum{order=dim};
142
143 typedef Simplex<dim,order-1> ChildSimplexType;
145
147
148
150 const std::shared_ptr<MeshRegionType> region;
151
153 const Eigen::Matrix<double,dim+1,dim+1> p2b;
154
156 const Eigen::Matrix<double,dim,dim+1> nda;
157
158 const double vol0;
159
160 private:
161 friend struct WeakPtrFactory<SimplexFactory<dim,order>,Simplex<dim,order>>;
162 Simplex(SimplicialMesh<dim>* const m,
163 const SimplexIDType& vIN, const int regionID=0);
164 Simplex(SimplexFactory<dim,order>* factory, const SimplexIDType& id, int regionID)
165 : Simplex(factory->mesh,id,regionID)
166 {
167 }
168 public:
169 ~Simplex();
170 // BaseArrayType& children();
171 // const BaseArrayType& children() const;
172 // ChildSimplexType& child(const int& n);
173 // const ChildSimplexType& child(const int& n) const;
174 // const std::shared_ptr<ChildSimplexType>& child(const ChildIDType& xID) const;
175 size_t childOrder(const ChildIDType& childID) const;
176 std::vector<int> boundaryFaces() const;
177 bool isBoundarySimplex() const;
178 bool isRegionBoundarySimplex() const;
179 Eigen::Matrix<double,dim+1,1> pos2bary(const Eigen::Matrix<double,dim,1>& P) const;
180 void convexDelaunaynSearch(const bool& searchAllRegions,
181 const Eigen::Matrix<double,dim,1>& P,
182 std::pair<bool,const Simplex<dim,dim>*>& lastSearched,
183 std::set<const Simplex<dim,dim>*>& searchSet) const; // TO DO: searchSet is not necessary, because baryMin changes sign in next Simplex
184 Eigen::Matrix<double,dim+1,1> faceLineIntersection(const Eigen::Matrix<double,dim+1,1>& bary0,
185 const Eigen::Matrix<double,dim+1,1>& bary1,
186 const int& faceID) const;
187 std::set<size_t> regionIDs() const;
188
189
190 // std::set<const Simplex<dim,dim>* const> vertexNeighbors() const
191 // {
192 // std::set<const Simplex<dim,0>* const> vtxSet;
193 // for(const auto& face : children())
194 // {
195 // for(const auto& edge : face->children())
196 // {
197 // for(const auto& vertex : edge->children())
198 // {
199 // vtxSet.insert(vertex.get());
200 // }
201 // }
202 // }
203
204 // std::set<const Simplex<dim,dim>* const> eleSet;
205 // for(const auto& vtx : vtxSet)
206 // {
207 // for(const auto& edge : vtx->parents())
208 // {
209 // for(const auto& face : edge.second->parents())
210 // {
211 // for(const auto& tet : face.second->parents())
212 // {
213 // eleSet.insert(tet.second);
214 // }
215 // }
216 // }
217 // }
218 // return eleSet;
219 // }
220 };
221
222
223} // close namespace
224#endif
SimplexTraits< dim, order >::SimplexIDType SimplexIDType
Definition Simplex.h:45
const Eigen::Matrix< double, dim, 1 > & center() const
Definition Simplex.h:59
std::set< const Simplex< dim, 0 > * > regionBoundaryNeighbors() const
Definition Simplex.h:63
const Eigen::Matrix< double, dim, 1 > P0
Definition Simplex.h:47
Polyhedron< dim, dim > MeshRegionType
Definition Simplex.h:146
SimplexTraits< dim, order >::SimplexIDType SimplexIDType
Definition Simplex.h:141
Simplex< dim, order-1 > ChildSimplexType
Definition Simplex.h:143
SimplexTraits< dim, order-1 >::SimplexIDType ChildIDType
Definition Simplex.h:144
const std::shared_ptr< MeshRegionType > region
Shared pointer to MeshRegioin containing *this.
Definition Simplex.h:150
const Eigen::Matrix< double, dim, dim+1 > nda
The column matrix of face normals.
Definition Simplex.h:156
const Eigen::Matrix< double, dim+1, dim+1 > p2b
The position to barycentric-coordinate transformation matrix.
Definition Simplex.h:153
bool isBoundarySimplex() const
bool isRegionBoundarySimplex() const
std::set< size_t > regionIDs() const
static constexpr int nVertices
Definition Simplex.h:87
Eigen::Matrix< double, dim, 1 > outNormal() const
Definition Simplex.cpp:227
static constexpr int nFaces
Definition Simplex.h:88
std::set< const Simplex< dim, order > * > boundaryNeighbors() const
Definition Simplex.cpp:184
Eigen::Matrix< double, dim, 1 > outNormal(const size_t &rID) const
Definition Simplex.cpp:234
Simplex< dim, order-1 > ChildSimplexType
Definition Simplex.h:92
std::set< const Simplex< dim, order > * > regionBoundaryNeighbors() const
Definition Simplex.cpp:205
size_t childOrder(const ChildIDType &childID) const
Definition Simplex.cpp:141
SimplexTraits< dim, order >::SimplexIDType SimplexIDType
Definition Simplex.h:90
SimplexTraits< dim, order-1 >::SimplexIDType ChildIDType
Definition Simplex.h:93
std::set< const Simplex< dim, order > * > spouses() const
Definition Simplex.cpp:165
std::vector< int > boundaryFaces() const
Definition Simplex.cpp:148
SimplexBase(SimplicialMesh< dim > *const m, const SimplexIDType &vIN)
Definition SimplexBase.h:35
static constexpr short int dim
Definition SimplexBase.h:25
SimplicialMesh< dim > *const mesh
Definition SimplexBase.h:29
SimplexParent(SimplicialMesh< dim > *const mesh, const SimplexIDType &xID)
std::array< std::shared_ptr< Simplex< dim, order-1 > >, nFaces > BaseArrayType
static constexpr int nFaces
static constexpr int nVertices
SimplexID< nVertices > SimplexIDType
b order
void t struct mesh * m