Program Listing for File Hamiltonian_OnTheFly.hpp¶
↰ Return to documentation for file (src_ed/Hamiltonian/Hamiltonian_OnTheFly.hpp)
/*
Implementation of the Hamiltonian in CSR format (own implementation)
*/
#ifndef Hamiltonian_otf
#define Hamiltonian_otf
#include "Hamiltonian_base.hpp"
template<typename HilbertField>
class Hamiltonian_OnTheFly: public Hamiltonian<HilbertField>
{
public:
Hamiltonian_OnTheFly(
shared_ptr<model> the_model,
const map<string, double> &value,
sector _sec
);
void mult_add(vector<HilbertField> &x, vector<HilbertField> &y);
private:
map<shared_ptr<Hermitian_operator>, double> ops;
void ops_map(const map<string, double> &value);
};
template<typename HilbertField>
Hamiltonian_OnTheFly<HilbertField>::Hamiltonian_OnTheFly(
shared_ptr<model> _the_model,
const map<string, double> &value,
sector _sec
) {
this->the_model = _the_model;
this->sec = _sec;
this->B = _the_model->provide_basis(_sec);
this->dim = this->B->dim;
ops_map(value);
}
template<typename HilbertField>
void Hamiltonian_OnTheFly<HilbertField>::mult_add(vector<HilbertField> &x, vector<HilbertField> &y)
{
for(auto& h : ops){
h.first->multiply_add_OTF(x, y, h.second, this->B);
}
return;
}
//GS_energy
//states
//print
//to_dense
template<typename HilbertField>
void Hamiltonian_OnTheFly<HilbertField>::ops_map(const map<string, double> &value)
{
for(auto& x : value){
ops[this->the_model->term.at(x.first)] = value.at(x.first);
}
return;
}
#endif