Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
src/InclusionMicrostructure/PolyhedronInclusion.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_PolyhedronInclusion_cpp_
9#define model_PolyhedronInclusion_cpp_
10
11
13#include <numbers>
14
15namespace model
16{
17
18
19// template <int dim>
20// void PolyhedronInclusion<dim>::addSlipSystems(const std::vector<std::shared_ptr<SlipSystem>>& slipSystems)
21// {
22//
23// for(const auto& slipSystem : slipSystems)
24// {
25// if(gammaSurfaceMap.find(slipSystem->gammaSurface.get())==gammaSurfaceMap.end())
26// {// current slipSystem gammaSurface not found
27//
28// // GammaSurface temp();
29// //
30// // gammaSurfaceMap.emaplace(slipSystem->gammaSurface.get(),temp);
31// }
32// }
33//
34// }
35
36// template <int dim>
37// double PolyhedronInclusion<dim>::misfitEnergy(const Eigen::Matrix<double,3,1>& b, const GammaSurface* const matrixGammaSurface) const
38// {
39// const auto iter(gammaSurfaceMap.find(matrixGammaSurface));
40// return iter==gammaSurfaceMap.end()? 0.0 : iter->second(b);
41// }
42
43
44
45
46 template <int dim>
48 const std::map<size_t,std::vector<size_t>>& faceIDs,
49 const MatrixDim& _eT,
50 const double& _nu,
51 const double& _mu,
52 const double& _mobilityReduction,
53 const int& _phaseID,
54 const std::shared_ptr<SecondPhase<dim>>& sph) :
55 /* init */ EshelbyInclusionBase<dim>(_eT,_nu,_mu,_mobilityReduction,_phaseID,sph)
56 /* init */,delta(MatrixDim::Identity())
57 /* init */,nodes(nodesMap)
58 /* init */,faces(getFaces(nodesMap,faceIDs))
59 {
60// std::cout<<"Creating PolyhedronInclusion "<<this->sID<<" (type "<<this->phaseID<<"):\n eT="<<this->eT<<std::endl;
61
62 for(const auto& face : faces)
63 {
64 VectorDim C(VectorDim::Zero()); // face center
65 for(const auto& nodePair : face.second)
66 {
67// const auto nodeIter(nodes.find(nodeID));
68 C+=nodePair.second;
69// if(nodeIter!=nodes.end())
70// {
71// C+=nodeIter->second.P;
72// }
73// else
74// {
75// throw std::runtime_error("PolyhedronInclusion: nodeID not found in nodes.");
76// }
77 }
78 C/=face.second.size();
79
80 VectorDim nA(VectorDim::Zero()); // normal
81// const VectorDim P0(nodes.find(face.second.front())->second.P);
82 const VectorDim P0(face.second.front().second);
83 for(size_t k=0;k<face.second.size();++k)
84 {
85 const size_t k1(k<face.second.size()-1? k+1 : 0);
86// const VectorDim Pk(nodes.find(face.second[k])->second.P);
87// const VectorDim Pk1(nodes.find(face.second[k1])->second.P);
88 const VectorDim Pk(face.second[k].second);
89 const VectorDim Pk1(face.second[k1].second);
90 nA+= 0.5*(Pk-P0).cross(Pk1-Pk);
91 }
92
93 Plane<3> plane(C,nA);
94 for(const auto& nodePair : face.second)
95 {
96// const auto nodeIter(nodes.find(nodeID));
97// if(nodeIter!=nodes.end())
98// {
99 if(!plane.contains(nodePair.second))
100 {
101 throw std::runtime_error("PolyhedronInclusion: face plane does not include face vertex.");
102 }
103// }
104 }
105 this->emplace(face.first,plane);
106 }
107 }
108
109 template <int dim>
110 const std::map<size_t,Plane<dim>>& PolyhedronInclusion<dim>::planes() const
111 {
112 return *this;
113 }
114
115 template <int dim>
116 bool PolyhedronInclusion<dim>::contains(const VectorDim& x) const
117 {
118 bool contained(true);
119 for(const auto& plane : this->planes())
120 {
121 contained=(contained && plane.second.isAbove(x));
122 }
123 return contained;
124 }
125
126template <int dim>
127std::map<size_t,std::vector<std::pair<size_t,typename PolyhedronInclusion<dim>::VectorDim>>> PolyhedronInclusion<dim>::getFaces(const std::map<size_t,PolyhedronInclusionNodeIO<dim>>& nodesMap,
128 const std::map<size_t,std::vector<size_t>>& faceIDs)
129{
130 std::map<size_t,std::vector<std::pair<size_t,VectorDim>>> temp;
131 for(const auto& fID : faceIDs)
132 {
133 std::vector<std::pair<size_t,VectorDim>> tempV;
134 for(const auto& nID : fID.second)
135 {
136 const auto nodeIter(nodesMap.find(nID));
137 if(nodeIter!=nodesMap.end())
138 {
139 tempV.emplace_back(nID,nodeIter->second.P);
140 }
141 else
142 {
143 throw std::runtime_error("PolyhedronInclusion node not found.");
144 }
145 }
146 temp.emplace(fID.first,tempV);
147 }
148 return temp;
149}
150
151template <int dim>
152double PolyhedronInclusion<dim>::Phi_u_II_a(double a, double b, double le)
153{
154 if (a != 0 && b != 0 && le != 0) {
155 return -a / abs(a) * atan(le / b) + asin(a * le * abs(b) / (b * sqrt((a * a + b * b) * (b * b + le * le))));
156 }
157 else if (a == 0) {
158 return 0.0;
159 }
160 else if (a != 0) {
161
162 return 0.0;
163 }
164
165 // a, b, le equals zero
166 return 0.0;
167}
168
169template <int dim>
170double PolyhedronInclusion<dim>::Phi_u_II_b(double a, double b, double le)
171{
172 double dis = sqrt(a * a + b * b + le * le);
173 if (a != 0 && b != 0 && le != 0) {
174 return (1.0 / (b * b + le * le)) * (
175 -le * dis + le * abs(a) + (b * b + le * le) * atanh(le / dis));
176 }
177 else if (a == 0) {
178 if (b != 0) { // le may equal zero, all includes
179 return -le / dis + atanh(le / dis);
180 }
181 else { // b ==0, le != 0
182 return 0.0;
183 }
184 }
185 else if (a != 0) {
186 if (b != 0 && le == 0) {
187 return 0.0;
188 }
189 else if (b == 0 && le == 0) {
190 return 0.0;
191 }
192 else if (b == 0 && le != 0) {
193 return (-dis + abs(a)) / le + atanh(le / dis);
194 }
195 }
196
197 // a, b, le equals zero
198 return 0.0;
199}
200
201template <int dim>
202double PolyhedronInclusion<dim>::Phi_u_II_le(double a, double b, double le)
203{
204 if (a != 0 && b != 0 && le != 0) {
205 return b * (a * a + b * b + le * le - sqrt(a * a + b * b + le * le) * abs(a)) / ((b * b + le * le) * sqrt(a * a + b * b + le * le));
206 }
207 else if (a == 0) {
208 if (b != 0 || le != 0) {
209 return b / sqrt(b * b + le * le);
210 }
211 else {
212 return 0.0;
213 }
214 }
215 else if (a != 0) {
216 if (b != 0 && le == 0) {
217 return (sqrt(a * a + b * b) - abs(a)) / b;
218 }
219 else if (b == 0 && le != 0) {
220 return 0.0;
221 }
222 else if (b == 0 && le == 0) {
223 return 0.0;
224 }
225 }
226
227 return 0.0;
228}
229
230//template <int dim>
231//double PolyhedronInclusion<dim>::PHI_ij(int i, int j, double a, double b, double lm, double lp, const VectorDim& Svnorm, const VectorDim& Vnorm, const VectorDim& Vdir)
232//{
233// return -(Svnorm[i]) * (-(Phi_u_II_a(a, b, lp) - Phi_u_II_a(a, b, lm)) * Svnorm[j]
234// - (Phi_u_II_b(a, b, lp) - Phi_u_II_b(a, b, lm)) * Vnorm[j]
235// - (Phi_u_II_le(a, b, lp)) * Vdir[j] + (Phi_u_II_le(a, b, lm)) * Vdir[j]);
236//}
237
238//template <int dim>
239//double PolyhedronInclusion<dim>::PHI_ij(int i, int j, const VectorDim& x) const
240//{
241// double result=0.0;
242// for(const auto& face : faces)
243// {
244// const auto& P0(face.second[0].second);
245// const auto& P1(face.second[1].second);
246// const auto& P2(face.second[2].second);
247// const VectorDim Svnorm((P1-P0).cross(P2-P1).normalized());
248// const double a(Svnorm.dot(P0-x));
249// for(size_t e=0;e<face.second.size();++e)
250// {
251// const size_t e1(e<face.second.size()-1? e+1 : 0);
252// const VectorDim& vm(face.second[e].second);
253// const VectorDim& vp(face.second[e1].second);
254// const VectorDim Vdir((vp-vm).normalized());
255// const VectorDim Vnorm(Vdir.cross(Svnorm));
256// const double b((vp-x).dot(Vnorm));
257// const double lm((vm-x).dot(Vdir));
258// const double lp((vp-x).dot(Vdir));
259// result+=PHI_ij(i,j,a,b,lm,lp,Svnorm,Vnorm,Vdir);
260// }
261// }
262// return result;
263//}
264
265template <int dim>
266double PolyhedronInclusion<dim>::Psi_I1_a_a_a(double a, double b, double le)
267{
268 double dis = sqrt(a * a + b * b + le * le);
269 if (a < 0 && b != 0 && le != 0) {
270 return a * b * le / ((a * a + b * b) * dis) + 2.0 * atan(le / b) + 2.0 * atan(a * le / (b * dis));
271 }
272 else if (a > 0 && b != 0 && le != 0) {
273 return a * b * le / ((a * a + b * b) * dis) - 2.0 * atan(le / b) + 2.0 * atan(a * le / (b * dis));
274 }
275
276 return 0.0;
277}
278
279template <int dim>
280double PolyhedronInclusion<dim>::Psi_I1_a_a_b(double a, double b, double le)
281{
282 double dis = sqrt(a * a + b * b + le * le);
283 if (a < 0 && b != 0 && le != 0) {
284 return -le * (2.0 * a * a + b * b + a * b * b / dis) / ((a * a + b * b) * (dis - a)) + atanh(le / dis);
285 }
286 else if (a > 0 && b != 0 && le != 0) {
287 return 2.0 * a * le / (b * b + le * le) + (le / dis) * (-2.0 + b * b / (a * a + b * b) - 2.0 * a * a / (b * b + le * le)) + atanh(le / dis);
288 }
289 else if (a == 0) {
290 if (b != 0) {
291 return -le / dis + atanh(le / dis);
292 }
293 else { // include b = 0, le != 0, this is infinite
294 return 0.0;
295 }
296 }
297 else if (a != 0) {
298 if (b != 0 && le == 0) {
299 return 0.0;
300 }
301 else if (b == 0 && le != 0) {
302 return 2.0 * (abs(a) - dis) / le + atanh(le / dis);
303 }
304 else if (b == 0 && le == 0) {
305 return 0.0;
306 }
307 }
308
309 return 0.0;
310}
311
312template <int dim>
313double PolyhedronInclusion<dim>::Psi_I1_a_a_le(double a, double b, double le)
314{
315 double dis = sqrt(a * a + b * b + le * le);
316 if (a != 0 && b != 0 && le != 0) {
317 return (b / (b * b + le * le)) * (-2.0 * abs(a) + dis + (a * a) / dis);
318 }
319 else if (a == 0) {
320 if (b != 0) {
321 return b / dis;
322 }
323 else {
324 return 0.0;
325 }
326 }
327 else if (a != 0) {
328 if (b != 0 && le == 0) {
329 return ((2.0 * a * a + b * b) / dis - 2.0 * abs(a)) / b;
330 }
331 else if (b == 0 && le != 0) {
332 return 0.0;
333 }
334 else if (b == 0 && le == 0) {
335 return 0.0;
336 }
337 }
338
339 return 0.0;
340}
341
342template <int dim>
343double PolyhedronInclusion<dim>::Psi_I1_a_b_b(double a, double b, double le)
344{
345 double dis = sqrt(a * a + b * b + le * le);
346 if (a != 0 && b != 0 && le != 0) {
347 return (a * b * le / ((a * a + b * b) * pow(b * b + le * le, 2.0) * dis)) * (
348 2.0 * pow(a, 4.0) - le * le * (b * b + le * le) + a * a * (3.0 * b * b + le * le) - 2.0 * (a * a + b * b) * dis * abs(a)
349 );
350 }
351
352 return 0.0;
353
354}
355
356template <int dim>
357double PolyhedronInclusion<dim>::Psi_I1_a_b_le(double a, double b, double le)
358{
359 double dis = sqrt(a * a + b * b + le * le);
360 if (a != 0 && b != 0 && le != 0) {
361 return (a / (pow(b * b + le * le, 2.0) * dis)) * (
362 -pow(a * b, 2.0) + (a * a + b * b) * le * le + pow(le, 4.0) + (b * b - le * le) * dis * abs(a)
363 );
364 }
365 else if (a == 0) {
366 return 0.0;
367 }
368 else if (a != 0) {
369 if (b != 0 && le == 0) {
370 return a * (-a * a / dis + abs(a)) / (b * b);
371 }
372 else if (b == 0 && le != 0) {
373 return a * (dis - abs(a)) / (le * le);
374 }
375 else if (b == 0 && le == 0) {
376 return 0.5 * a / abs(a);
377 }
378 }
379
380 return 0.0;
381}
382
383template <int dim>
384double PolyhedronInclusion<dim>::Psi_I1_a_le_le(double a, double b, double le)
385{
386 double dis = sqrt(a * a + b * b + le * le);
387 if (a != 0 && b != 0 && le != 0) {
388 return -a * b * le * (
389 a * a + dis * dis - 2.0 * dis * abs(a)
390 ) / (pow(b * b + le * le, 2.0) * dis);
391 }
392
393 return 0.0;
394}
395
396template <int dim>
397double PolyhedronInclusion<dim>::Psi_I1_b_b_b(double a, double b, double le)
398{
399 double dis = sqrt(a * a + b * b + le * le);
400 if (a != 0 && b != 0 && le != 0) {
401 return (1.0 / (3.0 * (a * a + b * b) * pow(b * b + le * le, 3.0) * dis)) * (
402 2.0 * pow(a, 6.0) * le * (-3.0 * b * b + le * le) - b * b * le * pow(b * b + le * le, 2.0) * (3.0 * b * b + 4.0 * le * le)
403 - a * a * le * (b * b + le * le) * (3.0 * pow(b, 4.0) + pow(le, 4.0)) + pow(a, 4.0) * (-9.0 * pow(b, 4.0) * le + pow(le, 5.0))
404 )
405 - 2.0 * le * (-3.0 * b * b + le * le) * pow(abs(a), 3.0) / (3.0 * pow(b * b + le * le, 3.0))
406 + atanh(le / dis);
407 }
408 else if (a == 0) {
409 if (b != 0) {
410 return -le * (3.0 * b * b + 4.0 * le * le) / (3.0 * dis * dis * dis) + atanh(le / dis);
411 }
412 else { // infinite
413 return 0.0;
414 }
415 }
416 else if (a != 0) {
417 if (b != 0 && le == 0) {
418 return 0.0;
419 }
420 else if (b == 0 && le != 0) {
421 return (1.0 / (3.0 * pow(le, 3.0) * dis)) * (2.0 * pow(a, 4.0) + a * a * le * le - pow(le, 4.0)) - 2.0 * pow(abs(a), 3.0) / (3.0 * le * le * le) + atanh(le / dis);
422 }
423 else if (b == 0 && le == 0) {
424 return 0.0;
425 }
426 }
427
428 return 0.0;
429}
430
431template <int dim>
432double PolyhedronInclusion<dim>::Psi_I1_b_b_le(double a, double b, double le)
433{
434 double dis = sqrt(a * a + b * b + le * le);
435 if (a != 0 && b != 0 && le != 0) {
436 return (b / (3.0 * pow(b * b + le * le, 3.0) * dis)) * (
437 2.0 * pow(a, 4.0) * (b * b - 3.0 * le * le) + a * a * (b * b - 3.0 * le * le) * (b * b + le * le)
438 + pow(b * b + le * le, 2.0) * (2.0 * b * b + 3.0 * le * le) - 2.0 * (b * b - 3.0 * le * le) * dis * pow(abs(a), 3.0)
439 );
440 }
441 else if (a == 0) {
442 if (b != 0) {
443 return b * (2.0 * b * b + 3.0 * le * le) / (3.0 * dis * dis * dis);
444 }
445 else {
446 return 0.0;
447 }
448 }
449 else if (a != 0) {
450 if (b != 0 && le == 0) {
451 return (2.0 * pow(a, 4.0) + pow(a * b, 2.0) + 2.0 * pow(b, 4.0) - 2.0 * dis * pow(abs(a), 3.0)) / (3.0 * pow(b, 3.0) * dis);
452 }
453 else if (b == 0 && le != 0) {
454 return 0.0;
455 }
456 else if (b == 0 && le == 0) {
457 return 0.0;
458 }
459 }
460
461 return 0.0;
462}
463
464template <int dim>
465double PolyhedronInclusion<dim>::Psi_I1_b_le_le(double a, double b, double le)
466{
467 double dis = sqrt(a * a + b * b + le * le);
468 if (a != 0 && b != 0 && le != 0) {
469 return (le / (3.0 * pow(b * b + le * le, 3.0) * dis)) * (
470 pow(a, 4.0) * (6.0 * b * b - 2.0 * le * le) + a * a * (3.0 * b * b - le * le) * (b * b + le * le)
471 + le * le * pow(b * b + le * le, 2.0) + 2.0 * (-3.0 * b * b + le * le) * dis * pow(abs(a), 3.0)
472 );
473 }
474 else if (a == 0) {
475 if (b != 0) {
476 return pow(le, 3.0) / (3.0 * dis * dis * dis);
477 }
478 else if (le != 0) {
479 return 0.0; // le / (3.0 * abs(le));
480 }
481 else {
482 return 0.0;
483 }
484 }
485 else if (a != 0) {
486 if (b != 0 && le == 0) {
487 return 0.0;
488 }
489 else if (b == 0 && le != 0) {
490 return (-2.0 * pow(a, 4.0) - pow(a * le, 2.0) + pow(le, 4.0) + 2.0 * dis * pow(abs(a), 3.0)) / (3.0 * dis * pow(le, 3.0));
491 }
492 else if (b == 0 && le == 0) {
493 return 0.0;
494 }
495 }
496
497 return 0.0;
498}
499
500template <int dim>
501double PolyhedronInclusion<dim>::Psi_I1_le_le_le(double a, double b, double le)
502{
503 double dis = sqrt(a * a + b * b + le * le);
504 if (a != 0 && b != 0 && le != 0) {
505 return (b / (3.0 * pow(b * b + le * le, 3.0) * dis)) * (
506 -2.0 * pow(a, 4.0) * (b * b - 3.0 * le * le) - a * a * (b * b - 3.0 * le * le) * (b * b + le * le)
507 + b * b * pow(b * b + le * le, 2.0) + 2.0 * (b * b - 3.0 * le * le) * dis * pow(abs(a), 3.0)
508 );
509 }
510 else if (a == 0) {
511 if (b != 0) {
512 return pow(b, 3.0) / (3.0 * dis * dis * dis);
513 }
514 else {
515 return 0.0;
516 }
517 }
518 else if (a != 0) {
519 if (b != 0 && le == 0) {
520 return (-2.0 * pow(a, 4.0) - pow(a * b, 2.0) + pow(b, 4.0) + 2.0 * dis * pow(abs(a), 3.0)) / (3.0 * dis * pow(b, 3.0));
521 }
522 else if (b == 0 && le != 0) {
523 return 0.0;
524 }
525 else if (b == 0 && le == 0) {
526 return 0.0;
527 }
528 }
529
530 return 0.0;
531}
532
533
534//template <int dim>
535//double PolyhedronInclusion<dim>::PSI_ijkl(int i, int j, int k, int l, double a, double b, double lm, double lp, const VectorDim& Svnorm, const VectorDim& Vnorm, const VectorDim& Vdir)
536//{
537// return (-(Psi_I1_a_a_a(a, b, lp) - Psi_I1_a_a_a(a, b, lm)) * Svnorm[i] * Svnorm[j] * Svnorm[k] - (Psi_I1_b_b_b(a, b, lp) - Psi_I1_b_b_b(a, b, lm)) * Vnorm[i] * Vnorm[j] * Vnorm[k]
538// - (Psi_I1_le_le_le(a, b, lp) - Psi_I1_le_le_le(a, b, lm)) * Vdir[i] * Vdir[j] * Vdir[k] - (Psi_I1_a_a_b(a, b, lp) - Psi_I1_a_a_b(a, b, lm)) * (Svnorm[i] * Svnorm[j] * Vnorm[k] + Svnorm[i] * Vnorm[j] * Svnorm[k] + Vnorm[i] * Svnorm[j] * Svnorm[k])
539// - (Psi_I1_a_a_le(a, b, lp) - Psi_I1_a_a_le(a, b, lm)) * (Svnorm[i] * Svnorm[j] * Vdir[k] + Svnorm[i] * Vdir[j] * Svnorm[k] + Vdir[i] * Svnorm[j] * Svnorm[k]) - (Psi_I1_a_b_b(a, b, lp) - Psi_I1_a_b_b(a, b, lm)) * (Svnorm[i] * Vnorm[j] * Vnorm[k] + Svnorm[j] * Vnorm[i] * Vnorm[k] + Svnorm[k] * Vnorm[j] * Vnorm[i])
540// - (Psi_I1_b_b_le(a, b, lp) - Psi_I1_b_b_le(a, b, lm)) * (Vdir[i] * Vnorm[j] * Vnorm[k] + Vdir[j] * Vnorm[i] * Vnorm[k] + Vdir[k] * Vnorm[i] * Vnorm[j]) - (Psi_I1_a_le_le(a, b, lp) - Psi_I1_a_le_le(a, b, lm)) * (Svnorm[i] * Vdir[j] * Vdir[k] + Svnorm[j] * Vdir[i] * Vdir[k] + Svnorm[k] * Vdir[i] * Vdir[j])
541// - (Psi_I1_b_le_le(a, b, lp) - Psi_I1_b_le_le(a, b, lm)) * (Vnorm[i] * Vdir[j] * Vdir[k] + Vnorm[j] * Vdir[i] * Vdir[k] + Vnorm[k] * Vdir[i] * Vdir[j])
542// - (Psi_I1_a_b_le(a, b, lp) - Psi_I1_a_b_le(a, b, lm)) * (Svnorm[i] * Vnorm[j] * Vdir[k] + Svnorm[i] * Vnorm[k] * Vdir[j] + Svnorm[j] * Vnorm[i] * Vdir[k] + Svnorm[k] * Vnorm[i] * Vdir[j] + Svnorm[j] * Vnorm[k] * Vdir[i] + Svnorm[k] * Vnorm[j] * Vdir[i])) * (-Svnorm[l]);
543//}
544
545
546//template <int dim>
547//double PolyhedronInclusion<dim>::PSI_ijkl(int i, int j, int k, int l, const VectorDim& x) const
548//{
549// double result=0.0;
550// for(const auto& face : faces)
551// {
552// const auto& P0(face.second[0].second);
553// const auto& P1(face.second[1].second);
554// const auto& P2(face.second[2].second);
555// const VectorDim Svnorm((P1-P0).cross(P2-P1).normalized());
556// const double a(Svnorm.dot(P0-x));
557// for(size_t e=0;e<face.second.size();++e)
558// {
559// const size_t e1(e<face.second.size()-1? e+1 : 0);
560// const VectorDim& vm(face.second[e].second);
561// const VectorDim& vp(face.second[e1].second);
562// const VectorDim Vdir((vp-vm).normalized());
563// const VectorDim Vnorm(Vdir.cross(Svnorm));
564// const double b((vp-x).dot(Vnorm));
565// const double lm((vm-x).dot(Vdir));
566// const double lp((vp-x).dot(Vdir));
567// result+=PSI_ijkl(i,j,k,l,a,b,lm,lp,Svnorm,Vnorm,Vdir);
568// }
569// }
570// return result;
571//}
572
573// template <int dim>
574// double PolyhedronInclusion<dim>::eshelbyTensorComponent(const int&i,const int&j,const int&k,const int&l,const VectorDim& x) const
575// {
576// auto delta_xy = [] (const int x, const int y) -> int {return x==y;};
583//
584// return 0.125/(std::numbers::pi*(1.0-this->nu))*(PSI_ijkl(i,j,k,l,x)
585// -2.0*this->nu*delta_xy(k,l)*PHI_ij(i,j,x)
586// -(1.0-this->nu)*(PHI_ij(i,l,x)*delta_xy(j,k)
587// +PHI_ij(j,k,x)*delta_xy(i,l)
588// +PHI_ij(j,l,x)*delta_xy(i,k)
589// +PHI_ij(i,k,x)*delta_xy(j,l)));
590// }
591
592template <int dim>
593double PolyhedronInclusion<dim>::eshelbyTensorComponent(const int&i,const int&j,const int&k,const int&l,const MatrixDim& PHI,const MatrixDim& delta, const Psi_I1& psi,const VectorDim& Svnorm,const VectorDim& Vnorm,const VectorDim& Vdir) const
594{
595
596 const double psi_val= (-psi.I1_a_a_a * Svnorm[i] * Svnorm[j] * Svnorm[k] - psi.I1_b_b_b * Vnorm[i] * Vnorm[j] * Vnorm[k]
597 - psi.I1_le_le_le * Vdir[i] * Vdir[j] * Vdir[k] - psi.I1_a_a_b * (Svnorm[i] * Svnorm[j] * Vnorm[k] + Svnorm[i] * Vnorm[j] * Svnorm[k] + Vnorm[i] * Svnorm[j] * Svnorm[k])
598 - psi.I1_a_a_le * (Svnorm[i] * Svnorm[j] * Vdir[k] + Svnorm[i] * Vdir[j] * Svnorm[k] + Vdir[i] * Svnorm[j] * Svnorm[k]) - psi.I1_a_b_b * (Svnorm[i] * Vnorm[j] * Vnorm[k] + Svnorm[j] * Vnorm[i] * Vnorm[k] + Svnorm[k] * Vnorm[j] * Vnorm[i])
599 - psi.I1_b_b_le * (Vdir[i] * Vnorm[j] * Vnorm[k] + Vdir[j] * Vnorm[i] * Vnorm[k] + Vdir[k] * Vnorm[i] * Vnorm[j]) - psi.I1_a_le_le * (Svnorm[i] * Vdir[j] * Vdir[k] + Svnorm[j] * Vdir[i] * Vdir[k] + Svnorm[k] * Vdir[i] * Vdir[j])
600 - psi.I1_b_le_le * (Vnorm[i] * Vdir[j] * Vdir[k] + Vnorm[j] * Vdir[i] * Vdir[k] + Vnorm[k] * Vdir[i] * Vdir[j])
601 - psi.I1_a_b_le * (Svnorm[i] * Vnorm[j] * Vdir[k] + Svnorm[i] * Vnorm[k] * Vdir[j] + Svnorm[j] * Vnorm[i] * Vdir[k] + Svnorm[k] * Vnorm[i] * Vdir[j] + Svnorm[j] * Vnorm[k] * Vdir[i] + Svnorm[k] * Vnorm[j] * Vdir[i])) * (-Svnorm[l]);
602
603
604 return 0.125/(std::numbers::pi*(1.0-this->nu))*(psi_val
605 -2.0*this->nu*delta(k,l)*PHI(i,j)
606 -(1.0-this->nu)*(PHI(i,l)*delta(j,k)
607 +PHI(j,k)*delta(i,l)
608 +PHI(j,l)*delta(i,k)
609 +PHI(i,k)*delta(j,l)));
610}
611
612 template <int dim>
613 typename PolyhedronInclusion<dim>::MatrixVoigtSize PolyhedronInclusion<dim>::eshelbyTensorVoigt(const VectorDim& x) const
614 {
615 Eigen::Matrix<double,voigtSize,voigtSize> temp(Eigen::Matrix<double,voigtSize,voigtSize>::Zero());
616 Psi_I1 psi;
617
618 for(const auto& face : faces)
619 {
620 const auto& P0(face.second[0].second);
621 const auto& P1(face.second[1].second);
622 const auto& P2(face.second[2].second);
623 const VectorDim Svnorm((P1-P0).cross(P2-P1).normalized());
624 const double a(Svnorm.dot(P0-x));
625 for(size_t e=0;e<face.second.size();++e)
626 {
627 const size_t e1(e<face.second.size()-1? e+1 : 0);
628 const VectorDim& vm(face.second[e].second);
629 const VectorDim& vp(face.second[e1].second);
630 const VectorDim Vdir((vp-vm).normalized());
631 const VectorDim Vnorm(Vdir.cross(Svnorm));
632 const double b((vp-x).dot(Vnorm));
633 const double lm((vm-x).dot(Vdir));
634 const double lp((vp-x).dot(Vdir));
635
636 psi.I1_a_a_a=Psi_I1_a_a_a(a, b, lp) - Psi_I1_a_a_a(a, b, lm);
637 psi.I1_b_b_b=Psi_I1_b_b_b(a, b, lp) - Psi_I1_b_b_b(a, b, lm);
638 psi.I1_le_le_le=Psi_I1_le_le_le(a, b, lp) - Psi_I1_le_le_le(a, b, lm);
639 psi.I1_a_a_b=Psi_I1_a_a_b(a, b, lp) - Psi_I1_a_a_b(a, b, lm);
640 psi.I1_a_a_le=Psi_I1_a_a_le(a, b, lp) - Psi_I1_a_a_le(a, b, lm);
641 psi.I1_a_b_b=Psi_I1_a_b_b(a, b, lp) - Psi_I1_a_b_b(a, b, lm);
642 psi.I1_b_b_le=Psi_I1_b_b_le(a, b, lp) - Psi_I1_b_b_le(a, b, lm);
643 psi.I1_a_le_le=Psi_I1_a_le_le(a, b, lp) - Psi_I1_a_le_le(a, b, lm);
644 psi.I1_b_le_le=Psi_I1_b_le_le(a, b, lp) - Psi_I1_b_le_le(a, b, lm);
645 psi.I1_a_b_le=Psi_I1_a_b_le(a, b, lp) - Psi_I1_a_b_le(a, b, lm);
646
647 const VectorDim PHI_j(-(Phi_u_II_a(a, b, lp) - Phi_u_II_a(a, b, lm))*Svnorm
648 -(Phi_u_II_b(a, b, lp) - Phi_u_II_b(a, b, lm))*Vnorm
649 -(Phi_u_II_le(a, b, lp))*Vdir + (Phi_u_II_le(a, b, lm))*Vdir);
650 const MatrixDim PHI(-Svnorm*PHI_j.transpose());
651
652
653 for(int iV=0;iV<voigtTraits.voigtSize;++iV)
654 {
655 const size_t i(voigtTraits.tensorIndex(iV,0));
656 const size_t j(voigtTraits.tensorIndex(iV,1));
657
658 for(int jV=0;jV<voigtTraits.voigtSize;++jV)
659 {
660 const size_t k(voigtTraits.tensorIndex(jV,0));
661 const size_t l(voigtTraits.tensorIndex(jV,1));
662 temp(iV,jV)+=eshelbyTensorComponent(i,j,k,l,PHI,delta,psi,Svnorm,Vnorm,Vdir);
663 }
664 }
665
666 }
667 }
668
669 // 11 22 33 12 23 13 -> 00 11 22 01 12 02
670
671
672 // 0000, 0011, 0022, 0001, 0012, 0002
673 // 1100, 1111, 1122, 1101, 1112, 1102
674
675
676// temp(voigtTraits.voigtIndex(0,0),voigtTraits.voigtIndex(0,0))=eshelbyTensorComponent(0,0,0,0,x);
677// temp(voigtTraits.voigtIndex(0,0),voigtTraits.voigtIndex(1,1))=eshelbyTensorComponent(0,0,1,1,x);
678// temp(voigtTraits.voigtIndex(0,0),voigtTraits.voigtIndex(2,2))=eshelbyTensorComponent(0,0,2,2,x);
679// temp(voigtTraits.voigtIndex(0,0),voigtTraits.voigtIndex(0,1))=eshelbyTensorComponent(0,0,0,1,x);
680// temp(voigtTraits.voigtIndex(0,0),voigtTraits.voigtIndex(1,2))=eshelbyTensorComponent(0,0,1,2,x);
681// temp(voigtTraits.voigtIndex(0,0),voigtTraits.voigtIndex(2,0))=eshelbyTensorComponent(0,0,2,0,x);
682//
683// temp(voigtTraits.voigtIndex(1,1),voigtTraits.voigtIndex(0,0))=eshelbyTensorComponent(1,1,0,0,x);
684// temp(voigtTraits.voigtIndex(1,1),voigtTraits.voigtIndex(1,1))=eshelbyTensorComponent(1,1,1,1,x);
685// temp(voigtTraits.voigtIndex(1,1),voigtTraits.voigtIndex(2,2))=eshelbyTensorComponent(1,1,2,2,x);
686// temp(voigtTraits.voigtIndex(1,1),voigtTraits.voigtIndex(1,2))=eshelbyTensorComponent(1,1,1,2,x);
687// temp(voigtTraits.voigtIndex(1,1),voigtTraits.voigtIndex(2,0))=eshelbyTensorComponent(1,1,2,0,x);
688// temp(voigtTraits.voigtIndex(1,1),voigtTraits.voigtIndex(0,1))=eshelbyTensorComponent(1,1,0,1,x);
689//
690// temp(voigtTraits.voigtIndex(2,2),voigtTraits.voigtIndex(0,0))=eshelbyTensorComponent(2,2,0,0,x);
691// temp(voigtTraits.voigtIndex(2,2),voigtTraits.voigtIndex(1,1))=eshelbyTensorComponent(2,2,1,1,x);
692// temp(voigtTraits.voigtIndex(2,2),voigtTraits.voigtIndex(2,2))=eshelbyTensorComponent(2,2,2,2,x);
693// temp(voigtTraits.voigtIndex(2,2),voigtTraits.voigtIndex(1,2))=eshelbyTensorComponent(2,2,1,2,x);
694// temp(voigtTraits.voigtIndex(2,2),voigtTraits.voigtIndex(2,0))=eshelbyTensorComponent(2,2,2,0,x);
695// temp(voigtTraits.voigtIndex(2,2),voigtTraits.voigtIndex(0,1))=eshelbyTensorComponent(2,2,0,1,x);
696//
697// temp(voigtTraits.voigtIndex(0,1),voigtTraits.voigtIndex(0,1))=2.0*eshelbyTensorComponent(0,1,0,1,x);
698// temp(voigtTraits.voigtIndex(0,1),voigtTraits.voigtIndex(0,0))=2.0*eshelbyTensorComponent(0,1,0,0,x);
699// temp(voigtTraits.voigtIndex(0,1),voigtTraits.voigtIndex(1,1))=2.0*eshelbyTensorComponent(0,1,1,1,x);
700// temp(voigtTraits.voigtIndex(0,1),voigtTraits.voigtIndex(2,2))=2.0*eshelbyTensorComponent(0,1,2,2,x);
701// temp(voigtTraits.voigtIndex(0,1),voigtTraits.voigtIndex(1,2))=2.0*eshelbyTensorComponent(0,1,1,2,x);
702// temp(voigtTraits.voigtIndex(0,1),voigtTraits.voigtIndex(2,0))=2.0*eshelbyTensorComponent(0,1,2,0,x);
703//
704// temp(voigtTraits.voigtIndex(2,0),voigtTraits.voigtIndex(2,0))=2.0*eshelbyTensorComponent(2,0,2,0,x);
705// temp(voigtTraits.voigtIndex(2,0),voigtTraits.voigtIndex(0,0))=2.0*eshelbyTensorComponent(2,0,0,0,x);
706// temp(voigtTraits.voigtIndex(2,0),voigtTraits.voigtIndex(1,1))=2.0*eshelbyTensorComponent(2,0,1,1,x);
707// temp(voigtTraits.voigtIndex(2,0),voigtTraits.voigtIndex(2,2))=2.0*eshelbyTensorComponent(2,0,2,2,x);
708// temp(voigtTraits.voigtIndex(2,0),voigtTraits.voigtIndex(1,2))=2.0*eshelbyTensorComponent(2,0,1,2,x);
709// temp(voigtTraits.voigtIndex(2,0),voigtTraits.voigtIndex(0,1))=2.0*eshelbyTensorComponent(2,0,0,1,x);
710//
711// temp(voigtTraits.voigtIndex(1,2),voigtTraits.voigtIndex(1,2))=2.0*eshelbyTensorComponent(1,2,1,2,x);
712// temp(voigtTraits.voigtIndex(1,2),voigtTraits.voigtIndex(0,0))=2.0*eshelbyTensorComponent(1,2,0,0,x);
713// temp(voigtTraits.voigtIndex(1,2),voigtTraits.voigtIndex(1,1))=2.0*eshelbyTensorComponent(1,2,1,1,x);
714// temp(voigtTraits.voigtIndex(1,2),voigtTraits.voigtIndex(2,2))=2.0*eshelbyTensorComponent(1,2,2,2,x);
715// temp(voigtTraits.voigtIndex(1,2),voigtTraits.voigtIndex(2,0))=2.0*eshelbyTensorComponent(1,2,2,0,x);
716// temp(voigtTraits.voigtIndex(1,2),voigtTraits.voigtIndex(0,1))=2.0*eshelbyTensorComponent(1,2,0,1,x);
717
718
719 return temp;
720 }
721
722
723 template <int dim>
724 typename PolyhedronInclusion<dim>::MatrixDim PolyhedronInclusion<dim>::strain(const VectorDim& x) const
725 {
726 return this->eTNorm>FLT_EPSILON? voigtTraits.v2m(eshelbyTensorVoigt(x)*voigtTraits.m2v(this->eT,true),true) : MatrixDim::Zero();
727 }
728
729 template <int dim>
730 typename PolyhedronInclusion<dim>::MatrixDim PolyhedronInclusion<dim>::elasticStrain(const VectorDim& x) const
731 {
732 if(contains(x))
733 {
734 return strain(x)-this->eT;
735 }
736 else
737 {
738 return strain(x);
739 }
740 }
741
742 template <int dim>
743 typename PolyhedronInclusion<dim>::MatrixDim PolyhedronInclusion<dim>::stress(const VectorDim& x) const
744 {
745 const MatrixDim elStrain(elasticStrain(x));
746 return this->lambda*elStrain.trace()*MatrixDim::Identity()+2.0*this->mu*elStrain;
747 }
748
749 template <int dim>
751 //const typename PolyhedronInclusion<dim>::VoigtSizeMatrixType PolyhedronInclusion<dim>::voigtOrder=(PolyhedronInclusion<dim>::VoigtSizeMatrixType()<<0,0,0,1,0,2,1,1,1,2,2,2).finished();
752
753 template class PolyhedronInclusion<3>;
754
755}
756#endif
EshelbyInclusionBase(const MatrixDim &_eT, const double &_nu, const double &_mu, const double &_mobilityReduction, const int &_phaseID, const std::shared_ptr< SecondPhase< dim > > &sph)
MatrixDim stress(const VectorDim &x) const override
const std::map< size_t, std::vector< std::pair< size_t, VectorDim > > > faces
const std::map< size_t, PolyhedronInclusionNodeIO< dim > > & nodes
static double Psi_I1_a_a_b(double a, double b, double le)
static double Psi_I1_b_le_le(double a, double b, double le)
static double Psi_I1_b_b_le(double a, double b, double le)
static std::map< size_t, std::vector< std::pair< size_t, VectorDim > > > getFaces(const std::map< size_t, PolyhedronInclusionNodeIO< dim > > &nodesMap, const std::map< size_t, std::vector< size_t > > &faceIDs)
static double Psi_I1_a_b_b(double a, double b, double le)
static double Phi_u_II_le(double a, double b, double le)
static const SymmetricVoigtTraits< dim > voigtTraits
const std::map< size_t, Plane< dim > > & planes() const
static double Phi_u_II_a(double a, double b, double le)
static double Psi_I1_b_b_b(double a, double b, double le)
static double Psi_I1_a_a_a(double a, double b, double le)
PolyhedronInclusion(const std::map< size_t, PolyhedronInclusionNodeIO< dim > > &nodesMap, const std::map< size_t, std::vector< size_t > > &faceIDs, const MatrixDim &_eT, const double &_nu, const double &_mu, const double &_mobilityReduction, const int &_phaseID, const std::shared_ptr< SecondPhase< dim > > &sph)
static double Psi_I1_a_le_le(double a, double b, double le)
static double Psi_I1_a_b_le(double a, double b, double le)
MatrixVoigtSize eshelbyTensorVoigt(const VectorDim &x) const
double eshelbyTensorComponent(const int &i, const int &j, const int &k, const int &l, const MatrixDim &PHI, const MatrixDim &delta, const Psi_I1 &psi, const VectorDim &Svnorm, const VectorDim &Vnorm, const VectorDim &Vdir) const
static double Psi_I1_a_a_le(double a, double b, double le)
static double Psi_I1_le_le_le(double a, double b, double le)
static double Phi_u_II_b(double a, double b, double le)
a
Definition int_R.m:14
b
Definition int_R.m:16
x
Definition int_R.m:12
Eigen::Matrix< size_t, voigtSize, 2 > VoigtSizeMatrixType
Definition VoigtTraits.h:22
int j
int k
int i
int e
vertex temp