Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
PlanarLoopGenerator.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_PlanarLoopGenerator_cpp_
9#define model_PlanarLoopGenerator_cpp_
10
12#include <numbers>
13#include <chrono>
14#include <random>
15#include <cmath>
16#include <list>
17#include <assert.h>
18#include <Eigen/LU>
19#include <Eigen/Cholesky>
20#include <limits>
21
22//#include <Simplex.h>
23#include <SimplicialMesh.h>
24#include <Polycrystal.h>
26#include <LatticeModule.h>
27//#include <PlaneMeshIntersection.h>
34
36#include <TextFileParser.h>
38#include <MeshBoundarySegment.h>
39//#include <ConfinedDislocationObject.h>
40#include <GlidePlaneModule.h>
41#include <MeshModule.h>
42#include <Plane.h>
44#include <PlanarLoopGenerator.h>
46
47namespace model
48{
49
51{
52
53 std::cout<<magentaBoldColor<<"Generating individual planar loop"<<defaultColor<<std::endl;
54 if(spec.loopPoints.rows()>2)
55 {
56// const Eigen::Matrix<double,Eigen::Dynamic,dim> loopPointsMatrix(this->parser.readMatrixCols<double>("loopNodes",dim,true));
57 std::vector<VectorDimD> loopPoints;
58 for(int i=0;i<spec.loopPoints.rows();++i)
59 {
60 loopPoints.push_back(spec.loopPoints.row(i));
61 }
62 generateSingle(mg,spec.burgers,spec.normal,loopPoints);
63
64 }
65
66}
67
68 void PlanarLoopGenerator::generateSingle(MicrostructureGenerator& mg,const VectorDimD& b,const VectorDimD& n,const std::vector<VectorDimD>& loopPoints)
69 {
70 if(loopPoints.size()>=3)
71 {
72 // Grain is defined by first point
73 std::pair<bool,const Simplex<dim,dim>*> found(mg.ddBase.mesh.search(loopPoints[0]));
74 if(!found.first)
75 {
76 std::cout<<"Point "<<loopPoints[0].transpose()<<" is outside mesh. EXITING."<<std::endl;
77 exit(EXIT_FAILURE);
78 }
79
80 const int grainID(found.second->region->regionID);
81 //assert(mg.ddBase.poly.grains.size()==1 && "Periodic dislocations only supported for single crystals");
82 const auto& grain(mg.ddBase.poly.grain(grainID));
83
84 const ReciprocalLatticeDirection<dim> r(grain->reciprocalLatticeDirection(n));
85 GlidePlaneKey<3> glidePlaneKey(loopPoints[0], r);
86 std::shared_ptr<PeriodicGlidePlane<3>> glidePlane(mg.ddBase.dislocationDynamics().periodicGlidePlaneFactory.get(glidePlaneKey));
87// const GlidePlane<dim> glidePlane(loopPoints[0],r);
88 for(const auto& point : loopPoints)
89 {
90 if(!glidePlane->referencePlane->contains(point))
91 {
92 throw std::runtime_error("Plane does not contain point.");
93 }
94 }
95
96
97 mg.insertJunctionLoop(loopPoints,glidePlane,
98 b,n,
99 loopPoints[0],grainID,std::fabs(b.normalized().dot(n.normalized()))<FLT_EPSILON? DislocationLoopIO<dim>::GLISSILELOOP : DislocationLoopIO<dim>::SESSILELOOP);
100
101 }
102
103
104 }
105
106// void PlanarLoopGenerator::generateDensity(MicrostructureGenerator& mg)
107// {
108// throw std::runtime_error("PlanarLoopGenerator::generateDensity not implemented");
109// }
110
111// void PlanarLoopGenerator::generateIndividual(MicrostructureGenerator& mg)
112// {
113//
114// std::cout<<magentaBoldColor<<"Generating individual planar loop"<<defaultColor<<std::endl;
115// const Eigen::Matrix<double,Eigen::Dynamic,dim> loopPointsMatrix(this->parser.readMatrixCols<double>("loopNodes",dim,true));
116// std::vector<VectorDimD> loopPoints;
117// for(int i=0;i<loopPointsMatrix.rows();++i)
118// {
119// loopPoints.push_back(loopPointsMatrix.row(i));
120// }
121// generateSingle(mg,
122// this->parser.readMatrix<double>("loopBurgers",1,dim,true),
123// this->parser.readMatrix<double>("loopNormal",1,dim,true),
124// loopPoints);
125//
126// }
127
128}
129#endif
bool insertJunctionLoop(const std::vector< VectorDimD > &loopNodePos, const std::shared_ptr< PeriodicGlidePlane< 3 > > &periodicPlane, const VectorDimD &b, const VectorDimD &unitNormal, const VectorDimD &P0, const size_t &grainID, const DislocationLoopIO< dim >::DislocationLoopType &loopType)
DefectiveCrystalBase< 3 > & ddBase
PlanarLoopGenerator(const PlanarLoopIndividualSpecification &spec, MicrostructureGenerator &mg)
std::pair< bool, const Simplex< _dim, _dim > * > search(const Eigen::Matrix< double, dim, 1 > &P) const
b
Definition int_R.m:16
static std::string defaultColor
static std::string magentaBoldColor
LatticePlaneKey< dim > GlidePlaneKey
const Polycrystal< dim > & poly
const SimplicialMesh< dim > & mesh
DislocationDynamicsBase< dim > & dislocationDynamics() const
int i