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$ 00013 * ----------------------------------------------------------------------------- 00014 * Description: 00015 */ 00016 00017 #ifndef DIANA_NORMAL_EQUATIONS_SOLVER_HPP 00018 #define DIANA_NORMAL_EQUATIONS_SOLVER_HPP 00019 00020 #include <vector> 00021 #include <Basic/DianaSparseArray.hpp> 00022 #include "IDianaLinearAlgebraSolver.hpp" 00023 00024 namespace Diana { 00025 00026 class DianaNormalEquationsSolver : virtual public IDianaLinearAlgebraSolver { 00027 public: 00028 DianaNormalEquationsSolver(); 00029 virtual ~DianaNormalEquationsSolver(); 00030 00031 DianaNormalEquationsSolver(const DianaSparseArray& spar) 00032 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00033 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00034 Common::Error::ECapeNoMemory); 00035 00036 DianaNormalEquationsSolver& operator=(const DianaSparseArray& spar) 00037 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00038 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00039 Common::Error::ECapeNoMemory); 00040 00041 void decompose() 00042 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00043 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00044 Common::Error::ECapeNoMemory); 00045 00046 void solve(const Common::Types::CapeArrayDouble& rhs, 00047 Common::Types::CapeArrayDouble& sol, 00048 Common::Types::CapeBoolean transpose=false) 00049 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00050 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00051 Common::Error::ECapeNoMemory); 00052 00053 void solve(int n, const double* rhs, double* sol, 00054 Common::Types::CapeBoolean transpose=false) 00055 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00056 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00057 Common::Error::ECapeNoMemory); 00058 00059 void mulvec(const Common::Types::CapeArrayDouble& vec, 00060 Common::Types::CapeArrayDouble& res, 00061 Common::Types::CapeBoolean transpose=false) 00062 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00063 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00064 Common::Error::ECapeNoMemory); 00065 00066 void mulvec(int nvec, const double* vec, int nres, double* res, 00067 Common::Types::CapeBoolean transpose=false) 00068 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00069 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00070 Common::Error::ECapeNoMemory); 00071 private: 00072 void init_matrix(const DianaSparseArray& spar) 00073 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00074 Common::Error::ECapeOutOfBounds, Common::Error::ECapeSolvingError, 00075 Common::Error::ECapeNoMemory); 00076 00077 void lusymb() 00078 throw (Common::Error::ECapeUnknown, Common::Error::ECapeBadArgument, 00079 Common::Error::ECapeOutOfBounds,Common::Error::ECapeSolvingError, 00080 Common::Error::ECapeNoMemory); 00081 00082 void free_cholmod(); 00083 00084 private: 00085 Common::Types::CapeBoolean bNewStructure; 00086 Common::Types::CapeBoolean bNewValues; 00087 DianaSparseArray::crc_type crc32sa; 00088 00089 long nRows; 00090 long nCols; 00091 long nNoneZeros; 00092 00093 void* pCM; // cholmod_common 00094 void* cspA; // cholmod_sparse 00095 void* cdeB; // cholmod_dense 00096 void* cdeX; // cholmod_dense 00097 void* cdeAtB; // cholmod_dense 00098 void* csfL; // cholmod_factor 00099 Common::Types::CapeDouble dblUround; 00100 }; 00101 }; 00102 00103 #endif // DIANA_NORMAL_EQUATIONS_SOLVER_HPP