Modeling a simple shift in energy

Hi,

I’m trying to figure out a seemingly very simple problem.

At this moment, I’m simply testing to obtain some lowest eigenstates of the following ED hamiltonian in superblocks (E>0):
\begin{pmatrix} H_{bulk}+E\cdot I & 0 \\ 0 & H_{bulk} \end{pmatrix}
One can easily expect to obtain the bulk spectrum, plus a ‘copy’ of the same energies but shifted upwards by E.

The code for the bulk system has been tested and worked as expected.

Currently in my implementation, I defined my sites as

  sites = Vector{Index}(undef, L + 1)

  for i= 1 : L + 1
    sites[i] =  siteind("Fermion"; addtags="n=$i", conserve_qns =false)
  end 

Essentially, the ‘bulk’ lives on sites 2 to L+1, and I have some energy penalty terms to fix particle numbers on sites 2 to L+1.
I thought because I have QN conservation explicitly turned off, site 1 could freely hop on and off, so it would either give me the bulk spectrum when site 1 is 0, or +E when site 1 is 1, as below

ampo = OpSum()
ampo += E, "N", 1

#additional code for the bulk hamiltonian

But it turns out as I varied E, the spectrum of the system stayed exactly the same, which means the code does not see any change in site 1. (the gap between, say lowest 20 excited states, are much larger than E in general, so at least I should be able to see some shifted states)

Of course I can do this by manually adding E to my bulk spectrum, but I’m curious if there’s a way I can rigorously implement it. Sorry if this is a convoluted way to overcomplicate a problem.

It’s hard to say why it’s not behaving as you expect, because it sounds like it should work.

So perhaps there is just a bug or wrong assumption somewhere in your code or mathematical approach?

Yes there may be other ways to get a doubled spectrum. But yours sounds like the simplest way.

Hi Miles,

Thank you for the reply.

After a lot of testing, I think I know where the problem is.
For the initial state that goes into the DMRG, I have set it up as

    twolevel =  ["Emp"] 
    state = append!([ "Occ" for n=1:N] , ["Emp" for n=1:L -N])
    state = vcat(twolevel, state)
    
    ψ0 = randomMPS(sites,state)

(Where L, N are the chain length and particle number. The latter is forced by a penalty term in the Hamiltonian since I do not have explicit QN conservation. I want to make the convergence faster by setting up the initial condition like this)

With the same state set up as before, as an array of fermionic sites with QN turned off. I was under the impression that these “Occ” and “Emp” will freely ‘hop’ from one to the other, eventually led to the two-level behavior.

Currently, I believe the reason I’m not seeing the impact of change E was because the first site is set to “Emp”. If it’s set to “Occ” then E does have an effect.

Still, this does not change the problem, as now the spectrum just gets an overall shift of E, again as if the site 1, i.e. the two-level system, is ‘stuck’ in its initial condition and unable to change from one to the other.

Ok, actually when I simply set my initial state to

ψ0 = randomMPS(sites,L + 1)

The problem seemed resolved. Just out of curiosity I’m wondering why the behaves in such a way when I specified the initial conditions of the sites.