A convenient frontend for calculating dynamical correlation functions and related observables based on matrix-product states time evolution methods.
The symbolic operator representation of a quantum lattice system in condensed matter physics is based on the package QuantumLattices
The energy-minimization algorithms like DMRG and the time evolution methods such as MPO $W^{II}$ and TDVP are based on package MPSKit
The bechmark of dynamical correlation functions and related observables is the result from exact diagonalization method based on the packages ExactDiagonalization
Please type ]
in the REPL to use the package mode, then type this command:
dev "path/to/DynamicalCorrelators.jl"
Constuct a lattice by QuantumLattices
:
using QuantumLattices
#define the unitcell
unitcell = Lattice([0.0, 0.0]; vectors=[[1/2, √3/2], [1, 0]])
#give the length and width of the lattice and give the boundary condition where 'o' is open and 'p' is periodic
lattice = Lattice(unitcell, (2, 2), ('o', 'o'))
f = plot(lattice,1; siteon=true)
With the help of QuantumLattices
, constructing the lattice of a realistic system allows for the convenient inclusion of terms in the Hamiltonian for arbitrary neighbors, without the need to construct different types of lattices and define their neighbor relations case by case:
using TensorKit
using MPSKit
using DynamicalCorrelators
using Plots
#define the hilbert space
hilbert = Hilbert(site=>Fock{:f}(1, 2) for site=1:length(lattice))
#give the terms in the Hamiltonian
t = Hopping(:t, -1.0, 1)
U = Hubbard(:U, 8.0)
#construct the Hamiltonian
H = hamiltonian((t, U), lattice, hilbert; neighbors=1)
Here, hamiltonian
returns a MPOHamiltonian
type data that can be directly used in the algorithms like DMRG in MPSKit
:
#give the filling = (a, b) -> filling = a/b
filling = (1, 1)
#find the ground state and ground energy
st = randFiniteMPS(Float64, U1Irrep, U1Irrep, length(lattice); filling=filling)
gs, envs, delta = find_groundstate(st, H, DMRG2(trscheme= truncbelow(1e-9)));
E0 = expectation_value(gs, H)
It should be noted that currently, this construction method is only supported for Hamiltonians with Abelian symmetries. For Hamiltonians with non-Abelian symmetries, the construction still needs to follow the method used in MPSKitModels
.
Next, let’s look at how to calculate correlation functions. Here, I consider SU(2) symmetry, so I use the pre-defined MPOHamiltonian
in the models
file. If only U(1) symmetry is considered, using the method described above to obtain the MPOHamiltonian
provides greater flexibility.
using TensorKit
using MPSKit
using DynamicalCorrelators
# give filling = (a,b), where a=b is half-filling, a<b is h-doping and a>b is e-doping
filling = (1,1)
# give a hamiltonian
H = hubbard(Float64, SU2Irrep, U1Irrep; filling=filling, t=1, U=8, μ=0)
# give a N-site random initial state
N=4
st = randFiniteMPS(ComplexF64, SU2Irrep, U1Irrep, N; filling=filling)
#find the ground state |gs>
gs, envs, delta = find_groundstate(st, H, DMRG2(trscheme= truncbelow(1e-6)));
#obtain c^†_1|gs> and c^†_4|gs>
ep = e_plus(Float64, SU2Irrep, U1Irrep; side=:L, filling=filling)
i, j = 1, 4
cgs₁ = chargedMPS(ep, gs, i)
cgs₂ = chargedMPS(ep, gs, j)
#calculate the propagator: <gs|c_1(t)c^†_4|gs> (i.e. <gs|c_1(0)e^{-iHt}c^†_4|gs>)
dt = 0.05
ft = 10
pros = propagator(H, cgs₁, cgs₂; rev=false, dt=dt, ft=ft)
#calculate ground state energy
E0 = expectation_value(gs, H)
#give the creation and annihilation operators
cp = e_plus(Float64, SU2Irrep, U1Irrep; side=:L, filling=filling)
cm = e_min(Float64, SU2Irrep, U1Irrep; side=:L, filling=filling)
sp = S_plus(Float64, SU2Irrep, U1Irrep; filling=filling)
#calculate the dynamical single-particle correlation function
edc = dcorrelator(RetardedGF{:f}, H, E0, [[chargedMPS(cp, gs, i) for i in 1:48]; [chargedMPS(cm, gs, i) for i in 1:48]]; trscheme=truncdim(200), n=n, dt=dt, ft=ft)
#calculate the dynamical two-particle spin-spin correlation function
sdc = dcorrelator(GreaterLessGF, H, E0, [chargedMPS(sp, gs, i) for i in 1:48]; whichs=:greater, trscheme=truncdim(200), n=n, dt=dt, ft=ft)
After Fourier transforms, we can obtain their spectral functions:
for the electron spectrum, and
for the spin-spin spectrum.
If the $x$ variable has only discrete values ($x=na$, for $n=1,2,3,...,N$) and finite length $L$ ($L=Na$), the expansion of the function is
$$fn=\sum{m=1}^{N} A_{q} e^{iq_m x_n},\quad q=\frac{2\pi}{L}m,$$
where
$$A{q}=\frac{1}{N}\sum^N{n=1}f_n e^{-iq_mx_n}. $$
Dividing $A_{q}$ by the mode $\frac{2\pi}{L}$, the Fourier amplitudes with a per unit spacial interval is
$$ A(q) = \frac{L}{2\pi}Aq=\frac{a}{2\pi}\sum^N{n=1}f_ne^{-iqx_n}.$$
If the times $t$ are discrete times ($t=l\Delta t$, for $l=0,1,2,...,N$) and the final evolutionary time $t_{\mathrm{end}}=N\Delta t$, the expansion of the function is
$$ fl=\sum{p=1}^N A_{\omega} e^{-i\omega_p tl},\quad \omega=\frac{2\pi}{t{\mathrm{end}}}p,$$
where
$$A{\omega}=\frac{1}{N}\sum{l=1}^N f_l e^{i\omega_p t_l}.$$
To make it a per unit frequency interval, one need to divide by the spacing of the discrete frequency mode and the Fourier amlitudes are given by,
$$A(\omega)=\frac{t{\mathrm{end}}}{2\pi}A{\omega}=\frac{\Delta t}{2\pi}\sum_{l=1}^N f_l e^{i\omega t_l}.$$
Although a Fourier series is designed to represent functions that are periodic, one can assume that the finite data sequence can be periodically repeated, which leads to the time at index $l=N$ is identified with the time at $l=0$. However, the small errors made at the end of a period will be irrelevant as long as the primary correlations decay in less time than $t_{\mathrm{end}}$.
By use of double Fourier transforms, one can obtain the $k-\omega$ space correlation function $G(k,\omega)$,
$$G(k,\omega)=\frac{1}{(2\pi)^2}\Delta t\sum_{l=1}^{Nt} a\sum{n=1}^{N_L} G(x, t) e^{-i(kx-\omega t)}.$$
With
$$\Delta t \sum_{l=1}^{N_t}\to \int0^{t{\mathrm{end}}}dt,\quad a\sum_{n=1}^{N_L}\to \int_0^L dx,$$
the continuous form is as follows
$$ G(k,\omega) = \frac{1}{(2\pi)^2} \int0^{t{\mathrm{end}}}dt \int_0^L dx G(x, t) e^{-i(kx-\omega t)}. $$
The real-space and real-time correlation function $G(x, t)$ is given by,
$$ \begin{aligned}G\left( x_{n},t\right) &=\frac{1}{Nt}\sum{l=1}^{Nt}\frac{1}{N{L}}\sum{m=1}^{N{L}}\langle 0 | C\left( x{m}+x{n},t{l}+t\right) C^{\dagger}\left( x{m},t_{l}\right) | 0\rangle \ &=\frac{1}{Nt}\sum{l=1}^{Nt}\frac{1}{N{L}}\sum_{m=1}^{NL}\langle 0| e^{iH(t{l}+t)}C\left( x{m}+x{n}\right) e^{-iH(tl+t) }e^{iHt{l}}C^{\dagger}\left( x{m}\right) e^{-iHt{l}}| 0\rangle \ &=\frac{1}{N{L}}\sum{m=1}^{N{L}}e^{iE{0}t}\langle 0| C\left( x{m}+x{n}\right) e^{-iHt}C^{\dagger}\left( x_{m}\right) | 0\rangle. \end{aligned}$$
Finally, one gets,
$$ G(k,\omega)=\frac{1}{(2\pi)^2}\Delta t\sum_{l=1}^{Nt} a\sum{n=1}^{NL} \frac{1}{N{L}}\sum{m=1}^{N{L}}e^{iE{0}t}\langle 0| C\left( x{m}+x{n}\right) e^{-iHt}C^{\dagger}\left( x{m}\right) | 0\rangle e^{-i(kx_n-\omega t)}. $$
Here, the matrix-product states time evolution methods are implemented to solve the state $e^{-iHt}C^{\dagger}\left( x_{m}\right) | 0\rangle$.
Wysin G M. Magnetic Excitations and Geometric Confinement[M]. Philadelphia, USA: IOP, 2015.
Paeckel S, Köhler T, Swoboda A, et al. Time-evolution methods for matrix-product states[J]. Annals of Physics, 2019, 411: 167998.
Due to the fast development of this package, releases with different minor version numbers are not guaranteed to be compatible with previous ones before the release of v1.0.0. Comments are welcomed in the issues.
Y.-Y.Zong: zongyongyue@gmail.com; Jason: wavefuncion@gmail.com
We thank Maartenvd, lkdvos for help discussions in https://github.com/QuantumKitHub/MPSKit.jl/issues/160#issue-2430771115, and thank Zhao-Long Gu for great help.