00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef SELDON_FILE_MATRIX_COMPLEXSPARSE_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
00046 template <class T, class Prop, class Storage,
00047 class Allocator = SELDON_DEFAULT_ALLOCATOR<T> >
00048 class Matrix_ComplexSparse: public Matrix_Base<T, Allocator>
00049 {
00050
00051 public:
00052 typedef typename Allocator::value_type value_type;
00053 typedef typename Allocator::pointer pointer;
00054 typedef typename Allocator::const_pointer const_pointer;
00055 typedef typename Allocator::reference reference;
00056 typedef typename Allocator::const_reference const_reference;
00057 typedef complex<value_type> entry_type;
00058 typedef complex<value_type> access_type;
00059 typedef complex<value_type> const_access_type;
00060
00061
00062 protected:
00063
00064 int real_nz_;
00065 int imag_nz_;
00066
00067 int* real_ptr_;
00068 int* imag_ptr_;
00069
00070 int* real_ind_;
00071 int* imag_ind_;
00072
00073
00074 T* real_data_;
00075 T* imag_data_;
00076
00077
00078 public:
00079
00080 Matrix_ComplexSparse();
00081 Matrix_ComplexSparse(int i, int j);
00082 Matrix_ComplexSparse(int i, int j, int real_nz, int imag_nz);
00083 template <class Storage0, class Allocator0,
00084 class Storage1, class Allocator1,
00085 class Storage2, class Allocator2>
00086 Matrix_ComplexSparse(int i, int j,
00087 Vector<T, Storage0, Allocator0>& real_values,
00088 Vector<int, Storage1, Allocator1>& real_ptr,
00089 Vector<int, Storage2, Allocator2>& real_ind,
00090 Vector<T, Storage0, Allocator0>& imag_values,
00091 Vector<int, Storage1, Allocator1>& imag_ptr,
00092 Vector<int, Storage2, Allocator2>& imag_ind);
00093 Matrix_ComplexSparse(const Matrix_ComplexSparse<T, Prop,
00094 Storage, Allocator>& A);
00095
00096
00097 ~Matrix_ComplexSparse();
00098 void Clear();
00099
00100
00101 template <class Storage0, class Allocator0,
00102 class Storage1, class Allocator1,
00103 class Storage2, class Allocator2>
00104 void SetData(int i, int j,
00105 Vector<T, Storage0, Allocator0>& real_values,
00106 Vector<int, Storage1, Allocator1>& real_ptr,
00107 Vector<int, Storage2, Allocator2>& real_ind,
00108 Vector<T, Storage0, Allocator0>& imag_values,
00109 Vector<int, Storage1, Allocator1>& imag_ptr,
00110 Vector<int, Storage2, Allocator2>& imag_ind);
00111 void SetData(int i, int j,
00112 int real_nz, pointer real_values, int* real_ptr,
00113 int* real_ind,
00114 int imag_nz, pointer imag_values, int* imag_ptr,
00115 int* imag_ind);
00116 void Nullify();
00117 void Reallocate(int i, int j);
00118 void Reallocate(int i, int j, int real_nz, int imag_nz);
00119 void Resize(int i, int j);
00120 void Resize(int i, int j, int real_nz, int imag_nz);
00121 void Copy(const Matrix_ComplexSparse<T, Prop, Storage, Allocator>& A);
00122
00123
00124 int GetNonZeros() const;
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
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_ComplexSparse<T, Prop, Storage, Allocator>&
00152 operator= (const Matrix_ComplexSparse<T, Prop, Storage, Allocator>& A);
00153
00154
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, ColComplexSparse, Allocator>:
00176 public Matrix_ComplexSparse<T, Prop, ColComplexSparse, Allocator>
00177 {
00178
00179 public:
00180 typedef typename Allocator::value_type value_type;
00181 typedef Prop property;
00182 typedef ColComplexSparse 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, RowComplexSparse, Allocator>:
00205 public Matrix_ComplexSparse<T, Prop, RowComplexSparse, Allocator>
00206 {
00207
00208 public:
00209 typedef typename Allocator::value_type value_type;
00210 typedef Prop property;
00211 typedef RowComplexSparse 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 }
00232
00233 #define SELDON_FILE_MATRIX_COMPLEXSPARSE_HXX
00234 #endif