2009-02-10 18:02:41 +08:00
// This file is part of Eigen, a lightweight C++ template library
2009-05-23 02:25:33 +08:00
// for linear algebra.
2009-02-10 18:02:41 +08:00
//
// Copyright (C) 2008-2009 Gael Guennebaud <g.gael@free.fr>
//
2012-07-14 02:42:47 +08:00
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
2009-02-10 18:02:41 +08:00
#ifndef EIGEN_ITERATIVE_SOLVERS_MODULE_H
#define EIGEN_ITERATIVE_SOLVERS_MODULE_H
2018-09-17 15:54:29 +08:00
#include "../../Eigen/Sparse"
2018-08-29 00:32:39 +08:00
#include "../../Eigen/Jacobi"
#include "../../Eigen/Householder"
2009-03-19 04:06:06 +08:00
2021-04-12 00:26:14 +08:00
2013-01-11 17:40:35 +08:00
/**
2021-09-01 00:26:27 +08:00
* \defgroup IterativeLinearSolvers_Module Iterative Solvers module
2009-02-10 18:02:41 +08:00
* This module aims to provide various iterative linear and non linear solver algorithms.
* It currently provides:
* - a constrained conjugate gradient
2012-03-29 21:00:55 +08:00
* - a Householder GMRES implementation
2021-02-27 20:09:33 +08:00
* - an IDR(s) implementation
* - a DGMRES implementation
* - a MINRES implementation
2021-04-12 00:26:14 +08:00
*
2021-08-24 20:09:20 +08:00
* Choosing the best solver for solving \c A \c x = \c b depends a lot on the preconditioner chosen as well as the properties of \c A. The following flowchart might help you.
* \dot width=50%
* digraph g {
* node [ fontname=Arial, fontsize=11];
* edge [ fontname=Helvetica, fontsize=10 ];
* A1[label="hermitian",shape="box"];
* A2[label="positive definite",shape="box"];
* CG[shape="plaintext"];
* A3[label="ill conditioned",shape="box"];
* A4[label="good preconditioner",shape="box"];
* A5[label="flexible preconditioner",shape="box"];
* A6[label="strongly indefinite",shape="box"];
* A8[label="large imaginary eigenvalue",shape="box"];
* A7[label="large imaginary eigenvalue",shape="box"];
*
* SYMMLQ[shape="plaintext"];
* MINRES[shape="plaintext"];
* GCR[shape="plaintext"];
* GMRES[shape="plaintext"];
* IDRSTABL[shape="plaintext"];
* IDRS[shape="plaintext"];
* BICGSTABL[shape="plaintext"];
* BICGSTAB[shape="plaintext"];
*
* A1 -> A2 [label="yes"];
* A2 -> CG [label="yes"];
* A2 -> A3 [label="no"];
* A3 -> SYMMLQ [label="yes"];
* A3 -> MINRES [label="no"];
*
* A1 -> A4 [label="no"];
* A4 -> A5 [label="yes"];
* A5 -> GCR [label="yes"];
* A5 -> GMRES [label="no"];
*
* A4 -> A6 [label="no"];
* A6 -> A8 [label="yes"];
* A6 -> A7 [label="no"];
* A7 -> BICGSTABL [label="yes"];
* A7 -> BICGSTAB [label="no"];
* A8 -> IDRSTABL [label="yes"];
* A8 -> IDRS [label="no"];
* }
* \enddot
2009-02-10 18:02:41 +08:00
* \code
* #include <unsupported/Eigen/IterativeSolvers>
* \endcode
*/
2021-04-12 00:26:14 +08:00
2009-03-19 04:06:06 +08:00
2018-08-29 00:32:39 +08:00
#include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
2013-02-06 18:30:33 +08:00
#ifndef EIGEN_MPL2_ONLY
2009-02-10 18:02:41 +08:00
#include "src/IterativeSolvers/IterationController.h"
#include "src/IterativeSolvers/ConstrainedConjGrad.h"
2013-02-06 18:30:33 +08:00
#endif
2011-10-12 02:41:43 +08:00
#include "src/IterativeSolvers/IncompleteLU.h"
2012-03-29 21:00:55 +08:00
#include "src/IterativeSolvers/GMRES.h"
2015-12-07 19:23:22 +08:00
#include "src/IterativeSolvers/DGMRES.h"
2012-09-24 22:47:38 +08:00
#include "src/IterativeSolvers/MINRES.h"
2021-02-27 20:09:33 +08:00
#include "src/IterativeSolvers/IDRS.h"
2009-02-10 18:02:41 +08:00
2018-08-29 00:32:39 +08:00
#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
2009-02-10 18:02:41 +08:00
#endif // EIGEN_ITERATIVE_SOLVERS_MODULE_H