8#ifndef model_DislocationNode_cpp_
9#define model_DislocationNode_cpp_
32 VerboseDislocationNode(1,
" Creating Network Node " << this->
tag() <<
" @ "<<this->get_P().transpose() << std::endl;);
46 VerboseDislocationNode(1,
" Creating Network Node " << this->
tag() <<
" @ "<<this->get_P().transpose() << std::endl;);
55 if(std::get<1>(link.second)->isSessile())
57 temp+=std::get<1>(link.second)->climbDirection()*std::get<1>(link.second)->chordLength();
60 const double tempNorm(
temp.norm());
61 return tempNorm>FLT_EPSILON? (
temp/tempNorm).
eval() : VectorDim::Zero();
67 VerboseDislocationNode(1,
" Destroying Network Node " << this->
tag() << std::endl;);
80 std::pair<bool,const Simplex<dim,dim>*>
temp(
false,NULL);
90 if((*
grains.begin())->grainID!=guess->region->regionID)
96 temp=this->
network().ddBase.mesh.searchRegionWithGuess(X,guess);
101 temp=this->
network().ddBase.mesh.searchWithGuess(X,guess);
107 const double baryMin(
temp.second->pos2bary(X).minCoeff(&faceID));
108 const bool isApproxOnBoundary(std::fabs(baryMin)<1.0e3*FLT_EPSILON &&
temp.second->child(faceID).isBoundarySimplex());
109 if(!isApproxOnBoundary)
111 std::cout<<
"PlanarDislocationNode "<<this->
sID<<
" @ "<<X.transpose()<<std::endl;
112 std::cout<<
"Simplex "<<
temp.second->xID<<std::endl;
113 std::cout<<
"bary "<<
temp.second->pos2bary(X)<<std::endl;
114 std::cout<<
"face of barymin is "<<
temp.second->child(faceID).xID<<std::endl;
115 std::cout<<
"face of barymin is boundary Simplex? "<<
temp.second->child(faceID).isBoundarySimplex()<<std::endl;
116 std::cout<<
"face of barymin is region-boundary Simplex? "<<
temp.second->child(faceID).isRegionBoundarySimplex()<<std::endl;
117 throw std::runtime_error(
"DISLOCATION NODE OUTSIDE MESH.");
131 if(!ln->periodicPlanePatch())
135 const int grain=ln->periodicPlanePatch()->glidePlane->grain.grainID;
136 for(
const auto& edge : {ln->periodicPlaneEdge.first,ln->periodicPlaneEdge.second})
142 for(
const auto* face : edge->meshIntersection->faces)
144 if(!face->periodicFacePair.second || face->regionIDs!=face->periodicFacePair.second->regionIDs)
146 const VectorDim normal=face->outNormal(grain);
147 bool duplicate=
false;
148 for(
const auto& existing : normals)
150 duplicate|=(normal-existing).norm()<1.e-12;
152 if(!duplicate && normal.squaredNorm()>0.0)
154 normals.push_back(normal);
169 if(ln->loop()->glidePlane)
171 equalities.push_back(ln->loop()->glidePlane->unitNormal);
179 for(
int r=0;r<this->
network().nodalVelocityConstraints.rows();++r)
181 equalities.push_back(this->
network().nodalVelocityConstraints.row(r));
190 double emaStrength=0.0;
251 for(
const auto& neighboor : this->
neighbors())
253 std::get<1>(neighboor.second)->updateGeometry();
265 normals.push_back(plane->unitNormal);
267 for(
int r=0;r<
network.nodalVelocityConstraints.rows();++r)
269 normals.push_back(
network.nodalVelocityConstraints.row(r));
272 const bool immediate=!
network.trialNodeMotion;
274 for(
const auto* node : this->
loopNodes())
281 for(
const auto& entry : saved)
283 entry.first->set_P(
VectorDim(entry.second.get_P()+displacement));
293 for(
const auto& entry : saved)
297 network.trialNodeMotion=!immediate;
306 VerboseDislocationNode(1,
" Setting P for Network Node " << this->
tag() << std::endl;);
308 if((SplineNodeType::get_P()-newP).norm()>FLT_EPSILON)
311 SplineNodeType::set_P(newP);
316 return (this->get_P()-newP).norm()<FLT_EPSILON;
331 std::set<LoopType*>
temp;
332 for (
const auto& loop : this->
loops())
356 return MeshLocation::onRegionBoundary;
360 return MeshLocation::onMeshBoundary;
362 return MeshLocation::insideMesh;
377 for (
const auto& neighborIter : this->
neighbors())
379 if(std::get<1>(neighborIter.second)->chord().normalized().cross(
temp).norm()>FLT_EPSILON)
390 for(
const auto& loopNode : this->
loopNodes())
392 const VectorDim shift(loopNode->periodicPlanePatch()? loopNode->periodicPlanePatch()->shift : VectorDim::Zero());
394 if(!loopNode->isMovableTo(X-shift))
396 VerboseDislocationNode(2,
" DislocationNode "<<this->
tag()<<
" NOT movable "<<std::endl;);
431 if(face->regionIDs.first!=face->regionIDs.second)
435 const auto* partner=face->periodicFacePair.second;
436 if(partner && face->regionIDs!=partner->regionIDs)
450 if (ln->periodicPlanePatch())
452 temp.emplace(ln->periodicPlanePatch()->glidePlane.get());
464 if (ln->periodicPlaneEdge.first)
466 const auto& faces=ln->periodicPlaneEdge.first->meshIntersection->faces;
467 temp.insert(faces.begin(),faces.end());
469 if (ln->periodicPlaneEdge.second)
471 for (
const auto &face : ln->periodicPlaneEdge.second->meshIntersection->faces)
484 bool _isOnExternalBoundary(
false);
487 if (face->regionIDs.first == face->regionIDs.second)
489 _isOnExternalBoundary =
true;
494 return _isOnExternalBoundary;
500 bool _isOnInternalBoundary(
false);
503 if (face->regionIDs.first != face->regionIDs.second)
505 _isOnInternalBoundary =
true;
509 return _isOnInternalBoundary;
524 _outNormal += face->outNormal();
526 const double _outNormalNorm(_outNormal.norm());
527 if (_outNormalNorm > FLT_EPSILON)
529 _outNormal /= _outNormalNorm;
533 _outNormal.setZero();
544 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>
N(Eigen::Matrix<double,dim,Eigen::Dynamic>::Zero(dim,gps.size()));
545 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> P(Eigen::Matrix<double,dim,Eigen::Dynamic>::Zero(dim,gps.size()));
548 for(
const auto& plane : gps)
550 N.col(
k)=plane->unitNormal;
556 const std::pair<bool,VectorDim> snapped(pInt.
snap(
x));
559 return snapped.second;
563 std::cout<<
"glidePlanes.size()="<<gps.size()<<std::endl;
564 std::cout<<
"N="<<
N<<std::endl;
565 std::cout<<
"P="<<P<<std::endl;
566 throw std::runtime_error(
"DislocationNode, cannot snap, glidePlanes dont intersect.");
567 return snapped.second;
578 throw std::runtime_error(
"All loops must be sessile if there are no glide planes.");
590 temp.insert(&glidePlane->grain);
SplineNode< DislocationLoopNode< dim >, dim, 0, Hermite > SplineNodeType
std::shared_ptr< DislocationNode > clone() const
const Simplex< dim, dim > * get_includingSimplex(const VectorDim &, const Simplex< dim, dim > *const) const
void projectVelocity(const bool &isClimbingStep)
double velocityReductionCoeff
The previous velocity vector of *this PlanarDislocationNode.
GrainContainerType grains() const
std::vector< VectorDim > VectorOfNormalsType
bool trySet_P(const VectorDim &)
std::set< const GlidePlaneType * > GlidePlaneContainerType
bool isMovableTo(const VectorDim &) const
bool isOnInternalBoundary() const
ClimbVelocityScalarType climbVelocityScalar
VectorOfNormalsType physicalBoundaryNormals() const
const Simplex< dim, dim > * includingSimplex() const
bool isBoundaryNode() const
VectorDim climbDirection() const
static int totalCappedNodes
TypeTraits< NetworkNodeType >::MeshLocation MeshLocation
std::set< LoopType * > sessileLoops() const
DislocationNode(LoopNetworkType *const, const VectorDim &, const VectorDim &, const ClimbVelocityScalarType &, const double &)
bool isGrainBoundaryNode() const
TraitsType::VectorDim VectorDim
Eigen::Array< double, 1, ClusterDynamicsParameters< dim >::mSize > ClimbVelocityScalarType
std::set< const PlanarMeshFaceType * > PlanarMeshFaceContainerType
SplineNode< DislocationNode< dim >, dim, 0, Hermite > SplineNodeType
std::set< const GrainType * > GrainContainerType
const VectorDim & get_V() const
TraitsType::LoopNetworkType LoopNetworkType
VectorDim invariantDirectionOfMotion() const
void set_V(const VectorDim &vNew, const bool &isClimbingStep)
VectorDim bndNormal() const
MeshLocation meshLocation() const
VectorDim snapToGlidePlanesinPeriodic(const VectorDim &P) const
const double & velocityReduction() const
bool set_P(const VectorDim &)
GlidePlaneContainerType glidePlanes() const
const Simplex< dim, dim > * p_Simplex
PlanarMeshFaceContainerType meshFaces() const
bool isOnBoundary() const
bool isOnExternalBoundary() const
const LoopNetworkType & network() const
LoopNetworkType * p_network() const
NetworkNode(LoopNetworkType *const loopNetwork_in)
const NeighborContainerType & neighbors() const
const LoopNodeContainerType & loopNodes() const
std::set< LoopType * > loops() const
Eigen::Matrix< double, dim, 1 > oneSidedMotion(const Eigen::Matrix< double, dim, 1 > &requested, const std::vector< Eigen::Matrix< double, dim, 1 > > &equalities, const std::vector< Eigen::Matrix< double, dim, 1 > > &outward)
auto eval(const std::shared_ptr< T > &t)
Eigen::Matrix< double, 3, 1 > VectorDim
std::pair< bool, VectorDim > snap(const VectorDim &x) const