Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
DislocationLinkingNumber.cpp
Go to the documentation of this file.
3
4namespace model
5{
6template<int dim>
8 const VectorDim& v2)
9 {
10 VectorDim temp(v1.cross(v2));
11 const double tempNorm(temp.norm());
12 return (tempNorm<tol)? VectorDim::Zero() : (temp/tempNorm).eval();
13 }
14
15template<int dim>
16double LinkingNumber<dim>::myAsin(const double& x)
17 {
18 if(x>=1.0)
19 {
20 return 0.5*std::numbers::pi;
21 }
22 else if(x<=-1.0)
23 {
24 return -0.5*std::numbers::pi;
25 }
26 else
27 {
28 return asin(x);
29 }
30 }
31
32template<int dim>
34 const VectorDim& R2,
35 const VectorDim& R3,
36 const VectorDim& R4)
37 {
38 // const VectorDim& R1(link1.source->get_P());
39 // const VectorDim& R2(link1. sink->get_P());
40 // const VectorDim& R3(link2.source->get_P());
41 // const VectorDim& R4(link2. sink->get_P());
42
43 const VectorDim R13(R3-R1);
44 const VectorDim R12(R2-R1);
45 const VectorDim R34(R4-R3);
46
47 const double R13norm(R13.norm());
48 const double R12norm(R12.norm());
49 const double R34norm(R34.norm());
50
51 if(R13norm>tol && R12norm>tol && R34norm>tol)
52 {
53 const double prod(R34.cross(R12).dot(R13)/R13norm/R12norm/R34norm);
54 if(fabs(prod)>tol)
55 {
56 const VectorDim R14(R4-R1);
57 const VectorDim R24(R4-R2);
58 const VectorDim R23(R3-R2);
59
60 const VectorDim n1(unitCross(R13,R14));
61 const VectorDim n2(unitCross(R14,R24));
62 const VectorDim n3(unitCross(R24,R23));
63 const VectorDim n4(unitCross(R23,R13));
64
65
66 const double Os= myAsin(n1.dot(n2))
67 /* */+myAsin(n2.dot(n3))
68 /* */+myAsin(n3.dot(n4))
69 /* */+myAsin(n4.dot(n1));
70
71 return Os/(4.0*std::numbers::pi)*prod/fabs(prod);
72
73 }
74 else
75 {
76 return 0.0;
77 }
78 }
79 else
80 {
81 return 0.0;
82 }
83 }
84
85template<int dim>
86double LinkingNumber<dim>::loopPairLN(const std::vector<VectorDim>& loop1,
87 const std::vector<VectorDim>& loop2)
88 {
89
90 double temp(0.0);
91
92 for(size_t i=0;i<loop1.size();++i)
93 {
94
95 const size_t i1(i==loop1.size()-1? 0 : i+1);
96
97 for(size_t j=0;j<loop2.size();++j)
98 {
99
100 const size_t j1(j==loop2.size()-1? 0 : j+1);
101
102 temp+=segmentPairLN(loop1[i],
103 loop1[i1],
104 loop2[j],
105 loop2[j1]);
106 }
107 }
108 return temp;
109 }
110
111template<int dim>
112double LinkingNumber<dim>::loopPairHelicity(const std::vector<VectorDim>& loop1,
113 const VectorDim& b1,
114 const std::vector<VectorDim>& loop2,
115 const VectorDim& b2)
116 {
117
118
119 return loopPairLN(loop1,loop2)*b1.dot(b2);
120
121 }
122
123template<int dim>
124double DislocationLinkingNumber<dim>::segmentPairLN(const LoopLink& link1,
125 const LoopLink& link2)
126 {
127
128 const VectorDim& R1(link1.source->get_P());
129 const VectorDim& R2(link1. sink->get_P());
130 const VectorDim& R3(link2.source->get_P());
131 const VectorDim& R4(link2. sink->get_P());
132
133 if( (link1.source->sID==link2.source->sID && link1.sink->sID==link2.sink->sID)
134 || (link1.source->sID==link2.sink->sID && link1.sink->sID==link2.source->sID))
135 {
136 return 0.0;
137 }
138 else
139 {
140 return LinkingNumber<dim>::segmentPairLN(R1,R2,R3,R4);
141 }
142 }
143
144template<int dim>
145std::pair<double,bool> DislocationLinkingNumber<dim>::linkingNumber(const LoopType& loop1,
146 const LoopType& loop2)
147 {
148 double Ln=0.0;
149
150 bool loopsTouch=false;
151
152 for(const auto& link1 : loop1.loopLinks())
153 {
154 for(const auto& link2 : loop2.loopLinks())
155 {
156 if(SegmentSegmentDistance<dim>(link1->source->get_P(),
157 link1->sink->get_P(),
158 link2->source->get_P(),
159 link2->sink->get_P()).dMin<FLT_EPSILON)
160 {
161 loopsTouch=true;
162 }
163
164 Ln += segmentPairLN(*link1,*link2);
165
166 }
167 }
168
169 return std::make_pair(Ln,loopsTouch);
170 }
171
172template<int dim>
174 /* init */ DN(DN_in)
175 {
176
177
178 }
179
180template<int dim>
181std::ostream& DislocationLinkingNumber<dim>::write(std::ostream& os) const
182{
183 const auto& ln=*this;
184
185 for(auto loopIter1=ln.DN.loops().begin();loopIter1!=ln.DN.loops().end();++loopIter1)
186 {
187 for(auto loopIter2=loopIter1;loopIter2!=ln.DN.loops().end();++loopIter2)
188 {
189 if(loopIter1!=loopIter2)
190 {
191 const std::pair<double,bool> Ln(linkingNumber(*loopIter1->second.lock(),*loopIter2->second.lock()));
192
193 os <<loopIter1->first<<" "<<loopIter2->first;
194 os <<" "<<Ln.second<<" "<<Ln.first;
195 os <<" "<<loopIter1->second.lock()->burgers().dot(loopIter2->second.lock()->burgers());
196 // os <<" "<<loopIter1->second->burgers().transpose();
197 // os <<" "<<loopIter2->second->burgers().transpose();
198 os <<"\n";
199 }
200 }
201 }
202
203 return os;
204
205}
206
207 template struct LinkingNumber<3>;
208 template class DislocationLinkingNumber<3>;
209}
std::ostream & write(std::ostream &os) const
DislocationLinkingNumber(const DislocationNetwork< dim > &DN_in)
x
Definition int_R.m:12
auto eval(const std::shared_ptr< T > &t)
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)
int end[2]
int j
int i
vertex temp