427 const bool useLoopBasedKernels(
false);
431 if(parentSegment.
network().computeDDinteractions)
433 const double L0(parentSegment.
chord().norm());
434 const VectorDim
c(0.5*(parentSegment.
source->get_P()+parentSegment.
sink->get_P()));
435 if(useLoopBasedKernels)
437 for(
const auto& loop : parentSegment.
network().loops())
439 for(
const auto& patch : loop.second.lock()->patches().globalPatches())
441 for(
size_t k0=0;k0<patch.second.size();++k0)
443 const size_t k1(k0+1<patch.second.size()? k0+1 : 0);
444 const VectorDim& P0(patch.second[k0]);
445 const VectorDim& P1(patch.second[k1]);
446 const VectorDim chord(P1-P0);
447 const double chordLength(chord.norm());
448 if(chordLength>FLT_EPSILON)
450 const VectorDim tangent(chord/chordLength);
453 updateKernel(parentSegment,
ss,L0,
c);
461 for(
const auto& link : parentSegment.
network().networkLinks())
463 if(!link.second.lock()->hasZeroBurgers())
466 updateKernel(parentSegment,
ss,L0,
c);
475 const auto& glidePlane(**parentSegment.
glidePlanes().begin());
476 const auto& slipSystem(*parentSegment.
slipSystem());
480 const double eps=1.0e-2;
481 VectorDim outDir(parentSegment.
unitDirection().cross(slipSystem.unitNormal));
482 const double outDirNorm(outDir.norm());
483 if(outDirNorm>FLT_EPSILON)
486 std::vector<std::pair<VectorDim,VectorDim>> qPointSlip(
quadraturePoints().size(),std::make_pair(VectorDim::Zero(),VectorDim::Zero()));
488 for(
const auto& weakSourceLoop : parentSegment.
network().loops())
490 const auto sourceLoop(weakSourceLoop.second.lock());
491 if(sourceLoop->slipSystem())
493 if(slipSystem.n.base()==sourceLoop->slipSystem()->n.base())
498 if(qPoint.inclusionID>=0 || sourceLoop->slipSystem()->isPartial())
500 qPoint.slipVectors.first -=sourceLoop->patches().windingNumber(qPoint.r + eps*outDir)*sourceLoop->burgers();
501 qPoint.slipVectors.second-=sourceLoop->patches().windingNumber(qPoint.r - eps*outDir)*sourceLoop->burgers();
510 if((qPoint.slipVectors.first-qPoint.slipVectors.second).squaredNorm()>FLT_EPSILON)
513 if(qPoint.inclusionID<0)
516 const double gamma1(slipSystem.n.misfitEnergy(qPoint.slipVectors.first));
517 const double gamma2(slipSystem.n.misfitEnergy(qPoint.slipVectors.second));
519 double gammaNoise(0.0);
520 if(slipSystem.planeNoise)
522 gammaNoise=std::get<2>(slipSystem.gridInterp(qPoint.r-glidePlane.P));
524 qPoint.stackingFaultForce+= -(gamma2-gamma1+gammaNoise)*outDir;
529 const auto& secondPhase(parentSegment.
network().inclusions()->eshelbyInclusions().at(qPoint.inclusionID)->secondPhase);
532 const double gamma1(secondPhase->misfitEnergy(qPoint.slipVectors.first ,&slipSystem.n));
533 const double gamma2(secondPhase->misfitEnergy(qPoint.slipVectors.second,&slipSystem.n));
534 qPoint.stackingFaultForce+= -(gamma2-gamma1)*outDir;
542 if(slipSystem.planeNoise)
546 const auto noiseVal(slipSystem.gridInterp(qPoint.r-glidePlane.P));
547 qPoint.internalStress += std::get<0>(noiseVal);
576 std::vector<std::tuple<VectorDim,VectorDim,VectorDim>> linkSplineVector;
577 for (
const auto &ll : parentSegment.
loopLinks())
579 const double paramU (ll->source->networkNode==parentSegment.
source ? qPoint.abscissa : 1.0-qPoint.abscissa);
580 const auto spline(ll->spline());
581 linkSplineVector.emplace_back(ll->loop->burgers(),spline.get_rl(paramU),spline.get_rll(paramU));
585 for(
size_t ii=0;
ii<linkSplineVector.size();++
ii)
587 for(
size_t jj=
ii;jj<linkSplineVector.size();++jj)
589 const double preFactor(
ii==jj? parentSegment.
network().alphaLineTension * parentSegment.
network().ddBase.poly.C2 : 2.0*parentSegment.
network().alphaLineTension * parentSegment.
network().ddBase.poly.C2);
590 const auto& bii(std::get<0>(linkSplineVector[
ii]));
591 const auto& bjj(std::get<0>(linkSplineVector[jj]));
592 const auto& tii(std::get<1>(linkSplineVector[
ii]));
593 const auto& tjj(std::get<1>(linkSplineVector[jj]));
594 qPoint.coreEnergyPerLength+=preFactor*(bii.dot(bjj)*tii.dot(tjj)-parentSegment.
network().ddBase.poly.nu*bii.dot(tii)*bjj.dot(tii));
599 for(
size_t ii=0;
ii<linkSplineVector.size();++
ii)
601 const auto& kii(std::get<2>(linkSplineVector[
ii]));
602 if(!std::isnan(kii.squaredNorm()))
604 qPoint.lineTensionForce+=qPoint.coreEnergyPerLength*kii;
618 qPoint.updateForcesAndVelocities(parentSegment,isClimbStep);
701 return (MatrixNdof()<<L/3.0, 0.0, 0.0, L/6.0, 0.0, 0.0,
702 0.0,L/3.0, 0.0, 0.0,L/6.0, 0.0,
703 0.0, 0.0,L/3.0, 0.0, 0.0,L/6.0,
704 L/6.0, 0.0, 0.0, L/3.0, 0.0, 0.0,
705 0.0,L/6.0, 0.0, 0.0,L/3.0, 0.0,
706 0.0, 0.0,L/6.0, 0.0, 0.0,L/3.0).finished();