66 s(MaxLinIt + 1), cs(MaxLinIt + 1), sn(MaxLinIt + 1)
 
   73         for (
int i = 0; i < 
MaxLinIt + 1; i++) {
 
   84         if (
fabs(dy) < std::numeric_limits<doublereal>::epsilon()) {
 
   90                 sn = 1.0 / 
sqrt( 1.0 + temp*temp );
 
   95                 cs = 1.0 / 
sqrt( 1.0 + temp*temp );
 
  105         dy = -sn * dx + cs * dy;
 
  113         for (
int i = sz+1; i > 0; i--) {
 
  115                 for (
int j = i - 1; j > 0; j--) {
 
  120         for (
int j = 0; j <= sz; j++) {
 
  178 #ifdef DEBUG_ITERATIVE 
  179         std::cout << 
" Gmres New Step " << std::endl;
 
  205                         dErrFactor *= dErr/dOldErr;
 
  209 #ifdef DEBUG_ITERATIVE 
  210                 std::cerr << 
"dErr " << dErr << std::endl;
 
  215                         if (!bParallel || MBDynComm.Get_rank() == 0)
 
  218                                 silent_cout(
"\tIteration(" << iIterCnt << 
") " << dErr);
 
  222                                 silent_cout(std::endl);
 
  231                 if (!std::isfinite(dErr)) {
 
  234                 if (iIterCnt >= std::abs(iMaxIter)) {
 
  235                         if (iMaxIter < 0 && dErrFactor < 1.) {
 
  243                 rateo = dErr*dErr/Fnorm;
 
  245 #ifdef DEBUG_ITERATIVE 
  246                 std::cerr << 
"rateo " << rateo << std::endl;
 
  256                 DEBUGCOUT(
"Using Gmres(m) iterative solver" << std::endl);
 
  264 #ifdef DEBUG_ITERATIVE           
  265                 std::cerr << 
"LocTol " << LocTol << std::endl;
 
  279                                 silent_cout(
"NewtonRaphsonSolver: " 
  280                                                 "rebuilding matrix..." 
  295 #ifdef DEBUG_ITERATIVE 
  296                         std::cerr << 
"Jacobian " << std::endl;
 
  310 #ifdef DEBUG_ITERATIVE 
  311                         std::cout << 
"v[i]:" << i << std::endl;
 
  312                         for (
int iTmpCnt = 1; iTmpCnt <= 
Size; iTmpCnt++) {
 
  313                                 std::cout << 
"Dof" << std::setw(4) << iTmpCnt << 
": "  
  314                                         << 
v[i](iTmpCnt) << std::endl;
 
  320 #ifdef DEBUG_ITERATIVE 
  321                         std::cout << 
"vHat:" << std::endl;
 
  322                         for (
int iTmpCnt = 1; iTmpCnt <= 
Size; iTmpCnt++) {
 
  323                                 std::cout << 
"Dof" << std::setw(4) << iTmpCnt << 
": "  
  324                                         << 
vHat(iTmpCnt) << std::endl;
 
  334 #ifdef DEBUG_ITERATIVE 
  335                         std::cout << 
"w:" << std::endl;
 
  336                         for (
int iTmpCnt = 1; iTmpCnt <= 
Size; iTmpCnt++) {
 
  337                                 std::cout << 
"Dof" << std::setw(4) << iTmpCnt << 
": "  
  338                                         << 
w(iTmpCnt) << std::endl;
 
  344 #ifdef DEBUG_ITERATIVE 
  345                         std::cerr << 
"norm1: " << norm1 << std::endl; 
 
  348                         for (
int k = 0; k <= i; k++) {
 
  351 #ifdef DEBUG_ITERATIVE 
  352                                 std::cerr << 
"H(k, i): " << k+1 << 
" " << i+1 << 
" "<< 
H(k+1, i+1) << std::endl; 
 
  359 #ifdef DEBUG_ITERATIVE 
  360                         std::cerr << 
"w.Norm(): " << 
w.
Norm() << std::endl;
 
  361                         std::cerr << 
"H(i+1, i): " << i+2 << 
" " << i+1 << 
" " << 
H(i+2, i+1) << std::endl;
 
  366 #ifdef DEBUG_ITERATIVE 
  367                         std::cerr << 
"norm2: " << norm2 << std::endl;
 
  373                         if  (.001*norm2/norm1 < std::numeric_limits<doublereal>::epsilon()) {
 
  374                                 for (
int k = 0;  k <= i; k++) {       
 
  379 #ifdef DEBUG_ITERATIVE 
  380                                         std::cerr << 
"Reorthogonalize: "  << std::endl;
 
  386                         if (
fabs(
H(i+2, i+1)) > std::numeric_limits<doublereal>::epsilon()) { 
 
  389 #ifdef DEBUG_ITERATIVE 
  390                                 std::cout << 
"v[i+1]:" << i+1 << std::endl;
 
  392                                 for (
int iTmpCnt = 1; iTmpCnt <= 
Size; iTmpCnt++) {
 
  393                                         std::cout << 
"Dof" << std::setw(4) << iTmpCnt << 
": "  
  394                                                 << 
v[i+1](iTmpCnt) << std::endl;
 
  400 #ifdef DEBUG_ITERATIVE 
  401                                 std::cerr << 
"happy breakdown: "  << std::endl;
 
  406                         for (
int k = 0; k < i; k++) {
 
  411 #ifdef DEBUG_ITERATIVE 
  412                                 std::cerr << 
"H(k, i): " << k+1 << 
" " << i+1 << 
" " << 
H(k+1, i+1) << std::endl;
 
  413                                 std::cerr << 
"H(k+1, i): " << k+2 << 
" " << i+1 << 
" " << 
H(k+2, i+1) << std::endl;
 
  421 #ifdef DEBUG_ITERATIVE 
  422                         std::cerr << 
"cs(i): " << 
cs(i+1) << std::endl;
 
  423                         std::cerr << 
"sn(i): " << 
sn(i+1) << std::endl;
 
  429                         if ((resid = 
fabs(
s(i+2))) < LocTol) {
 
  431 #ifdef DEBUG_ITERATIVE 
  432                                 std::cerr << 
"resid 1: " << resid  << std::endl;
 
  438 #ifdef DEBUG_ITERATIVE 
  439                                 std::cout << 
"dx:" << std::endl;
 
  440                                 for (
int iTmpCnt = 1; iTmpCnt <= 
Size; iTmpCnt++) {
 
  441                                         std::cout << 
"Dof" << std::setw(4) << iTmpCnt << 
": "  
  442                                                 << 
dx(iTmpCnt) << std::endl;
 
  449 #ifdef DEBUG_ITERATIVE 
  450                         std::cerr << 
"resid 2 : " << resid << std::endl;
 
  459                         silent_cerr(
"Iterative inner solver didn't converge." 
  460                                 << 
" Continuing..." << std::endl);
 
  471                 if ((etaBis = 
gamma*eta*eta) > .1) {
 
  472                         etaNew = (etaNew > etaBis) ? etaNew : etaBis;
 
  476                 etaBis = .5*Tol/dErr;
 
  477                 eta = (eta > etaBis) ? eta : etaBis;
 
  479 #ifdef DEBUG_ITERATIVE 
  480                 std::cerr << 
"eta " << eta << std::endl;
 
  492                         if (!bParallel || MBDynComm.Get_rank() == 0)
 
  495                                 silent_cout(
"\t\tSolErr " 
  496                                         << dSolErr << std::endl);
 
void GeneratePlaneRotation(const doublereal &dx, const doublereal &dy, doublereal &cs, doublereal &sn) const 
virtual void Reset(void)=0
virtual VectorHandler * pResHdl(void) const =0
virtual SolutionManager * pGetSolutionManager(void) const 
virtual void Jacobian(MatrixHandler *pJac) const =0
bool outputIters(void) const 
#define MBDYN_EXCEPT_ARGS
bool outputBailout(void) const 
void ApplyPlaneRotation(doublereal &dx, doublereal &dy, const doublereal &cs, const doublereal &sn) const 
virtual bool MakeSolTest(Solver *pS, const VectorHandler &Vec, const doublereal &dTol, doublereal &dTest)
virtual void PrintResidual(const VectorHandler &Res, integer iIterCnt) const 
virtual bool MakeResTest(Solver *pS, const NonlinearProblem *pNLP, const VectorHandler &Vec, const doublereal &dTol, doublereal &dTest, doublereal &dTestDiff)
virtual void CheckTimeStepLimit(doublereal dErr, doublereal dErrDiff) const 
#define SAFEDELETEARR(pnt)
virtual doublereal InnerProd(const VectorHandler &VH) const 
virtual VectorHandler & ScalarAddMul(const VectorHandler &VH, const VectorHandler &VH1, const doublereal &d)
bool outputRes(void) const 
virtual void Residual(VectorHandler *pRes) const =0
virtual void Resize(integer iNewRows, integer iNewCols)
virtual integer iGetSize(void) const =0
virtual doublereal Norm(void) const 
GradientExpression< UnaryExpr< FuncFabs, Expr > > fabs(const GradientExpression< Expr > &u)
virtual void PutCoef(integer iRow, const doublereal &dCoef)
virtual VectorHandler & ScalarMul(const VectorHandler &VH, const doublereal &d)
virtual void Resize(integer iSize)
int mbdyn_stop_at_end_of_iteration(void)
virtual void DecCoef(integer iRow, const doublereal &dCoef)=0
virtual void Solve(const NonlinearProblem *NLP, Solver *pS, const integer iMaxIter, const doublereal &Tol, integer &iIterCnt, doublereal &dErr, const doublereal &SolTol, doublereal &dSolErr)
bool outputSol(void) const 
const NonlinearProblem * pPrevNLP
virtual void EvalProd(doublereal Tau, const VectorHandler &f0, const VectorHandler &w, VectorHandler &z) const =0
virtual MatrixHandler * pMatHdl(void) const =0
virtual void MatrReset(void)=0
Gmres(const Preconditioner::PrecondType PType, const integer iPStep, doublereal ITol, integer MaxIt, doublereal etaMx, doublereal T, const NonlinearSolverOptions &options)
#define ASSERT(expression)
virtual void Precond(VectorHandler &b, VectorHandler &x, SolutionManager *pSM) const =0
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
virtual void MatrInitialize(void)
virtual void PutCoef(integer iRow, const doublereal &dCoef)=0
virtual VectorHandler & ScalarAddMul(const VectorHandler &VH, const doublereal &d)
#define SAFENEWARRNOFILL(pnt, item, sz)
virtual void PrintSolution(const VectorHandler &Sol, integer iIterCnt) const 
virtual void Update(const VectorHandler *pSol) const =0
void Backsolve(VectorHandler &x, integer sz, VectorHandler &s, MyVectorHandler *v)