DMRG with Mixed Local Hilbert Space Types


I have been using ITensor for a couple of weeks now and I am currently trying to extend some DMRG calculations to a Hubbard model with spin 3/2 fermions. I have defined a custom type for the latter but the representation of the operators by 16x16 matrices leads to really slow running times. I was hoping to get better execution times by following your example in the DMRG with Mixed Local Hilbert Space Types section, so I tried alternating Electron sites with custom Electron3 sites (same as Electron but with 3/2 and -3/2 projections).

Unfortunately, the hopping between two Electron sites (1 and 3) in the minimal code below (with alternating Electron and Fermion sites) does not behave as expected. The Fermion sites should be irrelevant, but the output is 0 for the energy; when renaming them e.g. to Electron it changes to a nonzero value.

using ITensors
  N = 20
  sites = siteinds(n->isodd(n) ? "Electron" : "Fermion",N; conserve_qns=true)

  ampo = OpSum()
  ampo += "Cdagup", 1, "Cup", 3
  ampo += "Cdagup", 3, "Cup", 1

  H = MPO(ampo, sites)

  sweeps = Sweeps(6)
  setmaxdim!(sweeps, 100)
  setcutoff!(sweeps, 1E-12)

  state = ["Emp" for n in 1:N]

  psi0 = randomMPS(sites, state, 10)
  @show flux(psi0)

  energy, psi = dmrg(H, psi0, sweeps)
  println("\nGround State Energy = $energy")

Thank you,

Thanks for the interesting question. Splitting up the sites into two kinds of sites sounds like a potentially good strategy.

Your code looks correct and I checked that it is. The issue you were seeing is due to DMRG just having a hard time converging since there is only a hopping from site 1 to site 3 and no other hoppings to “help” move particles around. It can be challenging to converge these kinds of Hamiltonians.

You can often fix this situation by turning on the “noise term” feature of DMRG. When I added the following line:


I found that the code now gives an energy of -1.0.

Hi, yes, it works! Thank you so much for the awesome work!

1 Like

Appreciate the feedback!