Questions about the conserved total dipole moment

Hi, miles

I am working on a total dipole moment coserved Bosonic Hamiltonian, and the model is like this,

H=-J_d\sum_i(b_i^\dag b_{i+1}^2 b_{i+2}^\dag+h.c.).

H conserves both the total particle number N=\sum_in_i and the total dipole moment P=\sum_iin_i. If I am not misunderstanding, the total dipole moment conservation is just the U(1) symmetry which is similar to the total particle number. I expect that the total dipole moment quantum number can be applied in ITensor as well. I know how to add the total particle number conservation in the DMRG calculations. However, the total dipole moment conservation relates to the site index and I have no idea how to deal with this kind of QNs.

So, my question is how to construct a Boson site type that conserves both N and P.

Any suggestion is much appreciate!

Kind

Chen-Rong

1 Like

Hi Chen-Rong,
It’s a good question. I do think that your “P” may be another kind of Abelian symmetry that can be conserved in a similar manner to the U(1) particle number symmetry.

The actual “Boson” site type in ITensor is implemented in a rather general way that may make that code hard to read and modify for newcomers.

Fortunately, I think could still have an easy time making the kind of site index you need if you follow the code examples
Make a Custom Local Hilbert Space / Physical Degree of Freedom
then next reading
Make a Custom Local Hilbert Space with QNs.

If you carefully adapt the spin 3/2 example in the Make a Custom Local Hilbert Space with QNs code example to instead have the relevant quantum number names and values for your case, it could work well for you. Also you will need to define the matrix elements of your operators (in your case “b” and “bdag” are names you could use for b and b^\dagger).

For example, if you want your bosons to have a total dimension (maximum boson number on a site) of 3, you could define the “space” to be:

[QN(("N",0),("P",0)) => 1,
 QN(("N",1),("P",1)) => 1,
 QN(("N",2),("P",3)) => 1]

At first you could just “hard code” the dimension you want, but later as a challenge to yourself you could make the code take any dimension as an input and then allow the user to specificy whatever maximum they want.

Hope that helps-
Miles

P.S. Even though I’m the person answering your question, other ITensor developers and community members answer questions here quite often too. So please address any posts you make to the entire community. Thanks.

1 Like

Hi,

The only difference between dipole symmetry and the ordinary U(1) particle symmetry is the dependence on site position, and this can be easily incorporated into a very small redefinition of whatever site type you have. Below I’ll show an example; suppose we have a spin-1 chain and we conserve the total “charge” \sum_j S^z_j and the dipole moment \sum_j jS^z_j. Then just do

using ITensors, ITensorMPS
using ITensorInfiniteMPS
function ITensors.space(::SiteType"spin1dipole", pos::Int;
                        conserve_qns = true)
  if conserve_qns
    return [QN(("Sz",1),("dipole",1*pos))=>1,QN(("Sz",0),("dipole",0*pos))=>1,
            QN(("Sz",-1),("dipole",-1*pos))=>1]
  end
  return 3
  
end

#Define/import everything else from a usual spin-1 site definition

the only change being the extra argument pos::Int.

Note that I learned this by digging through some of the ITensorInfiniteMPS examples (fqhe13.jl) but I’ve only gotten this to work with finite DMRG. I’m not sure if we need to import ITensorInfiniteMPS to implement this dipole quantum number, I haven’t yet tested it without this import.

Hi, Miles
Thanks for your answers. I have followed the documents you listed and I defined the physical sites accordingly. The code works exactly as I expected! By the way, to address the post to make it face to the entire community, should I revise this post or do something else? I am not familiar with using the discussion system.
Kind,
Chen-Rong

Hi, amoghanakru
Thanks for your answers. Your example is much appreciated, and yes, there is only a need for small changes. Based on your example, I defined a new type of physical site as,


function ITensors.space(::SiteType"Bosondipole", pos::Int;
                        conserve_qns = true)
  if conserve_qns
    return [QN(("N",0),("dipole",0*pos))=>1,
            QN(("N",1),("dipole",1*pos))=>1,
            QN(("N",2),("dipole",2*pos))=>1,
            QN(("N",3),("dipole",3*pos))=>1,
            QN(("N",4),("dipole",4*pos))=>1,
            QN(("N",5),("dipole",5*pos))=>1,
            QN(("N",6),("dipole",6*pos))=>1,
            QN(("N",7),("dipole",7*pos))=>1]
  end
  return 8
  
end

That code works exactly as I expected!

Best,
Chen-Rong

Hi Chen-Rong,
Glad to hear it is working. It is a very interesting application of Abelian quantum numbers, and one that I was surprised to learn about.

Miles