Diana  0.8.3
DianaBorderedSolver.hpp
00001 /* -----------------------------------------------------------------------------
00002  *  Diana process modelling, simulation and analysis software
00003  *  Copyright (c) 2005, Michael Krasnyk
00004  *  All rights reserved.
00005 
00006  *  This file is a part of Diana process modelling, simulation and analysis software
00007  *
00008  *  Diana is free software; you can redistribute it and/or modify it
00009  *  under the terms of the GNU General Public License as published
00010  *  by the Free Software Foundation (see accompanying file LICENSE)
00011  * -----------------------------------------------------------------------------
00012  *  $Id: DianaBorderedSolver.hpp 8160 2009-03-16 18:36:30Z miha $
00013  * -----------------------------------------------------------------------------
00014  *  Description:
00015  */
00016 
00017 #ifndef DIANA_BORDERED_SOLVER_HPP
00018 #define DIANA_BORDERED_SOLVER_HPP
00019 
00020 #ifdef HAVE_CONFIG_H
00021 #include <config.h>
00022 #endif
00023 
00024 #include <vector>
00025 #include <Basic/DianaSparseArray.hpp>
00026 #include "IDianaLinearAlgebraSolver.hpp"
00027 #ifdef HAVE_HSL
00028 #include "DianaHslSolver.hpp"
00029 #else
00030 #include "DianaSparseSolver.hpp"
00031 #endif
00032 
00033 namespace Diana {
00034 
00035   class DianaBorderedSolver : virtual public IDianaLinearAlgebraSolver {
00036 
00037   public:
00038     DianaBorderedSolver();
00039     virtual ~DianaBorderedSolver();
00040 
00041     void setA(const DianaSparseArray& spar)
00042       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00043              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00044              Common::Error::ECapeNoMemory);
00045 
00046     void setB(const Common::Types::CapeArrayDouble& _vecB)
00047       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00048              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00049              Common::Error::ECapeNoMemory);
00050     
00051     void setC(const Common::Types::CapeArrayDouble& _vecC)
00052       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00053              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00054              Common::Error::ECapeNoMemory);
00055     
00056     void setD(Common::Types::CapeDouble _dblD)
00057       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00058              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00059              Common::Error::ECapeNoMemory);
00060     
00061     void decompose()
00062       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00063              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00064              Common::Error::ECapeNoMemory);
00065 
00066     void solve(const Common::Types::CapeArrayDouble& rhs,
00067                Common::Types::CapeArrayDouble& sol,
00068                Common::Types::CapeBoolean transpose=false)
00069       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00070              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00071              Common::Error::ECapeNoMemory);
00072 
00073     void solve(int n, const double* rhs, double* sol,
00074                Common::Types::CapeBoolean transpose=false)
00075       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00076              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00077              Common::Error::ECapeNoMemory);
00078 
00079     void mulvec(const Common::Types::CapeArrayDouble& vec,
00080                 Common::Types::CapeArrayDouble& res,
00081                 Common::Types::CapeBoolean transpose=false)
00082       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00083              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00084              Common::Error::ECapeNoMemory);
00085 
00086     void mulvec(int nvec, const double* vec, int nres, double* res,
00087                 Common::Types::CapeBoolean transpose=false)
00088       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00089              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00090              Common::Error::ECapeNoMemory);
00091 
00092   private:
00093     int                            nSize;
00094 #ifdef HAVE_HSL
00095     DianaHslSolver                 dsmA;
00096 #else
00097     DianaSparseSolver              dsmA;
00098 #endif
00099     Common::Types::CapeArrayDouble vecB;
00100     Common::Types::CapeArrayDouble vecC;
00101     Common::Types::CapeDouble      dblD;
00102     Common::Types::CapeArrayDouble vecAmB;
00103     Common::Types::CapeArrayDouble vecAmF;
00104   };
00105 };
00106 
00107 #endif // DIANA_BORDERED_SOLVER_HPP