bool Elasticity::evalSol (Vector& s, const Vectors& eV, const FiniteElement& fe, const Vec3& X, bool toLocal, Vec3* pdir) const { if (eV.empty()) { std::cerr <<" *** Elasticity::evalSol: No solutions vector."<< std::endl; return false; } else if (!eV.front().empty() && eV.front().size() != fe.dNdX.rows()*nsd) { std::cerr <<" *** Elasticity::evalSol: Invalid displacement vector." <<"\n size(eV) = "<< eV.front().size() <<" size(dNdX) = " << fe.dNdX.rows() <<","<< fe.dNdX.cols() << std::endl; return false; } // Evaluate the deformation gradient, dUdX, and/or the strain tensor, eps Matrix Bmat; Tensor dUdX(nDF); SymmTensor eps(nsd,axiSymmetry); if (!this->kinematics(eV.front(),fe.N,fe.dNdX,X.x,Bmat,dUdX,eps)) return false; // Add strains due to temperature expansion, if any double epsT = this->getThermalStrain(eV.back(),fe.N,X); if (epsT != 0.0) eps -= epsT; // Calculate the stress tensor through the constitutive relation Matrix Cmat; SymmTensor sigma(nsd, axiSymmetry || material->isPlaneStrain()); double U; if (!material->evaluate(Cmat,sigma,U,fe,X,dUdX,eps)) return false; else if (epsT != 0.0 && nsd == 2 && material->isPlaneStrain()) sigma(3,3) -= material->getStiffness(X)*epsT; Vec3 p; bool havePval = false; if (toLocal && wantPrincipalStress) { // Calculate principal stresses and associated direction vectors if (sigma.size() == 4) { SymmTensor tmp(2); tmp = sigma; // discard the sigma_zz component havePval = pdir ? tmp.principal(p,pdir,2) : tmp.principal(p); } else havePval = pdir ? sigma.principal(p,pdir,2) : sigma.principal(p); // Congruence transformation to local coordinate system at current point if (locSys) sigma.transform(locSys->getTmat(X)); } s = sigma; if (toLocal) s.push_back(sigma.vonMises()); if (havePval) { s.push_back(p.x); s.push_back(p.y); if (sigma.dim() == 3) s.push_back(p.z); } return true; }