Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
SphericalInclusionsGenerator.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_SphericalInclusionsGenerator_cpp_
9#define model_SphericalInclusionsGenerator_cpp_
10
11
12#include <chrono>
13#include <random>
14#include <cmath>
15#include <list>
16#include <assert.h>
17#include <Eigen/LU>
18#include <Eigen/Cholesky>
19#include <limits>
20
21//#include <Simplex.h>
22#include <SimplicialMesh.h>
23#include <Polycrystal.h>
25#include <LatticeModule.h>
26//#include <PlaneMeshIntersection.h>
33
35#include <TextFileParser.h>
37#include <MeshBoundarySegment.h>
38//#include <ConfinedDislocationObject.h>
39#include <GlidePlaneModule.h>
40#include <MeshModule.h>
41#include <Plane.h>
45
46namespace model
47{
48
50 {
51 std::cout<<magentaBoldColor<<"Generating Spherical Inclusions Density"<<defaultColor<<std::endl;
52 // const double targetInclusionDensity(this->parser.readScalar<double>("targetDensity",true));
53 if(spec.targetDensity>0)
54 {
55 // const double inclusionsDiameterLognormalDistribution_M(this->parser.readScalar<double>("diameterLognormalDistribution_M",true) );
56 // const double inclusionsDiameterLognormalDistribution_S(this->parser.readScalar<double>("diameterLognormalDistribution_S",true));
57 // const double inclusionsDiameterLognormalDistribution_A(this->parser.readScalar<double>("diameterLognormalDistribution_A",true));
58 // const Eigen::Matrix<double,1,dim*dim> inclusionsTransformationEigenDistortion(this->parser.readMatrix<double>("crystalEigenDistortion",1,dim*dim,true));
59 // const Eigen::Matrix<double,1,dim> patternVector(this->parser.readMatrix<double>("patternVector",1,dim,true)/mg.ddBase.poly.b_SI);
60 // const double velocityReductionFactor(this->parser.readScalar<double>("velocityReductionFactor",true));
61 // const int phaseIDs(this->parser.readScalar<int>("phaseID",true));
62
63
64 std::lognormal_distribution<double> distribution(log(spec.diameterLognormalDistribution_M/spec.diameterLognormalDistribution_A),spec.diameterLognormalDistribution_S);
65
66 const VectorDimD patternVector(spec.patternVector_SI/mg.ddBase.poly.b_SI);
67 const double patternHeigth(patternVector.norm());
68 const bool applyPattern(patternHeigth>0.0);
69 const VectorDimD patternDir(applyPattern? (patternVector/patternHeigth).eval() : VectorDimD::Zero());
70
71 std::mt19937 generator;
72 double density(0.0);
73 while(density<spec.targetDensity)
74 {
75
76 const double diameter = distribution(generator)*spec.diameterLognormalDistribution_A/mg.ddBase.poly.b_SI;
77 const double radius(0.5*diameter);
78 std::pair<LatticeVector<dim>,int> pointPair=mg.ddBase.poly.randomLatticePointInMesh();
79 VectorDimD P=pointPair.first.cartesian();
80 const int& grainID(pointPair.second);
81
82 if(applyPattern)
83 {
84 const VectorDimD globalVector(mg.ddBase.poly.grain(grainID)->C2G*patternVector);
85 const VectorDimD globalDir(mg.ddBase.poly.grain(grainID)->C2G*patternDir);
86 const long long pointHeigth=std::round(P.dot(globalDir)/patternHeigth);
87 const VectorDimD O(pointHeigth*globalVector);
88 P-=(P-O).dot(globalDir)*globalDir;
89 }
90 if(generateSingle(mg,P,radius,spec.crystalEigenDistortion,spec.velocityReductionFactor,spec.phaseID,spec.allowOutside,spec.allowOverlap))
91 {
92 density+=1.0/mg.ddBase.mesh.volume()/std::pow(mg.ddBase.poly.b_SI,3);
93 std::cout<<"inclusion density="<<density<<std::endl;
94 }
95
96
97 }
98
99
100 // const double patternHeigth(currentPattern.norm());
101 // const bool applyPattern(patternHeigth>0.0);
102
103
104 // const double inclusionsDiameterLognormalDistribution_S(isInclusionsUsed()? TextFileParser("./inputFiles/initialMicrostructure.txt").readArray<double>("inclusionsDiameterLognormalDistribution_S",true) : std::vector<double>())
105 // const double inclusionsDiameterLognormalDistribution_A(isInclusionsUsed()? TextFileParser("./inputFiles/initialMicrostructure.txt").readArray<double>("inclusionsDiameterLognormalDistribution_A",true) : std::vector<double>())
106 // const double inclusionsTransformationStrains(isInclusionsUsed()? TextFileParser("./inputFiles/initialMicrostructure.txt").readMatrix<double>("inclusionsTransformationStrains",targetInclusionDensities.size(),MicrostructureGenerator::dim*MicrostructureGenerator::dim,true) : Eigen::Matrix<double,Eigen::Dynamic,MicrostructureGenerator::dim*MicrostructureGenerator::dim>::Zero(1,MicrostructureGenerator::dim*MicrostructureGenerator::dim))
107 // const double patternVectors(isInclusionsUsed()? TextFileParser("./inputFiles/initialMicrostructure.txt").readMatrix<double>("patternVectors",targetInclusionDensities.size(),MicrostructureGenerator::dim,true) : Eigen::Matrix<double,Eigen::Dynamic,MicrostructureGenerator::dim>::Zero(1,MicrostructureGenerator::dim))
108
109 }
110 }
111
113 {
114 // const std::vector<double> inclusionRadii_SI(this->parser.readArray<double>("inclusionRadii_SI",true));
115
116 std::cout<<magentaBoldColor<<"Generating Individual Sperical Inclusions"<<defaultColor<<std::endl;
117 if(spec.radii_SI.size())
118 {
119
120 for(size_t k=0;k<spec.radii_SI.size();++k)
121 {
122 if(generateSingle(mg,spec.centers.row(k),spec.radii_SI[k]/mg.ddBase.poly.b_SI,spec.crystalEigenDistortions.row(k),spec.velocityReductionFactors[k],spec.phaseIDs[k],spec.allowOutside,spec.allowOverlap))
123 {
124 std::cout<<"generated inclusion"<<std::endl;
125 }
126 }
127 }
128
129 }
130
131 bool SphericalInclusionsGenerator::generateSingle(MicrostructureGenerator& mg,const VectorDimD& C,const double& R, const Eigen::Matrix<double,1,dim*dim>& eTrow, const double& vrc,const int&type, const bool& allowOutside, const bool& allowOverlap)
132 {
133
134 const auto searchPair = mg.ddBase.mesh.search(C);
135 if(!searchPair.first)
136 {
137 std::cout << "Spherical inclusion center outside mesh; cannot determine crystal frame; not generated\n";
138 return false;
139 }
140 const auto &C2G = mg.ddBase.poly.grain(searchPair.second->region->regionID)->C2G;
141 const Eigen::Matrix<double,dim,dim> crystalET(
142 Eigen::Map<const Eigen::Matrix<double,dim,dim>>(eTrow.data()).transpose());
143 const Eigen::Matrix<double,dim,dim> eT = C2G * crystalET * C2G.transpose();
144
145
146 bool isInside(allowOutside);
147 if(!isInside)
148 {
149 isInside=( mg.ddBase.mesh.search(C+VectorDimD::UnitX()*R).first
150 && mg.ddBase.mesh.search(C-VectorDimD::UnitX()*R).first
151 && mg.ddBase.mesh.search(C+VectorDimD::UnitY()*R).first
152 && mg.ddBase.mesh.search(C-VectorDimD::UnitY()*R).first
153 && mg.ddBase.mesh.search(C+VectorDimD::UnitZ()*R).first
154 && mg.ddBase.mesh.search(C-VectorDimD::UnitZ()*R).first);
155 }
156
157 if(isInside)
158 {
159 if(allowOverlap)
160 {
161 mg.insertInclusion(C,R,eT,vrc,type);
162 return true;
163 }
164 else
165 {
166 bool isOutsidePrecipitates(true);
167 for(const auto& incl : mg.config().sphericalInclusions())
168 {
169 isOutsidePrecipitates=(isOutsidePrecipitates && ((C-incl.C).norm()>R+incl.a));
170 }
171 if(isOutsidePrecipitates)
172 {
173 mg.insertInclusion(C,R,eT,vrc,type);
174 return true;
175 }
176 else
177 {
178 return false;
179 }
180 }
181 }
182 else
183 {
184 std::cout<<"Inclusion outside mesh"<<std::endl;
185 return false;
186 }
187 }
188
189}
190#endif
const std::vector< SphericalInclusionIO< dim > > & sphericalInclusions() const
DefectiveCrystalBase< 3 > & ddBase
size_t insertInclusion(const VectorDimD &pos, const double &R, const Eigen::Matrix< double, dim, dim > &eT, const double &vrc, const int &type)
std::pair< bool, const Simplex< _dim, _dim > * > search(const Eigen::Matrix< double, dim, 1 > &P) const
const double & volume() const
SphericalInclusionsGenerator(const SphericalInclusionDensitySpecification &spec, MicrostructureGenerator &mg)
auto eval(const std::shared_ptr< T > &t)
static std::string defaultColor
static std::string magentaBoldColor
const Polycrystal< dim > & poly
const SimplicialMesh< dim > & mesh
int k
vertex first