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)