Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
DislocationSegment.cpp
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_DislocationSegment_cpp_
9#define model_DislocationSegment_cpp_
10
12#include <DislocationSegment.h>
13#include <PlanesIntersection.h>
14
15namespace model
16{
17 template <int dim>
19 const std::shared_ptr<NetworkNodeType>& nI,
20 const std::shared_ptr<NetworkNodeType>& nJ) :
21 /* init */ NetworkLink<DislocationSegment<dim>>(net,nI,nJ)
22 /* init */,SplineSegmentType(this->source->get_P(),this->sink->get_P())
23 // /* init */,ConfinedDislocationObjectType(this->source->get_P(),this->sink->get_P())
24 /* init */,Burgers(VectorDim::Zero())
25 /* init */,BurgersNorm(Burgers.norm())
26 /* init */,straight(this->network().ddBase.poly,this->source->get_P(),this->sink->get_P(),Burgers,this->chordLength(),this->unitDirection(),this->network().ddBase.dislocationDynamics().EwaldLength)
27 /* init */,_slipSystem(nullptr)
28 {
29 VerboseDislocationSegment(1,"Constructing DislocationSegment "<<this->tag()<<std::endl);
30 }
31
32template <int dim>
34{
35 if(this->isBoundarySegment()
36 || this->isGrainBoundarySegment())
37 {
38 return VectorDim::Zero();
39 }
40 else
41 {
42 const VectorDim temp(this->burgers().cross(this->chord()));
43 const double tempNorm(temp.norm());
44 return tempNorm<FLT_EPSILON? VectorDim::Zero() : (temp/tempNorm).eval();
45 }
46}
47
48 template <int dim>
50 {
51// if (this->grains().size() == 0)
52// {
53// _slipSystem=nullptr;
54// }
55 const auto grs(this->grains());
56 if (grs.size() == 1)
57 {
58 std::set<std::shared_ptr<SlipSystem>> ssSet;
59
60 for (const auto &loopLink : this->loopLinks())
61 {
62 if (loopLink->loop->slipSystem())
63 {
64 ssSet.insert(loopLink->loop->slipSystem());
65 }
66 }
67
68 switch (ssSet.size())
69 {
70 case 0:
71 {
72 _slipSystem = nullptr;
73 break;
74 }
75
76 case 1:
77 {
78 _slipSystem = *ssSet.begin();
79 break;
80 }
81
82 default:
83 {
84 _slipSystem = nullptr;
85
86 const auto gps(glidePlanes());
87 if(gps.size()==1)
88 {//Possible planar glissile junction, we'll pick the first slip system that has the same burgers
89 for(const auto& gpss : (*gps.begin())->slipSystems())
90 {
91 if((gpss->s.cartesian()-burgers()).norm()<FLT_EPSILON)
92 {
93 _slipSystem=gpss;
94 break;
95 }
96 }
97 }
98 break;
99 }
100 }
101
102// if (ssSet.size() == 1)
103// { // a unique slip system found.
104// _slipSystem = *ssSet.begin();
105// }
106// else
107// { // ssSet.size()==0.
108// _slipSystem = nullptr;
109//
110// const auto gps(glidePlanes());
111// if(gps.size()==1)
112// {//Planar glissile junction, we'll pick the first slip system that has the same flow
113// for(const auto& gpss : (*gps.begin())->slipSystems())
114// {
115//
116// }
117// }
118// else
119// {
120// _slipSystem = nullptr;
121// }
122// }
123 }
124 else
125 {
126// assert(false && "FINISH THIS FOR MULTIPLE GRAINS");
127 _slipSystem = nullptr;
128 }
129
130 VerboseDislocationSegment(3, "_slipSystem.s= " << _slipSystem->s.cartesian().transpose() << std::endl;);
131 if (_slipSystem)
132 {
133
134 VerboseDislocationSegment(3, "_slipSystem.s= " << _slipSystem->s.cartesian().transpose() << std::endl;);
135 VerboseDislocationSegment(3, "_slipSystem.n= " << _slipSystem->unitNormal.transpose() << std::endl;);
136 }
137 else
138 {
139 }
140 }
141
142 /**********************************************************************/
143 template <int dim>
145 {
146 VerboseDislocationSegment(2,"DislocationSegment "<<this->tag()<<", adding LoopLink "<<pL->tag()<<std::endl;);
147 NetworkLink<DislocationSegment>::addLoopLink(pL); // forward to base class
148 if(pL->source->networkNode==this->source)
149 {// Update Burgers vector
150 Burgers+=pL->flow().cartesian();
151 }
152 else
153 {
154 Burgers-=pL->flow().cartesian();
155 }
156 BurgersNorm=Burgers.norm();
157 straight.updateGeometry();
158
159 // Each participating loop supplies a patch plane. Both network
160 // endpoints must retain every such plane, including at shared junctions.
161 const auto sourcePlanes(this->source->glidePlanes());
162 const auto sinkPlanes(this->sink->glidePlanes());
163 for(const auto* plane : glidePlanes())
164 {
165 if(sourcePlanes.count(plane)==0 || sinkPlanes.count(plane)==0)
166 {
167 throw std::runtime_error("Segment glide plane missing from an endpoint");
168 }
169 }
170
172 }
173
174
175
176 /**********************************************************************/
177 template <int dim>
179 {
180 VerboseDislocationSegment(2,"DislocationSegment "<<this->tag()<<", removing LoopLink "<<pL->tag()<<std::endl;);
181 NetworkLink<DislocationSegment>::removeLoopLink(pL); // forward to base class
182
183 if(pL->source->networkNode==this->source)
184 {// Modify Burgers vector
185 Burgers-=pL->flow().cartesian();
186 }
187 else
188 {
189 Burgers+=pL->flow().cartesian();
190 }
191 BurgersNorm=Burgers.norm();
192 straight.updateGeometry(); // update b x t
193
195
196 }
197
198 template <int dim>
200 {
201 VerboseDislocationSegment(2,"DislocationSegment "<<this->tag()<<", updateGeometry "<<std::endl;);
203 // this->updateConfinement(this->source->get_P(),this->sink->get_P());
204 straight.updateGeometry();
205 VerboseDislocationSegment(2,"DislocationSegment "<<this->tag()<<", updateGeometry DONE"<<std::endl;);
206 }
207
208 template <int dim>
210 {/*\returns true if ALL the following conditions are met
211 * - the segment is confined by only one plane
212 * - all loops containing this segment are glissile
213 */
214 // bool temp(this->glidePlanes().size()==1 && !hasZeroBurgers() && !isVirtualBoundarySegment());
215 bool temp(this->glidePlanes().size()==1);
216 if(temp)
217 {
218 for(const auto& loopLink : this->loopLinks())
219 {
220 temp=(temp && loopLink->loop->loopType==DislocationLoopIO<dim>::GLISSILELOOP);
221 }
222 }
223 return temp;
224 }
225
226 template <int dim>
228 {
229 return !isGlissile();
230 }
231
232 /******************************************************************/
233 template <int dim>
234 void DislocationSegment<dim>::initFromFile(const std::string& fileName)
235 {
236 // LinkType::alpha=TextFileParser(fileName).readScalar<double>("parametrizationExponent",true);
237 // assert((LinkType::alpha)>=0.0 && "parametrizationExponent MUST BE >= 0.0");
238 // assert((LinkType::alpha)<=1.0 && "parametrizationExponent MUST BE <= 1.0");
239 quadPerLength=TextFileParser(fileName).readScalar<double>("quadPerLength",false);
240 // assembleWithTangentProjection=TextFileParser(fileName).readScalar<int>("assembleWithTangentProjection",true);
241 assert((NetworkLinkType::quadPerLength)>=0.0 && "quadPerLength MUST BE >= 0.0");
242 verboseDislocationSegment=TextFileParser(fileName).readScalar<int>("verboseDislocationSegment",false);
243 }
244
245 template <int dim>
247 {
252 {
253 return MeshLocation::onRegionBoundary;
254 }
255 else if(isBoundarySegment())
256 {
257 return MeshLocation::onMeshBoundary;
258 }
259// else if(isVirtualBoundarySegment())
260// {
261// return MeshLocation::outsideMesh;
262// }
263 else
264 {
265 return MeshLocation::insideMesh;
266 }
267 }
268
269// template <int dim>
270// bool DislocationSegment<dim>::isVirtualBoundarySegment() const
271// {//!\returns true if all loops of this segment are virtualBoundaryLoops
272// bool temp(true);
273// for(const auto& loopLink : this->loopLinks())
274// {
275// temp= (temp && loopLink->loop->isVirtualBoundaryLoop());
276// if(!temp)
277// {
278// break;
279// }
280// }
281// return temp;
282// }
283
284 template <int dim>
286 {
287 return BurgersNorm<FLT_EPSILON;
288 }
289
290 template <int dim>
291 const std::shared_ptr<SlipSystem>& DislocationSegment<dim>::slipSystem() const
292 {
293 return _slipSystem;
294 }
295
296 template <int dim>
298 {
301 return this->isOnExternalBoundary();
302 }
303
304 template <int dim>
306 {
307 for(const auto* face : meshFaces())
308 {
309 if(face->regionIDs.first!=face->regionIDs.second ||
310 (face->periodicFacePair.second && face->regionIDs!=face->periodicFacePair.second->regionIDs))
311 {
312 return true;
313 }
314 }
315 return false;
316 }
317
318 template <int dim>
320 {
321 return Burgers;
322 }
323
324 template <int dim>
325 void DislocationSegment<dim>::addToGlobalAssembly(std::deque<Eigen::Triplet<double>>& kqqT,
326 Eigen::VectorXd& FQ) const
327 {
328 if(!hasZeroBurgers())
329 {
330 addToGlobalAssembly(kqqT,FQ,this->source->networkID(),this->sink->networkID());
331 }
332 }
333
334 template <int dim>
335 void DislocationSegment<dim>::addToGlobalAssembly(std::deque<Eigen::Triplet<double> >& kqqT,
336 Eigen::VectorXd& FQ,const size_t sourceIndex,const size_t sinkIndex) const
337 {
340 if(!hasZeroBurgers())
341 {
342// h2posMap.clear();
343 std::map<size_t,
344 /* */ std::pair<VectorNcoeff,VectorDim>,
345 /* */ std::less<size_t>
346 /* */ > h2posMap;
347 h2posMap.emplace(sourceIndex,std::make_pair((VectorNcoeff()<<1.0,0.0).finished(),this->source->get_P()));
348 h2posMap.emplace(sinkIndex,std::make_pair((VectorNcoeff()<<0.0,1.0).finished(),this-> sink->get_P()));
349
350
351 Eigen::Matrix<double, Ndof, Eigen::Dynamic> Mseg(Eigen::Matrix<double, Ndof, Eigen::Dynamic>::Zero(Ncoeff*dim,h2posMap.size()*dim));
352// Mseg.setZero(Ncoeff*dim,h2posMap.size()*dim);
353 size_t c=0;
354 for(const auto& pair : h2posMap)
355 {
356 for(int r=0;r<Ncoeff;++r)
357 {
358 Mseg.template block<dim,dim>(r*dim,c*dim)=pair.second.first(r)*MatrixDim::Identity();
359 }
360 c++;
361 }
362
363
364 const Eigen::MatrixXd tempKqq(Mseg.transpose()*this->nodalVelocityMatrix(*this)*Mseg); // Create the temporaty stiffness matrix and push into triplets
365 size_t localI=0;
366 for(const auto& pairI : h2posMap)
367 {
368 for(int dI=0;dI<dim;++dI)
369 {
370 const size_t globalI=pairI.first*dim+dI;
371 size_t localJ=0;
372 for(const auto& pairJ : h2posMap)
373 {
374 for(int dJ=0;dJ<dim;++dJ)
375 {
376 const size_t globalJ=pairJ.first*dim+dJ;
377
378 if (std::fabs(tempKqq(localI,localJ))>FLT_EPSILON)
379 {
380 kqqT.emplace_back(globalI,globalJ,tempKqq(localI,localJ));
381 }
382 localJ++;
383 }
384 }
385 localI++;
386 }
387 }
388
389 if(this->quadraturePoints().size())
390 {
391 const Eigen::VectorXd tempFq(Mseg.transpose()*this->nodalVelocityVector(*this)); // Create temporary force vector and add to global FQ
392 localI=0;
393 for(const auto& pairI : h2posMap)
394 {
395 for(int dI=0;dI<dim;++dI)
396 {
397 const size_t globalI=pairI.first*dim+dI;
398
399 FQ(globalI)+=tempFq(localI);
400
401 localI++;
402 }
403 }
404 }
405 }
406 }
407
408 template <int dim>
410 {
411 this->create(*this,quadPerLength,isClimbStep);
412 }
413
414 template <int dim>
416 {
417 this->update(*this,isClimbStep);
418 }
419
420 template <int dim>
421 int DislocationSegment<dim>::velocityGroup(const double &maxVelocity, const std::set<int> &subcyclingBins) const
422 // This represents how many number of steps taken for updating the velocity
423 {
424 if (this->quadraturePoints().size() == 0)
425 {
426 return *subcyclingBins.begin();
427 }
428 else
429 {
430 if (maxVelocity > FLT_EPSILON)
431 {
432 const double avgV((0.5 * (this->source->get_V() + this->sink->get_V())).norm());
433
434 if (avgV >= FLT_EPSILON)
435 {
436 const double velRat(maxVelocity / avgV);
437 std::map<double, int> temp;
438 for (const auto &sbin : subcyclingBins)
439 {
440 temp.emplace(fabs(velRat - sbin), sbin);
441 }
442 return temp.begin()->second;
443 }
444 else
445 {
446 return *subcyclingBins.rbegin();
447 }
448
449 }
450 else
451 {
452 return *subcyclingBins.begin();
453 }
454 }
455
456 // return DislocationSegmentIO<dim>::velocityGroup(this->source->get_V(),this->sink->get_V(),maxVelocity);
457 }
458
459 template <int dim>
461 {
462 return this->glidePlanes().size()==1? (*this->glidePlanes().begin())->unitNormal : zeroVector;
463 }
464
465 template <int dim>
467 {
469 for (const auto &ln : this->loopLinks())
470 {
471 if (ln->periodicPlanePatch())
472 {
473 temp.emplace(ln->periodicPlanePatch()->glidePlane.get());
474 }
475 }
476 return temp;
477 }
478
479 template <int dim>
481 {
483 const PlanarMeshFaceContainerType sourceMeshFaces(this->source->meshFaces());
484 const PlanarMeshFaceContainerType sinkMeshFaces(this->sink->meshFaces());
485
486 for (const auto &sourceMeshFace : sourceMeshFaces)
487 {
488 if (sinkMeshFaces.find(sourceMeshFace) != sinkMeshFaces.end())
489 {
490 temp.emplace(sourceMeshFace);
491 }
492 }
493 return temp;
494 }
495 template <int dim>
497 {
499 bool _isOnExternalBoundary(false);
500 for (const auto &face : meshFaces())
501 {
502 if (face->regionIDs.first == face->regionIDs.second)
503 {
504 _isOnExternalBoundary = true;
505 }
506 }
507
508 return _isOnExternalBoundary;
509 }
510
511 template <int dim>
513 {
514 bool _isOnInternalBoundary(false);
515 for (const auto &face : meshFaces())
516 {
517 if (face->regionIDs.first != face->regionIDs.second)
518 {
519 _isOnInternalBoundary = true;
520 }
521 }
522 return _isOnInternalBoundary;
523 }
524
525 template <int dim>
530 template <int dim>
532 {
534 for (const auto &glidePlane : glidePlanes())
535 {
536 temp.insert(&glidePlane->grain);
537 }
538 return temp;
539 }
540
541 template <int dim>
543 {
544 VectorDim _outNormal(VectorDim::Zero());
545 for (const auto &face : meshFaces())
546 {
547 _outNormal += face->outNormal();
548 }
549 const double _outNormalNorm(_outNormal.norm());
550 if (_outNormalNorm > FLT_EPSILON)
551 {
552 _outNormal /= _outNormalNorm;
553 }
554 else
555 {
556 _outNormal.setZero();
557 }
558 return _outNormal;
559 }
560
561 template <int dim>
562 std::vector<std::pair<const GlidePlane<dim> *const, const GlidePlane<dim> *const>> DislocationSegment<dim>::parallelAndCoincidentGlidePlanes(const GlidePlaneContainerType &other) const
563 {
564 std::vector<std::pair<const GlidePlane<dim> *const, const GlidePlane<dim> *const>> pp;
565
566 for (const auto &plane : glidePlanes())
567 {
568 for (const auto &otherPlane : other)
569 {
570 // Integer plane coordinates are comparable only within one
571 // crystal lattice. Across grains, compare global unit normals.
572 const bool parallel=&plane->n.lattice==&otherPlane->n.lattice?
573 plane->n.cross(otherPlane->n).base().squaredNorm()==0 :
574 plane->unitNormal.cross(otherPlane->unitNormal).norm()<FLT_EPSILON;
575 if(parallel)
576 { // parallel planes
577 pp.emplace_back(plane, otherPlane);
578 }
579 }
580 }
581 return pp;
582 }
583
584 template <int dim>
586 {
588 if(gps.size())
589 {
590 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> N(Eigen::Matrix<double,dim,Eigen::Dynamic>::Zero(dim,gps.size()));
591 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> P(Eigen::Matrix<double,dim,Eigen::Dynamic>::Zero(dim,gps.size()));
592
593 int k=0;
594 for(const auto& plane : gps)
595 {
596 N.col(k)=plane->unitNormal;
597 P.col(k)=plane->P;
598 ++k;
599 }
600
601 PlanesIntersection<dim> pInt(N,P,FLT_EPSILON);
602 const std::pair<bool,VectorDim> snapped(pInt.snap(x));
603 if(snapped.first)
604 {
605 return snapped.second;
606 }
607 else
608 {
609 std::cout<<"glidePlanes.size()="<<gps.size()<<std::endl;
610 std::cout<<"N="<<N<<std::endl;
611 std::cout<<"P="<<P<<std::endl;
612 throw std::runtime_error("DislocationSegment: cannot snap, glidePlanes dont intersect.");
613 return snapped.second;
614 }
615 }
616 else
617 {
618 return x;
619 }
620 }
621
622 template <int dim>
624 {
625 ConcentrationMatrixType M(ConcentrationMatrixType::Zero());
626 if(this->grains().size() == 1 && this->chordLength()>FLT_EPSILON)
627 {
628 const auto& Dinv(icp.invD.at((*this->grains().begin())->grainID));
629 const auto& Ddet(icp.detD.at((*this->grains().begin())->grainID));
630 const VectorDim bCt(burgers().cross(this->unitDirection()));
631 Eigen::Array<double,mSize,1> a(Eigen::Array<double,mSize,1>::Zero());
632 Eigen::Array<double,mSize,1> b(Eigen::Array<double,mSize,1>::Zero());
633 Eigen::Array<double,mSize,1> c(Eigen::Array<double,mSize,1>::Zero());
634 const double bxtSource(bCt.dot(this->source->climbDirection()));
635 const double bxtSink (bCt.dot(this->sink->climbDirection()));
636
637 Eigen::Array<double,mSize,1> bias(Eigen::Array<double,mSize,1>::Ones());
638 if(this->loopLinks().size()==1)
639 {
640 const auto loop((*this->loopLinks().begin())->loop);
641 if(loop->burgers().dot(loop->rightHandedUnitNormal())>FLT_EPSILON)
642 {// vacancy loop
643 bias=icp.discreteDislocationBias.row(0);
644 }
645 else if(loop->burgers().dot(loop->rightHandedUnitNormal())<-FLT_EPSILON)
646 {
647 bias=icp.discreteDislocationBias.row(1);
648 }
649 }
650
651 for(const auto& shift : this->network().ddBase.periodicShifts)
652 {
653 for(size_t k=0; k<mSize; k++)
654 {
655 a(k) = this->chord().dot( Dinv[k]*this->chord() );
656 b(k) =-2.0*(x+shift-this->source->get_P()).dot( Dinv[k]*this->chord() );
657 c(k) = (x+shift-this->source->get_P()).dot( Dinv[k]*(x+shift-this->source->get_P()) )+ DislocationFieldBase<dim>::a2/pow(Ddet(k),1.0/3.0);
658 }
659 const Eigen::Array<double,mSize,1> ba(b/a);
660 const Eigen::Array<double,mSize,1> ca(c/a);
661 const Eigen::Array<double,mSize,1> sqbca(sqrt(1.0+ba+ca));
662 const Eigen::Array<double,mSize,1> sqca(sqrt(ca));
663 const Eigen::Array<double,mSize,1> logTerm(log((2.0*sqbca+2.0+ba)/(2.0*sqca+ba)));
664 const Eigen::Array<double,mSize,1> I0((1.0+0.5*ba)*logTerm-sqbca+sqca);
665 const Eigen::Array<double,mSize,1> I1( -0.5*ba*logTerm+sqbca-sqca);
666 M.col(0)+=bxtSource*this->chordLength()/(4.0*M_PI)*(I0/bias/sqrt(a*Ddet)).matrix();
667 M.col(1)+=bxtSink* this->chordLength()/(4.0*M_PI)*(I1/bias/sqrt(a*Ddet)).matrix();
668 }
669 }
670 return M;
671 }
672
673 template <int dim>
675 {
676 ConcentrationVectorType temp(ConcentrationVectorType::Zero());
678 for(int k=0; k<mSize; k++)
679 {
680 temp(k)=cM.row(k)*(Eigen::Matrix<double,2,1>()<<this->source->climbVelocityScalar(k),this->sink->climbVelocityScalar(k)).finished();
681 }
682 return temp;
683 }
684
685// template <int dim>
686// const typename DislocationSegment<dim>::MatrixDim DislocationSegment<dim>::I=DislocationSegment<dim>::MatrixDim::Identity();
687
688 template <int dim>
690
691 template <int dim>
693
694 template <int dim>
696
697 template class DislocationSegment<3>;
698}
699#endif
Eigen::Matrix3d M
void create(const LinkType &parentSegment, const double &quadPerLength, const bool &isClimbStep)
void update(const LinkType &parentSegment, const bool &isClimbStep)
const DislocationQuadraturePointContainerType & quadraturePoints() const
ConcentrationMatrixType concentrationMatrices(const VectorDim &x, const ClusterDynamicsParameters< dim > &icp) const
std::set< const GlidePlaneType * > GlidePlaneContainerType
MeshLocation meshLocation() const
std::set< const PlanarMeshFaceType * > PlanarMeshFaceContainerType
Eigen::Matrix< double, mSize, 1 > ConcentrationVectorType
TraitsType::VectorDim VectorDim
PlanarMeshFaceContainerType meshFaces() const
Eigen::Matrix< double, mSize, 2 > ConcentrationMatrixType
GlidePlaneContainerType glidePlanes() const
StraightDislocationSegment< dim > straight
static constexpr int mSize
void addToGlobalAssembly(std::deque< Eigen::Triplet< double > > &kqqT, Eigen::VectorXd &FQ) const
DislocationSegment(LoopNetworkType *const net, const std::shared_ptr< NetworkNodeType > &, const std::shared_ptr< NetworkNodeType > &)
void updateQuadraturePoints(const bool &isClimbStep)
VectorDim snapToGlidePlanes(const VectorDim &P) const
const VectorDim & glidePlaneNormal() const
static constexpr int Ncoeff
std::set< const GrainType * > GrainContainerType
static void initFromFile(const std::string &)
static const VectorDim zeroVector
std::vector< std::pair< const GlidePlane< dim > *const, const GlidePlane< dim > *const > > parallelAndCoincidentGlidePlanes(const GlidePlaneContainerType &other) const
void createQuadraturePoints(const bool &isClimbStep)
const VectorDim & burgers() const
double BurgersNorm
The Burgers vector.
void removeLoopLink(LoopLinkType *const pL)
void addLoopLink(LoopLinkType *const pL)
SplineSegment< dim, 0 > SplineSegmentType
GrainContainerType grains() const
const std::shared_ptr< SlipSystem > & slipSystem() const
std::shared_ptr< SlipSystem > _slipSystem
int velocityGroup(const double &maxVelocity, const std::set< int > &subcyclingBins) const
TraitsType::LoopNetworkType LoopNetworkType
TraitsType::LoopLinkType LoopLinkType
ConcentrationVectorType clusterConcentration(const VectorDim &x, const ClusterDynamicsParameters< dim > &icp) const
SplineSegmentType::VectorNcoeff VectorNcoeff
TraitsType::MeshLocation MeshLocation
const VectorDim & unitDirection() const
const VectorDim & chord() const
const double & chordLength() const
Scalar readScalar(const std::string &key, const bool &verbose=false)
c
Definition int_R.m:15
a
Definition int_R.m:14
b
Definition int_R.m:16
x
Definition int_R.m:12
auto eval(const std::shared_ptr< T > &t)
const Eigen::Array< double, 2, mSize > discreteDislocationBias
const std::map< size_t, std::vector< Eigen::Matrix< double, dim, dim > > > invD
const std::map< size_t, Eigen::Array< double, mSize, 1 > > detD
static double a2
Dislocation core size squared.
std::pair< bool, VectorDim > snap(const VectorDim &x) const
REAL ca[4]
int k
vertex temp
b poly