matrix_sparse/Matrix_SymComplexSparse.hxx

00001 // Copyright (C) 2001-2009 Vivien Mallet
00002 //
00003 // This file is part of the linear-algebra library Seldon,
00004 // http://seldon.sourceforge.net/.
00005 //
00006 // Seldon is free software; you can redistribute it and/or modify it under the
00007 // terms of the GNU Lesser General Public License as published by the Free
00008 // Software Foundation; either version 2.1 of the License, or (at your option)
00009 // any later version.
00010 //
00011 // Seldon is distributed in the hope that it will be useful, but WITHOUT ANY
00012 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00013 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
00014 // more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public License
00017 // along with Seldon. If not, see http://www.gnu.org/licenses/.
00018 
00019 
00020 // To be included by Seldon.hxx
00021 
00022 #ifndef SELDON_FILE_MATRIX_SYMCOMPLEXSPARSE_HXX
00023 
00024 #include "../share/Common.hxx"
00025 #include "../share/Properties.hxx"
00026 #include "../share/Storage.hxx"
00027 #include "../share/Errors.hxx"
00028 #include "../share/Allocator.hxx"
00029 
00030 namespace Seldon
00031 {
00032 
00033 
00035 
00047   template <class T, class Prop, class Storage,
00048             class Allocator = SELDON_DEFAULT_ALLOCATOR<T> >
00049   class Matrix_SymComplexSparse: public Matrix_Base<T, Allocator>
00050   {
00051     // typedef declaration.
00052   public:
00053     typedef typename Allocator::value_type value_type;
00054     typedef typename Allocator::pointer pointer;
00055     typedef typename Allocator::const_pointer const_pointer;
00056     typedef typename Allocator::reference reference;
00057     typedef typename Allocator::const_reference const_reference;
00058     typedef complex<value_type> entry_type;
00059     typedef complex<value_type> access_type;
00060     typedef complex<value_type> const_access_type;
00061 
00062     // Attributes.
00063   protected:
00064     // Number of non-zero (stored) elements.
00065     int real_nz_;
00066     int imag_nz_;
00067     // Index (in data_) of first element stored for each row or column.
00068     int* real_ptr_;
00069     int* imag_ptr_;
00070     // Column or row index (in the matrix) each element.
00071     int* real_ind_;
00072     int* imag_ind_;
00073 
00074     // Data.
00075     T* real_data_;
00076     T* imag_data_;
00077 
00078     // Methods.
00079   public:
00080     // Constructors.
00081     Matrix_SymComplexSparse();
00082     Matrix_SymComplexSparse(int i, int j);
00083     Matrix_SymComplexSparse(int i, int j, int real_nz, int imag_nz);
00084     template <class Storage0, class Allocator0,
00085               class Storage1, class Allocator1,
00086               class Storage2, class Allocator2>
00087     Matrix_SymComplexSparse(int i, int j,
00088                             Vector<T, Storage0, Allocator0>& real_values,
00089                             Vector<int, Storage1, Allocator1>& real_ptr,
00090                             Vector<int, Storage2, Allocator2>& real_ind,
00091                             Vector<T, Storage0, Allocator0>& imag_values,
00092                             Vector<int, Storage1, Allocator1>& imag_ptr,
00093                             Vector<int, Storage2, Allocator2>& imag_ind);
00094     Matrix_SymComplexSparse(const Matrix_SymComplexSparse<T, Prop, Storage,
00095                             Allocator>& A);
00096 
00097     // Destructor.
00098     ~Matrix_SymComplexSparse();
00099     void Clear();
00100 
00101     // Memory management.
00102     template <class Storage0, class Allocator0,
00103               class Storage1, class Allocator1,
00104               class Storage2, class Allocator2>
00105     void SetData(int i, int j,
00106                  Vector<T, Storage0, Allocator0>& real_values,
00107                  Vector<int, Storage1, Allocator1>& real_ptr,
00108                  Vector<int, Storage2, Allocator2>& real_ind,
00109                  Vector<T, Storage0, Allocator0>& imag_values,
00110                  Vector<int, Storage1, Allocator1>& imag_ptr,
00111                  Vector<int, Storage2, Allocator2>& imag_ind);
00112     void SetData(int i, int j,
00113                  int real_nz, pointer real_values, int* real_ptr,
00114                  int* real_ind,
00115                  int imag_nz, pointer imag_values, int* imag_ptr,
00116                  int* imag_ind);
00117     void Nullify();
00118     void Reallocate(int i, int j);
00119     void Reallocate(int i, int j, int real_nz, int imag_nz);
00120     void Resize(int i, int j);
00121     void Resize(int i, int j, int real_nz, int imag_nz);
00122     void Copy(const Matrix_SymComplexSparse<T, Prop, Storage, Allocator>& A);
00123 
00124     // Basic methods.
00125     int GetDataSize() const;
00126     int* GetRealPtr() const;
00127     int* GetImagPtr() const;
00128     int* GetRealInd() const;
00129     int* GetImagInd() const;
00130     int GetRealPtrSize() const;
00131     int GetImagPtrSize() const;
00132     int GetRealIndSize() const;
00133     int GetImagIndSize() const;
00134     int GetRealDataSize() const;
00135     int GetImagDataSize() const;
00136     T* GetRealData() const;
00137     T* GetImagData() const;
00138 
00139     // Element acess and affectation.
00140     complex<value_type> operator() (int i, int j) const;
00141     value_type& ValReal(int i, int j);
00142     const value_type& ValReal(int i, int j) const;
00143     value_type& ValImag(int i, int j);
00144     const value_type& ValImag(int i, int j) const;
00145     value_type& GetReal(int i, int j);
00146     const value_type& GetReal(int i, int j) const;
00147     value_type& GetImag(int i, int j);
00148     const value_type& GetImag(int i, int j) const;
00149     void Set(int i, int j, const complex<T>& x);
00150     void AddInteraction(int i, int j, const complex<T>& x);
00151     Matrix_SymComplexSparse<T, Prop, Storage, Allocator>&
00152     operator= (const Matrix_SymComplexSparse<T, Prop, Storage, Allocator>& A);
00153 
00154     // Convenient functions.
00155     void Zero();
00156     void SetIdentity();
00157     void Fill();
00158     void Fill(const complex<T>& x);
00159     void FillRand();
00160 
00161     void Print() const;
00162     void Write(string FileName) const;
00163     void Write(ostream& FileStream) const;
00164     void WriteText(string FileName) const;
00165     void WriteText(ostream& FileStream) const;
00166     void Read(string FileName);
00167     void Read(istream& FileStream);
00168     void ReadText(string FileName);
00169     void ReadText(istream& FileStream);
00170   };
00171 
00172 
00174   template <class T, class Prop, class Allocator>
00175   class Matrix<T, Prop, ColSymComplexSparse, Allocator>:
00176     public Matrix_SymComplexSparse<T, Prop, ColSymComplexSparse, Allocator>
00177   {
00178     // typedef declaration.
00179   public:
00180     typedef typename Allocator::value_type value_type;
00181     typedef Prop property;
00182     typedef ColSymComplexSparse storage;
00183     typedef Allocator allocator;
00184 
00185   public:
00186     Matrix();
00187     Matrix(int i, int j);
00188     Matrix(int i, int j, int real_nz, int imag_nz);
00189     template <class Storage0, class Allocator0,
00190               class Storage1, class Allocator1,
00191               class Storage2, class Allocator2>
00192     Matrix(int i, int j,
00193            Vector<T, Storage0, Allocator0>& real_values,
00194            Vector<int, Storage1, Allocator1>& real_ptr,
00195            Vector<int, Storage2, Allocator2>& real_ind,
00196            Vector<T, Storage0, Allocator0>& imag_values,
00197            Vector<int, Storage1, Allocator1>& imag_ptr,
00198            Vector<int, Storage2, Allocator2>& imag_ind);
00199   };
00200 
00201 
00203   template <class T, class Prop, class Allocator>
00204   class Matrix<T, Prop, RowSymComplexSparse, Allocator>:
00205     public Matrix_SymComplexSparse<T, Prop, RowSymComplexSparse, Allocator>
00206   {
00207     // typedef declaration.
00208   public:
00209     typedef typename Allocator::value_type value_type;
00210     typedef Prop property;
00211     typedef RowSymComplexSparse storage;
00212     typedef Allocator allocator;
00213 
00214   public:
00215     Matrix();
00216     Matrix(int i, int j);
00217     Matrix(int i, int j, int real_nz, int imag_nz);
00218     template <class Storage0, class Allocator0,
00219               class Storage1, class Allocator1,
00220               class Storage2, class Allocator2>
00221     Matrix(int i, int j,
00222            Vector<T, Storage0, Allocator0>& values,
00223            Vector<int, Storage1, Allocator1>& ptr,
00224            Vector<int, Storage2, Allocator2>& ind,
00225            Vector<T, Storage0, Allocator0>& imag_values,
00226            Vector<int, Storage1, Allocator1>& imag_ptr,
00227            Vector<int, Storage2, Allocator2>& imag_ind);
00228   };
00229 
00230 
00231 } // namespace Seldon.
00232 
00233 #define SELDON_FILE_MATRIX_SYMCOMPLEXSPARSE_HXX
00234 #endif