Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
GrainBoundary.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_GrainBoundary_cpp_
9#define model_GrainBoundary_cpp_
10
11#include <numbers>
12#include <cfloat> // FLT_EPSILON
13#include <vector>
14#include <deque>
15#include <Eigen/Core>
16#include <Eigen/Eigenvalues>
17//#include <RoundEigen.h>
18#include <SimplicialMesh.h>
19#include <Grain.h>
20//#include <GrainBoundaryType.h>
21#include <LatticePlane.h>
22//#include <LineMeshIntersection.h>
23//#include <CSL.h>
24//#include <DSCL.h>
25//#include <DislocationDynamics/StressStraight.h>
26//#include <GlidePlane.h>
27#include <MeshPlane.h>
28#include <GrainBoundary.h>
29
30
31namespace model
32{
33
34 template <int dim>
35 void GrainBoundary<dim>::computeCrystallographicRotationAxis()
36 {
37 // Compute the relative rotation matrix R such that C2G2=R*C2G1
38 const MatrixDimD R(grain(grainBndID.first).C2G.transpose()*grain(grainBndID.second).C2G);
39
40 // Eigen-decompose R
41 Eigen::EigenSolver<MatrixDimD> es(R);
42
43 // Determine _crystallographicRotationAxis as the eigenvector of R corresponding to eigenvalue=1
44 for(unsigned int j=0;j<dim;++j)
45 {
46 if(fabs(es.eigenvalues()(j).real()-1.0)<FLT_EPSILON && fabs(es.eigenvalues()(j).imag())<FLT_EPSILON)
47 {
48 for(unsigned int d=0;d<dim;++d)
49 {
50 _crystallographicRotationAxis=es.eigenvectors().col(j).real();
51 }
52 break;
53 }
54 }
55 const double axisNorm(_crystallographicRotationAxis.norm());
56 assert(axisNorm>FLT_EPSILON);
57 _crystallographicRotationAxis/=axisNorm;
58
59 _rotationAxis=grain(grainBndID.first).C2G*_crystallographicRotationAxis;
60 assert((_rotationAxis-grain(grainBndID.second).C2G*_crystallographicRotationAxis).norm()<FLT_EPSILON && "rotationAxis inconsistency.");
61
62 cosTheta=0.5*(R.trace()-1.0);
63
64 std::cout<<" Rotation axis="<<_crystallographicRotationAxis.transpose()<<std::endl;
65 std::cout<<" Rotation angle="<<acos(cosTheta)*180.0/std::numbers::pi<<" deg"<<defaultColor<<std::endl;
66 }
67
68 template <int dim>
69 GrainBoundary<dim>::GrainBoundary(const MeshRegionBoundaryType& regionbnd_in,
70 const std::shared_ptr<Polyhedron<dim,dim-1>>& face_in,
71 const Grain<dim>& grainFirst,
72 const Grain<dim>& grainSecond
73 ) :
74 // /* init */ MeshPlane<dim>(getMeshPlane(regionbnd_in)),
75 // /* init */ MeshPlane<dim>(mesh,grainFirst.grainID,grainSecond.grainID),
76 /* init */ MeshPlane<dim>(*face_in,grainFirst.grainID,grainSecond.grainID),
77 // /* init */ _csl(grainFirst,grainSecond),
78 // /* init */ _dscl(grainFirst,grainSecond),
79 /* init */ _crystallographicRotationAxis(VectorDimD::Zero()),
80 /* init */ _rotationAxis(_crystallographicRotationAxis),
81 /* init */ cosTheta(1.0),
82 // /* init */ p_gbType(NULL),
83 /* init */ regionBoundary(regionbnd_in),
84 /* init */ face(face_in),
85 /* init */ grainBndID(regionBoundary.regionBndID)
86 {
87 std::cout<<greenBoldColor<<"Creating GrainBoundary ("<<grainBndID.first<<" "<<grainBndID.second<<")"<<defaultColor<<std::endl;
88 // std::cout<<defaultColor<<" CSL: sigma= "<<_csl.sigma()<<std::endl;
89 // std::cout<<defaultColor<<" DSCL: sigma= "<<_dscl.sigma()<<std::endl;
90
91 // Populate pointers to parent Grains
92 GrainContainerType::emplace(grainFirst.grainID,&grainFirst);
93 GrainContainerType::emplace(grainSecond.grainID,&grainSecond);
94
95 // Populate outNormals to grains
96 const Simplex<dim,dim-1>& triangle(**regionBoundary.simplices().begin());
97 for(const auto& tet : triangle.parents())
98 {
99 const size_t faceID=tet.second->childOrder(triangle.xID);
100 const VectorDimD outNormal=tet.second->nda.col(faceID);
101 const double outNorm(outNormal.norm());
102 const size_t rID=tet.second->region->regionID;
103 assert(outNorm>FLT_EPSILON && "Simplex normal has zero norm.");
104 assert(rID==grainFirst.grainID || rID==grainSecond.grainID);
105 OutNormalContainerType::emplace(rID,outNormal/outNorm);
106 }
107
108 // Initialize
109 // initializeGrainBoundary(dn,mesh);
110 computeCrystallographicRotationAxis();
111// grainFirst.grainBoundaries().emplace(grainBndID,this);
112// grainSecond.grainBoundaries().emplace(grainBndID,this);
113
114 }
115
116 template <int dim>
117 const typename GrainBoundary<dim>::GrainContainerType& GrainBoundary<dim>::grains() const
118 {
119 return *this;
120 }
121
122 template <int dim>
123 const Grain<dim>& GrainBoundary<dim>::grain(const size_t& k) const
124 {
125 return *(grains().at(k));
126 }
127
128 template <int dim>
129 const typename GrainBoundary<dim>::OutNormalContainerType& GrainBoundary<dim>::outNormals() const
130 {
131 return *this;
132 }
133
134 template <int dim>
135 const typename GrainBoundary<dim>::VectorDimD& GrainBoundary<dim>::outNormal(const size_t& k) const
136 {
137 return outNormals().at(k);
138 }
139
140 template <int dim>
141 const typename GrainBoundary<dim>::VectorDimD& GrainBoundary<dim>::crystallographicRotationAxis() const
142 {
143 return _crystallographicRotationAxis;
144 }
145
146 template <int dim>
147 const typename GrainBoundary<dim>::VectorDimD& GrainBoundary<dim>::rotationAxis() const
148 {
149 return _rotationAxis;
150 }
151
152 template <int dim>
154 {
155 return acos(cosTheta);
156 }
157
158 template <int dim>
159 std::string GrainBoundary<dim>::tag() const
160 {
161 return "(" + std::to_string(grainBndID.first)+"," +std::to_string(grainBndID.second)+")";
162 }
163
164 template <int dim>
166
167 template class GrainBoundary<3>;
168
169}
170#endif
171
172
double rotationAngle() const
const VectorDimD & rotationAxis() const
const VectorDimD & outNormal(const size_t &k) const
const VectorDimD & crystallographicRotationAxis() const
const GrainContainerType & grains() const
std::string tag() const
const MeshRegionBoundaryType & regionBoundary
const std::pair< int, int > & grainBndID
const OutNormalContainerType & outNormals() const
static bool use_GBdislocations
const std::shared_ptr< Polyhedron< dim, dim-1 > > & face
const Grain< dim > & grain(const size_t &k) const
GrainBoundary(const MeshRegionBoundaryType &regionbnd_in, const std::shared_ptr< Polyhedron< dim, dim-1 > > &face_in, const Grain< dim > &grainFirst, const Grain< dim > &grainSecond)
const size_t & grainID
Definition Grain.h:49
static std::string greenBoldColor
static std::string defaultColor
MeshPlane(const SimplicialMesh< dim > &mesh, const size_t &rID, const VectorDim &p, const VectorDim &n)
Definition MeshPlane.cpp:57
int j
REAL ** triangle
Definition triangle.cpp:508
int k