# Hubbard model on a dimer

This example shows the effect of inter-site correlations in a two site Hubbard model, aka a H$_2$ molecule on the smallest basis possible. The solution of this problem is analytically known. The large $U$ limit is known as the Heither-London approximation.

The input code is:

H2.Quanty
Verbosity(0)

-- This example calculates the PES and IPES of a H2 molecule in the Hubbard model
-- approximation

-- we have two s-shells one centered around atom A, one around atom B
-- in total there are thus 4 spin-orbitals

NF=4
NB=0

IndexAUp={1}
IndexBDn={2}
IndexBUp={3}

-- The Hamiltonian is given by a hopping from site A to B that conserves spin
-- A Coulomb repulsion if the two electrons are on the same site
-- A chemical potential that gives an onsite energy of -U/2

OppNAdn = NewOperator("Number", NF, 0, 0)
OppNAup = NewOperator("Number", NF, 1, 1)
OppNBdn = NewOperator("Number", NF, 2, 2)
OppNBup = NewOperator("Number", NF, 3, 3)

OppNB = OppNBup + OppNBdn

Oppt = NewOperator("Number", NF, {0,1,2,3}, {2,3,0,1}, {1,1,1,1})
OppU = OppNAup * OppNAdn + OppNBup * OppNBdn

-- PES and IPES are electron annihilation and creation operators

TPes  = NewOperator("An", NF, 0)
TIPes = NewOperator("Cr", NF, 0)

-- the total number of states is 6.

Npsi=6;
StartRestrictions = {NF, NB, {"1111",2,2}};
psiList = Eigensystem(Oppt, StartRestrictions, Npsi);

-- a loop creates U dependent spectra

for i=0, 20 do
U = 0.5*i
Hamiltonian=Oppt + U * OppU - U/2 * (OppNA+OppNB)
Eigensystem(Hamiltonian, psiList)
PESIPES= CreateSpectra(Hamiltonian, {TPes, TIPes}, psiList[1], {{"Emin",-1}, {"Emax",9}, {"NE",1000}, {"Gamma",0.25}})
PESIPES.Print({{"file", string.format("PESIPES%i.dat",i)}})
end

gnuplotInput = [[
set autoscale
set xtic auto
set ytic auto
set style line  1 lt 1 lw 1 lc rgb "#000000"
set style line  2 lt 1 lw 1 lc rgb "#FF0000"

set xlabel "E (eV)" font "Times,12"
set ylabel "Intensity (arb. units)" font "Times,12"

set out 'H2.ps'
set size 1.0, 1.0
set terminal postscript portrait enhanced color  "Times" 8

plot for [i=0:20] 'PESIPES'.i.'.dat' using ( $1):(-(column(3))+i/2.) notitle with lines ls 1,\ for [i=0:20] 'PESIPES'.i.'.dat' using (-$1):(-(column(5))+i/2.) notitle with lines ls 2
]]

-- write the gnuplot script to a file
file = io.open("H2.gnuplot", "w")
file:write(gnuplotInput)
file:close()

-- call gnuplot to execute the script
os.execute("gnuplot H2.gnuplot ; ps2pdf H2.ps")

The example produces a picture of the spectral function as output: