\(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)
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)
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)
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())
-- 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. "
Any help would be greatly appreciated!