Skip to content

Unable to do subspace expansion for QN conserved Hamiltonian with only next-nearest-neighbor hopping #75

@mingruyang

Description

@mingruyang

As mentioned in #69, the default subspace expansion does not work in my case:

maxdim = 100 # Maximum bond dimension
cutoff = 1e-8 # Singular value cutoff when increasing the bond dimension
max_vumps_iters = 100 # Maximum number of iterations of the VUMPS algorithm at each bond dimension
vumps_tol = 1e-9
conserve_qns = true
solver_tol = (x -> x / 10)
outer_iters = 10 # Number of times to increase the bond dimension

function initstate(n)
    if n%2==0
        if (n/2)%2==1 
            return "Dn"
        else 
            return "Up"
        end
    else
        if n==2*1-1 return "Up" end
        if n==2*3-1 return "Dn" end
        if n==2*5-1 return "Up" end
        if n==2*7-1 return "Dn" end
        if n==2*9-1 return "Up" end
        if n==2*11-1 return "Dn" end
        if n==2*13-1 return "Up" end
        if n==2*14-1 return "Dn" end
        if n==2*15-1 return "Up" end
        if n==2*16-1 return "Dn" end
        if n==2*17-1 return "Up" end
        if n==2*18-1 return "Dn" end
        if n==2*19-1 return "Up" end
        if n==2*21-1 return "Dn" end
        if n==2*23-1 return "Up" end
        if n==2*25-1 return "Dn" end
        if n==2*27-1 return "Up" end
        if n==2*29-1 return "Dn" end
        if n==2*31-1 return "Up"
        else return "Emp"
        end
    end
end

N = 62 # Number of sites in the unit cell
s = infsiteinds(n->isodd(n) ? "tJ" : "S=1/2", N; conserve_qns, initstate)
ψ = InfMPS(s, initstate)

function ITensorInfiniteMPS.unit_cell_terms(::Model"mymodel"; N)
  ampo = OpSum()

  t = 1.0;
  Jc = 0.5;
  Js = 0.5;
  Jk = 1.25;
  Jcs = 0.25;

    for j in 1:2:N
        ampo += -t,"Cdagup",j,"Cup",j+2;
        ampo += -t,"Cdagdn",j,"Cdn",j+2;
        ampo += -t,"Cdagup",j+2,"Cup",j;
        ampo += -t,"Cdagdn",j+2,"Cdn",j;
        ampo += 0.5*Jc,"S+",j,"S-",j+2;
        ampo += 0.5*Jc,"S-",j,"S+",j+2;
        ampo +=     Jc,"Sz",j,"Sz",j+2;
        ampo += -0.25*Jc,"Ntot",j,"Ntot",j+2;
    end
    for j in 2:2:N
        ampo += 0.5*Js,"S+",j,"S-",j+2;
        ampo += 0.5*Js,"S-",j,"S+",j+2;
        ampo +=     Js,"Sz",j,"Sz",j+2;
    end
    for j in 1:2:N
        ampo += 0.5*Jk,"S+",j,"S-",j+1;
        ampo += 0.5*Jk,"S-",j,"S+",j+1;
        ampo +=     Jk,"Sz",j,"Sz",j+1;
    end
    for j in 1:2:N
        ampo += 0.5*Jcs,"S+",j,"S-",j+3;
        ampo += 0.5*Jcs,"S-",j,"S+",j+3;
        ampo +=     Jcs,"Sz",j,"Sz",j+3;
    end
    for j in 2:2:N
        ampo += 0.5*Jcs,"S+",j,"S-",j+1;
        ampo += 0.5*Jcs,"S-",j,"S+",j+1;
        ampo +=     Jcs,"Sz",j,"Sz",j+1;
    end

  return ampo
end
model = Model("mymodel")
H = InfiniteSum{MPO}(model, s; N)
vumps_kwargs = (tol=vumps_tol, maxiter=max_vumps_iters, solver_tol)
subspace_expansion_kwargs = (cutoff=cutoff, maxdim=maxdim)
ψ = vumps_subspace_expansion(H, ψ; outer_iters, subspace_expansion_kwargs, vumps_kwargs)

Also in the example codes, all examples are using vumps_subspace_expansion. Is it easy to use as input (1) a randomly generated QN conserved uMPS with bond dimension larger than 1 (2) a MPS which has optimized by iDMRG and then calling the VUMPS without subspace expansion?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions