8#ifndef model_MicrostructureGenerator_cpp_
9#define model_MicrostructureGenerator_cpp_
46,
configIO(ddBase_in.simulationParameters.traitsIO.configFolder)
47,
auxIO(ddBase_in.simulationParameters.traitsIO.auxFolder)
55 if(
ddBase.mesh.volume()<FLT_EPSILON)
57 throw std::runtime_error(
"mesh "+ddBase.simulationParameters.traitsIO.meshFile+
" is empty.");
80 ddBase.dislocationDynamics();
86 ddBase.dislocationDynamics();
92 ddBase.dislocationDynamics();
98 ddBase.dislocationDynamics();
104 ddBase.dislocationDynamics();
110 ddBase.dislocationDynamics();
116 ddBase.dislocationDynamics();
122 ddBase.dislocationDynamics();
128 ddBase.dislocationDynamics();
134 ddBase.dislocationDynamics();
165 ddBase.dislocationDynamics();
186 for(
const auto& pair : microstructureFiles)
188 const std::string microstructureFileName(std::filesystem::path(
ddBase.simulationParameters.traitsIO.microstructureFile).parent_path().string()+
"/"+
StrUtilities::removeSpaces(pair.first));
192 if(type==
"ShearLoop")
194 if(style==
"Density" || style==
"density")
199 else if(style==
"Individual" || style==
"individual")
206 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
209 else if(type==
"PeriodicDipole")
211 if(style==
"Density" || style==
"density")
216 else if(style==
"Individual" || style==
"individual")
223 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
226 else if(type==
"PrismaticLoop")
228 if(style==
"Density" || style==
"density")
233 else if(style==
"Individual" || style==
"individual")
240 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
243 else if(type==
"FrankLoops")
245 if(style==
"Density" || style==
"density")
250 else if(style==
"Individual" || style==
"individual")
257 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
260 else if(type==
"StackingFaultTetrahedra" || type==
"StackingFaultTetrahedron")
262 if(style==
"Density" || style==
"density")
267 else if(style==
"Individual" || style==
"individual")
274 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
277 else if(type==
"SphericalInclusions")
279 if(style==
"Density" || style==
"density")
284 else if(style==
"Individual" || style==
"individual")
291 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
294 else if(type==
"EllipsoidalInclusions")
296 if(style==
"Density" || style==
"density")
301 else if(style==
"Individual" || style==
"individual")
308 throw std::runtime_error(
"Unknown style "+style+
" for "+type);
311 else if(type==
"PolyhedronInclusions")
313 if(style==
"Density" || style==
"density")
315 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
319 else if(style==
"Individual" || style==
"individual")
326 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
329 else if(type==
"PlanarLoop")
331 if(style==
"Individual" || style==
"individual")
338 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
341 else if(type==
"CircularCrack")
343 if(style==
"Individual" || style==
"individual")
350 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
353 else if(type==
"CrackMesh")
355 if(style==
"Individual" || style==
"individual")
362 throw std::runtime_error(
"Unkown style "+style+
" for "+type);
367 throw std::runtime_error(
"Unkown microstructure type "+type+
".");
374 return ddBase.simulationParameters.traitsIO;
400 const VectorDimD& unitNormal,
401 const VectorDimD& P0,
402 const size_t& grainID,
405 ddBase.dislocationDynamics();
406 if(loopNodePos.size()<3)
410 std::vector<PolyPoint> dummyPolyPoints(loopNodePos.size());
411 std::vector<std::pair<VectorDimD, const PolyPoint *const>> loopNodePosTemp;
412 for(
size_t k=0;
k<loopNodePos.size();++
k)
414 loopNodePosTemp.emplace_back(loopNodePos[
k], &dummyPolyPoints[
k]);
416 const auto ppi(periodicPlane->polygonPatchIntersection(loopNodePosTemp,
true));
424 std::vector<double> retainedLength(loopNodePos.size(),0.0);
425 for(
size_t k=0;
k<ppi.size();++
k)
427 const auto& provenance=std::get<6>(ppi[
k]);
428 if(provenance.incomingOriginalSegment)
430 retainedLength.at(provenance.incomingOriginalSegment->sourceIndex)+=
431 (std::get<0>(ppi[
k])-std::get<0>(ppi[(
k+ppi.size()-1)%ppi.size()])).norm();
434 for(
size_t k=0;
k<loopNodePos.size();++
k)
436 const double length=(loopNodePos[(
k+1)%loopNodePos.size()]-loopNodePos[
k]).norm();
437 if(std::abs(retainedLength[
k]-length)>1.e-8*std::max(1.0,length))
442 const size_t loopID(
insertLoop(
b,unitNormal,P0,grainID,loopType));
443 std::vector<size_t> loopNodeIDs;
444 for(
const auto &tup : ppi)
446 const VectorDimD loopNodePos(periodicPlane->referencePlane->globalPosition(std::get<0>(tup)));
447 const VectorDimD networkNodePos(loopNodePos+std::get<1>(tup));
461 ddBase.dislocationDynamics();
462 const size_t loopID(
configIO.loops().size());
463 configIO.loops().emplace_back(loopID,
b,unitNormal,P0,grainID,loopType);
467size_t MicrostructureGenerator::insertLoopNode(
const size_t& loopID,
const VectorDimD& loopNodePos,
const size_t& networkNodeID,
const VectorDimD& loopNodeShift,
const std::pair<short int,short int>& periodicEdgeIDs)
469 ddBase.dislocationDynamics();
470 const size_t loopNodeID(
configIO.loopNodes().size());
471 configIO.loopNodes().emplace_back(loopNodeID,loopID,loopNodePos,networkNodeID,loopNodeShift,periodicEdgeIDs);
477 ddBase.dislocationDynamics();
478 std::vector<size_t>
temp;
479 for(
size_t k=0;
k<loopNodeIDs.size();++
k)
481 const size_t k1=(
k+1)<loopNodeIDs.size()?
k+1 : 0;
483 const size_t sourceNodeID(loopNodeIDs[
k ]);
484 const size_t sinkNodeID(loopNodeIDs[k1]);
485 const auto sourceNode(
configIO.loopNodes()[sourceNodeID]);
486 const auto sinkNode(
configIO.loopNodes()[sinkNodeID]);
487 configIO.loopLinks().emplace_back(loopID,sourceNodeID,sinkNodeID,(sourceNode.P-sinkNode.P).norm()>FLT_EPSILON,0);
494 ddBase.dislocationDynamics();
495 const size_t networkNodeID(
configIO.nodes().size());
497 return networkNodeID;
505 const auto scan=[&](
const auto& inclusions)
507 for(
const auto& inclusion : inclusions)
509 if(inclusion.inclusionID==std::numeric_limits<size_t>::max())
511 throw std::overflow_error(
"Inclusion IDs exhausted");
513 next=std::max(next,inclusion.inclusionID+1);
524 const Eigen::Matrix3d& eT,
const double& vrc,
const int& type)
526 const size_t inclusionID=nextInclusionID(
configIO);
527 configIO.ellipsoidalInclusions().emplace_back(inclusionID,pos,axes,eT,vrc,type);
533 const size_t inclusionID(nextInclusionID(
configIO));
534 configIO.sphericalInclusions().emplace_back(inclusionID,pos,R,eT,vrc,type);
538size_t MicrostructureGenerator::insertInclusion(
const std::map<size_t,Eigen::Vector3d>& polyNodes,
const std::map<
size_t,std::vector<size_t>>& faceMap,
const Eigen::Matrix<double,dim,dim>& eT,
const double& vrc,
const int&type)
540 const size_t inclusionID(nextInclusionID(
configIO));
541 configIO.polyhedronInclusions().emplace_back(inclusionID,eT,vrc,type);
543 const size_t startNodeID(
configIO.polyhedronInclusionNodes().size());
545 size_t nodeCounter(0);
546 for(
const auto& node : polyNodes)
548 configIO.polyhedronInclusionNodes().emplace_back(startNodeID+nodeCounter,node.second);
552 for(
const auto& pair : faceMap)
554 const size_t& faceID(pair.first);
555 for(
size_t k=0;
k<pair.second.size();++
k)
557 const size_t k1(
k<pair.second.size()-1?
k+1 : 0);
560 const auto sourceIter(polyNodes.find(pair.second[
k]));
561 const auto sinkIter(polyNodes.find(pair.second[k1]));
562 if(sourceIter!=polyNodes.end() && sinkIter!=polyNodes.end())
564 const size_t sourceID(startNodeID +std::distance(polyNodes.begin(),sourceIter));
565 const size_t sinkID(startNodeID +std::distance(polyNodes.begin(),sinkIter));
566 configIO.polyhedronInclusionEdges().emplace_back(inclusionID,faceID,sourceID,sinkID);
570 std::cout<<
"inclusionID="<<inclusionID<<std::endl;
571 std::cout<<
"faceID="<<faceID<<std::endl;
572 std::cout<<
"node "<<pair.second[
k]<<
" found? "<<(sourceIter!=polyNodes.end())<<std::endl;
573 std::cout<<
"node "<<pair.second[k1]<<
" found? "<<(sinkIter!=polyNodes.end())<<std::endl;
574 throw std::runtime_error(
"Cannot insert polyhedronInclusionEdge.");
583 ddBase.dislocationDynamics();
591 throw std::runtime_error(
"CrackMeshGenerator::generateSingle:: crack nodes outside mesh.");
603 auxIO.writeBin(fileID);
609 auxIO.writeTxt(fileID);
616 for(
const auto& point : points)
618 temp*=
ddBase.mesh.searchRegion(grainID,point).first;
629 const auto* guess=
ddBase.mesh.simplices().begin()->second.get();
631 for(
const auto& point : points)
633 const auto pair(
ddBase.mesh.searchWithGuess(point,guess));
const std::vector< SphericalInclusionIO< dim > > & sphericalInclusions() const
const std::vector< PolyhedronInclusionIO< dim > > & polyhedronInclusions() const
const std::vector< EllipsoidalInclusionIO< dim > > & ellipsoidalInclusions() const
void addFrankLoopsIndividual(const FrankLoopsIndividualSpecification &spec)
size_t insertNetworkNode(const VectorDimD &networkNodePos)
void addPrismaticLoopIndividual(const PrismaticLoopIndividualSpecification &spec)
void addSphericalInclusionIndividual(const SphericalInclusionIndividualSpecification &spec)
size_t insertLoopNode(const size_t &loopID, const VectorDimD &loopNodePos, const size_t &networkNodeID, const VectorDimD &loopNodeShift, const std::pair< short int, short int > &periodicEdgeIDs)
void addSphericalInclusionDensity(const SphericalInclusionDensitySpecification &spec)
void addPeriodicDipoleDensity(const PeriodicDipoleDensitySpecification &spec)
void addPlanarLoopIndividual(const PlanarLoopIndividualSpecification &spec)
bool insertJunctionLoop(const std::vector< VectorDimD > &loopNodePos, const std::shared_ptr< PeriodicGlidePlane< 3 > > &periodicPlane, const VectorDimD &b, const VectorDimD &unitNormal, const VectorDimD &P0, const size_t &grainID, const DislocationLoopIO< dim >::DislocationLoopType &loopType)
std::vector< size_t > insertLoopLinks(const size_t &loopID, const std::vector< size_t > &loopNodeIDs)
void addEllipsoidalInclusionIndividual(const EllipsoidalInclusionIndividualSpecification &spec)
std::map< VectorDimD, size_t, CompareVectorsByComponent< double, dim, float > > uniqueNetworkNodeMap
bool allPointsInMesh(const std::vector< VectorDimD > &points)
DefectiveCrystalAuxIO< 3 > auxIO
void addStackingFaultTetrahedraDensity(const StackingFaultTetrahedraDensitySpecification &spec)
DefectiveCrystalBase< 3 > & ddBase
void addCrackMeshIndividual(const CrackMeshIndividualSpecification &spec)
size_t insertLoop(const VectorDimD &b, const VectorDimD &unitNormal, const VectorDimD &P0, const size_t &grainID, const DislocationLoopType &loopType)
DefectiveCrystalConfigIO< 3 > configIO
void addCircularCrackIndividual(const CircularCrackIndividualSpecification &spec)
void addPrismaticLoopDensity(const PrismaticLoopDensitySpecification &spec)
bool insertCrackMesh(const std::vector< VectorDimD > &nodes, const std::vector< VectorDimD > &burgers, const std::vector< VectorDimI > &triangles)
void addStackingFaultTetrahedraIndividual(const StackingFaultTetrahedraIndividualSpecification &spec)
void addFrankLoopsDensity(const FrankLoopsDensitySpecification &spec)
void addEllipsoidalInclusionDensity(const EllipsoidalInclusionDensitySpecification &spec)
void addPolyhedronInclusionIndividual(const PolyhedronInclusionIndividualSpecification &spec)
const DefectiveCrystalAuxIO< 3 > & aux() const
const DefectiveCrystalConfigIO< 3 > & config() const
bool allPointsInGrain(const std::vector< VectorDimD > &points, const int &grainID)
MicrostructureGenerator(DefectiveCrystalBase< 3 > &ddBase_in)
void addPeriodicDipoleIndividual(const PeriodicDipoleIndividualSpecification &spec)
void writeConfigFiles(const size_t &fileID)
const DefectiveCrystalTraitsIO & traits() const
void addShearLoopDensity(const ShearLoopDensitySpecification &spec)
void addShearLoopIndividual(const ShearLoopIndividualSpecification &spec)
void readMicrostructureFile()
size_t insertInclusion(const VectorDimD &pos, const double &R, const Eigen::Matrix< double, dim, dim > &eT, const double &vrc, const int &type)
std::vector< std::pair< std::string, std::string > > readStringVector(const std::string &key)
static std::string greenBoldColor
static std::string defaultColor
static constexpr int mSize
std::shared_ptr< PeriodicPlanePatch< 3 > > periodicPlanePatch() const
static std::string removeSpaces(std::string key)
enum insertvertexresult success