Hi! I think I have an easy question but not sure how to do it. I am running iDMRG algorithm to find the ground state of the system I am interested in. Apart from the total energy density, is there a built-in function in Tenpy to obtain the contribution to the total energy of each of the terms in the Hamiltonian separately? E.g., if H= T + V, what is the correct way to use the defined model to access eg the kinetic energy T?

My example code:

M = FermionModel(model_params)

psi = MPS.from_product_state(M.lat.mps_sites(), product_state, bc=M.lat.bc_MPS)

result = dmrg.run(psi, M, dmrg_params)

Energy = result['E']

Thanks!

## Kinetic energy

### Re: Kinetic energy

Hi, and welcome to the forum! In Tenpy, you can compute expectation values of any operator you'd like using psi.expectation_value(). You can read the documentation here: tenpy.networks.mps.MPS

### Re: Kinetic energy

I think the question aims at how to get the terms contained in the kinetic energy.

Actually, there's some functionality in the tenpy.models.model.CouplingModel, which is not explicitly used in most of the pre-defined models, though, and a bit hidden in the documentation.

When one calls add_coupling, it takes a keyword argument

The attribute

You basically want to take a subset of all the CouplingTerms and build an MPO from it to measure the expectation value of the MPO.

Full example:

Actually, there's some functionality in the tenpy.models.model.CouplingModel, which is not explicitly used in most of the pre-defined models, though, and a bit hidden in the documentation.

When one calls add_coupling, it takes a keyword argument

`category`

.The attribute

`coupling_terms`

of the model is simply a dictionary mapping the `category`

string to instances of tenpy.networks.terms.CouplingTerms.You basically want to take a subset of all the CouplingTerms and build an MPO from it to measure the expectation value of the MPO.

Full example:

Code: Select all

```
import tenpy
from tenpy.models.xxz_chain import XXZChain
from tenpy.networks.terms import CouplingTerms, OnsiteTerms
from tenpy.networks.mps import MPS
from tenpy.networks import mpo
L = 6
M = XXZChain({'L': L, 'bc_MPS': 'finite'})
print("coupling term categories:", M.coupling_terms.keys())
ct = M.coupling_terms['Sp_i Sm_j']
print("contained terms: ")
print(ct.to_TermList())
ot = OnsiteTerms(L)
T_MPO_graph = mpo.MPOGraph.from_terms(ot, ct, M.lat.mps_sites(), M.lat.bc_MPS)
T_MPO = T_MPO_graph.build_MPO()
T_MPO.max_range = ct.max_range()
# define psi as nearest-neighbor singlets
psi = MPS.from_singlets(M.lat.unit_cell[0], L, [(0, 1), (2, 3), (4, 5)])
print("<psi|T_MPO|psi> = ", T_MPO.expectation_value(psi))
assert abs(T_MPO.expectation_value(psi) - (-1.5)) < 1.e-13
```