DOCI-Exact  1.0
DM2.h
Go to the documentation of this file.
1 #ifndef DM2_H
2 #define DM2_H
3 
4 #include <iostream>
5 #include <memory>
6 #include <vector>
7 
8 #include "helpers.h"
9 #include "Molecule.h"
10 #include "Permutation.h"
11 
12 // dark magic to get the friend operator<< to work...
13 namespace doci { class DM2; }
14 std::ostream &operator<<(std::ostream &,doci::DM2 &);
15 
16 namespace doci {
17 
24 class DM2
25 {
26  friend std::ostream &::operator<<(std::ostream &,doci::DM2 &);
27 
28  public:
29  DM2(unsigned int, unsigned int);
30 
31  DM2(const Molecule &);
32 
33  DM2(const DM2 &);
34 
35  DM2(DM2 &&);
36 
37  virtual ~DM2() = default;
38 
39  DM2& operator=(const DM2 &);
40 
41  DM2& operator=(DM2 &&);
42 
43  DM2& operator=(double);
44 
45  double operator()(int, int, int, int) const;
46 
47  DM2& operator+=(const DM2 &);
48 
49  void WriteToFile(const std::string) const;
50 
51  static DM2 ReadFromFile(const std::string);
52 
53  unsigned int get_n_electrons() const;
54 
55  unsigned int get_n_sp() const;
56 
57  void Build(Permutation &, std::vector<double> &);
58 
59  void BuildHamiltonian(const Molecule &);
60 
61  double Dot(const DM2 &) const;
62 
63  double Trace() const;
64 
65  std::pair<double,bool> find_min_angle(int k, int l, double start_angle, std::function<double(int,int)> &T, std::function<double(int,int,int,int)> &V) const;
66 
67  double calc_rotate(int k, int l, double theta, std::function<double(int,int)> &T, std::function<double(int,int,int,int)> &V) const;
68 
69  private:
70 
71  void build_iter(Permutation& , std::vector<double> &, unsigned int , unsigned int , DM2 &);
72 
73  void fill_lists(unsigned int);
74 
76  static std::unique_ptr<helpers::matrix> sp2tp;
77 
79  static std::unique_ptr<helpers::matrix> tp2sp;
80 
82  std::unique_ptr<helpers::matrix> block;
83 
85  std::vector<double> diag;
86 
88  unsigned int N;
89 };
90 
91 }
92 
93 #endif /* DM2_H */
94 
95 /* vim: set ts=3 sw=3 expandtab :*/
std::pair< double, bool > find_min_angle(int k, int l, double start_angle, std::function< double(int, int)> &T, std::function< double(int, int, int, int)> &V) const
Definition: DM2.cpp:630
static DM2 ReadFromFile(const std::string)
Definition: DM2.cpp:291
double Trace() const
Definition: DM2.cpp:611
double calc_rotate(int k, int l, double theta, std::function< double(int, int)> &T, std::function< double(int, int, int, int)> &V) const
Definition: DM2.cpp:740
void WriteToFile(const std::string) const
Definition: DM2.cpp:213
double operator()(int, int, int, int) const
Definition: DM2.cpp:111
Definition: DM2.h:24
unsigned int get_n_sp() const
Definition: DM2.cpp:362
void Build(Permutation &, std::vector< double > &)
Definition: DM2.cpp:373
void BuildHamiltonian(const Molecule &)
Definition: DM2.cpp:537
DM2(unsigned int, unsigned int)
Definition: DM2.cpp:26
virtual ~DM2()=default
std::ostream & operator<<(std::ostream &, doci::DM2 &)
Definition: DM2.cpp:516
DM2 & operator=(const DM2 &)
Definition: DM2.cpp:71
unsigned int get_n_electrons() const
Definition: DM2.cpp:354
double Dot(const DM2 &) const
Definition: DM2.cpp:593
DM2 & operator+=(const DM2 &)
Definition: DM2.cpp:140