Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
InclusionMicrostructure.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_InclusionMicrostructure_cpp_
9#define model_InclusionMicrostructure_cpp_
10
13#include <limits>
14
15namespace model
16{
17 template<int dim>
23
24 template<int dim>
25 void InclusionMicrostructure<dim>::initializeConfiguration(const DefectiveCrystalConfigIO<dim>& configIO,const std::ofstream& f_file,const std::ofstream& F_labels)
26 {
27 this->lastUpdateTime=this->ddBase.simulationParameters.totalTime;
28
29 // IDs are shared across inclusion shapes. Reject collisions before loading.
30 std::set<size_t> inclusionIDs;
31 const auto checkIDs=[&](const auto& inclusions)
32 {
33 for(const auto& inclusion : inclusions)
34 {
35 if(inclusion.inclusionID==std::numeric_limits<size_t>::max())
36 {
37 throw std::runtime_error("Inclusion ID leaves no room for the next ID.");
38 }
39 if(!inclusionIDs.insert(inclusion.inclusionID).second)
40 {
41 throw std::runtime_error("Duplicate inclusionID in configuration.");
42 }
43 }
44 };
45 checkIDs(configIO.sphericalInclusions());
46 checkIDs(configIO.ellipsoidalInclusions());
47 checkIDs(configIO.polyhedronInclusions());
48
49 // Restore saved IDs even when shapes are interleaved or a configuration is reloaded.
50 this->eshelbyInclusions().clear();
51 this->polyhedronInclusionNodes().clear();
52 for(const auto& inclusion : configIO.sphericalInclusions())
53 {
54 // std::cout<<"Creating spherical inclusion "<<inclusion.inclusionID<<std::endl;
55 const std::pair<bool,const Simplex<dim,dim>*> searchPair(this->ddBase.mesh.search(inclusion.C));
56 if(searchPair.first)
57 {
58
59 const auto& grain(this->ddBase.poly.grain(searchPair.second->region->regionID));
60 if(inclusion.phaseID<int(grain->secondPhases().size()))
61 {
62 const auto secondPhase(grain->secondPhases().at(inclusion.phaseID));
63 EshelbyInclusionBase<dim>::force_count(inclusion.inclusionID);
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));
65 this->eshelbyInclusions().emplace(inclusion.inclusionID,iptr);
66 }
67 else
68 {
69 throw std::runtime_error("phaseID does not exist in grain.");
70 }
71 }
72 }
73
74 for(const auto& inclusion : configIO.ellipsoidalInclusions())
75 {
76 const auto searchPair(this->ddBase.mesh.search(inclusion.C));
77 if(searchPair.first)
78 {
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())
82 {
83 throw std::runtime_error("Ellipsoidal inclusion phaseID does not exist in grain.");
84 }
86 auto iptr=std::make_shared<EllipsoidalInclusion<dim>>(
87 inclusion.C,inclusion.axes,inclusion.eT,this->ddBase.poly.nu,
88 this->ddBase.poly.mu,inclusion.mobilityReduction,inclusion.phaseID,phaseIter->second);
89 this->eshelbyInclusions().emplace(inclusion.inclusionID,iptr);
90 }
91 }
92
93 for(const auto& piNode : configIO.polyhedronInclusionNodes())
94 {
95 this->polyhedronInclusionNodes().emplace(piNode.nodeID,piNode);
96 }
97
98 std::map<size_t,std::map<size_t,std::vector<size_t>>> faceMap;
99 for(const auto& edge : configIO.polyhedronInclusionEdges())
100 {
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);
105 }
106
107
108 for(const auto& inclusion : configIO.polyhedronInclusions())
109 {
110 // std::cout<<"Creating polyhedron inclusion "<<inclusion.inclusionID<<std::endl;
111
112 const auto faceIter(faceMap.find(inclusion.inclusionID));
113 if(faceIter!=faceMap.end())
114 {
115 const auto& faces(faceIter->second);
116 // std::cout<<" #faces= "<<faces.size()<<std::endl;
117 std::set<const PolyhedronInclusionNodeIO<dim>*> uniquePolyNodes;
118 for(const auto& pair : faces)
119 {
120 for(const auto& nodeID : pair.second)
121 {
122 uniquePolyNodes.emplace(&this->polyhedronInclusionNodes().at(nodeID));
123 }
124 }
125 // std::cout<<" #nodes= "<<uniquePolyNodes.size()<<std::endl;
126 if(uniquePolyNodes.size()>=dim+1)
127 {
128 // Find grain
129 std::set<size_t> grainIDs;
130 for(const auto& nodePtr : uniquePolyNodes)
131 {
132 const std::pair<bool,const Simplex<dim,dim>*> searchPair(this->ddBase.mesh.search(nodePtr->P));
133 if(searchPair.first)
134 {
135 grainIDs.insert(searchPair.second->region->regionID);
136 }
137 else
138 {
139 throw std::runtime_error("inclusion node outside mesh");
140 }
141 }
142
143 // Add inclusion
144 if(grainIDs.size()==1)
145 {
146 const auto& grain(this->ddBase.poly.grain(*grainIDs.begin()));
147 if(inclusion.phaseID<int(grain->secondPhases().size()))
148 {
149 const auto secondPhase(grain->secondPhases().at(inclusion.phaseID));
151 std::shared_ptr<EshelbyInclusionBase<dim>> iptr(new PolyhedronInclusion<dim>(this->polyhedronInclusionNodes(),faces,inclusion.eT,this->ddBase.poly.nu,this->ddBase.poly.mu,inclusion.mobilityReduction,inclusion.phaseID,secondPhase));
152 this->eshelbyInclusions().emplace(inclusion.inclusionID,iptr);
153 }
154 else
155 {
156 throw std::runtime_error("phaseID does not exist in grain.");
157 }
158 }
159 else
160 {
161 throw std::runtime_error("inclusion across grain boundaries");
162 }
163 }
164 else
165 {
166 throw std::runtime_error("inclusion does not have enough nodes");
167 }
168 }
169 else
170 {
171 throw std::runtime_error("inclusionID not found in faceMap");
172 }
173 }
174 if(!inclusionIDs.empty())
175 {
176 EshelbyInclusionBase<dim>::force_count(*inclusionIDs.rbegin()+1);
177 }
178 }
179
180 template<int dim>
185
186template<int dim>
191
192 template<int dim>
194 {
195 this->lastUpdateTime=this->ddBase.simulationParameters.totalTime;
196 }
197
198 template<int dim>
200 {
201 return this->ddBase.simulationParameters.dtMax;
202 }
203
204 template<int dim>
205 void InclusionMicrostructure<dim>::output(DefectiveCrystalConfigIO<dim>& configIO,DefectiveCrystalAuxIO<dim>& auxIO,std::ofstream& f_file,std::ofstream& F_labels) const
206 {
207 for(const auto& node : this->polyhedronInclusionNodes())
208 {
209 configIO.polyhedronInclusionNodes().emplace_back(node.second);
210 }
211
212 // Store Eshelby Inclusions
213 for(const auto& ei : this->eshelbyInclusions())
214 {
215
216 auto* sphericalDerived = dynamic_cast<SphericalInclusion<dim>*>(ei.second.get());
217 if (sphericalDerived)
218 {
219 configIO.sphericalInclusions().emplace_back(*sphericalDerived);
220 }
221
222 auto* ellipsoidalDerived = dynamic_cast<EllipsoidalInclusion<dim>*>(ei.second.get());
223 if(ellipsoidalDerived)
224 {
225 configIO.ellipsoidalInclusions().emplace_back(*ellipsoidalDerived);
226 }
227
228 auto* polyhedronDerived = dynamic_cast<PolyhedronInclusion<dim>*>(ei.second.get());
229 if (polyhedronDerived)
230 {
231 configIO.polyhedronInclusions().emplace_back(*polyhedronDerived);
232 for(const auto& face : polyhedronDerived->faces)
233 {
234 for(size_t k=0;k<face.second.size();++k)
235 {
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);
238 }
239 }
240 }
241 }
242 }
243
244 template<int dim>
246 {
247 return VectorDim::Zero();
248 }
249
250 template<int dim>
255
256 template<int dim>
261
262 template<int dim>
264 {
265 return VectorDim::Zero();
266 }
267
268 template<int dim>
270 {
271 MatrixDim temp(MatrixDim::Zero());
272 for(const auto& inclusion : this->eshelbyInclusions() )
273 {
274 for(const auto& shift : this->ddBase.periodicShifts)
275 {
276 temp+=inclusion.second->stress(x+shift);
277 }
278 }
279 return temp;
280 }
281
282 template<int dim>
284 {
285 return VectorMSize::Zero();
286 }
287
288 template<int dim>
290 {
291 return VectorISize::Zero();
292 }
293
294 template<int dim>
296 {
297 return MatrixDim::Zero();
298 }
299
300 template struct InclusionMicrostructure<3>;
301}
302#endif
static void force_count(const size_t &newCount)
Definition StaticID.h:79
x
Definition int_R.m:12
const PolyhedronInclusionNodeContainerType & polyhedronInclusionNodes() const
MicrostructureBase< dim >::MatrixDim MatrixDim
MicrostructureContainer< dim > MicrostructureContainerType
MatrixDim stress(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
InclusionMicrostructure(MicrostructureContainerType &mc)
MicrostructureBase< dim >::VectorISize VectorISize
MicrostructureBase< dim >::VectorDim VectorDim
MatrixDim averagePlasticDistortion() const override
MatrixDim averagePlasticDistortionRate() const override
MicrostructureBase< dim >::ElementType ElementType
MatrixDim averageStress() const override
MicrostructureBase< dim >::VectorMSize VectorMSize
VectorMSize mobileConcentration(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
VectorISize immobileClusters(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
MicrostructureBase< dim >::NodeType NodeType
MicrostructureBase< dim >::SimplexDim SimplexDim
void output(DefectiveCrystalConfigIO< dim > &configIO, DefectiveCrystalAuxIO< dim > &auxIO, std::ofstream &f_file, std::ofstream &F_labels) const override
void initializeConfiguration(const DefectiveCrystalConfigIO< dim > &configIO, const std::ofstream &f_file, const std::ofstream &F_labels) override
VectorDim inelasticDisplacementRate(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
VectorDim displacement(const VectorDim &, const NodeType *const, const ElementType *const, const SimplexDim *const) const override
MicrostructureBase(const std::string &tag_in, MicrostructureContainer< dim > &m_in)
MicrostructureContainerType & microstructures
int k
vertex temp