Kind of a philosophical question here: when starting from a state with definite quantum number how does DMRG wind up in a different quantum number sector when quantum number conservation is turned off?
Here’s my take:
It shouldn’t be from the eigensolver which only uses applications of the Hamiltonian. To my mind that leaves the SVD as the only culprit. When using QN conservation the SVD is done block by block. Without QN conservation the tensor should still be block sparse but with degenerate singular values there is no guarantee that the SVD will also produce block sparse tensors. Throw in a little floating point error and eventually you’ll wind up in a superposition of symmetry sectors.
Below is code for a little demo with the Fermi-Hubbard Hamiltonian. I initialize in a product state with 3 spin up and 3 spin down electrons and run DMRG. For the first 6 sweeps it remains in this symmetry sector. But at sweep 7 it immediately jumps out. After 100 steps it has converged to what I guess is the global ground state with 2 spin up and 2 spin down electrons.
let
N, nUp, nDn = 6, 3, 3
conserve_qns = false
# Fermi Hubbard Hamiltonian on N sites
sites, H = fermi_hubbard(N; conserve_qns)
# The MPOs for the number of spin up and down electrons
Nup, Ndn = NupNdn(sites)
psiInit = initial_state(sites, nUp, nDn)
println("The initial state")
check_flux(psiInit, Nup, Ndn)
E, psi = dmrg(H, psiInit; nsweeps=6, maxdim=64, cutoff=0, outputlevel=0)
println("\nAfter 6 sweeps of DMRG")
check_flux(psi, Nup, Ndn)
E, psi = dmrg(H, psiInit; nsweeps=7, maxdim=64, cutoff=0, outputlevel=0)
println("\nAfter 7 sweeps of DMRG")
check_flux(psi, Nup, Ndn)
E, psi = dmrg(H, psiInit; nsweeps=100, maxdim=64, cutoff=0, outputlevel=0)
println("\nAfter 100 sweeps of DMRG")
check_flux(psi, Nup, Ndn)
end
The output is
The initial state
<Nup> = 3.0, variance = 0.0
<Ndn> = 3.0, variance = 0.0
After 6 sweeps of DMRG
<Nup> = 2.9999999999999942, variance = 1.7763568394002505e-14
<Ndn> = 2.999999999999994, variance = 2.3092638912203256e-14
After 7 sweeps of DMRG
<Nup> = 2.517036125816046, variance = 0.2497615038863925
<Ndn> = 2.482713172373026, variance = 0.24975290223099567
After 100 sweeps of DMRG
<Nup> = 2.000000000000001, variance = -1.7763568394002505e-15
<Ndn> = 2.0000000000000004, variance = -8.881784197001252e-16