diff --git a/AMDiS/src/ITL_OEMSolver.h b/AMDiS/src/ITL_OEMSolver.h index ecaa854df8fdda5d1c561ab3c05daa6d82863a5a..7c2245f7a993aa45d1271f41a4d0ff4224578738 100644 --- a/AMDiS/src/ITL_OEMSolver.h +++ b/AMDiS/src/ITL_OEMSolver.h @@ -74,7 +74,9 @@ namespace AMDiS { if (one_norm(x) > 1e100) x= 0.0; #endif - return ITLSolver()(A, x, b, *this->leftPrecon, *this->rightPrecon, iter); + error= ITLSolver()(A, x, b, *this->leftPrecon, *this->rightPrecon, iter); + iterations= iter.iterations(); + return error; } @@ -124,7 +126,9 @@ namespace AMDiS { { itl::cyclic_iteration<value_type> iter(b, this->max_iter, this->relative, this->tolerance, this->print_cycle); - return ITLSolver()(A, x, b, *this->leftPrecon, *this->rightPrecon, iter, ell); + error= ITLSolver()(A, x, b, *this->leftPrecon, *this->rightPrecon, iter, ell); + iterations= iter.iterations(); + return error; } class Creator : public OEMSolverCreator diff --git a/AMDiS/src/OEMSolver.h b/AMDiS/src/OEMSolver.h index e5b6fb13d7f0f3f14b45b1dedfe6219466cbb614..6f00a4c00999d211f5ec7dfe309c2a38e0b21b27 100644 --- a/AMDiS/src/OEMSolver.h +++ b/AMDiS/src/OEMSolver.h @@ -64,6 +64,8 @@ namespace AMDiS { info(0), residual(0), print_cycle(100), + iterations(-1), + error(-1), leftPrecon(NULL), rightPrecon(NULL) {} @@ -132,6 +134,7 @@ namespace AMDiS { counter++; } + // std::cout << "Iterative Solver: A = \n" << A.getMatrix(); int r = solveSystem(A.getMatrix(), xx, bb); // Copy solution vector to DOFVector @@ -164,6 +167,7 @@ namespace AMDiS { } // Solver on DOFVector for single system + std::cout << "Iterative Solver (System): A = \n" << A.getMatrix(); int r= solveSystem(A.getMatrix(), xx, bb); for (int i = 0, counter = 0; i < ns; i++) { @@ -227,6 +231,18 @@ namespace AMDiS { max_iter = i; } + /// Returns number of iterations in last run of an iterative solver + inline int getIterations() + { + return iterations; + } + + /// Returns error code in last run of an iterative solver + inline int getErrorCode() + { + return error; + } + /// Sets \ref info inline void setInfo(int i) { @@ -257,8 +273,16 @@ namespace AMDiS { /// Print cycle, after how many iterations the residuum norm is logged. int print_cycle; + /// How many iterations were performed in last solver (not set by UmfPack) + int iterations; + + /// Error code in last solver (not set by UmfPack) + int error; + + /// Left preconditioner (ignored by some iterative solvers and by UmfPack) ITL_BasePreconditioner *leftPrecon; + /// Right preconditioner (ignored by some iterative solvers and by UmfPack) ITL_BasePreconditioner *rightPrecon; }; diff --git a/AMDiS/src/UmfPackSolver.h b/AMDiS/src/UmfPackSolver.h index 634fbce7d87ec78728702dbe075a9c0e32afd32b..8bb6ae057599a8f2e042f48b57bce717998acb02 100644 --- a/AMDiS/src/UmfPackSolver.h +++ b/AMDiS/src/UmfPackSolver.h @@ -87,6 +87,8 @@ namespace AMDiS { solver->update_numeric(); else solver->update(); + + // std::cout << "UmfPackSolver: A = \n" << A << "\n"; int code= (*solver)(x, b); mtl::dense_vector<value_type> r= b - A * x; std::cout << "UmfPackSolver: ||b-Ax|| = " << two_norm(r) << "\n";