Program Listing for File ED_basis.hpp

Return to documentation for file (src_ed/ED_basis.hpp)

#ifndef ED_basis_h
#define ED_basis_h

#include <cstdio>
#include <string>
#include <map>
#include <memory>
#include <tuple>

#include "parser.hpp"
#include "symmetry_group.hpp"
#include "sector.hpp"
#include "binary_state.hpp"

#define PARAMETER_ZERO 1e-10
#define MIN_DUMP_SIZE 13
#define MIN_BASIS_DUMP_SIZE 13
#define MAX_ORBITAL 32

struct ED_basis
{
    int L;
    sector sec;
    std::string name;
    uint32_t dim;

    static bool verb;

    ED_basis(const sector &_sec, int L);
    virtual binary_state bin(uint32_t I) const = 0;
    virtual uint32_t index(const binary_state &b) const = 0;
    virtual void print_state(std::ostream &flux, uint32_t i) const = 0;

    template<typename T>
    void print_state(std::ostream &flux, const vector<T>& psi) const
    {
        if(psi.size() != dim) qcm_ED_throw("dimensions of vector psi and basis do not match!");
        if(psi.size() > global_int("max_dim_print")) return;
        for(int i=0; i<psi.size(); i++){
            flux << psi[i] << "\t: ";
            print_state(flux, i);
            flux << '\n';
        }
    }
};



struct ED_halfbasis
{
    int N;
    int L;
    uint32_t dim;
    vector<uint32_t> bin;

    ED_halfbasis(int L, int N);
    uint32_t index(const uint32_t &b) const;
    void print_state(std::ostream &flux, int i) const;
};



struct ED_factorized_basis : ED_basis
{
    shared_ptr<ED_halfbasis> up;
    shared_ptr<ED_halfbasis> down;

    ED_factorized_basis(const sector &_sec, int _L);
    binary_state bin(uint32_t I) const;
    uint32_t index(const binary_state &b) const;
    void print_state(std::ostream &flux, uint32_t i) const;
    tuple<uint32_t, uint32_t, uint32_t, uint32_t> components(uint32_t label)  const;
};


struct ED_mixed_basis : ED_basis
{
    shared_ptr<symmetry_group> group;
    vector<binary_state> binlist;

    ED_mixed_basis(const sector &_sec, shared_ptr<symmetry_group> _group);
    ~ED_mixed_basis();
    binary_state bin(uint32_t I) const;
    uint32_t index(const binary_state &b) const;
    void print_state(std::ostream &flux, uint32_t i) const;
};


std::ostream & operator<<(std::ostream &flux, const ED_basis &B);
tuple<uint32_t, int, int, bool> Destroy(const int a, const uint32_t label, const ED_mixed_basis &Bx, const ED_mixed_basis &By);
tuple<uint32_t, int, int, bool>  Destroy(const int a, const uint32_t label, const ED_factorized_basis &Bx, const ED_factorized_basis &By);

#endif