8#ifndef model_DislocationLoopPatches_cpp_
9#define model_DislocationLoopPatches_cpp_
32 std::vector<Eigen::Matrix<double,dim-1,1>> localNodePos;
33 for(
const auto& globalPos : nodePos)
39 for(
const auto& patch : loopPatches)
42 std::vector<Eigen::Matrix<double,dim-1,1>> localPatchPos;
43 for(
const auto& edge : patch->edges())
45 localPatchPos.push_back(*edge->source);
50 if(!localLoopPosOnPeriodicPlane.empty())
52 std::vector<Eigen::Matrix<double,dim,1>> globalLoopPos;
53 std::vector<Eigen::Matrix<double,dim-1,1>> localLoopPos;
55 for(
const auto& localPos : localLoopPosOnPeriodicPlane)
57 globalLoopPos.push_back(
periodicGlidePlane->referencePlane->globalPosition(localPos)+patch->shift);
58 localLoopPos.push_back(patch->glidePlane->localPosition(globalLoopPos.back()));
60 globalPatches().emplace(patch,globalLoopPos);
61 localPatches().emplace(patch,localLoopPos);
77 return _globalPatches;
89 return _globalPatches;
100 for(
size_t k0=0;k0<patch.second.size();++k0)
102 const size_t k1(k0+1<patch.second.size()? k0+1 : 0);
105 nA+= 0.5*(P0-Ps).cross(P1-P0);
115 const double a2(1.0e-2);
116 const double oneA2=sqrt(1.0+a2);
119 const double rhAnorm(rhA.norm());
120 if(rhAnorm>FLT_EPSILON)
125 if(patch.second.size())
127 const VectorDim& planePoint(patch.second[0]);
128 const double posNorm((
x-planePoint).norm());
129 const double dotProd((
x-planePoint).dot(rhN));
130 if(std::fabs(dotProd)>FLT_EPSILON*posNorm)
133 for(
size_t k=0;
k<patch.second.size();++
k)
135 const size_t k1(
k<patch.second.size()-1?
k+1 : 0);
138 const double e1Norm(e1.norm());
139 if(e1Norm>FLT_EPSILON)
143 const double Y1norm(Y1.norm());
144 if(Y1norm>FLT_EPSILON)
148 const double e3Norm(e3.norm());
149 if(e3Norm>FLT_EPSILON)
153 const double ydy(e1.dot(Y1));
154 const double w=sqrt((1.0-ydy)/(1.0+ydy));
155 const double s3(s.dot(e3));
156 const double s3A2=sqrt(std::pow(s3,2)+a2);
157 temp+=2.0*s3/oneA2/s3A2*atan(s3A2*
w/(oneA2-s.dot(e1)-s.dot(e2)*
w));
177 if(pair.first->glidePlane)
179 if(pair.first->glidePlane->contains(pt))
181 const auto localPt(pair.first->glidePlane->localPosition(pt));
197 if(pair.first->glidePlane)
199 if(pair.first->glidePlane==ptPlane)
209 template <
typename T>
212 return (val > T(0)) - (val < T(0));
static constexpr std::vector< PointType > clip(const std::vector< PointType > &subject, const std::vector< PointType > &boundary)
void update(const std::vector< VectorDim > &linkShifts, const std::vector< VectorDim > &nodePos)
std::map< std::shared_ptr< PeriodicPlanePatch< dim > >, std::vector< VectorDim > > GlobalPatchPositionType
static int sgn(const T &val)
const GlobalPatchPositionType & globalPatches() const
Eigen::Matrix< double, dim, 1 > VectorDim
const LocalPatchPositionType & localPatches() const
double solidAngle(const VectorDim &x) const
std::map< std::shared_ptr< PeriodicPlanePatch< dim > >, std::vector< VectorLowerDim > > LocalPatchPositionType
DislocationLoopPatches(const std::shared_ptr< PeriodicGlidePlaneType > &periodicGlidePlane_in)
const VectorDim orientedArea() const
const std::shared_ptr< PeriodicGlidePlaneType > periodicGlidePlane
int windingNumber(const VectorDim &pt) const
static int windingNumber(const PointType &P, const std::vector< PointType > &V)