Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
DislocationLinkingNumber.h
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_DislocationLinkingNumber_H_
9#define model_DislocationLinkingNumber_H_
10
11#include <numbers>
12#include <iostream>
13#include <vector>
14#include <Eigen/Dense>
15#include <cfloat>
16#include <math.h> /* asin */
17
19
20namespace model
21{
22 template<int dim> class DislocationNetwork;
23
24
25 template<int dim>
27 {
28
29 static constexpr double tol=FLT_EPSILON;
30
31
32 typedef Eigen::Matrix<double,dim,1> VectorDim;
33
34 // /**********************************************************************/
35 // static double F(const double& t1,
36 // const double& t2,
37 // const double& cosBeta,
38 // const double& sinBeta2,
39 // const double& a0)
40 // {
41 //
42 // const double num=t1*t2+a0*a0*cosBeta;
43 // const double den=a0*sqrt(t1*t1+t2*t2-2.0*t1*t2*cosBeta+a0*a0*sinBeta2);
44 // // return -atan2(den+tol,num)/(4.0*std::numbers::pi);
45 // // return fabs(den)>tol? -atan2(den,num)/(4.0*std::numbers::pi) : -atan2(0.0,num)/(4.0*std::numbers::pi);
46 // return fabs(den)>tol? -atan2(den,num)/(4.0*std::numbers::pi) : 0.0;
47 //
48 // }
49
50 /**********************************************************************/
51
52 static VectorDim unitCross(const VectorDim& v1,
53 const VectorDim& v2);
54
55 /**********************************************************************/
56
57 static double myAsin(const double& x);
58
59 /**********************************************************************/
60
61 static double segmentPairLN(const VectorDim& R1,
62 const VectorDim& R2,
63 const VectorDim& R3,
64 const VectorDim& R4);
65
66 /**********************************************************************/
67
68 static double loopPairLN(const std::vector<VectorDim>& loop1,
69 const std::vector<VectorDim>& loop2);
70
71 /**********************************************************************/
72
73 static double loopPairHelicity(const std::vector<VectorDim>& loop1,
74 const VectorDim& b1,
75 const std::vector<VectorDim>& loop2,
76 const VectorDim& b2);
77
78 };
79
86 template<int dim>
88 {
89 typedef typename DislocationNetwork<dim>::LoopType LoopType;
90 typedef typename DislocationNetwork<dim>::LoopLinkType LoopLink;
91 typedef typename DislocationNetwork<dim>::VectorDim VectorDim;
92
93
95
96 static constexpr double tol=FLT_EPSILON;
97
98
99
100 /**********************************************************************/
101
102 static double segmentPairLN(const LoopLink& link1,
103 const LoopLink& link2);
104
105
106
107
108
109 // /**********************************************************************/
110 // static double segmentPairLN(const VectorDim& R1,
111 // const VectorDim& R2,
112 // const VectorDim& R3,
113 // const VectorDim& R4)
114 // {
119 //
120 // const VectorDim R13(R3-R1);
121 // const VectorDim R12(R2-R1);
122 // const VectorDim R34(R4-R3);
123 //
124 // const double R13norm(R13.norm());
125 // const double R12norm(R12.norm());
126 // const double R34norm(R34.norm());
127 //
128 // if(R13norm>tol && R12norm>tol && R34norm>tol)
129 // {
130 // const double prod(R34.cross(R12).dot(R13)/R13norm/R12norm/R34norm);
131 // if(fabs(prod)>tol)
132 // {
133 // const VectorDim R14(R4-R1);
134 // const VectorDim R24(R4-R2);
135 // const VectorDim R23(R3-R2);
136 //
137 // const VectorDim n1(unitCross(R13,R14));
138 // const VectorDim n2(unitCross(R14,R24));
139 // const VectorDim n3(unitCross(R24,R23));
140 // const VectorDim n4(unitCross(R23,R13));
141 //
142 //
143 // const double Os= myAsin(n1.dot(n2))
144 // /* */+myAsin(n2.dot(n3))
145 // /* */+myAsin(n3.dot(n4))
146 // /* */+myAsin(n4.dot(n1));
147 //
148 // return Os/(4.0*std::numbers::pi)*prod/fabs(prod);
149 //
150 // }
151 // else
152 // {
153 // return 0.0;
154 // }
155 // }
156 // else
157 // {
158 // return 0.0;
159 // }
160 // }
161
162 // /**********************************************************************/
163 // static double segmentPairLN_b(const LoopLink& link1,
164 // const LoopLink& link2)
165 // {
166 // const VectorDim R1(link1.source->get_P());
167 // const VectorDim R2(link2.source->get_P());
168 //
169 // const VectorDim S1(link1.sink->get_P()-link1.source->get_P());
170 // const VectorDim S2(link2.sink->get_P()-link2.source->get_P());
171 // const double s1(S1.norm());
172 // const double s2(S2.norm());
173 // const VectorDim e1(S1.normalized());
174 // const VectorDim e2(S2.normalized());
175 // const VectorDim R12(R2-R1);
176 //
177 // const double cosBeta(e1.dot(e2));
178 // const double sinBeta2(1.0-cosBeta*cosBeta);
179 // const double a1=R12.dot(e2*cosBeta-e1)/(sinBeta2+tol);
180 // const double a2=R12.dot(e2-e1*cosBeta)/(sinBeta2+tol);
181 // const double a0=R12.dot(e1.cross(e2))/(sinBeta2+tol);
182 //
196 //
197 // return F(a1+s1,a2+s2,cosBeta,sinBeta2,a0)
198 // /* */ -F(a1+s1,a2 ,cosBeta,sinBeta2,a0)
199 // /* */ -F(a1 ,a2+s2,cosBeta,sinBeta2,a0)
200 // /* */ +F(a1 ,a2 ,cosBeta,sinBeta2,a0);
201 // }
202
203
204 /**********************************************************************/
205
206 static std::pair<double,bool> linkingNumber(const LoopType& loop1,
207 const LoopType& loop2);
208
209 public:
210
211 /**********************************************************************/
212
214
215
216 /**********************************************************************/
217 template <class T>
218 friend T& operator << (T& os, const DislocationLinkingNumber<dim>& ln)
219 {
220 ln.write(os);
221 return os;
222 }
223
224 std::ostream& write(std::ostream& os) const;
225
226 };
227
228}
229#endif
230
friend T & operator<<(T &os, const DislocationLinkingNumber< dim > &ln)
std::ostream & write(std::ostream &os) const
DislocationLinkingNumber(const DislocationNetwork< dim > &DN_in)
TraitsType::VectorDim VectorDim
TraitsType::LoopType LoopType
TraitsType::LoopLinkType LoopLinkType
x
Definition int_R.m:12
static VectorDim unitCross(const VectorDim &v1, const VectorDim &v2)
static double loopPairLN(const std::vector< VectorDim > &loop1, const std::vector< VectorDim > &loop2)
Eigen::Matrix< double, dim, 1 > VectorDim
static double loopPairHelicity(const std::vector< VectorDim > &loop1, const VectorDim &b1, const std::vector< VectorDim > &loop2, const VectorDim &b2)
static constexpr double tol
static double myAsin(const double &x)
static double segmentPairLN(const VectorDim &R1, const VectorDim &R2, const VectorDim &R3, const VectorDim &R4)