Quantum Monte Carlo

Running QMC simulation

As an example for Quantum Monte Carlo simulation we show simulation of the effective local moment of the impurity with decreasing temperature due to Kondo screening, with semielliptical density of states is used as a hybridization function.

First we import all required python modules

from pyalps.hdf5 import archive       # hdf5 interface
import pyalps.cthyb as cthyb      # the solver module
import matplotlib.pyplot as plt   # for plotting results
from numpy import exp,log,sqrt,pi # some math

Generate a sequence of $10$ temperatures between $0.05$ and $100.0$ which are equidistant on a logarithmic scale

N_T  = 10    # number of temperatures
Tmin = 0.05  # maximum temperature
Tmax = 100.0 # minimum temperature
Tdiv = exp(log(Tmax/Tmin)/N_T)
T=Tmax
Tvalues=[]
for i in range(N_T+1):
  Tvalues.append(T)
  T/=Tdiv

Set up the values of onsite interaction, number of time points and timelimit for each simulation

Uvalues=[0.,2.] # the values of the on-site interaction
N_TAU = 1000    # number of tau-points; must be large enough for the lowest temperature (set to at least 5*BETA*U)
runtime = 5     # solver runtime (in seconds)

Setup the parameters for the simulation

values=[[] for u in Uvalues]
errors=[[] for u in Uvalues]
parameters=[]
for un,u in enumerate(Uvalues):
    for t in Tvalues:
        # prepare the input parameters; they can be used inside the script and are passed to the solver
        parameters.append(
         {
           # solver parameters
           'SWEEPS'             : 1000000000,                         # sweeps to be done
           'THERMALIZATION'     : 1000,                               # thermalization sweeps to be done
           'SEED'               : 42,                                 # random number seed
           'N_MEAS'             : 10,                                 # number of sweeps after which a measurement is done
           'N_ORBITALS'         : 2,                                  # number of 'orbitals', i.e. number of spin-orbital degrees of freedom or segments
           'BASENAME'           : "hyb.param_U%.1f_BETA%.3f"%(u,1/t), # base name of the h5 output file
           'MAX_TIME'           : runtime,                            # runtime of the solver per iteration
           'VERBOSE'            : 1,                                  # whether to output extra information
           'TEXT_OUTPUT'        : 0,                                  # whether to write results in human readable (text) format
           # file names
           'DELTA'              : "Delta_BETA%.3f.h5"%(1/t),          # file name of the hybridization function
           'DELTA_IN_HDF5'      : 1,                                  # whether to read the hybridization from an h5 archive
           # physical parameters
           'U'                  : u,                                  # Hubbard repulsion
           'MU'                 : u/2.,                               # chemical potential
           'BETA'               : 1/t,                                # inverse temperature
           # measurements
           'MEASURE_nnw'        : 1,                                  # measure the density-density correlation function (local susceptibility) on Matsubara frequencies
           'MEASURE_time'       : 0,                                  # turn of imaginary-time measurement
           # measurement parameters
           'N_HISTOGRAM_ORDERS' : 50,                                 # maximum order for the perturbation order histogram
           'N_TAU'              : N_TAU,                              # number of imaginary time points (tau_0=0, tau_N_TAU=BETA)
           'N_MATSUBARA'        : int(N_TAU/(2*pi)),                  # number of Matsubara frequencies
           'N_W'                : 1,                                  # number of bosonic Matsubara frequencies for the local susceptibility
           # additional parameters (used outside the solver only)
           't'                  : 1,                                  # hopping
           'Un'                 : un,                                 # interaction point
         }
        )

For each set of parameters setup hybridization function

for parms in parameters:
    ar=archive(parms['BASENAME']+'.out.h5','a')
    ar['/parameters']=parms
    del ar
    print("creating initial hybridization...").
    g=[]
    I=complex(0.,1.)
    mu=0.0
    for n in range(parms['N_MATSUBARA']):
        w=(2*n+1)*pi/parms['BETA']
        g.append(2.0/(I*w+mu+I*sqrt(4*parms['t']**2-(I*w+mu)**2))) # use GF with semielliptical DOS
    delta=[]
    for i in range(parms['N_TAU']+1):
        tau=i*parms['BETA']/parms['N_TAU']
        g0tau=0.0;
        for n in range(parms['N_MATSUBARA']):
            iw=complex(0.0,(2*n+1)*pi/parms['BETA'])
            g0tau+=((g[n]-1.0/iw)*exp(-iw*tau)).real # Fourier transform with tail subtracted
        g0tau *= 2.0/parms['BETA']
        g0tau += -1.0/2.0 # add back contribution of the tail
        delta.append(parms['t']**2*g0tau) # delta=t**2 g

    # write hybridization function to hdf5 archive (solver input)
    ar=archive(parms['DELTA'],'w')
    for m in range(parms['N_ORBITALS']):
        ar['/Delta_%i'%m]=delta
    del ar

and run Monte Carlo simulation

for parms in parameters:
    # solve the impurity model in parallel
    cthyb.solve(parms)

After simulation is finished, we obtain results for each set of parameters, postprocess them and plot

for parms in parameters:
    # extract the local spin susceptiblity
    ar=archive(parms['BASENAME']+'.out.h5','w')
    nn_0_0=ar['simulation/results/nnw_re_0_0/mean/value']
    nn_1_1=ar['simulation/results/nnw_re_1_1/mean/value']
    nn_1_0=ar['simulation/results/nnw_re_1_0/mean/value']
    dnn_0_0=ar['simulation/results/nnw_re_0_0/mean/error']
    dnn_1_1=ar['simulation/results/nnw_re_1_1/mean/error']
    dnn_1_0=ar['simulation/results/nnw_re_1_0/mean/error']

    nn  = nn_0_0 + nn_1_1 - 2*nn_1_0
    dnn = sqrt(dnn_0_0**2 + dnn_1_1**2 + ((2*dnn_1_0)**2) )

    ar['chi']=nn/4.
    ar['dchi']=dnn/4.

    del ar
    T=1/parms['BETA']
    values[parms['Un']].append(T*nn[0])
    errors[parms['Un']].append(T*dnn[0])

plt.figure()
plt.xlabel(r'$T$')
plt.ylabel(r'$4T\chi_{dd}$')
plt.title('Kondo screening of an impurity\n(using the hybridization expansion impurity solver)')
for un in range(len(Uvalues)):
    plt.errorbar(Tvalues, values[un], yerr=errors[un], label="U=%.1f"%Uvalues[un])
plt.xscale('log')
plt.legend()
plt.show()

After that you will have following plot kondo