# Partial Filling in VUMPS

I am interested in making an electronic initial MPS state at various filling fractions for VUMPS. The simplest state for half filling that conserves `Sz=0` for example is

``````initstate(n) = isodd(n) ? "↑" : "↓"
s = infsiteinds("Electron", N; initstate, conserve_qns)
ψ = InfMPS(s, initstate)
``````

If I consider 1/4 filling, I would naively write

``````initstate(n) = isodd(n) ? "↑" : "0"
s = infsiteinds("Electron", N; initstate, conserve_qns)
ψ = InfMPS(s, initstate)
``````

but this now does not conserve `Sz=0`. Do I need a 4 site unit cell then ? If I wanted filling 1/8 would I then also need 8 sites in order to conserve `Sz=0` ?

Yes, you would need to use larger unit cells for those fillings.

1 Like

@mtfishman As I understand, the unit cell roughly resembles the width of cylinders in iDMRG. Does this mean that computationally I’m limited to fillings around 1/8th or so?

If you are using a 1D model (a model with local interactions in 1D) the cost should scale linearly with the unit cell size.

Sorry, If I am trying say a 2-leg ladder for example, I’m not clear how to construct a 1/4th filling unit cell as it seems the unit cell size can be used to extend either along the infinitely repeated line or along the new dimension?

For a 2-leg ladder, it would make sense to me to make a 4-site unit cell based on 2 rungs of the ladder.

Hi Matt, our solution for this has been to use the following initial state function.

``````function InitState(; N::Int64=4, filling::Int64=2, SzTot::Float64=0.0)::Vector{String}
##### Filling the state with up and down electrons #####
Nup = Int((filling + (2 * SzTot)) / 2)
Ndn = Int((filling - (2 * SzTot)) / 2)
##### Choosing random sites to fill the up-electrons and down-electrons #####
stateUp = state_fill(N, Nup, "Up")
stateDn = state_fill(N, Ndn, "Dn"; starting = (filling/N) == 1.0 ? 2 : 3)
state =  stateUp .* stateDn
state = [x == "" ? "Emp" : x for x in state]
return state
end
``````

This seems to work for half-filling (N=4, filling = 4 for example), but for large interaction strengths (J = 5 for a 1D t-J model) for partial filling ( (N=4, filling = 2) , we’re getting the error

``````┌ Warning: Right precision error 1.052545211436737 is too high!
└ @ ITensorInfiniteMPS ~/.julia/packages/ITensorInfiniteMPS/v5Lx4/src/vumps_nonlocalham.jl:404
┌ Warning: Left precision error 1.397765999575384 is too high!
└ @ ITensorInfiniteMPS ~/.julia/packages/ITensorInfiniteMPS/v5Lx4/src/vumps_nonlocalham.jl:402
VUMPS iteration 4 (out of maximum 200). Bond dimension = 32, energy = ([-5.313809909935317, -6.956322928281491, -8.465293657965256, -1.723316220609907], [-3.390841907800686, -5.141353622968244, -0.3790025062582366, -6.223079887932087]), ϵᵖʳᵉˢ = 1.397765999575384, tol = 1.0e-6, iteration time = 1.663362496 seconds
``````

and the VUMPs does not converge. Do you have a suggestion for going about debugging this? Since it only occurs for large interaction strengths (J = 4.5 does not do it for example).