0 votes
asked by (230 points)

Hi Miles,

I am trying to look at dynamical quantum phase transitions (DQPTs) in a particular model by numerically finding Fisher zero lines @@z \in \mathcal{C} @@ such that @@\langle \psi (0) | \psi (z) \rangle = 0@@, where @@ | \psi (z) \rangle := e^{zH} | \psi (0) \rangle@@.

I would like to work directly in the thermodynamic limit using iDMRG code based on this example, and identify Fisher zeros based on crossings in the eigenspectrum of the Transfer Matrix. How would I compute the transfer matrix of two MPS and obtain its eigenvalues, similarly to what is done in TenPy?

Also, are there any subtleties I need to be aware of when performing real and imaginary time evolution of iMPS in ITensor, or can I use the same functionality as for generic MPS?

Thanks so much for your help!

commented by (70.1k points)
Thanks for your patience since we haven't answered your question yet. I'm going to try to work up an example code to show you how to do this, since I think we have all the components needed in ITensor. Hope to get back to you soon! - Miles
commented by (70.1k points)
Sorry for the continued delay answering your question. I'd still like to post a sample code for you to use for this, but I thought in the meantime I can give you a shorter answer about how to get these eigenvectors.

The high-level answer is that we have a function `arnoldi` in ITensor (C++ version 3) whose interface you can view in the file itensor/iterativesolvers.h on line 946. It takes two arguments: a generic type (which can be any type) which models a matrix (more on this in a second) and an ITensor "v" which is the initial guess for the eigenvector. The matrix object "A" can be anything, and just has to implement the A.size(); and A.product(v); methods. So for your case, A would be an object holding the MPS tensors which form the MPS transfer matrix, A.size() would give the linear dimension of this transfer matrix, and A.product(v) carries out the multiplication of v times the transfer matrix (which you can do with chi^3 scaling, where chi is the MPS bond dimension).

You can control the arnoldi routine by passing the named arguments MaxIter (integer) and ErrGoal (real number).

For performing time evolution of iMPS, there aren't any particular subtleties I'd point out. It really depends on which algorithm you are trying to do. Our MPS class isn't intentionally set up for infinite calculations, but it's perfectly fine for this purpose. I've used it a lot in the past for infinite methods. Over the next year, and primarily in the Julia version, we are planning to add more functions and algorithms more specifically tailored toward infinite MPS.

commented by (230 points)
Hi Miles,

Thank you for your updates! Very helpful to know, and would indeed really appreciate a sample code like the one you mention above. In the meantime, I will read up on the 'arnoldi' function and will do my best to make headway on this problem.


Please log in or register to answer this question.

Welcome to ITensor Support Q&A, where you can ask questions and receive answers from other members of the community.

Formatting Tips:
  • To format code, indent by four spaces
  • To format inline LaTeX, surround it by @@ on both sides
  • To format LaTeX on its own line, surround it by $$ above and below
  • For LaTeX, it may be necessary to backslash-escape underscore characters to obtain proper formatting. So for example writing \sum\_i to represent a sum over i.
If you cannot register due to firewall issues (e.g. you cannot see the capcha box) please email Miles Stoudenmire to ask for an account.

To report ITensor bugs, please use the issue tracker.