8#ifndef model_GrainBoundary_cpp_
9#define model_GrainBoundary_cpp_
16#include <Eigen/Eigenvalues>
21#include <LatticePlane.h>
35 void GrainBoundary<dim>::computeCrystallographicRotationAxis()
38 const MatrixDimD R(grain(grainBndID.first).C2G.transpose()*grain(grainBndID.second).C2G);
41 Eigen::EigenSolver<MatrixDimD> es(R);
44 for(
unsigned int j=0;
j<
dim;++
j)
46 if(fabs(es.eigenvalues()(
j).real()-1.0)<FLT_EPSILON && fabs(es.eigenvalues()(
j).imag())<FLT_EPSILON)
48 for(
unsigned int d=0;d<
dim;++d)
50 _crystallographicRotationAxis=es.eigenvectors().col(
j).real();
55 const double axisNorm(_crystallographicRotationAxis.norm());
56 assert(axisNorm>FLT_EPSILON);
57 _crystallographicRotationAxis/=axisNorm;
59 _rotationAxis=grain(grainBndID.first).C2G*_crystallographicRotationAxis;
60 assert((_rotationAxis-grain(grainBndID.second).C2G*_crystallographicRotationAxis).norm()<FLT_EPSILON &&
"rotationAxis inconsistency.");
62 cosTheta=0.5*(R.trace()-1.0);
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;
76 MeshPlane<dim>(*face_in,grainFirst.grainID,grainSecond.grainID),
79 _crystallographicRotationAxis(VectorDimD::Zero()),
80 _rotationAxis(_crystallographicRotationAxis),
92 GrainContainerType::emplace(grainFirst.
grainID,&grainFirst);
93 GrainContainerType::emplace(grainSecond.
grainID,&grainSecond);
97 for(
const auto& tet :
triangle.parents())
99 const size_t faceID=tet.second->childOrder(
triangle.xID);
100 const VectorDimD
outNormal=tet.second->nda.col(faceID);
102 const size_t rID=tet.second->region->regionID;
103 assert(outNorm>FLT_EPSILON &&
"Simplex normal has zero norm.");
105 OutNormalContainerType::emplace(rID,
outNormal/outNorm);
110 computeCrystallographicRotationAxis();
143 return _crystallographicRotationAxis;
149 return _rotationAxis;
155 return acos(cosTheta);
double rotationAngle() const
const VectorDimD & rotationAxis() const
const VectorDimD & outNormal(const size_t &k) const
const VectorDimD & crystallographicRotationAxis() const
const GrainContainerType & grains() 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 ®ionbnd_in, const std::shared_ptr< Polyhedron< dim, dim-1 > > &face_in, const Grain< dim > &grainFirst, const Grain< dim > &grainSecond)
static std::string greenBoldColor
static std::string defaultColor
MeshPlane(const SimplicialMesh< dim > &mesh, const size_t &rID, const VectorDim &p, const VectorDim &n)