Diana  0.8.3
DianaHslSolver.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: DianaHslSolver.hpp 8160 2009-03-16 18:36:30Z miha $
00013  * -----------------------------------------------------------------------------
00014  *  Description:
00015  */
00016 
00017 #ifndef DIANA_HSL_SOLVER_HPP
00018 #define DIANA_HSL_SOLVER_HPP
00019 
00020 #include <vector>
00021 #include <Basic/DianaSparseArray.hpp>
00022 #include "Fortran.hpp"
00023 #include "IDianaLinearAlgebraSolver.hpp"
00024 
00025 namespace Diana {
00026 
00027   class DianaHslSolver : virtual public IDianaLinearAlgebraSolver {
00028   public:
00029     DianaHslSolver();
00030     virtual ~DianaHslSolver();
00031     
00032     DianaHslSolver(const DianaSparseArray& spar)
00033       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00034              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00035              Common::Error::ECapeNoMemory);
00036 
00037     DianaHslSolver& operator=(const DianaSparseArray& spar)
00038       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00039              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00040              Common::Error::ECapeNoMemory);
00041 
00042     void decompose()
00043       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00044              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00045              Common::Error::ECapeNoMemory);
00046 
00047     void solve(const Common::Types::CapeArrayDouble& rhs,
00048                Common::Types::CapeArrayDouble& sol,
00049                Common::Types::CapeBoolean transpose=false)
00050       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00051              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00052              Common::Error::ECapeNoMemory);
00053 
00054     void solve(int n, const double* rhs, double* sol,
00055                Common::Types::CapeBoolean transpose=false)
00056       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00057              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00058              Common::Error::ECapeNoMemory);
00059 
00060     void mulvec(const Common::Types::CapeArrayDouble& vec,
00061                 Common::Types::CapeArrayDouble& res,
00062                 Common::Types::CapeBoolean transpose=false)
00063       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00064              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00065              Common::Error::ECapeNoMemory);
00066 
00067     void mulvec(int nvec, const double* vec, int nres, double* res,
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   private:
00073     void init_matrix(const DianaSparseArray& spar)
00074       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00075              Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError,
00076              Common::Error::ECapeNoMemory);
00077 
00078     void lusymb()
00079       throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument,
00080              Common::Error::ECapeOutOfBounds,Common::Error::ECapeSolvingError,
00081              Common::Error::ECapeNoMemory);
00082 
00083   private:
00084     Common::Types::CapeBoolean                       bNewStructure;
00085     Common::Types::CapeBoolean                       bNewValues;
00086     DianaSparseArray::crc_type crc32sa;
00087 
00088     fortrani               nRows;
00089     fortrani               nCols;
00090     fortrani               Ne;
00091     fortrani               JobA;
00092     fortrani               JobB;
00093     fortrani               JobC;
00094     fortrani               La;
00095     fortrand               Rinfo;
00096     std::vector<fortrand>  A;
00097     std::vector<fortrani>  Irn;
00098     std::vector<fortrani>  Jcn;
00099     std::vector<fortrand>  Ta;
00100     std::vector<fortrani>  Tirn;
00101     std::vector<fortrani>  Tjcn;
00102     std::vector<fortrani>  Keep;
00103     std::vector<fortrani>  Iw;
00104     std::vector<fortrani>  Info; //[MA48Info_Size];
00105     std::vector<fortrand>  W;
00106     std::vector<fortrand>  Error; //[MA48Error_Size];
00107     std::vector<fortrand>  Cntl; // [MA48Cntl_Size];
00108     std::vector<fortrani>  Icntl; // [MA48Icntl_Size]; 
00109     std::vector<fortrand>  B;
00110   };
00111 };
00112 
00113 #endif // DIANA_HSL_SOLVER_HPP