# how to obtain more than one eigen energy of local MPO during sweep?

Dear itensor:
ITensor/itensor/mps/dmrg.h at 98fc7022eb812fe68640e662f4051dfd2348e4e9 · ITensor/ITensor (github.com)
May I ask if I want to output more eigenenergy for each effective Hamiltonian (local MPO) during the DMRG sweep process. Instead of calling following codes

``````energy = davidson(PH,phi,args);
``````

in the current program to obtain one eigenenergy, what should I do? Can you guys help me to do this?

Is your goal to obtain energies of excited states? If so, there is a generally better way to do this, using the code pattern demonstrated here:
http://itensor.org/docs.cgi?vers=cppv3&page=formulas/excited_dmrg
which uses the “orthogonality penalty method” to obtain eigenstates.

arxiv.org/pdf/1705.05423.pdf
where they extract information about excited states simultaneously while obtaining the ground state in the DMRG sweep process, instead of obtaining excited states according to the usual orthogonalization scheme. The only difference is that during the ground state sweeping process, they performed lanczos diagonalization on the effective Hamiltonian(local mpo) to obtain more eigenenergies. They found that these higher eigenenergies happen to correspond exactly to the energies of the excited states. So, can you provide me with some function options that can output higher energies of the effective Hamiltonian(local mpo) during the DMRG sweeping process? According to the current algorithm in dmrg,

``````energy = davidson(PH,phi,args);
``````

only one energy can be output.

Does itensor provide such functionality? Are there any other diagonalization functions available during the DMRG sweep process that can output more eigenvalues of the effective Hamiltonian?

I see, yes that algorithm is interesting, however, make sure you note that it only works well for a critical system, as the authors discuss. Away from a critical system, users of that algorithm in the past have taken other steps to “enrich” the MPS basis to make sure it is able to represent more than one state. So it takes some careful development and testing to work in general cases and we have not provided it in a “black box” way.

Our `davidson` algorithm does support obtaining more than one low-lying eigenstate. If you look around line 102 of this file
https://github.com/ITensor/ITensor/blob/v3/itensor/iterativesolvers.h
you’ll see there a version which takes a vector `phi` of ITensors. If you pass more than one, the code will attempt to compute that many of the lowest-lying eigenvectors. Note that we have not used that code for that purpose much so I can’t promise how reliable it will be and you may want to test it separately. Also we have not written the DMRG code in a general way to support tracking multiple states in this style so you would need to write that part yourself also.