Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
Polycrystal.cpp
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_Polycrystal_cpp_
9#define model_Polycrystal_cpp_
10
11#include <filesystem>
12#include <string> // std::string
13#include <iostream> // std::cout
14#include <sstream>
15#include <utility>
16#include <tuple>
17#include <map>
18#include <vector>
19#include <deque>
20#include <tuple>
21#include <chrono>
22#include <random>
23#include <memory>
24#include <Eigen/Core>
25#include <SimplicialMesh.h>
26
27#include <Grain.h>
28#include <GrainBoundary.h>
29#include <LatticeVector.h>
30#include <TextFileParser.h>
31#include <Polycrystal.h>
32
33namespace model
34{
35
36 template <int dim>
37 Polycrystal<dim>::Polycrystal(const std::string& polyFile,
38 const SimplicialMeshType& mesh_in) :
39 /* init */ PolycrystallineMaterialBase(std::filesystem::path(polyFile).parent_path().string()+"/"+TextFileParser(polyFile).readString("materialFile",false),
40 TextFileParser(polyFile).readScalar<double>("absoluteTemperature",true))
41 /* init */,mesh(mesh_in)
42 /* init */,grains(getGrains(polyFile))
43 /* init */,grainBoundaries(getGrainBoundaries())
44 /* init */,Omega(getAtomicVolume())
45 {
46 std::cout<<greenBoldColor<<"Created Polycrystal"<<defaultColor<<std::endl;
47 StaticID<Lattice<dim>>::force_count(0);
48 StaticID<Polyhedron<dim,dim-1>>::force_count(0);
49 }
50
51
52 template <int dim>
53 typename Polycrystal<dim>::GrainContainerType Polycrystal<dim>::getGrains(const std::string& polyFile) const
54 {
56 for(const auto& rIter : mesh.regions())
57 {
58 std::cout<<greenBoldColor<<"Creating Grain "<<rIter.second->regionID<<defaultColor<<std::endl;
59 StaticID<Lattice<dim>>::set_count(rIter.second->regionID);
60 const auto success(temp.emplace(rIter.second->regionID,std::shared_ptr<Grain<dim>>(new Grain<dim>(*rIter.second,*this,polyFile))));
61 if(!success.second)
62 {
63 throw std::runtime_error("Cound not insert grain "+std::to_string(rIter.second->regionID));
64 }
65 }
66
67 for(const auto& rgnBnd : mesh.regionBoundaries())
68 {// loop over region boundaries
69 for(const auto& face : rgnBnd.second.faces())
70 {// loop over faces of each region boundary
71
72
73 std::shared_ptr<GrainBoundary<dim>> gb(new GrainBoundary<dim>(rgnBnd.second,
74 face.second,
75 *grain(rgnBnd.first.first),
76 *grain(rgnBnd.first.second)));
77
78 temp.at(rgnBnd.first.first )->grainBoundaries().emplace(rgnBnd.first,gb);
79 temp.at(rgnBnd.first.second)->grainBoundaries().emplace(rgnBnd.first,gb);
80 }
81 }
82 return temp;
83 }
84
85 template <int dim>
86 double Polycrystal<dim>::getAtomicVolume() const
87 {
88 const double omg0(grains.begin()->second->latticeBasis.determinant());
89 for(const auto& grain : grains)
90 {
91 const double omg(grain.second->latticeBasis.determinant());
92 if(std::fabs(omg-omg0)>FLT_EPSILON)
93 {
94 throw std::runtime_error("grains have different atomic volume");
95 }
96 }
97
98 return omg0/this->atomsPerUnitCell;
99 }
100
101 template <int dim>
102 std::map<std::pair<size_t,size_t>,const GrainBoundary<dim>* const> Polycrystal<dim>::getGrainBoundaries() const
103 {
104 std::map<std::pair<size_t,size_t>,const GrainBoundaryType* const> temp;
105
106 for(const auto& grain : grains)
107 {
108 for(const auto& gb : grain.second->grainBoundaries())
109 {
110 temp.emplace(gb.first,gb.second.get());
111 }
112 }
113
114 return temp;
115 }
116
117 template <int dim>
118 const std::shared_ptr<typename Polycrystal<dim>::GrainType>& Polycrystal<dim>::grain(const size_t& k) const
119 {
120 return grains.at(k);
121 }
122
123 template <int dim>
125 const size_t& j) const
126 {
127 return (i<j)? *grainBoundaries.at(std::make_pair(i,j)) : *grainBoundaries.at(std::make_pair(j,i));
128 }
129
130 template <int dim>
132 const Simplex<dim,dim>* const guess) const
133 {
134 const std::pair<bool,const Simplex<dim,dim>*> temp(mesh.searchWithGuess(p,guess));
135 assert(temp.first && "Position not found in mesh");
136 return grain(temp.second->region->regionID)->latticeVector(p);
137 }
138
139 template <int dim>
141 {
142 return latticeVectorFromPosition(p,mesh.simplices().begin()->second.get());
143 }
144
145 template <int dim>
147 const Simplex<dim,dim>* const guess) const
148 {
149 const std::pair<bool,const Simplex<dim,dim>*> temp(mesh.searchWithGuess(p,guess));
150 assert(temp.first && "Position not found in mesh");
151 return grain(temp.second->region->regionID)->reciprocalLatticeVector(p);
152 }
153
154 template <int dim>
159
160 template <int dim>
162 {
163 std::mt19937 generator(std::chrono::system_clock::now().time_since_epoch().count());
164 std::uniform_real_distribution<double> distribution(0.0,1.0);
165
166 VectorDim P0(VectorDim::Zero());
167
168 P0 << mesh.xMin(0)+distribution(generator)*(mesh.xMax(0)-mesh.xMin(0)),
169 /* */ mesh.xMin(1)+distribution(generator)*(mesh.xMax(1)-mesh.xMin(1)),
170 /* */ mesh.xMin(2)+distribution(generator)*(mesh.xMax(2)-mesh.xMin(2));
171
172 return P0;
173 }
174
175 template <int dim>
176 std::pair<LatticeVector<dim>,int> Polycrystal<dim>::randomLatticePointInMesh() const
177 {
178 const VectorDim P0=randomPoint();
179 auto searchResult=mesh.search(P0);
180 if(searchResult.first)
181 {// point inside
182 const LatticeVector<dim> L0 = grain(searchResult.second->region->regionID)->snapToLattice(P0);
183 searchResult=mesh.searchRegionWithGuess(L0.cartesian(),searchResult.second);
184 if(searchResult.first)
185 {// point inside
186 return std::make_pair(L0,searchResult.second->region->regionID);
187 }
188 else
189 {
191 }
192 }
193 else
194 {
196 }
197
198 }
199
200 template class Polycrystal<3>;
201}
202#endif
203
GrainBoundary< dim > GrainBoundaryType
Definition Polycrystal.h:46
const double Omega
Definition Polycrystal.h:58
const GrainBoundaryType & grainBoundary(const size_t &i, const size_t &j) const
SimplicialMesh< dim > SimplicialMeshType
Definition Polycrystal.h:39
ReciprocalLatticeVector< dim > ReciprocalLatticeVectorType
Definition Polycrystal.h:43
std::pair< LatticeVector< dim >, int > randomLatticePointInMesh() const
const SimplicialMeshType & mesh
Definition Polycrystal.h:55
LatticeVector< dim > LatticeVectorType
Definition Polycrystal.h:42
Eigen::Matrix< double, dim, 1 > VectorDim
Definition Polycrystal.h:44
const std::shared_ptr< GrainType > & grain(const size_t &k) const
LatticeVectorType latticeVectorFromPosition(const VectorDim &p, const Simplex< dim, dim > *const guess) const
ReciprocalLatticeVectorType reciprocalLatticeVectorFromPosition(const VectorDim &p, const Simplex< dim, dim > *const guess) const
std::map< size_t, std::shared_ptr< Grain< dim > > > GrainContainerType
Definition Polycrystal.h:47
const std::map< size_t, std::shared_ptr< Grain< dim > > > grains
Definition Polycrystal.h:56
VectorDim randomPoint() const
const std::map< std::pair< size_t, size_t >, const GrainBoundaryType *const > grainBoundaries
Definition Polycrystal.h:57
Polycrystal(const std::string &polyFile, const SimplicialMeshType &mesh_in)
A class template that implements a counter of the number of instances of Derived type that are create...
Definition StaticID.h:29
size_t InstanceCount< Derived >::count
static std::string greenBoldColor
static std::string defaultColor
int regions
Definition triangle.cpp:696
PolycrystallineMaterialBase(const std::string &fileName, const double &absoluteTemperature)
int j
vertex p[3]
int k
char infilename char * string
enum insertvertexresult success
int i
vertex temp