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