Diana  0.8.3
DianaNormalEquationsSolver.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$
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