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