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_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
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
00063 protected:
00064
00065 int real_nz_;
00066 int imag_nz_;
00067
00068 int* real_ptr_;
00069 int* imag_ptr_;
00070
00071 int* real_ind_;
00072 int* imag_ind_;
00073
00074
00075 T* real_data_;
00076 T* imag_data_;
00077
00078
00079 public:
00080
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
00098 ~Matrix_SymComplexSparse();
00099 void Clear();
00100
00101
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
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_SymComplexSparse<T, Prop, Storage, Allocator>&
00152 operator= (const Matrix_SymComplexSparse<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, ColSymComplexSparse, Allocator>:
00176 public Matrix_SymComplexSparse<T, Prop, ColSymComplexSparse, Allocator>
00177 {
00178
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
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 }
00232
00233 #define SELDON_FILE_MATRIX_SYMCOMPLEXSPARSE_HXX
00234 #endif