11 const double tempNorm(
temp.norm());
12 return (tempNorm<
tol)? VectorDim::Zero() : (
temp/tempNorm).
eval();
20 return 0.5*std::numbers::pi;
24 return -0.5*std::numbers::pi;
47 const double R13norm(R13.norm());
48 const double R12norm(R12.norm());
49 const double R34norm(R34.norm());
51 if(R13norm>
tol && R12norm>
tol && R34norm>
tol)
53 const double prod(R34.cross(R12).dot(R13)/R13norm/R12norm/R34norm);
66 const double Os=
myAsin(n1.dot(n2))
71 return Os/(4.0*std::numbers::pi)*prod/fabs(prod);
87 const std::vector<VectorDim>& loop2)
92 for(
size_t i=0;
i<loop1.size();++
i)
95 const size_t i1(
i==loop1.size()-1? 0 :
i+1);
97 for(
size_t j=0;
j<loop2.size();++
j)
100 const size_t j1(
j==loop2.size()-1? 0 :
j+1);
114 const std::vector<VectorDim>& loop2,
124double DislocationLinkingNumber<dim>::segmentPairLN(
const LoopLink& link1,
129 const VectorDim& R2(link1. sink->get_P());
131 const VectorDim& R4(link2. sink->get_P());
145std::pair<double,bool> DislocationLinkingNumber<dim>::linkingNumber(
const LoopType& loop1,
150 bool loopsTouch=
false;
152 for(
const auto& link1 : loop1.loopLinks())
154 for(
const auto& link2 : loop2.loopLinks())
157 link1->
sink->get_P(),
159 link2->
sink->get_P()).
dMin<FLT_EPSILON)
164 Ln += segmentPairLN(*link1,*link2);
169 return std::make_pair(Ln,loopsTouch);
183 const auto& ln=*
this;
185 for(
auto loopIter1=ln.DN.loops().begin();loopIter1!=ln.DN.loops().end();++loopIter1)
187 for(
auto loopIter2=loopIter1;loopIter2!=ln.DN.loops().
end();++loopIter2)
189 if(loopIter1!=loopIter2)
191 const std::pair<double,bool> Ln(linkingNumber(*loopIter1->second.lock(),*loopIter2->second.lock()));
193 os <<loopIter1->first<<
" "<<loopIter2->first;
194 os <<
" "<<Ln.second<<
" "<<Ln.first;
195 os <<
" "<<loopIter1->second.lock()->burgers().dot(loopIter2->second.lock()->burgers());
std::ostream & write(std::ostream &os) const
DislocationLinkingNumber(const DislocationNetwork< dim > &DN_in)
const std::shared_ptr< LoopNodeType > source
const std::shared_ptr< LoopNodeType > sink
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)