Electron-Phonon couplings in ITensor

Hi!

I am trying to find and create ground states of electron-phonon coupled Hamiltonian in ITensor (with dmrg) . Till now, I have only worked with spin-½ systems in ITensor and I am not quite sure how to make the leap. So, any minimum working example in the regard would be immensely helpful.

For example:

  • How would I encode the Hamiltonian:

\displaystyle H=-(c_1^{\dagger}c_2+c_2^{\dagger}c_1)+g(b_1^{\dagger}+b_1^{\dagger})c_1^{\dagger} c_1+ g(b_2^{\dagger}+b_2^{\dagger})c_2^{\dagger} c_2+\Omega(b_1^{\dagger}b_1+b_1^{\dagger}b_1)

  • and create this state:

|\psi_0 \rangle= \frac{1}{\sqrt{2}}\left[c_1^{+} e^{-\frac{g^2}{2 \Omega^2}-\frac{9}{\Omega} b_1^{+}}|0\rangle+c_2^{+} e^{-\frac{g^2}{2 \Omega^2}-\frac{9}{\Omega} b_2^{+}}|0\rangle\right]

using ITensor?

Thanks in advance!

Arnab

Hi Arnab,
To make a system with “mixed” degrees of freedom, in your case alternating fermion and boson sites, you can use the general pattern shown in one of our Code Examples here:
https://itensor.github.io/ITensors.jl/dev/examples/DMRG.html#DMRG-Calculation-with-Mixed-Local-Hilbert-Space-Types
where in your case you would
(1) replace “S=1/2” and “S=1” with “Fermion” and “Boson”
(2) change the definition of the Hamiltonian to use the appropriate operators for your case.

Note that for the “Boson” site type, it is not really capturing the infinite Hilbert space of a boson in an exact way, but approximating it by only allowing from zero up to some maximum occupancy of bosons. To set this maximum to different values (the default is 2) you can pass the "dim=..." keyword argument when making the site indices. You’ll need to consider if your system ever needs to have a high occupancy (a simple way to test is to redo your calculations for different maximum occupancies and see if your results change much).

For the state you are asking about, if that is the state of two neighboring sites, I would say just write it out on paper (truncated to the maximum occupancy of your number of bosons) and then create it as a single two-site tensor by filling up the values. Then you can call the ITensor u,s,v = svd(...) function to split it into two tensors u and (s*v) and put those into the correct site locations of your MPS.