Greens-code
A modular quantum transport code
matrix.hpp
1 #ifndef MATRIX_CPP_H
2 #define MATRIX_CPP_H
3 
4 #include <cstdlib>
5 #include <exception>
6 #include <iostream>
7 #include <fstream>
8 #include <list>
9 #include <map>
10 #include <vector>
11 #include <memory>
12 #include <complex>
13 
14 #include "exceptions.hpp"
15 #include "shared_ptr.hpp"
16 
17 typedef std::complex<double> complex;
18 typedef std::vector<complex> Vector;
19 
20 typedef STD_TR1::shared_ptr<Vector> Vector_ref;
21 
23 
29 template <int>
30 class selector{
31  size_t cc;
32 public:
33  selector():cc(0){};
34  explicit selector(size_t i):cc(i){
35  };
36 
37  size_t get() const {return cc;};
38  void set(size_t c) {cc = c;};
39 
40  selector& operator++(){
41  ++cc; return *this;};
42  selector operator++(int){
43  selector tmp(cc); ++cc; return tmp;};
44  selector& operator--(){
45  --cc; return *this;};
46  selector operator--(int){
47  selector tmp(cc); --cc; return tmp;};
48  selector operator+(const selector c) const{
49  return selector(cc + c.cc);};
50  selector operator-(const selector c) const{
51  return selector(cc - c.cc);};
52  selector& operator+=(const int c){
53  cc += c; return *this;};
54  selector& operator-=(const int c){
55  cc -= c; return *this;};
56  bool operator==(const selector c) const {
57  return (cc == c.cc);};
58  bool operator!=(const selector c) const {
59  return (cc != c.cc);};
60 
61  bool operator<(const selector c){
62  return cc < c.cc;};
63  bool operator>(const selector c){
64  return cc > c.cc;};
65  bool operator<=(const selector c){
66  return cc <= c.cc;};
67  bool operator>=(const selector c){
68  return cc >= c.cc;};
69 };
70 
71 typedef selector<0> row;
72 typedef selector<1> column;
73 
74 
76 
82 class Matrix{
83 public:
84  virtual ~Matrix() throw() {};
85 
87  void assert_size(row r, column c);
89  void assert_size(row r, column c) const;
90 
92  void Insert(row r, column c, complex v) { insert(r,c,v);};
94  void Add(row r, column c, complex v) { add(r,c,v);};
96  complex Get(row r, column c) const { return get(r,c);};
97 
99  row nrows() const { return row(num_rows());};
100  size_t num_of_rows() const { return num_rows();};
101 
103  column ncols() const { return column(num_cols());};
104  size_t num_of_cols() const { return num_cols();};
105 
107  void add_diagonal( complex e );
109  void insert_diagonal( complex e );
111  void multiply_by_number( complex v);
113  void print(std::ostream&) const;
114  void formatted_print(std::ostream&) const;
115 
116  bool check_hermitian() const;
117  bool check_realsymmetric() const;
118  Matrix & operator +=(Matrix const & rhs);
119 
120 private:
121  virtual void insert(row r, column c, complex v) = 0;
122  virtual void add(row r, column c, complex v) = 0;
123  virtual complex get(row r, column c) const = 0;
124 
125  virtual void resize(row r, column c) {
126  throw (E_Bad_Size(r.get()*c.get()));
127  };
128 
129  virtual size_t num_rows() const = 0;
130  virtual size_t num_cols() const = 0;
131 };
132 
133 std::ostream& operator<<(std::ostream&, const Matrix&);
134 
135 
137 
143 class sub_Matrix: public Matrix{
144 public:
145 
148  myM(&t), my_c(c), my_r(r) {};
149 
150  virtual ~sub_Matrix() throw() {};
151 
152 private:
153  Matrix* myM;
154  column my_c;
155  row my_r;
156 
157  sub_Matrix();
158 
159  void insert(row r, column c, complex v){
160  myM->Insert(r + my_r,c + my_c,v);
161  };
162 
163  void add(row r, column c, complex v){
164  myM->Add(r + my_r,c + my_c,v);
165  };
166 
167  complex get(row r, column c) const{
168  return myM->Get(r + my_r,c + my_c);
169  };
170 
171  size_t num_rows() const { return myM->num_of_rows() - my_r.get();};
172  size_t num_cols() const { return myM->num_of_cols() - my_c.get();};
173 };
174 
176 public:
177  row_iterator():r(0),c(0){};
178  row_iterator(Matrix* mm, row rr, column cc):r(rr),c(cc),m(mm){};
179 
180  row_iterator& operator++(){ ++r; return *this;};
181  row_iterator operator++(int){ row_iterator ri(*this); ++r; return ri;};
182 
183  row_iterator& operator--(){ --r; return *this;};
184  row_iterator operator--(int){ row_iterator ri(*this); --r; return ri;};
185 
186  bool operator==(const row_iterator& ri){ return ri.r == r;};
187  bool operator!=(const row_iterator& ri){ return ri.r != r;};
188 
189  std::complex<double> operator*(){ return m->Get(r,c);};
190 
191 private:
192  row r;
193  column c;
194  Matrix* m;
195 };
196 
198 
202 class transpose_Matrix: public Matrix{
203 public:
205  transpose_Matrix(Matrix* m):myM(m){};
206  virtual ~transpose_Matrix() throw() {};
207 
208 private:
209  Matrix* myM;
210 
212 
213  void insert(row r, column c, complex v){
214  myM->Insert(row(c.get()),column(r.get()),conj(v));
215  };
216  void add(row r, column c, complex v){
217  myM->Add(row(c.get()),column(r.get()),conj(v));
218  };
219  complex get(row r, column c) const{
220  return myM->Get(row(c.get()),column(r.get()));
221  };
222 
223  size_t num_rows() const {return myM->num_of_cols();};
224  size_t num_cols() const {return myM->num_of_rows();};
225 };
226 
228 
234 public:
237  virtual ~correct_transpose_Matrix() throw() {};
238 
239 private:
240  Matrix* myM;
241 
243 
244  void insert(row r, column c, complex v){
245  myM->Insert(row(c.get()),column(r.get()),v);
246  };
247  void add(row r, column c, complex v){
248  myM->Add(row(c.get()),column(r.get()),v);
249  };
250  complex get(row r, column c) const{
251  return myM->Get(row(c.get()),column(r.get()));
252  };
253 
254  size_t num_rows() const {return myM->num_of_cols();};
255  size_t num_cols() const {return myM->num_of_rows();};
256 };
257 
262 class scaled_Matrix: public Matrix{
263 public:
265  scaled_Matrix(complex s,Matrix* m):s(s),myM(m){};
266  virtual ~scaled_Matrix() throw() {};
267 
268 private:
269  complex s;
270  Matrix* myM;
271 
272  scaled_Matrix();
273 
274  void insert(row r, column c, complex v){
275  myM->Insert(row(r.get()),column(c.get()),v*s);
276  };
277  void add(row r, column c, complex v){
278  myM->Add(row(r.get()),column(c.get()),v*s);
279  };
280  complex get(row r, column c) const{
281  return myM->Get(row(r.get()),column(c.get()));
282  };
283 
284  size_t num_rows() const {return myM->num_of_rows();};
285  size_t num_cols() const {return myM->num_of_cols();};
286 };
287 
289 
292 public:
295  virtual ~conjugate_transpose_Matrix() throw() {};
296 
297 private:
298  Matrix* myM;
299 
301 
302  void insert(row r, column c, complex v){
303  myM->Insert(row(c.get()),column(r.get()),conj(v));
304  };
305  void add(row r, column c, complex v){
306  myM->Add(row(c.get()),column(r.get()),conj(v));
307  };
308  complex get(row r, column c) const{
309  return conj(myM->Get(row(c.get()),column(r.get())));
310  };
311 
312  size_t num_rows() const {return myM->num_of_cols();};
313  size_t num_cols() const {return myM->num_of_rows();};
314 };
315 
317 
323 public:
324 
325  typedef STD_TR1::shared_ptr<calculation_Matrix> ref;
326  typedef STD_TR1::shared_ptr<const calculation_Matrix> const_ref;
327 
328  virtual ~calculation_Matrix() throw() {};
329 
331  void Apply(const complex* phi,
332  complex* result) const { apply_two(phi, result);};
334  void Apply(const Vector& phi,
335  Vector& result) const;
336 
338  void Apply(complex* phi) const { apply_one(phi);};
340  void Apply(Vector& phi) const;
341 
343  void Scale(complex v) { scale(v);};
344 
345 private:
346 
347 // No Overloading for virtual functions!
348  virtual
349  void apply_two(const complex* phi,
350  complex* result) const = 0;
351  virtual
352  void apply_one(complex* phi) const;
353 
354  virtual
355  void scale(complex v) = 0;
356 };
357 
359 
370 public:
371 
372  orbital_dropper_Matrix(Matrix& t,std::vector<int> orbitals_to_drop):
373  myM(&t),orbitals_to_drop(orbitals_to_drop)
374  {
375  size = myM->num_of_cols()<myM->num_of_rows() ? myM->num_of_cols() : myM->num_of_rows();//If the matrix is not square, the list is as long as the smaller dimension.
376  correspondence_list = create_correspondence_list(orbitals_to_drop,size);
377  };
378 
379  virtual ~orbital_dropper_Matrix() throw() {};
380 
382 
389  static std::vector<int> create_correspondence_list(std::vector<int> orbitals_to_drop,int n);
390 
391 private:
392  Matrix* myM;
393 
395 
396  void insert(row r, column c, complex v){
397  if (correspondence_list[r.get()]==-1 || correspondence_list[c.get()]==-1) return;
398  else myM->Insert(row(correspondence_list[r.get()]),column(correspondence_list[c.get()]) ,v);
399  };
400 
401  void add(row r, column c, complex v){
402  if (correspondence_list[r.get()]==-1 || correspondence_list[c.get()]==-1) return;
403  else myM->Add(row(correspondence_list[r.get()]),column(correspondence_list[c.get()]) ,v);
404  };
405 
406  complex get(row r, column c) const{
407  if (correspondence_list[r.get()]==-1 || correspondence_list[c.get()]==-1)
408  {
409  std::cout << "orbital_dropper_Matrix: get() of a nonexisting (dropped) item was attempted (this should not happen!). 0 was returned.";
410  return 0;
411  }
412  else return myM->Get(r,c);
413  };
414 
415  std::vector<int> orbitals_to_drop;
416  std::vector<int> correspondence_list;
417 
418  int size;
419 
420  size_t num_rows() const { return size;};
421  size_t num_cols() const { return size;};
422 
423 
424 };
425 
426 #endif
Definition: matrix.hpp:262
correct_transpose_Matrix(Matrix *m)
Construct a transposed Matrix out of a normal one.
Definition: matrix.hpp:236
void Scale(complex v)
Scale the entire matrix by a complex constant.
Definition: matrix.hpp:343
column ncols() const
Number of Columns.
Definition: matrix.hpp:103
Definition: matrix.hpp:175
void Apply(complex *phi) const
Overload of Apply to directly overwrite the input vector.
Definition: matrix.hpp:338
Access a Matrix by transposed indices.
Definition: matrix.hpp:233
void Insert(row r, column c, complex v)
Insert an element at a given position (overwritten if already there)
Definition: matrix.hpp:92
scaled_Matrix(complex s, Matrix *m)
Construct a transposed Matrix out of a normal one.
Definition: matrix.hpp:265
Simulate a larger square matrix and ignore accesses to given rows and columns.
Definition: matrix.hpp:369
Access a Matrix by transposed indices.
Definition: matrix.hpp:291
sub_Matrix(Matrix &t, row r, column c)
Construct a sub_Matrix from a Matrix, where the sub_Matrix starts at given Position.
Definition: matrix.hpp:147
complex Get(row r, column c) const
Obtain an element at a given position.
Definition: matrix.hpp:96
transpose_Matrix(Matrix *m)
Construct a transposed Matrix out of a normal one.
Definition: matrix.hpp:205
Obtain a part of a larger Matrix as sub-Matrix that can be accessed like a Matrix.
Definition: matrix.hpp:143
Access a Matrix by transposed indices.
Definition: matrix.hpp:202
Helper object for indexed access of matrices.
Definition: matrix.hpp:30
Base Matrix class for access to 2D number grids.
Definition: matrix.hpp:82
void Apply(const complex *phi, complex *result) const
Apply a vector (stored in a pointer, for legacy code only!) to the matrix.
Definition: matrix.hpp:331
row nrows() const
Number of rows.
Definition: matrix.hpp:99
conjugate_transpose_Matrix(Matrix *m)
Construct a transposed Matrix out ofa normal one.
Definition: matrix.hpp:294
Definition: exceptions.hpp:153
This Base-Class offers Matrix-Vector multiplication and scaling.
Definition: matrix.hpp:322
void Add(row r, column c, complex v)
Add an element at a given position.
Definition: matrix.hpp:94