Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
SimplicialMesh.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_SimplicialMesh_H_
9#define model_SimplicialMesh_H_
10
11#include <chrono>
12#include <sstream>
13#include <fstream>
14#include <assert.h>
15#include <utility> // std::pair, std::make_pair
16#include <set>
17
18#include <map>
19//#include <VertexReader.h>
20#include <TerminalColors.h>
21#include <SimplexTraits.h>
22#include <Simplex.h>
23#include <SimplexReader.h>
24#include <IDreader.h>
25//#include <MeshStats.h>
26 // defines mode::cout
27#include <MeshRegionBoundary.h>
28#include <SimplexFactory.h>
29//#include <SimplicialMeshFace.h>
30#include <GmshReader.h>
31#include <PeriodicSimplexPair.h>
32#include <PolyhedralMesh.h>
33
34
35namespace model
36{
37 template<int dim> class PolyhedralMesh;
38
39
40 /**************************************************************************/
41 /**************************************************************************/
42 template<int _dim>
43 class SimplicialMesh : public SimplexReader<_dim>
44 /* */,public std::map<typename SimplexTraits<_dim,_dim>::SimplexIDType, // key
45 /* */ std::shared_ptr<Simplex<_dim,_dim>>>
46 /* */,public std::map<std::pair<size_t,size_t>,MeshRegionBoundary<_dim>> // MeshRegionBoundary container
47 // /* */,public std::deque<SimplicialMeshFace<_dim>> // MeshRegionBoundary container
48 {
49
50 typedef Eigen::Matrix<double,_dim,1> VectorDim;
51
52 SimplexFactories<_dim> _simplexFactories{this};
53 VectorDim _xMin;
54 VectorDim _xMax;
55 VectorDim _xC;
56
57 double vol0;
58 std::shared_ptr<const int> lifetime=std::make_shared<const int>(0);
59 PeriodicSimplexPairMap<_dim> _periodicSimplexPairs;
60 Eigen::Matrix<double,_dim,Eigen::Dynamic> _periodicBasis = Eigen::Matrix<double,_dim,Eigen::Dynamic>(_dim,0);
61
62 std::shared_ptr<PolyhedralMesh<_dim>> _polyhedralMesh = std::make_shared<PolyhedralMesh<_dim>>();
63 void createMesh(const std::set<int>&);
64
65
66 public:
67
68
69 static constexpr int dim=_dim;
70
71
72 typedef std::map<typename SimplexTraits<dim,dim>::SimplexIDType, // key
73 /* */ std::shared_ptr<Simplex<dim,dim>>> SimplexMapType;
76
78 typedef std::pair<size_t,size_t> MeshRegionIDType;
79 typedef std::map<MeshRegionIDType,MeshRegionBoundaryType> MeshRegionBoundaryContainerType;
80 typedef Eigen::Matrix<double,dim,Eigen::Dynamic> PeriodicBasisType;
81
83
84 SimplicialMesh(const std::string& meshFileName,const Eigen::Matrix<double,dim,dim>& A,const Eigen::Matrix<double,dim,1>& x0,const std::set<int>&);
85
86 void readMesh(const std::string& meshFileName,const Eigen::Matrix<double,dim,dim>& A,const Eigen::Matrix<double,dim,1>& x0,const std::set<int>&);
87
88 const SimplexMapType& simplices() const;
89
91
92 template<short int order> auto& simplexFactory()
93 {
94 return _simplexFactories.template factory<order>();
95 }
96 template<short int order> const auto& simplexFactory() const
97 {
98 return _simplexFactories.template factory<order>();
99 }
101 const auto& regions() const { return _polyhedralMesh->template factory<_dim>(); }
102 Polyhedron<_dim,_dim>* region(const size_t& id) { return regions().at(id).get(); }
103 const Polyhedron<_dim,_dim>* region(const size_t& id) const { return regions().at(id).get(); }
104 std::shared_ptr<Polyhedron<_dim,_dim>> getSharedRegion(size_t id) { return _polyhedralMesh->getRegion(id); }
105
106
108
110
111 // Discover the full valid lattice first, then select active translations using
112 // external face IDs. Only integer-combination pairs are activated; unmatched
113 // faces remain physical boundaries. -1 enables all; an empty set disables pairing.
114 void identifyParallelFaces(const std::set<int>&);
115
116 Eigen::Matrix<double,dim,Eigen::Dynamic> periodicBasis() const;
117 std::weak_ptr<const int> lifetimeToken() const
118 {
119 return lifetime;
120 }
122 {
123 return _periodicSimplexPairs;
124 }
125
126
127 void insertSimplex(const typename SimplexTraits<dim,dim>::SimplexIDType& xIN,const int& regionID);
128
129 std::pair<bool,const Simplex<_dim,_dim>*> search(const Eigen::Matrix<double,dim,1>& P) const;
130
131 std::pair<bool,const Simplex<_dim,_dim>*> searchWithGuess(const Eigen::Matrix<double,dim,1>& P,
132 const Simplex<dim,dim>* const guess) const;
133
134 std::pair<bool,const Simplex<_dim,_dim>*> searchRegion(const int& regionID,
135 const Eigen::Matrix<double,dim,1>& P) const;
136
137 std::pair<bool,const Simplex<_dim,_dim>*> searchRegionWithGuess(const Eigen::Matrix<double,dim,1>& P,
138 const Simplex<dim,dim>* const guess) const;
139
140 std::pair<bool,const Simplex<_dim,_dim>*> searchWithGuess(const bool& searchAllRegions,
141 const Eigen::Matrix<double,dim,1>& P,
142 const Simplex<dim,dim>* const guess,
143 std::set<const Simplex<dim,dim>*>& searchSet) const;
144 void checkSearch(const bool& searchAllRegions,
145 const Eigen::Matrix<double,dim,1>& P,
146 const Simplex<dim,dim>* const guess,
147 const std::pair<bool,const Simplex<dim,dim>*>& lastSearched) const;
148 std::pair<bool,const Simplex<_dim,_dim>*> isStrictlyInsideMesh(const Eigen::Matrix<double,dim,1>& P,
149 const Simplex<dim,dim>* const guess,
150 const double& tol) const;
151 std::pair<bool,const Simplex<_dim,_dim>*> isOnMeshBoundary(const Eigen::Matrix<double,dim,1>& P, const Simplex<dim,dim>* const guess, const double& tol) const;
152 const Eigen::Matrix<double,_dim,1>& xMin() const;
153 const double& xMin(const int& k) const;
154 const Eigen::Matrix<double,_dim,1>& xMax() const;
155 const double& xMax(const int& k) const;
156 const Eigen::Matrix<double,_dim,1>& xCenter() const;
157 const double& volume() const;
160 const MeshRegionBoundaryType& regionBoundary(const int& i,const int& j) const;
161
162 };
163
164}
165#endif
A class template.
Definition IDreader.h:55
const double & xMax(const int &k) const
Eigen::Matrix< double, dim, Eigen::Dynamic > PeriodicBasisType
const Eigen::Matrix< double, _dim, 1 > & xMax() const
std::pair< bool, const Simplex< _dim, _dim > * > searchRegion(const int &regionID, const Eigen::Matrix< double, dim, 1 > &P) const
void identifyParallelFaces(const std::set< int > &)
std::pair< bool, const Simplex< _dim, _dim > * > isOnMeshBoundary(const Eigen::Matrix< double, dim, 1 > &P, const Simplex< dim, dim > *const guess, const double &tol) const
MeshRegionBoundary< dim > MeshRegionBoundaryType
std::pair< bool, const Simplex< _dim, _dim > * > searchWithGuess(const Eigen::Matrix< double, dim, 1 > &P, const Simplex< dim, dim > *const guess) const
IDreader< 1, dim+2, size_t > ElementReaderType
Polyhedron< dim, dim > MeshRegionType
static constexpr int dim
const PolyhedralMesh< _dim > & polyhedralMesh() const
const Eigen::Matrix< double, _dim, 1 > & xMin() const
const PeriodicSimplexPairMap< dim > & periodicSimplexPairs() const
const SimplexMapType & simplices() const
const double & xMin(const int &k) const
const auto & simplexFactory() const
std::map< typename SimplexTraits< dim, dim >::SimplexIDType, std::shared_ptr< Simplex< dim, dim > > > SimplexMapType
const MeshRegionBoundaryType & regionBoundary(const int &i, const int &j) const
std::pair< size_t, size_t > MeshRegionIDType
SimplicialMesh(const std::string &meshFileName, const Eigen::Matrix< double, dim, dim > &A, const Eigen::Matrix< double, dim, 1 > &x0, const std::set< int > &)
std::pair< bool, const Simplex< _dim, _dim > * > isStrictlyInsideMesh(const Eigen::Matrix< double, dim, 1 > &P, const Simplex< dim, dim > *const guess, const double &tol) const
Eigen::Matrix< double, dim, Eigen::Dynamic > periodicBasis() const
std::shared_ptr< Polyhedron< _dim, _dim > > getSharedRegion(size_t id)
const MeshRegionBoundaryContainerType & regionBoundaries() const
const Eigen::Matrix< double, _dim, 1 > & xCenter() const
Polyhedron< _dim, _dim > * region(const size_t &id)
std::pair< bool, const Simplex< _dim, _dim > * > searchRegionWithGuess(const Eigen::Matrix< double, dim, 1 > &P, const Simplex< dim, dim > *const guess) const
void readMesh(const std::string &meshFileName, const Eigen::Matrix< double, dim, dim > &A, const Eigen::Matrix< double, dim, 1 > &x0, const std::set< int > &)
const auto & regions() const
MeshRegionBoundaryContainerType & regionBoundaries()
std::weak_ptr< const int > lifetimeToken() const
std::pair< bool, const Simplex< _dim, _dim > * > search(const Eigen::Matrix< double, dim, 1 > &P) const
std::pair< bool, const Simplex< _dim, _dim > * > searchWithGuess(const bool &searchAllRegions, const Eigen::Matrix< double, dim, 1 > &P, const Simplex< dim, dim > *const guess, std::set< const Simplex< dim, dim > * > &searchSet) const
const Polyhedron< _dim, _dim > * region(const size_t &id) const
void insertSimplex(const typename SimplexTraits< dim, dim >::SimplexIDType &xIN, const int &regionID)
void checkSearch(const bool &searchAllRegions, const Eigen::Matrix< double, dim, 1 > &P, const Simplex< dim, dim > *const guess, const std::pair< bool, const Simplex< dim, dim > * > &lastSearched) const
SimplexMapType & simplices()
std::map< MeshRegionIDType, MeshRegionBoundaryType > MeshRegionBoundaryContainerType
const double & volume() const
function infiniteDisplacement syms Ax Ay Az Bx By Bz qx qy qz u L x y z real A
std::map< const Simplex< dim, dim-1 > *, PeriodicSimplexPair< dim > > PeriodicSimplexPairMap
SimplexID< nVertices > SimplexIDType
int j
int k
int i