New release: v0.6.1.

Preparing state with specified particle filling

How do I use this algorithm? What does that parameter do?
Post Reply
rdilip
Posts: 4
Joined: 03 Dec 2019, 12:42

Preparing state with specified particle filling

Post by rdilip »

Hi all,

I'm interested in properties of a state in the Bose Hubbard model at different values of the chemical potential. To speed up the computation, my thought was to set the chemical potential, run dmrg and find the ground state, read out the expected filling, then construct a new state with that filling and turn on particle number conservation. This only works if conserve = None, though. If conserve = "N", then the expectation value of the particle number is always 0.0 at each site (the below code replicates what I'm talking about; if you change conserve = None on the first line, then the filling is 0.5. Is there a way to, once I know the particle number corresponding to a certain chemical potential, shift to particle number conservation to speed up programs?

Code: Select all

M = BoseHubbardModel(dict(n_max=1, L = 4, conserve = "N"))
localwf = np.array([1.0,1.0])
localwf = localwf / np.linalg.norm(localwf)
pstate = [localwf] * 4
psi = MPS.from_product_state(M.lat.mps_sites(), pstate, M.lat.bc_MPS)
print(psi.expectation_value("N"))

User avatar
Johannes
Site Admin
Posts: 176
Joined: 21 Jul 2018, 12:52
Location: UC Berkeley

Re: Preparing state with specified particle filling

Post by Johannes »

If you run the code with conserve='N', you should get a UserWarning

Code: Select all

tenpy/networks/mps.py:396: UserWarning: flat array has non-zero entries in blocks incompatible with charge
  B = npc.Array.from_ndarray(B, legs, dtype)
The reason is that for conserve='N', each tensor needs to have a well defined charge.
You write down an initial state which is a superposition of 0, 1, 2,3, or 4 particles! The code doesn't know which sector you want and just projects into the first one it finds (which is the one with 0 particles).

Try to write down a product state with a well-defined particle number instead, e.g.

Code: Select all

unit_filling = ['1'] * 4
psi = MPS.from_product_state(M.lat.mps_sites(), unit_filling, M.lat.bc_MPS)
For "half filling" you could write e.g.

Code: Select all

half_filling = ['1', '0', '1', '0']
psi = MPS.from_product_state(M.lat.mps_sites(), unit_filling, M.lat.bc_MPS)
As a side note: you cannot write down an initial state with a non-integer filling in the total system and at the same time use charge conservation!

Does that answer your question?

rdilip
Posts: 4
Joined: 03 Dec 2019, 12:42

Re: Preparing state with specified particle filling

Post by rdilip »

That makes complete sense, thanks!

lcarda
Posts: 1
Joined: 14 Apr 2020, 13:38

Re: Preparing state with specified particle filling

Post by lcarda »

Hi all,

I have some follow-up questions, I thought it'd be convenient to post them here instead of opening a new thread.

1 - On the side note of Johannes: does that mean that the charge conservation is only supported for commensurate fillings? If so, suppose that I start out with a product state with incommensurate filling (say, 3 particles on 10 sites):

Code: Select all

model_params = dict(n_max=2, filling=0.3, conserve=None, t=0.25, U=1., V=0., mu=0., lattice='Chain', bc_MPS='finite', order='default', L=10)
M = BoseHubbardModel(model_params)
initial_state = ['0', '0', '0', '1', '1', '0', '0', '1', '0', '0']
psi = MPS.from_product_state(M.lat.mps_sites(), initial_state, bc=M.lat.bc_MPS)
dmrg_params = { ... }
info = dmrg.run(psi, M, dmrg_params)
Without enforcing Abelian symmetries in the DMRG algorithm, how can I be sure that during the variational search the state won't leak out of the initial charge sector (for instance due to numerical errors or perhaps by using the 'Mixer') thus drifting towards the macro-canonical ground state for \(\mu=0\)? Should I use the chemical potential, by knowing in advance the \(\mu(t=0.25, U=1, V=0)\) for which \(<N>=3\) is favoured?

2 - What is the role of the attribute 'filling', both for conserve='N' and =None? Tracking it down, it ends up defining an offset operator 'dN': what is its purpose? How does it relate to the filling specified by the initial state and to the actual filling of the ground state determined by the set \(\{\mu, U, t, V\}\)?

I tried to figure it out by myself by reading the docs and the forum, but I couldn't answer all the (many) questions :)

User avatar
Johannes
Site Admin
Posts: 176
Joined: 21 Jul 2018, 12:52
Location: UC Berkeley

Re: Preparing state with specified particle filling

Post by Johannes »

We allow a fractional filling \(n/L\) where \(n \in \mathbb{Z}\) is the number of particles, and \(L\) the number of sites in the MPS (or for infinite MPS: in the MPS unit cell).
So a filling of 3/10 particles is "commensurate" in that sense.
Incommensurate would be and average filling of an irration number or rational number with denominater not dividing the length L of the MPS.

1. If you don't enforce the symmetry and don't adjust the chemical potential such that the sector you start in is the "actual" ground state with the lowest energy, it is likely (though not guaranteed) that DMRG will go into another sector.
So better use the symmetry conservation -- or, as you said, adjust the chemical potential.

2. The "filling" parameter only changes the definition of the dN operator which measures the "charge on top of a background filling", it does not affect the initial state.
In you example code, the number of '1' in the "inital_state" is what defines the (initial) filling.

Post Reply