Model Hamiltonians

For many chemical systems the full electronic structure Hamiltonian proves prohibitively expensive to solve. In such cases, valuable insight into the properties of the system can often be gained by employing a model Hamiltonian with simplified terms.

The Hubbard model

One such model Hamiltonian, used frequently to study strongly correlated materials (e.g. cuprates), is the Hubbard model. It assumes the tight-binding approximation, i.e. that electrons are tightly bound to atomic sites they occupy and that they can hop between them. In its simplest form the Hubbard Hamiltonian reads [73], [63]:

(124)\[H= -t \sum_{<i,j>} c_i^{\dagger} c_j +U \sum_{i}n_{i\uparrow}n_{i\downarrow},\]

where the first term includes the hopping integral \(t\) and the second term contains the Coulomb interaction energy \(U\) for electrons of opposite spin occupying the same site.

Sometimes, the on-site energy is also included in the Hubbard Hamiltonian:

(125)\[H'= H + \sum_{i} e_i c_i^{\dagger} c_i.\]

The equations above neglect several terms of interest for the study of correlated phases, e.g. the Coulomb interaction \(V\) between the electrons on neighboring sites, which together with (124) make up extended Hubbard model [74].

(126)\[H_{ext}= H+ V \sum_{<i,j>} n_{i\uparrow} n_{j\downarrow}.\]

The Hubbard driver in InQuanto

InQuanto provides drivers for generating Hubbard Hamiltonians for a dimer using DriverHubbardDimer as well as for a square lattice in 1D and 2D, using DriverGeneralizedHubbard1D and DriverGeneralizedHubbard2D.

Below we show an example for the Hubbard dimer.

from inquanto.express import DriverHubbardDimer

hubbard_dimer_driver = DriverHubbardDimer(t=1.0, u=8.0)

dimer_ham, dimer_space, dimer_hf_state = hubbard_dimer_driver.get_system()

print('Dimer Hamiltonian:\n', dimer_ham.normal_ordered().compress())
Dimer Hamiltonian:
 (-1.0, F2^ F0 ), (-1.0, F0^ F2 ), (-1.0, F3^ F1 ), (-1.0, F1^ F3 ), (-8.0, F1^ F0^ F1  F0 ), (-8.0, F3^ F2^ F3  F2 )

In 1D and 2D, the Hubbard Hamiltonian can account for periodic boundary conditions (PBC) or create an open boundary (for a ring and chain in 1D respectively).

from inquanto.express import DriverGeneralizedHubbard1D

hubbard_ring_driver = DriverGeneralizedHubbard1D(t=-1.0, u=8.0, n=3, ring=True)
hubbard_chain_driver = DriverGeneralizedHubbard1D(t=-1.0, u=8.0, n=3, ring=False)

ring_ham, ring_space, ring_hf_state = hubbard_ring_driver.get_system()
chain_ham, chain_space, chain_hf_state = hubbard_chain_driver.get_system()

print('\nRing Hamiltonian:\n', ring_ham.normal_ordered().compress())
print('\nChain Hamiltonian:\n', chain_ham.normal_ordered().compress())

Ring Hamiltonian:
 (-1.0, F0^ F2 ), (-1.0, F0^ F4 ), (-1.0, F2^ F0 ), (-1.0, F2^ F4 ), (-1.0, F4^ F0 ), (-1.0, F4^ F2 ), (-1.0, F1^ F3 ), (-1.0, F1^ F5 ), (-1.0, F3^ F1 ), (-1.0, F3^ F5 ), (-1.0, F5^ F1 ), (-1.0, F5^ F3 ), (-8.0, F1^ F0^ F1  F0 ), (-8.0, F3^ F2^ F3  F2 ), (-8.0, F5^ F4^ F5  F4 )

Chain Hamiltonian:
 (-1.0, F0^ F2 ), (-1.0, F2^ F0 ), (-1.0, F2^ F4 ), (-1.0, F4^ F2 ), (-1.0, F1^ F3 ), (-1.0, F3^ F1 ), (-1.0, F3^ F5 ), (-1.0, F5^ F3 ), (-8.0, F1^ F0^ F1  F0 ), (-8.0, F3^ F2^ F3  F2 ), (-8.0, F5^ F4^ F5  F4 )

Note the minus sign for the t argument for DriverGeneralizedHubbard1D (whereas for DriverHubbardDimer t is negated when the Hamiltonian is constructed). This reflects the different conventions used in the literature; in some conventions t is kept negative, while in general the sign can be absorbed into the coefficients. Hence for a more “general” approach, the sign of the user-provided t is not changed in DriverGeneralizedHubbard1D. To generate the same Hubbard dimer Hamiltonian as above with DriverGeneralizedHubbard1D, use:

from inquanto.express import DriverGeneralizedHubbard1D

hubbard_dimer_driver = DriverGeneralizedHubbard1D(t=-0.2, u=2.0, n=2, ring=False)

dimer_ham, dimer_space, dimer_hf_state = hubbard_dimer_driver.get_system()

print('Dimer Hamiltonian:\n', dimer_ham.normal_ordered().compress())
Dimer Hamiltonian:
 (-0.2, F0^ F2 ), (-0.2, F2^ F0 ), (-0.2, F1^ F3 ), (-0.2, F3^ F1 ), (-2.0, F1^ F0^ F1  F0 ), (-2.0, F3^ F2^ F3  F2 )

In 2D, one can also generate distinct Hubbard Hamiltonians depending on site labeling. For a square lattice Hubbard driver in InQuanto, two choices are possible: grid and snake. Grid labeling means that the site label always increases from the left to right within a row. In snake labeling the highest label in a row alternates between the left and right for each row.

from inquanto.express import DriverGeneralizedHubbard2D
from inquanto.ansatzes import SiteLabeling2D

e, t, u, v, nx, ny = [0.0, -1.0, 8.0, 0.0, 2, 4]
hubbard_driver_grid = DriverGeneralizedHubbard2D(
    nx, ny, e, t, u, v, pbc=False,
    site_labeling=SiteLabeling2D.grid
)
hubbard_driver_snake = DriverGeneralizedHubbard2D(
    nx, ny, e, t, u, v, pbc=False,
    site_labeling=SiteLabeling2D.snake
)

ham_grid, space_grid, hf_grid = hubbard_driver_grid.get_system()
ham_snake, space_snake, hf_snake = hubbard_driver_snake.get_system()

print('\nGrid Hamiltonian:\n', ham_grid.normal_ordered().compress())
print('\nSnake Hamiltonian:\n', ham_snake.normal_ordered().compress())

Grid Hamiltonian:
 (-1.0, F0^ F2 ), (-1.0, F0^ F4 ), (8.0, F0^ F6 ), (-1.0, F2^ F0 ), (8.0, F2^ F4 ), (-1.0, F2^ F6 ), (-1.0, F4^ F0 ), (8.0, F4^ F2 ), (-1.0, F4^ F6 ), (-1.0, F4^ F8 ), (8.0, F4^ F10 ), (8.0, F6^ F0 ), (-1.0, F6^ F2 ), (-1.0, F6^ F4 ), (8.0, F6^ F8 ), (-1.0, F6^ F10 ), (-1.0, F8^ F4 ), (8.0, F8^ F6 ), (-1.0, F8^ F10 ), (-1.0, F8^ F12 ), (8.0, F8^ F14 ), (8.0, F10^ F4 ), (-1.0, F10^ F6 ), (-1.0, F10^ F8 ), (8.0, F10^ F12 ), (-1.0, F10^ F14 ), (-1.0, F12^ F8 ), (8.0, F12^ F10 ), (-1.0, F12^ F14 ), (8.0, F14^ F8 ), (-1.0, F14^ F10 ), (-1.0, F14^ F12 ), (-1.0, F1^ F3 ), (-1.0, F1^ F5 ), (8.0, F1^ F7 ), (-1.0, F3^ F1 ), (8.0, F3^ F5 ), (-1.0, F3^ F7 ), (-1.0, F5^ F1 ), (8.0, F5^ F3 ), (-1.0, F5^ F7 ), (-1.0, F5^ F9 ), (8.0, F5^ F11 ), (8.0, F7^ F1 ), (-1.0, F7^ F3 ), (-1.0, F7^ F5 ), (8.0, F7^ F9 ), (-1.0, F7^ F11 ), (-1.0, F9^ F5 ), (8.0, F9^ F7 ), (-1.0, F9^ F11 ), (-1.0, F9^ F13 ), (8.0, F9^ F15 ), (8.0, F11^ F5 ), (-1.0, F11^ F7 ), (-1.0, F11^ F9 ), (8.0, F11^ F13 ), (-1.0, F11^ F15 ), (-1.0, F13^ F9 ), (8.0, F13^ F11 ), (-1.0, F13^ F15 ), (8.0, F15^ F9 ), (-1.0, F15^ F11 ), (-1.0, F15^ F13 )

Snake Hamiltonian:
 (-1.0, F0^ F2 ), (8.0, F0^ F4 ), (-1.0, F0^ F6 ), (-1.0, F2^ F0 ), (-1.0, F2^ F4 ), (8.0, F2^ F6 ), (8.0, F4^ F0 ), (-1.0, F4^ F2 ), (-1.0, F4^ F6 ), (8.0, F4^ F8 ), (-1.0, F4^ F10 ), (-1.0, F6^ F0 ), (8.0, F6^ F2 ), (-1.0, F6^ F4 ), (-1.0, F6^ F8 ), (8.0, F6^ F10 ), (8.0, F8^ F4 ), (-1.0, F8^ F6 ), (-1.0, F8^ F10 ), (8.0, F8^ F12 ), (-1.0, F8^ F14 ), (-1.0, F10^ F4 ), (8.0, F10^ F6 ), (-1.0, F10^ F8 ), (-1.0, F10^ F12 ), (8.0, F10^ F14 ), (8.0, F12^ F8 ), (-1.0, F12^ F10 ), (-1.0, F12^ F14 ), (-1.0, F14^ F8 ), (8.0, F14^ F10 ), (-1.0, F14^ F12 ), (-1.0, F1^ F3 ), (8.0, F1^ F5 ), (-1.0, F1^ F7 ), (-1.0, F3^ F1 ), (-1.0, F3^ F5 ), (8.0, F3^ F7 ), (8.0, F5^ F1 ), (-1.0, F5^ F3 ), (-1.0, F5^ F7 ), (8.0, F5^ F9 ), (-1.0, F5^ F11 ), (-1.0, F7^ F1 ), (8.0, F7^ F3 ), (-1.0, F7^ F5 ), (-1.0, F7^ F9 ), (8.0, F7^ F11 ), (8.0, F9^ F5 ), (-1.0, F9^ F7 ), (-1.0, F9^ F11 ), (8.0, F9^ F13 ), (-1.0, F9^ F15 ), (-1.0, F11^ F5 ), (8.0, F11^ F7 ), (-1.0, F11^ F9 ), (-1.0, F11^ F13 ), (8.0, F11^ F15 ), (8.0, F13^ F9 ), (-1.0, F13^ F11 ), (-1.0, F13^ F15 ), (-1.0, F15^ F9 ), (8.0, F15^ F11 ), (-1.0, F15^ F13 )