Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
SlipSystem.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
9#ifndef model_SLIPSYSTEM_cpp_
10#define model_SLIPSYSTEM_cpp_
11
12#include <memory>
13#include <assert.h>
14#include <LatticeModule.h>
16#include <SlipSystem.h>
17
18namespace model
19{
20
22 const RationalLatticeDirection<3>& slip_in,
23 const std::shared_ptr<DislocationMobility>& mobility_in,
24 const std::shared_ptr<GlidePlaneNoise>& planeNoise_in):
25 /* init */ n(n_in)
26 /* init */,s(slip_in)
27 /* init */,unitNormal(n.cartesian().normalized())
28 /* init */,unitSlip(s.cartesian().normalized())
29 /* init */,unitSlipFull(n.primitiveVectors.first.cartesian().normalized())
30 /* init */,G2Lfull((MatrixDim()<<unitSlipFull,unitNormal.cross(unitSlipFull),unitNormal).finished())
31 /* init */,mobility(mobility_in)
32 /* init */,planeNoise(planeNoise_in)
33 {
34
35 if(isPartial())
36 {
37 std::cout<<greenColor<<"Creating partial SlipSystem "<<this->sID<<defaultColor<<std::endl;
38 }
39 else
40 {
41 std::cout<<greenColor<<"Creating full SlipSystem "<<this->sID<<defaultColor<<std::endl;
42 }
43
44 std::cout<<" s= "<<std::setprecision(15)<<std::scientific<<s.cartesian().transpose()<<std::endl;
45 std::cout<<" n= "<<std::setprecision(15)<<std::scientific<<n.cartesian().transpose()<<std::endl;
46 std::cout<<" mobility= "<<mobility->name<<std::endl;
47
48
49 if(s.dot(n)!=0)
50 {
51 throw std::runtime_error("SlipSystem: PLANE NORMAL AND SLIP DIRECTION ARE NOT ORTHOGONAL.");
52 }
53 if(!mobility)
54 {
55 throw std::runtime_error("SlipSystem: MOBILITY CANNOT BE A NULLPTR.");
56 }
57
58 if((G2Lfull*G2Lfull.transpose()-MatrixDim::Identity()).squaredNorm()>FLT_EPSILON)
59 {
60 throw std::runtime_error("G2Lfull is not orthogonal.");
61 }
62
63 }
64
66 {
67 return abs(s.rat.d)!=1;
68 }
69
71 {
72 if( ((s-s1).squaredNorm()==0 && (n-n1).base().squaredNorm()==0)
73 || ((s+s1).squaredNorm()==0 && (n+n1).base().squaredNorm()==0)
74 )
75 {
76 return true;
77 }
78 else
79 {
80 return false;
81 }
82 }
83
84 Eigen::Matrix<double,2,1> SlipSystem::globalToLocal(const VectorDim& x) const
85 {
86 return (G2Lfull*x).template segment<2>(0);
87 }
88
89 Eigen::Matrix<double,3,1> SlipSystem::localToGlobal(const Eigen::Matrix<double,2,1>& x) const
90 {
91 return (G2Lfull.transpose()).template block<3,2>(0,0)*x;
92 }
93
94 std::tuple<Eigen::Matrix<double,3,3>,double,double> SlipSystem::gridInterp(const VectorDim& x) const
95 { // Added by Hyunsoo (hyunsol@g.clemson.edu)
96
97 if(planeNoise)
98 {
99 const std::tuple<double,double,double> gridNoise(planeNoise->gridInterp(globalToLocal(x)));
100
101 const Eigen::Matrix<double,3,3> ssStress( std::get<0>(gridNoise)*(G2Lfull.row(2).transpose()*G2Lfull.row(0)+G2Lfull.row(0).transpose()*G2Lfull.row(2))
102 +std::get<1>(gridNoise)*(G2Lfull.row(2).transpose()*G2Lfull.row(1)+G2Lfull.row(1).transpose()*G2Lfull.row(2)));
103 const double ssRSS((ssStress*unitSlip).dot(unitNormal));
104 return std::make_tuple(ssStress,ssRSS,std::get<2>(gridNoise));
105 }
106 else
107 {
108 return std::make_tuple(Eigen::Matrix<double,3,3>::Zero(),0.0,0.0);
109 }
110 }
111
112 std::tuple<Eigen::Matrix<double,3,3>,double,double> SlipSystem::gridVal(const Eigen::Array<int,2,1>& idx) const
113 { // Added by Hyunsoo (hyunsol@g.clemson.edu)
114
115 if(planeNoise)
116 {
117 const std::tuple<double,double,double> gridNoise(planeNoise->gridVal(idx));
118
119 const Eigen::Matrix<double,3,3> ssStress( std::get<0>(gridNoise)*(G2Lfull.row(2).transpose()*G2Lfull.row(0)+G2Lfull.row(0).transpose()*G2Lfull.row(2))
120 +std::get<1>(gridNoise)*(G2Lfull.row(2).transpose()*G2Lfull.row(1)+G2Lfull.row(1).transpose()*G2Lfull.row(2)));
121 const double ssRSS((ssStress*unitSlip).dot(unitNormal));
122 return std::make_tuple(ssStress,ssRSS,std::get<2>(gridNoise));
123 }
124 else
125 {
126 return std::make_tuple(Eigen::Matrix<double,3,3>::Zero(),0.0,0.0);
127 }
128 }
129
130double SlipSystem::velocity(const MatrixDim& S,const VectorDim& xi,const double& T) const
131{
132 return mobility? mobility->velocity(S,s.cartesian(),xi,unitNormal,T) : 0.0;
133}
134
135
136}
137#endif
the tangent vector S
x
Definition int_R.m:12
static std::string greenColor
static std::string defaultColor
Eigen::Matrix< double, 2, 1 > globalToLocal(const VectorDim &x) const
const std::shared_ptr< GlidePlaneNoise > planeNoise
Definition SlipSystem.h:35
std::tuple< Eigen::Matrix< double, 3, 3 >, double, double > gridVal(const Eigen::Array< int, 2, 1 > &idx) const
std::tuple< Eigen::Matrix< double, 3, 3 >, double, double > gridInterp(const VectorDim &x) const
Eigen::Matrix< double, 3, 1 > VectorDim
Definition SlipSystem.h:25
const RationalLatticeDirection< 3 > s
Definition SlipSystem.h:29
const VectorDim unitNormal
Definition SlipSystem.h:30
const MatrixDim G2Lfull
Definition SlipSystem.h:33
VectorDim localToGlobal(const Eigen::Matrix< double, 2, 1 > &x) const
double velocity(const MatrixDim &S, const VectorDim &xi, const double &T) const
Eigen::Matrix< double, 3, 3 > MatrixDim
Definition SlipSystem.h:26
bool isSameAs(const RationalLatticeDirection< 3 > &s1, const ReciprocalLatticeDirection< 3 > &n1)
const std::shared_ptr< DislocationMobility > mobility
Definition SlipSystem.h:34
const GlidePlaneBase & n
Definition SlipSystem.h:28
SlipSystem(const GlidePlaneBase &n_in, const RationalLatticeDirection< 3 > &slip_in, const std::shared_ptr< DislocationMobility > &mobility_in, const std::shared_ptr< GlidePlaneNoise > &planeNoise_in)
const VectorDim unitSlipFull
Definition SlipSystem.h:32
const VectorDim unitSlip
Definition SlipSystem.h:31
bool isPartial() const
INEXACT REAL s1
REAL * xi
vertex first