46 checkIDs(configIO.ellipsoidalInclusions());
47 checkIDs(configIO.polyhedronInclusions());
52 for(
const auto& inclusion : configIO.sphericalInclusions())
55 const std::pair<bool,const Simplex<dim,dim>*> searchPair(this->
ddBase.mesh.search(inclusion.C));
59 const auto& grain(this->
ddBase.poly.grain(searchPair.second->region->regionID));
60 if(inclusion.phaseID<
int(grain->secondPhases().size()))
62 const auto secondPhase(grain->secondPhases().at(inclusion.phaseID));
64 std::shared_ptr<EshelbyInclusionBase<dim>> iptr(
new SphericalInclusion<dim>(inclusion.C,inclusion.a,inclusion.eT,this->ddBase.poly.nu,this->ddBase.poly.mu,inclusion.mobilityReduction,inclusion.phaseID,secondPhase));
69 throw std::runtime_error(
"phaseID does not exist in grain.");
74 for(
const auto& inclusion :
configIO.ellipsoidalInclusions())
79 const auto& grain(this->
ddBase.poly.grain(searchPair.second->region->regionID));
80 const auto phaseIter(grain->secondPhases().find(
inclusion.phaseID));
81 if(phaseIter==grain->secondPhases().end())
83 throw std::runtime_error(
"Ellipsoidal inclusion phaseID does not exist in grain.");
86 auto iptr=std::make_shared<EllipsoidalInclusion<dim>>(
89 this->eshelbyInclusions().emplace(
inclusion.inclusionID,iptr);
93 for(
const auto& piNode :
configIO.polyhedronInclusionNodes())
95 this->polyhedronInclusionNodes().emplace(piNode.nodeID,piNode);
98 std::map<size_t,std::map<size_t,std::vector<size_t>>> faceMap;
99 for(
const auto& edge :
configIO.polyhedronInclusionEdges())
101 const size_t& iID(edge.inclusionID);
102 const size_t& fID(edge.faceID);
103 const size_t& sourceID(edge.sourceID);
104 faceMap[iID][fID].push_back(sourceID);
108 for(
const auto& inclusion :
configIO.polyhedronInclusions())
112 const auto faceIter(faceMap.find(
inclusion.inclusionID));
113 if(faceIter!=faceMap.end())
115 const auto&
faces(faceIter->second);
117 std::set<const PolyhedronInclusionNodeIO<dim>*> uniquePolyNodes;
118 for(
const auto& pair : faces)
120 for(
const auto& nodeID : pair.second)
122 uniquePolyNodes.emplace(&this->polyhedronInclusionNodes().at(nodeID));
126 if(uniquePolyNodes.size()>=dim+1)
129 std::set<size_t> grainIDs;
130 for(
const auto& nodePtr : uniquePolyNodes)
132 const std::pair<bool,const Simplex<dim,dim>*> searchPair(this->
ddBase.mesh.search(nodePtr->P));
135 grainIDs.insert(searchPair.second->region->regionID);
139 throw std::runtime_error(
"inclusion node outside mesh");
144 if(grainIDs.size()==1)
146 const auto& grain(this->
ddBase.poly.grain(*grainIDs.begin()));
147 if(
inclusion.phaseID<
int(grain->secondPhases().size()))
149 const auto secondPhase(grain->secondPhases().at(
inclusion.phaseID));
152 this->eshelbyInclusions().emplace(
inclusion.inclusionID,iptr);
156 throw std::runtime_error(
"phaseID does not exist in grain.");
161 throw std::runtime_error(
"inclusion across grain boundaries");
166 throw std::runtime_error(
"inclusion does not have enough nodes");
171 throw std::runtime_error(
"inclusionID not found in faceMap");
174 if(!inclusionIDs.empty())
201 return this->
ddBase.simulationParameters.dtMax;
209 configIO.polyhedronInclusionNodes().emplace_back(node.second);
217 if (sphericalDerived)
219 configIO.sphericalInclusions().emplace_back(*sphericalDerived);
223 if(ellipsoidalDerived)
225 configIO.ellipsoidalInclusions().emplace_back(*ellipsoidalDerived);
229 if (polyhedronDerived)
231 configIO.polyhedronInclusions().emplace_back(*polyhedronDerived);
232 for(
const auto& face : polyhedronDerived->faces)
234 for(
size_t k=0;
k<face.second.size();++
k)
236 const size_t k1(
k<face.second.size()-1?
k+1 : 0);
237 configIO.polyhedronInclusionEdges().emplace_back(polyhedronDerived->sID,face.first,face.second[
k].first,face.second[k1].first);
247 return VectorDim::Zero();
253 return MatrixDim::Zero();
259 return MatrixDim::Zero();
265 return VectorDim::Zero();
274 for(
const auto& shift : this->
ddBase.periodicShifts)
276 temp+=inclusion.second->stress(
x+shift);
285 return VectorMSize::Zero();
291 return VectorISize::Zero();