Intersite interactions

In this tutorial, we calculate the intersite interactions of the single band Hubbard model on the square lattice. For details of the intersite interactions, see Intersite interactions in Algorithms. Sample files for this tutorial are available at examples/square_Ir.

Model

The model parameters such as \(U\) are the same as in the previous tutorial. The input file of DCore is dmft_square.in:

[model]
seedname = square
lattice = wannier90
norb = 1
nelec = 1.0
t = -1.0
kanamori = [(8.0, 0.0, 0.0)]
nk0 = 32
nk1 = 32
nk2 = 1

#[mpi]
#command = "mpirun -n #"

[system]
T = 0.5
n_iw = 1024
mu = 4.0
fix_mu = True

[impurity_solver]
name = pomerol
exec_path{str} = pomerol2dcore
n_bath{int} = 0
fit_gtol{float} = 1e-6

[control]
max_step = 10
sigma_mix = 1.0
converge_tol = 1e-5
n_converge = 3

[bse]
num_wb = 1
num_wf = 20
X0q_qpoints_saved = "q_fbz.dat"

Compared to the previous example, the X0q_qpoints_saved parameter in the [bse] section is set to q_fbz.dat from q_path.dat. This is because we need to calculate the intersite interactions for all the points in the BZ (fbz means full Brillouin zone) in order to perform FFT from the momentum space to the real space.

Workflow

Calculation of susceptibility \(\chi(q)\)

First, we perform the DMFT calculation as usual.

dcore_pre dmft_square.in
dcore --np 4 dmft_square.in

Before running dcore_chiq.py, we need to prepare the q_fbz.dat file by using the gen_allq.py script.

gen_allq.py dmft_square.in

Run dcore_chiq.py and chiq_main.py to calculate the susceptibility in the momentum space, \(\chi(q)\) and \(\chi_\text{loc}(q)\).

dcore_chiq.py --np 4 dmft_square.in
mpiexec -np 4 chiq_main.py bse.in

The input file of ChiQ tools, bse.in, is also the same as in the previous tutorial:

[chiq_common]
input = "dmft_bse.h5"
output = "dmft_bse.out.h5"
type = ["chi0", "bse"]  # "chi0", "bse", "scl", "rpa", "rrpa"
omega_q = "q_fbz.dat"

[chiq_main]
work_dir = "work/chiq"
# num_wf = 20  # If not specified, the value is determined from X_loc

[chiq_post]
output_dir = "bse"
mode = ["eigen"]  # "matrix_element", "eigen", "linear_combination"

# for mode="eigen"
#vector = true  # output eigenvectors
order = "file"  # "descend" (default), "overlap", "file"
order_file = "eigenvec.in"  # for order="file"

# for mode="linear_combination"
# coefs_file = "/path/to/coefs.in"

The only difference is that the q_fbz.dat file is used instead of q_path.dat in omega_q parameter in the [chiq_common] section.

Calculation of intersite interactions \(I(q)\) and \(I(r)\)

Once these susceptibilities are calculated, we can run calc_Iq.py to calculate the intersite interactions in the momentum space, \(I(q)\).

calc_Iq.py -f dmft_bse.out.h5 --remove 1

-f is used to specify the HDF5 file, which is the output file of chiq_main.py (in this case, dmft_bse.out.h5). --remove specifies the number of the modes to be removed to stabilize the calculation. In this case, we remove one mode with the smallest eigenvalue. The obtained \(I(q)\) is saved in the HDF5 file as dmft_bse.out.h5/bse/output/I_q.

Next, we perform the FFT from the momentum space \(I(q)\) to the real space \(I(r)\) by using chiq_fft.py.

chiq_fft.py -f dmft_bse.out.h5 --input_dname I_q --output_dname I_r dmft_square.in

-f is used to specify the HDF5 file, which is used in calc_Iq.py (in this case, dmft_bse.out.h5). --input_dname is used to specify the name of the dataset in the HDF5 file of \(I(q)\) (in this case, I_q). --output_dname is used to specify the name of the dataset in the HDF5 file of \(I(r)\) (in this case, I_r). In this case, chiq_fft.py reads the \(I(q)\) from dmft_bse.out.h5/bse/output/I_q and writes the \(I(r)\) to dmft_bse.out.h5/bse/output/I_r.

Finally, as in the case of \(\chi(q)\), we need to transform (or diagonalize) \(I(q)\) to \(I(r)\) by using chiq_post.py.

mpiexec --np 4 chiq_post.py bse.in

This also transforms \(I(q)\) and \(I(r)\) in the same way as \(\chi(q)\). The results, I_q_eigen.dat and I_r_eigen.dat, are saved in the directory specified by output_dir parameter in the [chiq_post] section of bse.in (in this case, bse directory). The file format is also the same as in the \(\chi(q)\) case.

Plotting the results

\(I(q)\) can be plotted in the same way as \(\chi(q)\) in the previous tutorial.

First, we prepare a q-path file, q_path.dat:

gen_qpath.py dmft_square.in qpath.in

Then, we plot \(I(q)\) as follows in the bse directory:

plot_chiq_path.py --label ../label2.in --mode=Iq ../q_path.in I_q_eigen.dat

The following figure I_q_eigen_path.pdf is saved.

../_images/I_q_eigen_path.png

\(I(q)\) calculated by the BSE.

On the other hand, \(I(r)\) can be plotted by using plot_Ir.py. This script plots \(I(r)\) as a function of the distance from the origin. In the bse directory, run the following command:

plot_Ir.py --label ../label2.in I_r_eigen.dat

The following figure I_r_eigen_distance.pdf is saved.

../_images/I_r_eigen_distance.png

\(I(r)\) calculated by the BSE.