Example: Correlator of boson-like operators

Observable kind: BosonCorr.

A general correlation function of boson-like operators \(\hat O\) and \(\hat O^\dagger\) is defined as

\[\chi(\tau) = \langle\mathbb{T}_\tau \hat O(\tau) \hat O^\dagger(0)\rangle.\]

\(\chi(\tau)\) is subject to an additional periodicity condition

\[\chi(\tau+\beta) = \chi(\tau).\]

Examples of such correlators are the transverse magnetic susceptibility \(\langle\mathbb{T}_\tau \hat S_+(\tau) \hat S_-(0)\rangle\) and the Green’s function of bosons \(\langle\mathbb{T}_\tau \hat b(\tau) \hat b^\dagger(0)\rangle\).

The auxiliary spectral function \(A(\epsilon) = \Im\chi(\epsilon)/\epsilon\) is non-negative but not necessarily symmetric.

Warning

When \(\hat O = \hat O^\dagger\) (for instance, in case of charge or longitudinal magnetic susceptibility), it is strongly recommended to use BosonAutoCorr observable kind instead.

Run analytical continuation

# Import some TRIQS modules and NumPy
from pytriqs.gf.local import *
from pytriqs.archive import HDFArchive
import pytriqs.utility.mpi as mpi
import numpy

# Import main SOM class
from pytriqs.applications.analytical_continuation.som import Som

n_w = 1001                    # Number of energy slices for the solution
energy_window = (-5.0,5.0)    # Energy window to search the solution in


# Parameters for Som.run()
run_params = {'energy_window' : energy_window}
# Verbosity level
run_params['verbosity'] = 3
# Number of particular solutions to accumulate
run_params['l'] = 10000
# Number of global updates
run_params['f'] = 100
# Number of local updates per global update
run_params['t'] = 50
# Accumulate histogram of the objective function values
run_params['make_histograms'] = True

# Read \chi(i\omega_n) from archive
# Could be \chi(\tau) or \chi_l as well.
chi_iw = HDFArchive('example.h5', 'r')['chi_iw']

# Set the weight function S to a constant (all points of chi_iw are equally important)
S = chi_iw.copy()
S.data[:] = 1.0

# Construct a SOM object
#
# Norms of spectral functions are known to be 3.0 for both diagonal components of \chi.
# It is possible to estimate the norms as \pi\chi(i\omega_0) (estimate affected by noise)
cont = Som(chi_iw, S, kind = "BosonCorr", norms = numpy.array([3.0, 3.0]))

# Run!
# Takes 10-15 minutes on 16 cores ...
cont.run(**run_params)

# Evaluate the solution on an energy mesh
# NB: we can use *any* energy window at this point, not necessarily that from run_params
chi_w = GfReFreq(window = (-5.0,5.0), n_points = n_w, indices = [0,1])
chi_w << cont

# \chi(i\omega_n) reconstructed from the solution
chi_rec_iw = chi_iw.copy()
chi_rec_iw << cont

# On master node, save results to an archive
if mpi.is_master_node():
    with HDFArchive("results.h5",'w') as ar:
        ar['chi_iw'] = chi_iw
        ar['chi_rec_iw'] = chi_rec_iw
        ar['chi_w'] = chi_w
        ar['histograms'] = cont.histograms

Download input file example.h5.

Plot input and reconstructed correlators at Matsubara frequencies

from pytriqs.gf.local import *
from pytriqs.archive import HDFArchive
from matplotlib import pyplot as plt
from pytriqs.plot.mpl_interface import oplot

# Read data from archive
ar = HDFArchive('results.h5', 'r')

# Plot input and reconstructed \chi(i\omega_n), real parts
oplot(ar['chi_iw'][0,0],     mode='R', linewidth=0.8, label="$\chi'_0(i\\omega_n)$")
oplot(ar['chi_rec_iw'][0,0], mode='R', linewidth=0.8, label="$\chi'_\mathrm{0,rec}(i\\omega_n)$")
oplot(ar['chi_iw'][1,1],     mode='R', linewidth=0.8, label="$\chi'_1(i\\omega_n)$")
oplot(ar['chi_rec_iw'][1,1], mode='R', linewidth=0.8, label="$\chi'_\mathrm{1,rec}(i\\omega_n)$")

plt.xlim((0, 20))
plt.ylabel("$\chi'(i\\omega_n)$")
plt.legend(loc="upper center")
plt.show()

(Source code, png, hires.png, pdf)

../../_images/plot_chi_iw_00_00.png
# Plot input and reconstructed \chi(i\omega_n), imaginary parts
oplot(ar['chi_iw'][0,0],     mode='I', linewidth=0.8, label="$\chi''_0(i\\omega_n)$")
oplot(ar['chi_rec_iw'][0,0], mode='I', linewidth=0.8, label="$\chi''_\mathrm{0,rec}(i\\omega_n)$")
oplot(ar['chi_iw'][1,1],     mode='I', linewidth=0.8, label="$\chi''_1(i\\omega_n)$")
oplot(ar['chi_rec_iw'][1,1], mode='I', linewidth=0.8, label="$\chi''_\mathrm{1,rec}(i\\omega_n)$")

plt.xlim((0, 20))
plt.ylabel("$\chi(i\\omega_n)$")
plt.legend(loc="lower center")

(png, hires.png, pdf)

../../_images/plot_chi_iw_01_00.png

Plot the correlator on the real frequency axis

from pytriqs.gf.local import *
from pytriqs.archive import HDFArchive
from matplotlib import pyplot as plt
from pytriqs.plot.mpl_interface import oplot

# Read data from archive
ar = HDFArchive('results.h5', 'r')

# Plot imaginary part of the susceptibility on the real axis
oplot(ar['chi_w'][0,0], mode='I', linewidth=0.8, label="$\chi''_0(\\omega)$")
oplot(ar['chi_w'][1,1], mode='I', linewidth=0.8, label="$\chi''_1(\\omega)$")

plt.xlim((-5.0,5.0))
plt.ylim((-1.5,1.5))
plt.ylabel("$\chi(\\omega)$")
plt.legend(loc = "lower right")

(Source code, png, hires.png, pdf)

../../_images/plot_chi_w1.png