8#ifndef model_InclusionsGenerator_cpp_
9#define model_InclusionsGenerator_cpp_
18#include <Eigen/Cholesky>
25#include <LatticeModule.h>
51 bool PolyhedronInclusionsGenerator::generateSingle(
MicrostructureGenerator& mg,
const std::map<size_t,Eigen::Vector3d>& polyNodes,
const std::map<
size_t,std::vector<size_t>>& faceMap,
const Eigen::Matrix<double,1,dim*dim>& eTrow,
const double& vrc,
const int&type)
54 std::set<size_t> grainIDs;
55 for(
const auto &face : faceMap)
57 for(
const auto nodeID : face.second)
59 const auto searchPair = mg.ddBase.mesh.search(polyNodes.at(nodeID));
62 throw std::runtime_error(
"Polyhedral inclusion node outside mesh; cannot determine crystal frame");
64 grainIDs.insert(searchPair.second->region->regionID);
67 if(grainIDs.size() != 1)
69 throw std::runtime_error(
"Polyhedral inclusion must belong to a single grain");
71 const auto &
C2G = mg.ddBase.poly.grain(*grainIDs.begin())->C2G;
72 const Eigen::Matrix<double,dim,dim> crystalET(
73 Eigen::Map<
const Eigen::Matrix<double,dim,dim>>(eTrow.data()).transpose());
74 const Eigen::Matrix<double,dim,dim> eT =
C2G * crystalET *
C2G.transpose();
75 mg.insertInclusion(polyNodes,faceMap, eT, vrc,type);
88 Eigen::Vector3d nodeBary(Eigen::Vector3d::Zero());
89 for(
const auto& node : mshReader.
nodes())
91 nodeBary+=node.second;
93 nodeBary/=mshReader.
nodes().size();
95 for(
int j=0;
j<spec.X0.rows();++
j)
97 std::map<size_t,Eigen::Vector3d> scaledNodes;
98 const Eigen::Vector3d x0(spec.X0.row(
j));
99 for(
const auto& node : mshReader.
nodes())
101 scaledNodes.emplace(node.first,spec.F*(node.second-nodeBary)+x0);
104 std::map<size_t,std::vector<size_t>> faces;
105 size_t eleCounter(0);
106 for(
const auto& ele : mshReader.
elements())
108 if(ele.second.type==2)
110 faces.emplace(eleCounter,ele.second.nodeIDs);
116 generateSingle(mg,scaledNodes,faces, spec.crystalEigenDistortion, spec.velocityReductionFactor,spec.phaseID);
const std::map< size_t, Eigen::Vector3d > & nodes() const
const std::map< size_t, GmshElement > & elements() const
PolyhedronInclusionsGenerator(const PolyhedronInclusionIndividualSpecification &spec, MicrostructureGenerator &mg)