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: 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