8#ifndef model_GalerkinGlideSolver_cpp_
9#define model_GalerkinGlideSolver_cpp_
35 size_t GalerkinGlideSolver<dim>::assembleNCtriplets(TripletContainerType& kqqT, Eigen::VectorXd& Fq)
const
37 const size_t Ndof(this->DN.networkNodes().size()*NdofXnode);
39 std::map<size_t,size_t> nodeIndices;
40 for(
const auto& entry : this->DN.networkNodes())
42 nodeIndices.emplace(entry.second.lock()->sID,nodeIndices.size());
46 for (
const auto& networkLink : this->DN.networkLinks())
48 if (!networkLink.second.lock()->isBoundarySegment())
50 const auto link=networkLink.second.lock();
51 link->addToGlobalAssembly(kqqT,Fq,nodeIndices.at(link->source->sID),nodeIndices.at(link->sink->sID));
59 size_t GalerkinGlideSolver<dim>::assemblePeriodicConstraints(TripletContainerType &zT)
const
65 Eigen::VectorXd GalerkinGlideSolver<dim>::lumpedSolve()
const
67 std::cout<<
", glideSolver "<<std::flush;
68 TripletContainerType kqqT;
70 const size_t Ndof=assembleNCtriplets(kqqT,Fq);
75 TripletContainerType zT;
76 const size_t nUnconstrained=assemblePeriodicConstraints(zT);
77 SparseMatrixType K(Ndof,Ndof);
78 K.setFromTriplets(kqqT.begin(),kqqT.end());
79 SparseMatrixType Z(Ndof,dim*nUnconstrained);
80 Z.setFromTriplets(zT.begin(),zT.end());
81 const SparseMatrixType reduced(Z.transpose()*K*Z);
82 const Eigen::VectorXd force(Z.transpose()*Fq);
85 Eigen::VectorXd diagonal=Eigen::VectorXd::Zero(dim*nUnconstrained);
86 for(
int k=0;
k<reduced.outerSize();++
k)
88 for(
typename SparseMatrixType::InnerIterator it(reduced,
k);it;++it)
90 if(it.row()==it.col())
92 diagonal(it.row())+=it.value();
96 diagonal(it.row())+=0.5*it.value();
97 diagonal(it.col())+=0.5*it.value();
101 Eigen::VectorXd velocity=Eigen::VectorXd::Zero(dim*nUnconstrained);
102 for(Eigen::Index
k=0;
k<diagonal.size();++
k)
104 if(std::fabs(diagonal(
k))>FLT_EPSILON)
106 velocity(
k)=force(
k)/diagonal(
k);
108 else if(std::fabs(force(
k))>FLT_EPSILON)
110 throw std::runtime_error(
"Nonzero glide force on a zero-mass degree of freedom.");
GalerkinGlideSolver(const DislocationNetwork< dim > &)
Eigen::VectorXd getNodeVelocities() const override
static std::string greenBoldColor
static std::string defaultColor
size_t periodicVelocityConstraints(const Network &network, Triplets &triplets)
DislocationGlideSolverBase(const DislocationNetwork< dim > &)