Hi,
Hope this is the right forum for this. I am currently using the ITensorInfiniteMPS implementation of VUMPS (GitHub - ITensor/ITensorInfiniteMPS.jl: A package for working with infinite matrix product states (MPS) with ITensor.) and I am having trouble simulating a particular model with VUMPS. The model in question is
where c, d are two species of fermion per cell and where I have also given an equivalent (via Jordan-Wigner) spin/hardcore boson model. I’ve elected to implement the model using hardcore boson/spin-1/2 sites. My implementation is coded below:
function unit_cell_terms(::Model"DipoleHopping"; t)
opsum = OpSum()
dipoleHopNN = t,"S+",2,"S-",3,"S-",4,"S+",5
dipoleHopNN_HC = t,"S-",2,"S+",3,"S+",4,"S-",5
opsum += dipoleHopNN
opsum += dipoleHopNN_HC
return opsum
end
Though it seems like this model has only one fermion/spin-1/2 per unit cell, I have other terms in the model that enforce the two spin-1/2 in the primitive unit cell. I’ve neglected to include these terms for ease of presentation and because I’d like to understand this simpler model first.
I’m able to simulate this model perfectly fine using regular open-chain DMRG with a bond dimension of 50 (for N=52 spin 1/2’s and a cutoff of 1e-10). (I can also benchmark with an exact solution of the model, as it maps onto an XX chain with half the DOF when projected to a special conserved subspace.) However, when I simulate with VUMPS (a rather naïve implementation of it, as I’ve just copied the Hubbard model example and made only minimal modifications), I get the following ‘errors’:
The two-site subspace expansion produced a zero-norm expansion at (1, 2). This is likely due to the long-range nature of the QN conserving Hamiltonian.
(and similarly for other pairs of sites), and the algorithm only ever uses bond dimensions from 1-4. The results from this run are obviously nonsense (e.g. single cut entropies give me alternating log(2) and 0). Below, I’m posting a minimal section of my code that contains the VUMPS parameters.
using ITensors, ITensorMPS
using ITensorInfiniteMPS
base_path = joinpath(pkgdir(ITensorInfiniteMPS), "examples", "vumps", "src")
src_files = ["vumps_subspace_expansion.jl", "entropy.jl"]
for f in src_files
include(joinpath(base_path, f))
end
##############################################################################
# VUMPS parameters
#
maxdim = 100 # Maximum bond dimension
cutoff = 1e-10 # Singular value cutoff when increasing the bond dimension
max_vumps_iters = 200 # Maximum number of iterations of the VUMPS algorithm at each bond dimension
vumps_tol = 1e-5
outer_iters = 5 # Number of times to increase the bond dimension
localham_type = MPO # or ITensor
conserve_qns = true
eager = true
model_params = (t=1)
##############################################################################
N = 8 # Unit cell size
initstate(n) = isodd(floor(Int,n/2)+1) ? "↑" : "↓"
s = infsiteinds("S=1/2", N; initstate, conserve_qns)
ψ = InfMPS(s, initstate)
model = Model"DipoleHopping"()
@show model, model_params
# Form the Hamiltonian
H = InfiniteSum{localham_type}(model, s; model_params...)
outputlevel = 1
vumps_kwargs = (tol=vumps_tol, maxiter=max_vumps_iters, outputlevel, eager)
subspace_expansion_kwargs = (cutoff=cutoff, maxdim=maxdim)
# For now, to increase the bond dimension you must alternate
# between steps of VUMPS and subspace expansion (which outputs
# a new state that is equal to the original state but with
# a larger bond dimension)
println("\nRun VUMPS on initial product state, unit cell size $N")
ψ = vumps_subspace_expansion(H, ψ; outer_iters, subspace_expansion_kwargs, vumps_kwargs)
S_infinite = [entropy(ψ, b) for b in 1:N]
@show S_infinite
nothing
I understand that my usage of VUMPS here could be very naïve, hence why I’m running into this issue. I would appreciate any suggestion on how I can make the results of VUMPS line up with the finite DMRG.
N.B.: To work with my custom model, I made a DipoleHopping.jl file with that function and put include("models/DipoleHopping.jl") in the ITensorInfiniteMPS.jl file. This is a rather complicated step that can make reproducing my code quite unwieldy, but it’s the only thing that’s worked for me.
Thanks very much, and please let me know if additional information is needed!
Best,
Amogh