8#ifndef model_Polycrystal_cpp_
9#define model_Polycrystal_cpp_
29#include <LatticeVector.h>
40 TextFileParser(polyFile).readScalar<double>(
"absoluteTemperature",true))
42 ,
grains(getGrains(polyFile))
44 ,
Omega(getAtomicVolume())
63 throw std::runtime_error(
"Cound not insert grain "+std::to_string(rIter.second->regionID));
67 for(
const auto& rgnBnd :
mesh.regionBoundaries())
69 for(
const auto& face : rgnBnd.second.faces())
75 *grain(rgnBnd.first.first),
76 *grain(rgnBnd.first.second)));
78 temp.at(rgnBnd.first.first )->grainBoundaries().emplace(rgnBnd.first,gb);
79 temp.at(rgnBnd.first.second)->grainBoundaries().emplace(rgnBnd.first,gb);
86 double Polycrystal<dim>::getAtomicVolume()
const
88 const double omg0(
grains.begin()->second->latticeBasis.determinant());
89 for(
const auto& grain : grains)
91 const double omg(grain.second->latticeBasis.determinant());
92 if(std::fabs(omg-omg0)>FLT_EPSILON)
94 throw std::runtime_error(
"grains have different atomic volume");
98 return omg0/this->atomsPerUnitCell;
102 std::map<std::pair<size_t,size_t>,
const GrainBoundary<dim>*
const> Polycrystal<dim>::getGrainBoundaries()
const
104 std::map<std::pair<size_t,size_t>,
const GrainBoundaryType*
const>
temp;
106 for(
const auto& grain : grains)
108 for(
const auto& gb : grain.second->grainBoundaries())
110 temp.emplace(gb.first,gb.second.get());
125 const size_t&
j)
const
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);
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);
163 std::mt19937 generator(std::chrono::system_clock::now().time_since_epoch().
count());
164 std::uniform_real_distribution<double> distribution(0.0,1.0);
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));
179 auto searchResult=
mesh.search(P0);
180 if(searchResult.first)
183 searchResult=
mesh.searchRegionWithGuess(L0.
cartesian(),searchResult.second);
184 if(searchResult.first)
186 return std::make_pair(L0,searchResult.second->region->regionID);
VectorDimD cartesian() const
GrainBoundary< dim > GrainBoundaryType
const GrainBoundaryType & grainBoundary(const size_t &i, const size_t &j) const
SimplicialMesh< dim > SimplicialMeshType
ReciprocalLatticeVector< dim > ReciprocalLatticeVectorType
std::pair< LatticeVector< dim >, int > randomLatticePointInMesh() const
const SimplicialMeshType & mesh
LatticeVector< dim > LatticeVectorType
Eigen::Matrix< double, dim, 1 > VectorDim
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
const std::map< size_t, std::shared_ptr< Grain< dim > > > grains
VectorDim randomPoint() const
const std::map< std::pair< size_t, size_t >, const GrainBoundaryType *const > grainBoundaries
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...
size_t InstanceCount< Derived >::count
static std::string greenBoldColor
static std::string defaultColor
PolycrystallineMaterialBase(const std::string &fileName, const double &absoluteTemperature)
char infilename char * string
enum insertvertexresult success