diff --git a/MathLib/CMakeLists.txt b/MathLib/CMakeLists.txt index 1695d4b435d26bfb7366d3709ee454a8e3223535..b26bbc4b792736749206d3f176c31ca3aa9b5a90 100644 --- a/MathLib/CMakeLists.txt +++ b/MathLib/CMakeLists.txt @@ -6,7 +6,6 @@ APPEND_SOURCE_FILES(SOURCES InterpolationAlgorithms) APPEND_SOURCE_FILES(SOURCES Integration) APPEND_SOURCE_FILES(SOURCES LinAlg) APPEND_SOURCE_FILES(SOURCES LinAlg/Dense) -APPEND_SOURCE_FILES(SOURCES LinAlg/Solvers) APPEND_SOURCE_FILES(SOURCES ODE) APPEND_SOURCE_FILES(SOURCES Nonlinear) diff --git a/MathLib/LinAlg/Solvers/GaussAlgorithm-impl.h b/MathLib/LinAlg/Solvers/GaussAlgorithm-impl.h deleted file mode 100644 index b32b81fdaa2ae7a3f2d41df051e241f2d26b9c23..0000000000000000000000000000000000000000 --- a/MathLib/LinAlg/Solvers/GaussAlgorithm-impl.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * \file - * \author Thomas Fischer - * \date 2011-05-06 - * \brief Implementation of the GaussAlgorithm class. - * - * \copyright - * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) - * Distributed under a Modified BSD License. - * See accompanying file LICENSE.txt or - * http://www.opengeosys.org/project/license - * - */ - -#include <cmath> -#include <algorithm> -#include "GaussAlgorithm.h" - -namespace MathLib -{ - -template <typename MAT_T, typename VEC_T> -void GaussAlgorithm<MAT_T, VEC_T>::performLU(MAT_T& A) -{ - IDX_T const nr(A.getNumberOfRows()); - IDX_T const nc(A.getNumberOfColumns()); - - for (IDX_T k=0; k<nc; k++) { - // search pivot - FP_T t = std::abs(A(k, k)); - _perm[k] = k; - for (IDX_T i=k+1; i<nr; i++) { - FP_T const s = std::abs(A(i,k)); - if (s > t) { - t = s; - _perm[k] = i; - } - } - - // exchange rows - if (_perm[k] != k) { - for (IDX_T j=0; j<nc; j++) - std::swap (A(_perm[k],j), A(k,j)); - } - - // eliminate - for (IDX_T i=k+1; i<nr; i++) { - FP_T const l = A(i,k)/A(k,k); - for (IDX_T j=k; j<nc; j++) { - A(i,j) -= A(k,j) * l; - } - A(i,k) = l; - } - } -} - -template <typename MAT_T, typename VEC_T> -template <typename V> -void GaussAlgorithm<MAT_T, VEC_T>:: -solve (MAT_T& A, V& b, bool decompose) -{ - _perm.resize(A.getNumberOfRows()); - - if (decompose) - performLU(A); - permuteRHS (b); - forwardSolve (A, b); // L z = b, b will be overwritten by z - backwardSolve (A, b); // U x = z, b (z) will be overwritten by x -} - -template <typename MAT_T, typename VEC_T> -void GaussAlgorithm<MAT_T, VEC_T>:: -solve (MAT_T& A, FP_T* & b, bool decompose) -{ - _perm.resize(A.getNumberOfRows()); - - if (decompose) - performLU(A); - permuteRHS (b); - forwardSolve (A, b); // L z = b, b will be overwritten by z - backwardSolve (A, b); // U x = z, b (z) will be overwritten by x -} - -template <typename MAT_T, typename VEC_T> -void GaussAlgorithm<MAT_T, VEC_T>::solve ( - MAT_T& A, VEC_T const& b, VEC_T & x, - bool decompose) -{ - for (std::size_t k(0); k<A.getNumberOfRows(); k++) - x[k] = b[k]; - solve(A, x, decompose); -} - -template <typename MAT_T, typename VEC_T> -template <typename V> -void GaussAlgorithm<MAT_T, VEC_T>::permuteRHS (V & b) const -{ - for (IDX_T i=0; i<_perm.size(); i++) { - if (_perm[i] != i) - std::swap(b[i], b[_perm[i]]); - } -} - -template <typename MAT_T, typename VEC_T> -void GaussAlgorithm<MAT_T, VEC_T>::permuteRHS (VEC_T& b) const -{ - for (IDX_T i=0; i<_perm.size(); i++) { - if (_perm[i] != i) - std::swap(b[i], b[_perm[i]]); - } -} - -} // end namespace MathLib diff --git a/MathLib/LinAlg/Solvers/GaussAlgorithm.h b/MathLib/LinAlg/Solvers/GaussAlgorithm.h deleted file mode 100644 index 068b7494d7d786adcf8ca8c849ef425d26b0e3c1..0000000000000000000000000000000000000000 --- a/MathLib/LinAlg/Solvers/GaussAlgorithm.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * \file - * \author Thomas Fischer - * \date 2011-05-06 - * \brief Definition of the GaussAlgorithm class. - * - * \copyright - * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) - * Distributed under a Modified BSD License. - * See accompanying file LICENSE.txt or - * http://www.opengeosys.org/project/license - * - */ - -#pragma once - -#include <vector> - - -#include "BaseLib/ConfigTree.h" -#include "../Dense/DenseMatrix.h" -#include "TriangularSolve.h" - -namespace MathLib { - -/** - * This is a class for the direct solution of (dense) systems of - * linear equations, \f$A x = b\f$. During the construction of - * the object the matrix A is factorized in matrices L and U using - * Gauss-Elimination with partial pivoting (rows are exchanged). In doing so - * the entries of A change! The solution for a specific - * right hand side is computed by the method execute(). - */ -template <typename MAT_T, typename VEC_T = typename MAT_T::FP_T*> -class GaussAlgorithm -{ -public: - using FP_T = typename MAT_T::FP_T; - using IDX_T = typename MAT_T::IDX_T; - -public: - /** - * A direct solver for the (dense) linear system \f$A x = b\f$. - * @param solver_name A name used as a prefix for command line options - * if there are such options available. - * @param option For some solvers the user can give parameters to the - * algorithm. GaussAlgorithm has to fulfill the common interface - * of all solvers of systems of linear equations. For this reason the - * second argument was introduced. - */ - GaussAlgorithm(const std::string solver_name = "", - BaseLib::ConfigTree const*const option = nullptr) - { - (void) solver_name; (void) option; // silence both compiler and doxygen warnings. - } - - /** - * Method solves the linear system \f$A x = b\f$ (based on the LU factorization) - * using forward solve and backward solve. - * @param A the coefficient matrix - * @param b at the beginning the right hand side, at the end the solution - * @param decompose Flag that signals if the LU decomposition should be - * performed or not. If the matrix \f$A\f$ does not change, the LU - * decomposition needs to be performed once only! - * @attention The entries of the given matrix will be changed! - */ - template <typename V> - void solve (MAT_T& A, V & b, bool decompose = true); - - void solve(MAT_T& A, FP_T* & b, bool decompose = true); - - /** - * Method solves the linear system \f$A x = b\f$ (based on the LU factorization) - * using forward solve and backward solve. - * @param A (input) the coefficient matrix - * @param b (input) the right hand side - * @param x (output) the solution - * @param decompose see documentation of the other solve methods. - * @attention The entries of the given matrix will be changed! - */ - void solve(MAT_T& A, VEC_T const& b, VEC_T & x, bool decompose = true); - -private: - // void solve (MAT_T& A, VEC_T const& b, bool decompose); - - void performLU(MAT_T& A); - /** - * permute the right hand side vector according to the - * row permutations of the LU factorization - * @param b the entries of the vector b are permuted - */ - template <typename V> void permuteRHS(V & b) const; - void permuteRHS (VEC_T& b) const; - - //! the permutation of the rows - std::vector<IDX_T> _perm; -}; - -} // end namespace MathLib - -#include "GaussAlgorithm-impl.h" diff --git a/MathLib/LinAlg/Solvers/TriangularSolve-impl.h b/MathLib/LinAlg/Solvers/TriangularSolve-impl.h deleted file mode 100644 index 0836ce16e65e214ce9dbb86f566359f230795d5d..0000000000000000000000000000000000000000 --- a/MathLib/LinAlg/Solvers/TriangularSolve-impl.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * \file - * \author Thomas Fischer - * \date 2011-05-05 - * \brief Implementation of triangular solver functions. - * - * \copyright - * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) - * Distributed under a Modified BSD License. - * See accompanying file LICENSE.txt or - * http://www.opengeosys.org/project/license - * - */ - -namespace MathLib { - -template <typename FP_T, typename VEC_T> -void forwardSolve (const DenseMatrix <FP_T> &L, VEC_T& b) -{ - using IDX_T = typename DenseMatrix<double>::IDX_T; - IDX_T m (L.getNumberOfRows()); - FP_T t; - - for (IDX_T r=0; r<m; r++) { - t = 0.0; - for (IDX_T c=0; c<r; c++) { - t += L(r,c)*b[c]; - } - b[r] = b[r]-t; - } -} - -template <typename FP_T, typename VEC_T> -void backwardSolve (const DenseMatrix <FP_T> &mat, VEC_T& b) -{ - FP_T t; - using IDX_T = typename DenseMatrix<double>::IDX_T; - IDX_T m (mat.getNumberOfRows()), n(mat.getNumberOfColumns()); - for (int r=m-1; r>=0; r--) { - t = 0.0; - for (IDX_T c=r+1; c<n; c++) { - t += mat(r,c)*b[c]; - } - b[r] = (b[r]-t) / mat(r,r); - } -} - -template <typename FP_T, typename VEC_T> -void backwardSolve ( DenseMatrix<FP_T> const& mat, VEC_T& x, VEC_T const& b) -{ - using IDX_T = typename DenseMatrix<FP_T>::IDX_T; - IDX_T n_cols (mat.getNumberOfColumns()); - for (int r = (n_cols - 1); r >= 0; r--) { - FP_T t = 0.0; - - for (IDX_T c = r+1; c < n_cols; c++) { - t += mat(r,c) * b[c]; - } - x[r] = (b[r] - t) / mat(r, r); - } -} - - -} // end namespace MathLib diff --git a/MathLib/LinAlg/Solvers/TriangularSolve.h b/MathLib/LinAlg/Solvers/TriangularSolve.h deleted file mode 100644 index 51543ce397fc84a67ebda53f28b5e3ffd944c20b..0000000000000000000000000000000000000000 --- a/MathLib/LinAlg/Solvers/TriangularSolve.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * \file - * \author Thomas Fischer - * \date 2011-05-06 - * \brief Definition of triangular solver functions. - * - * \copyright - * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) - * Distributed under a Modified BSD License. - * See accompanying file LICENSE.txt or - * http://www.opengeosys.org/project/license - * - */ - -#pragma once - -#include "../Dense/DenseMatrix.h" - -namespace MathLib { - -/** - * solves the \f$n \times n\f$ triangular linear system \f$L \cdot y = b\f$, - * assumes \f$L_{ii} = 1.0\f$, \f$i=1,...,n\f$, \f$b\f$ is destroyed - * @param L the lower triangular matrix - * @param b at beginning the right hand side vector, at the end the solution vector - */ -template <typename FP_T, typename VEC_T> -void forwardSolve (const DenseMatrix <FP_T> &L, VEC_T& b); - -/** - * solves the \f$n \times n\f$ triangular linear system \f$U \cdot x=y\f$, - * \f$U\f$, where \f$U\f$ is a upper triangular matrix. - * @param U upper triangular matrix - * @param y at beginning the right hand side, at the end the solution - */ -template <typename FP_T, typename VEC_T> -void backwardSolve (const DenseMatrix <FP_T> &U, VEC_T& y); - -// backwardSolve mat * x = y, mat ... upper triangular matrix -/** - * backward solve the system of linear equations \f$ U \cdot x = y\f$, - * where \f$U\f$ is a upper triangular matrix - * @param mat the upper triangular matrix - * @param x the solution of the system of linear equations - * @param b the right hand side - */ -template <typename FP_T, typename VEC_T> -void backwardSolve ( DenseMatrix<FP_T> const& mat, VEC_T& x, VEC_T const& b); - -} // end namespace MathLib - -#include "TriangularSolve-impl.h"