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

📄 lusolver.h

📁 利用C
💻 H
字号:
// Copyright (C) 2007-2008 Garth N. Wells.// Licensed under the GNU LGPL Version 2.1.//// Modified by Ola Skavhaug, 2008.// Modified by Dag Lindbo, 2008.// Modified by Anders Logg, 2008.// Modified by Kent-Andre Mardal, 2008.//// First added:  2007-07-03// Last changed: 2008-06-13#ifndef __LU_SOLVER_H#define __LU_SOLVER_H#include <dolfin/parameter/Parametrized.h>#include <dolfin/common/Timer.h>#include "GenericMatrix.h"#include "GenericVector.h"#include "uBlasLUSolver.h"#include "uBlasSparseMatrix.h"#include "uBlasDenseMatrix.h"#include "PETScLUSolver.h"#include "PETScMatrix.h"#include "EpetraLUSolver.h"#include "EpetraMatrix.h"namespace dolfin{  class LUSolver : public Parametrized  {  /// LU solver for the built-in LA backends.       public:    LUSolver() : ublas_solver(0), petsc_solver(0), epetra_solver(0) {}        ~LUSolver()     {       delete ublas_solver;       delete petsc_solver;       delete epetra_solver;     }        uint solve(const GenericMatrix& A, GenericVector& x, const GenericVector& b)    {      Timer timer("LU solver");      if (A.has_type<uBlasSparseMatrix>())       {        if (!ublas_solver)        {          ublas_solver = new uBlasLUSolver();          ublas_solver->set("parent", *this);        }        return ublas_solver->solve(A.down_cast<uBlasSparseMatrix>(), x.down_cast<uBlasVector>(), b.down_cast<uBlasVector>());      }      if (A.has_type<uBlasDenseMatrix>())       {        if (!ublas_solver)        {          ublas_solver = new uBlasLUSolver();          ublas_solver->set("parent", *this);        }        return ublas_solver->solve(A.down_cast<uBlasDenseMatrix >(), x.down_cast<uBlasVector>(), b.down_cast<uBlasVector>());      }#ifdef HAS_PETSC      if (A.has_type<PETScMatrix>())       {        if (!petsc_solver)        {          petsc_solver = new PETScLUSolver();          petsc_solver->set("parent", *this);        }        return petsc_solver->solve(A.down_cast<PETScMatrix>(), x.down_cast<PETScVector>(), b.down_cast<PETScVector>());      }#endif#ifdef HAS_TRILINOS      if (A.has_type<EpetraMatrix>())       {        if (!epetra_solver)        {          epetra_solver = new EpetraLUSolver();          epetra_solver->set("parent", *this);        }        return epetra_solver->solve(A.down_cast<EpetraMatrix>(), x.down_cast<EpetraVector>(), b.down_cast<EpetraVector>());      }#endif      error("No default LU solver for given backend");      return 0;    }    uint factorize(const GenericMatrix& A)    {      if (A.has_type<uBlasSparseMatrix>())       {        if (!ublas_solver)        {          ublas_solver = new uBlasLUSolver();          ublas_solver->set("parent", *this);        }        return ublas_solver->factorize(A.down_cast<uBlasSparseMatrix>());      }      if (A.has_type<uBlasDenseMatrix>())        error("Will only factorize sparse matrices");      error("No matrix factorization for given backend.");      return 0;    }        uint factorized_solve(GenericVector& x, const GenericVector& b)    {      if (b.has_type<uBlasVector>())       {        if (!ublas_solver)        {          ublas_solver = new uBlasLUSolver();          ublas_solver->set("parent", *this);        }        return ublas_solver->factorized_solve(x.down_cast<uBlasVector>(), b.down_cast<uBlasVector>());      }      error("No factorized LU solver for given backend.");      return 0;    }  private:    // uBLAS solver    uBlasLUSolver* ublas_solver;    // PETSc Solver#ifdef HAS_PETSC    PETScLUSolver* petsc_solver;#else    int* petsc_solver;#endif#ifdef HAS_TRILINOS    EpetraLUSolver* epetra_solver;#else    int* epetra_solver;#endif  };}#endif

⌨️ 快捷键说明

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