8#ifndef model_SphericalInclusionsGenerator_cpp_
9#define model_SphericalInclusionsGenerator_cpp_
18#include <Eigen/Cholesky>
25#include <LatticeModule.h>
53 if(spec.targetDensity>0)
64 std::lognormal_distribution<double> distribution(log(spec.diameterLognormalDistribution_M/spec.diameterLognormalDistribution_A),spec.diameterLognormalDistribution_S);
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());
71 std::mt19937 generator;
73 while(density<spec.targetDensity)
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);
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;
90 if(generateSingle(mg,P,radius,spec.crystalEigenDistortion,spec.velocityReductionFactor,spec.phaseID,spec.allowOutside,spec.allowOverlap))
93 std::cout<<
"inclusion density="<<density<<std::endl;
117 if(spec.radii_SI.size())
120 for(
size_t k=0;
k<spec.radii_SI.size();++
k)
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))
124 std::cout<<
"generated inclusion"<<std::endl;
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)
135 if(!searchPair.first)
137 std::cout <<
"Spherical inclusion center outside mesh; cannot determine crystal frame; not generated\n";
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();
146 bool isInside(allowOutside);
166 bool isOutsidePrecipitates(
true);
169 isOutsidePrecipitates=(isOutsidePrecipitates && ((
C-incl.C).norm()>R+incl.a));
171 if(isOutsidePrecipitates)
184 std::cout<<
"Inclusion outside mesh"<<std::endl;
const std::vector< SphericalInclusionIO< dim > > & sphericalInclusions() const
DefectiveCrystalBase< 3 > & ddBase
const DefectiveCrystalConfigIO< 3 > & config() const
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