// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // 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/. // SPDX-FileCopyrightText: The Eigen Authors // SPDX-License-Identifier: MPL-2.0 #ifndef EIGEN_ITERATIVELINEARSOLVERS_MODULE_H #define EIGEN_ITERATIVELINEARSOLVERS_MODULE_H #include "SparseCore" #include "OrderingMethods" #include "Jacobi" #include "Householder" #include "QR" #include "LU" #include "src/Core/util/DisableStupidWarnings.h" /** * \defgroup IterativeLinearSolvers_Module IterativeLinearSolvers module * * This module provides iterative methods to solve problems of the form \c A \c x = \c b, where \c A is a squared matrix, usually very large and sparse. * Those solvers are accessible via the following classes: * - ConjugateGradient for selfadjoint (hermitian) matrices, * - LeastSquaresConjugateGradient for rectangular least-square problems, * - LSMR for rectangular least-square problems (Golub-Kahan bidiagonalization, optionally damped), * - BiCGSTAB for general square matrices, * - GMRES - a Householder GMRES implementation, * - DGMRES - a deflated GMRES implementation, * - MINRES for symmetric indefinite matrices, * - IDRS - an IDR(s) implementation, * - BiCGSTABL - a BiCGSTAB(L) implementation, * - IDRSTABL - an IDR(s)STAB(L) implementation. * * These iterative solvers are associated with some preconditioners: * - IdentityPreconditioner - not really useful * - DiagonalPreconditioner - also called Jacobi preconditioner, work very well on diagonal dominant matrices. * - IncompleteLUT - incomplete LU factorization with dual thresholding * - IncompleteLU - incomplete LU factorization without fill-in * * The IterScaling class can be used as a preprocessing step to equilibrate the row and column norms of a matrix. * * 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 * * Such problems can also be solved using the direct sparse decomposition modules: SparseCholesky, CholmodSupport, UmfPackSupport, SuperLUSupport, AccelerateSupport. * \code #include \endcode */ // IWYU pragma: begin_exports #include "src/IterativeLinearSolvers/SolveWithGuess.h" #include "src/IterativeLinearSolvers/IterativeSolverBase.h" #include "src/IterativeLinearSolvers/BasicPreconditioners.h" #include "src/IterativeLinearSolvers/ConjugateGradient.h" #include "src/IterativeLinearSolvers/LeastSquareConjugateGradient.h" #include "src/IterativeLinearSolvers/LSMR.h" #include "src/IterativeLinearSolvers/BiCGSTAB.h" #include "src/IterativeLinearSolvers/IncompleteLUT.h" #include "src/IterativeLinearSolvers/IncompleteCholesky.h" #include "src/IterativeLinearSolvers/Scaling.h" #include "src/IterativeLinearSolvers/IncompleteLU.h" #include "src/IterativeLinearSolvers/GMRES.h" #include "src/IterativeLinearSolvers/DGMRES.h" #include "src/IterativeLinearSolvers/MINRES.h" #include "src/IterativeLinearSolvers/IDRS.h" #include "src/IterativeLinearSolvers/BiCGSTABL.h" #include "src/IterativeLinearSolvers/IDRSTABL.h" // IWYU pragma: end_exports #include "src/Core/util/ReenableStupidWarnings.h" #endif // EIGEN_ITERATIVELINEARSOLVERS_MODULE_H