Investigations of the Hubbard model

How do I use this algorithm? What does that parameter do?
Post Reply
bart
Posts: 26
Joined: 23 Jan 2019, 09:35

Investigations of the Hubbard model

Post by bart »

I am in the process of testing the spin-1/2 Fermi-Hubbard model on a square lattice (infinite cylinder) with Hamiltonian:

\(H = \sum_{\langle i, j \rangle, i < j, \sigma} t (c^{\dagger}_{\sigma, i} c_{\sigma j} + \text{H.c.})
+ \sum_i U n_{\uparrow, i} n_{\downarrow, i}\),

where \(\langle i, j \rangle, i < j\) denotes nearest-neighbor pairs. NB: the model is at half filling (\(\mu=0\)) and has only on-site interactions (\(V=0\)).

For this, I am using the FermionicHubbardModel class from models/fermions_hubbard.py.

At the moment, I am just using one function called run_iDMRG(t, U, mu, V) which takes the Hamiltonian parameters. There are 4 main steps of the code:

1) Define model (2x2 unit cell)

Code: Select all

model_params = dict(cons_N='N', cons_Sz='Sz', t=t, U=U, mu=mu, V=V, lattice="Square", bc_MPS='infinite',
                        order='default', Lx=2, Ly=2, bc_y='cylinder', verbose=0)
M = FermionicHubbardModel(model_params)
2) Define initial psi (Neel state)

Code: Select all

product_state = ["up", "down"] * (M.lat.N_sites//2)
psi = MPS.from_product_state(M.lat.mps_sites(), product_state, bc=M.lat.bc_MPS)
3) Perform DMRG (\(\chi_\text{max}=30\))

Code: Select all

dmrg_params = {
        'mixer': True,
        'trunc_params': {
            'chi_max': 30,
            'svd_min': 1.e-10
        },
        'max_E_err': 1.e-10,
        'verbose': 0,
        'N_sweeps_check': 10
    }
info = dmrg.run(psi, M, dmrg_params)
4) Probe final psi (ground-state energy, mean magnetization, entanglement entropy, correlation length)

Code: Select all

E = info['E']
m = print(np.mean(psi.expectation_value('Sz')))
S = print(np.max(psi.entanglement_entropy()))
xi = print(psi.correlation_length())
I have several questions about the implementation:
-- Is this correctly set-up to give meaningful physical results?
-- What it the best way to quickly verify if the Hubbard model is working as it should?
-- Is there an intended way to implement finite-temperature expectation values of the form: \(\langle \hat{A} \rangle=Z^{-1}\text{Tr}\left[ \hat{A}e^{-\beta \hat{H}}\right]\) ?
-- What is the root cause of the warning:

Code: Select all

UserWarning: Correlation length: largest eigenvalue not one. Not in canonical form/normalized?
  warnings.warn("Correlation length: largest eigenvalue not one. "
? Is this associated to \(\chi\) not being large enough?

Any help would be greatly appreciated!
User avatar
Johannes
Site Admin
Posts: 413
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: Investigations of the Hubbard model

Post by Johannes »

The general setup looks fine.
Regarding the bond dimension, you need to carefully check if larger \(\chi\) leads to different results. I would be very surprised if 30 is enough for convergence.

To check that it works you need to compare results you have with existing results in the literature ;)

Finite temperature expectation values are not so easy to get with MPS, just looking for the ground state is much easier (and for a 2D system already hard enough!) For finite temperatures, you need a full mixed density matrix, which is basically twice as expensive as pure states. One way is to use "purification". The alternatives to write the density matrix as an MPO and METTS are currently not implemented in TeNPy. But also the purification won't help here, because you need to do an imaginary time evolution - and there is still no way to do that for long-range Hamiltonains in TeNPy :?

The warning points out that the largest eigenvalue of the transfer matrix was not 1, which is expected for states in the canonical form.
The reason might be the strong truncation, although I'm not sure about that right now.
The "norm error" printed by DMRG tells you how well the state is in canonical form. Is this small at the end of your DMRG run?
bart
Posts: 26
Joined: 23 Jan 2019, 09:35

Re: Investigations of the Hubbard model

Post by bart »

Thank you for confirming the general set-up and for making me suspicious of my \(\chi\)-value :lol: I will check my results for convergence with a larger \(\chi\) when I have more compute time available.

The middle two questions were in a way connected because the vast majority of results in the literature are at finite \(T\), but that isn't really a TeNPy question, so I'll think about it some more. Thank you for explaining the general issue with performing finite-\(T\) calculations in DMRG :)

Consider the Fermi-Hubbard model (initial neel product state, infinite cylinder, 2x2 square unit cell) with the parameters \(\{t=-1,\,U=\mu=V=0\}\). At the end of the DMRG run, I get:

Code: Select all

sweep 30, age = 372
Energy = -1.9999999995516760, S = 0.6934128266855892, norm_err = 2.5e-07
Current memory usage 1039.7 MB, time elapsed: 25.0 s
Delta E = -9.5062e-11, Delta S = 1.6485e-05 (per sweep)
max_trunc_err = 4.9518e-12, max_E_trunc = 2.4443e-11
MPS bond dimensions: [30, 30, 30, 30]
================================================================================
DMRG finished after 30 sweeps.
total size = 372, maximum chi = 30
This is followed by the UserWarning that I described when I try to compute

Code: Select all

psi.correlation_length()
. So, as you suspected, the norm_err is not small, and I find a correlation between getting the warning and the norm_err being large (approx >1e-8), however simply increasing \(\chi_{\text{max}}\) does not fix the problem. (Actually, increasing \(\chi_{\text{max}}\) in this case seems to make the norm_err even larger :? e.g. norm_err = 6.6e-05 for \(\chi_{\text{max}}=100\)). Is there a systematic way to reduce the norm_err, when I notice that it is too high?

NB: In this case, changing the Hamiltonian parameters can fix the problem e.g. \(U\neq 0\)
Post Reply