v2DM-DOCI  1.0
OrbitalTransform.h
Go to the documentation of this file.
1 #ifndef __OrbitalTransform__
2 #define __OrbitalTransform__
3 
4 #include <assert.h>
5 #include <memory>
6 #include <vector>
7 #include "Irreps.h"
8 #include "OptIndex.h"
9 
10 namespace CheMPS2 { class Hamiltonian; }
11 
12 namespace simanneal {
13 
14 class UnitaryMatrix;
15 
17 {
18  public :
20  virtual ~OrbitalTransform() = default;
21 
22  void fillHamCI(CheMPS2::Hamiltonian& HamCI);
23  void fillConstAndTmat(CheMPS2::Hamiltonian& Ham) const;
25  void set_unitary(UnitaryMatrix& unit);
27  const CheMPS2::Hamiltonian& get_ham() const { return (*_hamorig); }
28 
29  double TmatRotated(const int index1, const int index2) const;
30  double get_norb(int irrep) const;
31  double get_difference_orig(CheMPS2::Hamiltonian &hamin) const;
32  void CheckDeviationFromUnitary() const;
33  void update_unitary(double *step);
34 
36  UnitaryMatrix& get_unitary() const { return (*_unitary); }
37 
38  void DoJacobiRotation(CheMPS2::Hamiltonian &, int k, int l, double theta);
39 
40  void update_unitary(const UnitaryMatrix &, bool replace=false);
41 
42  private:
43  void rotate_old_to_new(std::unique_ptr<double []> * matrix);
44 
46  std::unique_ptr<CheMPS2::Hamiltonian> _hamorig;
48  std::unique_ptr<simanneal::UnitaryMatrix> _unitary;
49 
50  std::unique_ptr<CheMPS2::Hamiltonian> ham_rot;
51 
55 
57  std::vector< std::unique_ptr<double []> > QmatrixWork;
58  // The one body matrix elements, used for rotations, only allocated when needed
59  std::vector< std::unique_ptr<double []> > OneBodyMatrixElements;
60 
61  std::unique_ptr<double []> mem1;
62  std::unique_ptr<double []> mem2;
63 
64 };
65 
66 }
67 
68 #endif
69 
70 /* vim: set ts=4 sw=4 expandtab :*/
std::vector< std::unique_ptr< double[]> > OneBodyMatrixElements
void fillConstAndTmat(CheMPS2::Hamiltonian &Ham) const
UnitaryMatrix & get_unitary() const
const CheMPS2::Hamiltonian & get_ham() const
void update_unitary(double *step)
void fillHamCI(CheMPS2::Hamiltonian &HamCI)
std::unique_ptr< simanneal::UnitaryMatrix > _unitary
The rotation to perfrom on _hamorig to get the current hamiltonian.
std::vector< std::unique_ptr< double[]> > QmatrixWork
Some memory to do the one body work, allocated when needed.
virtual ~OrbitalTransform()=default
OrbitalTransform(const CheMPS2::Hamiltonian &ham)
void rotate_old_to_new(std::unique_ptr< double[]> *matrix)
std::unique_ptr< double[]> mem2
void set_unitary(UnitaryMatrix &unit)
std::unique_ptr< double[]> mem1
double get_norb(int irrep) const
UnitaryMatrix & get_unitary()
std::unique_ptr< CheMPS2::Hamiltonian > ham_rot
CheMPS2::Hamiltonian & get_ham()
double get_difference_orig(CheMPS2::Hamiltonian &hamin) const
double TmatRotated(const int index1, const int index2) const
std::unique_ptr< CheMPS2::Hamiltonian > _hamorig
the orginal hamiltonian
void DoJacobiRotation(CheMPS2::Hamiltonian &, int k, int l, double theta)