Diana
0.8.3
|
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