Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
CircularCrackGenerator.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_CircularCrackGenerator_cpp_
9#define model_CircularCrackGenerator_cpp_
10
11#include <iostream>
13
14namespace model
15{
16
18{
19 std::cout<<magentaBoldColor<<"Generating individual CircularCrack"<<defaultColor<<std::endl;
20
21 if(spec.radii.size()!=spec.nodesNumbers.size())
22 {
23 throw std::runtime_error("radii.size()="+std::to_string(spec.radii.size())+" NOT EQUAL TO nodesNumbers.size()="+std::to_string(spec.nodesNumbers.size()));
24 }
25 if(spec.radii.size()!=spec.meshSizes.size())
26 {
27 throw std::runtime_error("radii.size()="+std::to_string(spec.radii.size())+" NOT EQUAL TO meshSizes.size()="+std::to_string(spec.meshSizes.size()));
28 }
29 if(int(spec.radii.size())!=spec.centers.rows())
30 {
31 throw std::runtime_error("radii.size()="+std::to_string(spec.radii.size())+" NOT EQUAL TO centers.rows()="+std::to_string(spec.centers.rows()));
32 }
33 if(int(spec.radii.size())!=spec.normals.rows())
34 {
35 throw std::runtime_error("radii.size()="+std::to_string(spec.radii.size())+" NOT EQUAL TO normals.rows()="+std::to_string(spec.normals.rows()));
36 }
37
38// double density=0.0;
39 for(size_t k=0;k<spec.radii.size();++k)
40 {
41 try
42 {
43 const bool success=generateSingle(mg,spec.radii[k],spec.nodesNumbers[k],spec.meshSizes[k],spec.centers.row(k),spec.normals.row(k));
44 if(success)
45 {
46// density+=2.0*std::numbers::pi*spec.loopRadii[k]/mg.ddBase.mesh.volume()/std::pow(mg.ddBase.poly.b_SI,2);
47 std::cout<<"generated CircularCrack"<<std::endl;
48 }
49 }
50 catch(const std::exception& e)
51 {
52
53 }
54 }
55}
56
57bool CircularCrackGenerator::generateSingle(MicrostructureGenerator& mg,const double& radius,const int& nNodes,const double& meshSize, const VectorDimD& center,const VectorDimD& normal)
58{
59 bool success =false;
60 if(radius>0)
61 {
62 std::pair<bool,const Simplex<3,3>*> found(mg.ddBase.mesh.search(center));
63 if(!found.first)
64 {
65 throw std::runtime_error("ShearLoopGenerator::generateSingle:: center is outside mesh.");
66 }
67
68 const int grainID(found.second->region->regionID);
69 const auto& grain(mg.ddBase.poly.grain(grainID));
70
71 Plane<3> crackPlane(center,normal);
72 const VectorDimD localX1(crackPlane.L2G.col(0));
73
74 std::vector<VectorDimD> crackNodePos;
75 for(int k=0;k< nNodes;++k)
76 {
77 crackNodePos.push_back(center+Eigen::AngleAxisd(k*2.0*std::numbers::pi/nNodes,normal)*localX1*radius);
78 }
79
80 // success=mg.insertJunctionLoop(loopNodePos,glidePlane,
81 // slipSystem.s.cartesian(),glidePlane->referencePlane->unitNormal,
82 // P0,grainID,DislocationLoopIO<3>::GLISSILELOOP);
83 }
84 else
85 {
86 std::cout<<"Skipping CircularCrack of (negative) radius "<<radius<<std::endl;
87 }
88
89 return success;
90}
91
92}
93#endif
CircularCrackGenerator(const CircularCrackIndividualSpecification &, MicrostructureGenerator &mg)
DefectiveCrystalBase< 3 > & ddBase
std::pair< bool, const Simplex< _dim, _dim > * > search(const Eigen::Matrix< double, dim, 1 > &P) const
static std::string defaultColor
static std::string magentaBoldColor
const Polycrystal< dim > & poly
const SimplicialMesh< dim > & mesh
int k
enum insertvertexresult success
int e