⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ublaslusolver.h

📁 利用C
💻 H
字号:
// Copyright (C) 2006-2008 Garth N. Wells.// Licensed under the GNU LGPL Version 2.1.//// Modified by Anders Logg 2006.// Modified by Dah Lindbo 2008.// // First added:  2006-05-31// Last changed: 2008-05-07#ifndef __UBLAS_LU_SOLVER_H#define __UBLAS_LU_SOLVER_H#include "ublas.h"#include <dolfin/parameter/Parametrized.h>namespace dolfin{  /// Forward declarations  class uBlasVector;  class uBlasKrylovMatrix;  template<class Mat> class uBlasMatrix;  /// This class implements the direct solution (LU factorization) of  /// linear systems of the form Ax = b using uBlas data types. Dense  /// matrices are solved using uBlas LU factorisation, and sparse matrices  /// are solved using UMFPACK (http://www.cise.ufl.edu/research/sparse/umfpack/)  /// is installed. Matrices can also be inverted.      class uBlasLUSolver : public Parametrized  {  public:        /// Constructor    uBlasLUSolver();    /// Destructor    ~uBlasLUSolver();    /// Solve linear system Ax = b for a dense matrix    virtual uint solve(const uBlasMatrix<ublas_dense_matrix>& A, uBlasVector& x, const uBlasVector& b);    /// Solve linear system Ax = b for a sparse matrix using UMFPACK if installed    virtual uint solve(const uBlasMatrix<ublas_sparse_matrix>& A, uBlasVector& x, const uBlasVector& b);    /// LU-factor sparse matrix A if UMFPACK is installed    virtual uint factorize(const uBlasMatrix<ublas_sparse_matrix>& A);    /// Solve factorized system (UMFPACK).    virtual uint factorized_solve(uBlasVector& x, const uBlasVector& b);    /// Solve linear system Ax = b for a Krylov matrix    void solve(const uBlasKrylovMatrix& A, uBlasVector& x, const uBlasVector& b);    /// Solve linear system Ax = b in place (A is dense)    uint solveInPlaceUBlas(uBlasMatrix<ublas_dense_matrix>& A, uBlasVector& x, const uBlasVector& b) const;    /// Compute the inverse of A (A is dense or sparse)    template<class Mat>    void invert(Mat& A) const;  private:        /// Check status flag returned by an UMFPACK function    void check_status(long int status, std::string function) const;    /// General uBlas LU solver which accepts both vector and matrix right-hand sides    template<class Mat, class B>    uint solveInPlace(Mat& A, B& X) const;    // Temporary data for LU factorization of sparse ublas matrix (umfpack only)#ifdef HAS_UMFPACK    bool has_factorized_matrix;    uint mat_dim;    void* Numeric;    long int* Rp;    long int* Ri;    double* Rx;   #endif    // Temporary data for LU factorization of a uBlasKrylovMatrix    uBlasMatrix<ublas_dense_matrix>* AA;    uBlasVector* ej;    uBlasVector* Aj;      };  //---------------------------------------------------------------------------  // Implementation of template functions  //---------------------------------------------------------------------------  template<class Mat>  void uBlasLUSolver::invert(Mat& A) const  {    const uint M = A.size1();    dolfin_assert(M == A.size2());      // Create indentity matrix    Mat X(M, M);    X.assign(ublas::identity_matrix<real>(M));    // Solve    solveInPlace(A, X);    A.assign_temporary(X);  }  //-----------------------------------------------------------------------------  template<class Mat, class B>  dolfin::uint uBlasLUSolver::solveInPlace(Mat& A, B& X) const  {    const uint M = A.size1();    dolfin_assert( M == A.size2() );      // Create permutation matrix    ublas::permutation_matrix<std::size_t> pmatrix(M);    // Factorise (with pivoting)    uint singular = ublas::lu_factorize(A, pmatrix);    if( singular > 0)      error("Singularity detected in uBlas matrix factorization on line %u.", singular-1);     // Back substitute     ublas::lu_substitute(A, pmatrix, X);    return 1;  }  //-----------------------------------------------------------------------------}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -