crowmatrix.hpp

Go to the documentation of this file.
00001 
00005 /* Copyright (c) 2005-2010 Taneli Kalvas. All rights reserved.
00006  *
00007  * You can redistribute this software and/or modify it under the terms
00008  * of the GNU General Public License as published by the Free Software
00009  * Foundation; either version 2 of the License, or (at your option)
00010  * any later version.
00011  * 
00012  * This library is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00015  * General Public License for more details.
00016  * 
00017  * You should have received a copy of the GNU General Public License
00018  * along with this library (file "COPYING" included in the package);
00019  * if not, write to the Free Software Foundation, Inc., 51 Franklin
00020  * Street, Fifth Floor, Boston, MA 02110-1301 USA
00021  * 
00022  * If you have questions about your rights to use or distribute this
00023  * software, please contact Berkeley Lab's Technology Transfer
00024  * Department at TTD@lbl.gov. Other questions, comments and bug
00025  * reports should be sent directly to the author via email at
00026  * taneli.kalvas@jyu.fi.
00027  * 
00028  * NOTICE. This software was developed under partial funding from the
00029  * U.S.  Department of Energy.  As such, the U.S. Government has been
00030  * granted for itself and others acting on its behalf a paid-up,
00031  * nonexclusive, irrevocable, worldwide license in the Software to
00032  * reproduce, prepare derivative works, and perform publicly and
00033  * display publicly.  Beginning five (5) years after the date
00034  * permission to assert copyright is obtained from the U.S. Department
00035  * of Energy, and subject to any subsequent five (5) year renewals,
00036  * the U.S. Government is granted for itself and others acting on its
00037  * behalf a paid-up, nonexclusive, irrevocable, worldwide license in
00038  * the Software to reproduce, prepare derivative works, distribute
00039  * copies to the public, perform publicly and display publicly, and to
00040  * permit others to do so.
00041  */
00042 
00043 #ifndef CROWMATRIX_HPP
00044 #define CROWMATRIX_HPP 1
00045 
00046 
00047 #include <cstdlib>
00048 #include <iostream>
00049 #include "matrix.hpp"
00050 #include "error.hpp"
00051 
00052 
00076 class CRowMatrix : public Matrix {
00077     int       _n;      
00078     int       _m;      
00079     int       _nz;     
00080     int       _asize;  
00081     int      *_ptr;    
00082     int      *_col;    
00083     double   *_val;    
00084 
00085     void reallocate( void );
00086     void allocate( void );
00087 
00088     double get_check( int i, int j ) const;
00089     double &set_check( int i, int j );
00090     double get_no_check( int i, int j ) const;
00091     double &set_no_check( int i, int j );
00092 
00093     void clear_check( int i, int j );
00094     void clear_no_check( int i, int j );
00095 
00096     void build( const class CColMatrix &mat );
00097     void build( const class CRowMatrix &mat );
00098     void build( const class CoordMatrix &mat );
00099 
00100 public:
00101 
00102 /* ************************************** *
00103  * Constructors and destructor            *
00104  * ************************************** */
00105 
00108     CRowMatrix();
00109 
00112     CRowMatrix( int n, int m );
00113 
00122     CRowMatrix( int n, int m, int nz, 
00123                 int *ptr, int *col, double *val );
00124 
00127     CRowMatrix( const CRowMatrix &mat );
00128 
00134     CRowMatrix( const class CColMatrix &mat );
00135 
00138     CRowMatrix( const class CoordMatrix &mat );
00139 
00142     CRowMatrix( const class Matrix &mat );
00143 
00146     ~CRowMatrix();
00147 
00148 /* ************************************** *
00149  * Access and information                 *
00150  * ************************************** */
00151 
00154     int columns( void ) const { return( _m ); }
00155 
00158     int rows( void ) const { return( _n ); }
00159 
00163     void size( int &n, int &m ) const { n = _n; m = _m; }
00164 
00167     int nz_elements( void ) const { return( _nz ); }
00168 
00171     int capacity( void ) const { return( _asize ); }
00172 
00173 /* ************************************** *
00174  * User level control                     *
00175  * ************************************** */
00176 
00181     void resize( int n, int m );
00182 
00189     void merge( CRowMatrix &mat );
00190 
00193     void clear( void );
00194 
00199     void clear( int i, int j );
00200 
00203     void reserve( int size );
00204 
00208     void order_ascending( void );
00209 
00213     bool check_ascending( void );
00214 
00217     void debug_print( void ) const;
00218 
00219 /* ************************************** *
00220  * User level matrix element access       *
00221  * ************************************** */
00222 
00228     double get( int i, int j ) const;
00229 
00248     double &set( int i, int j );
00249 
00258     void set_row( int i, int N, const int *col, const double *val );
00259 
00275     void construct_add( int i, int j, double val );
00276 
00277 /* ************************************** *
00278  * Low level access                       *
00279  * ************************************** */
00280 
00284     int &ptr( int i ) { return( _ptr[i] ); }
00285 
00289     int &col( int i ) { return( _col[i] ); }
00290 
00294     double &val( int i ) { return( _val[i] ); }
00295 
00299     const int &ptr( int i ) const { return( _ptr[i] ); }
00300 
00304     const int &col( int i ) const { return( _col[i] ); }
00305 
00309     const double &val( int i ) const { return( _val[i] ); }
00310 
00318     void set_nz( int nz );
00319 
00320 /* ************************************** *
00321  * Assignent operators                    *
00322  * ************************************** */
00323 
00326     CRowMatrix &operator=( const CRowMatrix &mat );
00327 
00334     CRowMatrix &operator=( const class CColMatrix &mat );
00335 
00338     CRowMatrix &operator=( const class CoordMatrix &mat );
00339 
00343     CRowMatrix &operator=( const class Matrix &mat );
00344 
00345 /* ************************************** *
00346  * Matrix-Vector operations               *
00347  * ************************************** */
00348 
00349     /*  \brief Calculates \a x = \a A*b.
00350      */
00351     void multiply_by_vector( Vector &x, const Vector &b ) const;
00352 
00358     void lower_unit_solve( Vector &x, const Vector &b ) const;
00359 
00366     void upper_diag_solve( Vector &x, const Vector &b ) const;
00367 
00368 
00369     friend class CColMatrix;
00370     friend class CoordMatrix;
00371     friend class Vector;
00372 };
00373 
00374 
00375 inline double CRowMatrix::get( int i, int j ) const
00376 {
00377 #ifdef SPM_RANGE_CHECK
00378     return( get_check( i, j ) );
00379 #else
00380     return( get_no_check( i, j ) );
00381 #endif
00382 }    
00383 
00384 
00385 inline double &CRowMatrix::set( int i, int j )
00386 {
00387 #ifdef SPM_RANGE_CHECK
00388     return( set_check( i, j ) );
00389 #else
00390     return( set_no_check( i, j ) );
00391 #endif
00392 }    
00393 
00394 
00395 inline void CRowMatrix::clear( int i, int j )
00396 {
00397 #ifdef SPM_RANGE_CHECK
00398     clear_check( i, j );
00399 #else
00400     clear_no_check( i, j );
00401 #endif
00402 }
00403 
00404 
00405 #endif
00406 
00407 
00408 
00409 
00410 
00411 
00412 
00413 
00414 
00415 
00416 
00417 
00418 
00419 
00420 
00421 
00422 
00423 
00424 
00425 
00426 

Generated on 18 Apr 2011 for IBSimu by  doxygen 1.6.1