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 packageMPSKit
-
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
where
Dividing
If the times
where
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,
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
By use of double Fourier transforms, one can obtain the
With
the continuous form is as follows
The real-space and real-time correlation function
Finally, one gets,
Here, the matrix-product states time evolution methods are implemented to solve the state
-
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 QuantumKitHub/MPSKit.jl#160 (comment), and thank Zhao-Long Gu for great help.