Warning: this documentation for the development version is under construction.
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