bool NonlinearDriver::solutionNorms (const TimeDomain& time, double zero_tol, std::streamsize outPrec) { if (msgLevel < 0 || solution.empty()) return true; const size_t nsd = model.getNoSpaceDim(); size_t iMax[nsd]; double dMax[nsd]; double normL2 = model.solutionNorms(solution.front(),dMax,iMax); RealArray RF; bool haveReac = model.getCurrentReactions(RF,solution.front()); Vectors gNorm; if (calcEn) { model.setMode(SIM::RECOVERY); model.setQuadratureRule(opt.nGauss[1]); if (!model.solutionNorms(time,solution,gNorm)) gNorm.clear(); } if (myPid > 0) return true; std::streamsize stdPrec = outPrec > 0 ? IFEM::cout.precision(outPrec) : 0; double old_tol = utl::zero_print_tol; utl::zero_print_tol = zero_tol; IFEM::cout <<" Primary solution summary: L2-norm : " << utl::trunc(normL2); for (unsigned char d = 0; d < nsd; d++) if (utl::trunc(dMax[d]) != 0.0) IFEM::cout <<"\n Max "<< char('X'+d) <<"-displacement : "<< dMax[d] <<" node "<< iMax[d]; if (haveReac) { IFEM::cout <<"\n Total reaction forces: Sum(R) ="; for (size_t i = 1; i < RF.size(); i++) IFEM::cout <<" "<< utl::trunc(RF[i]); if (utl::trunc(RF.front()) != 0.0) IFEM::cout <<"\n displacement*reactions: (R,u) = "<< RF.front(); } if (!gNorm.empty()) this->printNorms(gNorm.front(),IFEM::cout); IFEM::cout << std::endl; utl::zero_print_tol = old_tol; if (stdPrec > 0) IFEM::cout.precision(stdPrec); return true; }
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; }