Reproduce band structure Kagome Fermi-Hubbard using Python

In summary, the article discusses the process of reproducing the band structure of the Kagome lattice in the context of the Fermi-Hubbard model using Python. It outlines the necessary theoretical background, including the significance of the Kagome lattice in condensed matter physics, and provides a step-by-step guide for implementing numerical simulations. The article emphasizes key methods for calculating the band structure, highlights relevant Python libraries, and presents the results, demonstrating the distinct features of the Kagome lattice's electronic properties.
  • #1
randomquestion
4
2
Homework Statement
I am trying to reproduce figure 5c) of https://arxiv.org/pdf/2002.03116.pdf in Python.
But I cannot spot my error in my attempt
Relevant Equations
$$\epsilon_{\boldsymbol{k}} / t = 2,-1 \pm \sqrt{3+2 \sum_{\nu=1}^3 \cos \left(\boldsymbol{k}\cdot e_{\nu}\right)}$$
We need to define a high symmetry point path in the Brillouin zone, we can choose: Gamma-K-M-Gamma

My attempt:


Code:
import numpy as np
import matplotlib.pyplot as plt

# lattice vectors
a1 = np.array([1, 0])
a2 = np.array([-1/2, np.sqrt(3)/2])
a3 = -(a1 + a2)
a = [a1,a2,a3]

#high symmetry points
Gamma = np.array([0, 0])
K = 2*np.pi*np.array([2/3, 0])
M = 2*np.pi*np.array([0, 1/np.sqrt(3)])


num_points = 100
k_path = np.concatenate([np.linspace(k_Gamma, k_K, num_points, endpoint=False),
                         np.linspace(k_K, k_M, num_points, endpoint=False),
                         np.linspace(k_M, k_Gamma, num_points)])


# Calculate energy eigenvalues for each k-point
energies = np.zeros((3, len(k_path)))
for i, k in enumerate(k_path):
    cos_sum = np.cos(np.dot(k,a[0]))+ np.cos(np.dot(k,a[1]))+np.cos(np.dot(k,a[2]))
    energies[:, i] = [2, -1 + np.sqrt(3 + 2*cos_sum), -1 - np.sqrt(3 + 2*cos_sum)]

   
   
# Plot the energy bands
plt.figure(figsize=(8, 6))
for band in range(3):
    plt.plot(np.arange(len(k_path)), energies[band], label=f'Band {band+1}')

plt.ylabel('Energy')

plt.grid(True)

plt.xticks([0, 3*num_points//3, 2*3*num_points//3, num_points*3], [r'$\Gamma$', 'K', 'M', r'$\Gamma$'])
 
Physics news on Phys.org
  • #2
I noticed that in your program the argument of the cosine function in the energy is ##\vec k \cdot \vec a_\nu##. But it looks to me that on page 8 of the paper, the argument is ##\vec k \cdot \vec a_\nu / 2##.

Also, would it make a difference in the energy band structure graph if you choose the "high-symmetry path" to be ##\Gamma## - ##K_2## - ##M_1## - ##\Gamma## rather than your choice of ##\Gamma## - ##K_2## - ##M_2## - ##\Gamma##? I ask mostly out of curiosity. I'm not knowledgeable in this field.
 
  • #3
1713399385369.png


In the paper at the top right of page 8, they write ##\vec M_1 = \dfrac{2\pi}{a}(0, \frac 1 {\sqrt 3})##. But, to me, this looks like the expression for ##\vec M_2##. Shouldn't ##\vec M_1## be ##\vec M_1 = \dfrac{2\pi}{a}(\frac 1 2, \frac 1 {2\sqrt 3})##?

I'm able to reproduce figure 5(c) using the path ##\Gamma##-##K_2##-##M_1##-##\Gamma## with ##\vec M_1 = \dfrac{2\pi}{a}(\frac 1 2, \frac 1 {2\sqrt 3})##. However, I have to follow your lead and use ##\vec k \cdot \vec a_\nu## instead of ##\vec k \cdot \vec a_\nu/2 ## for the argument of the cosine function.

If I construct the band structure graph using the path ##\Gamma##-##K_2##-##M_2##-##\Gamma## with ##\vec M_2 = \dfrac{2\pi}{a}(0, \frac 1 {\sqrt 3})##, I get a graph that differs from 5(c). That's not surprising. I think this is the graph that your code would produce:

1713401059123.png


Path ##\Gamma##-##K_1##-##M_2##-##\Gamma## should also reproduce 5(c) since this path is equivalent to ##\Gamma##-##K_2##-##M_1##-##\Gamma##.

I don't know Python, so I used different software.

[Edited to insert the clip of code.]
 
Last edited:
  • Like
Likes randomquestion
  • #4
Am I going insane? When I run your code I get the following which looks correct to me. The only thing I had to change was

##k_K \rightarrow K##

##k_M \rightarrow M##

##k_Gamma \rightarrow \Gamma##

4434A87F-AF8B-49B4-A952-899C09643EFB.jpeg
 
  • #5
Hello, thank you all for the replies. I found the source of my error. I have wrongly defined the K point.

It should be:

# high symmetry points
Gamma = np.array([0, 0])
K = 2*np.pi*np.array([1/3, 1/np.sqrt(3)])
M = 2*np.pi*np.array([0, 1/(np.sqrt(3))])


with this convention we get the correct plot (Fig. 5c).
 
  • Like
Likes TSny
  • #6
TSny said:
View attachment 343611

In the paper at the top right of page 8, they write ##\vec M_1 = \dfrac{2\pi}{a}(0, \frac 1 {\sqrt 3})##. But, to me, this looks like the expression for ##\vec M_2##. Shouldn't ##\vec M_1## be ##\vec M_1 = \dfrac{2\pi}{a}(\frac 1 2, \frac 1 {2\sqrt 3})##?

I'm able to reproduce figure 5(c) using the path ##\Gamma##-##K_2##-##M_1##-##\Gamma## with ##\vec M_1 = \dfrac{2\pi}{a}(\frac 1 2, \frac 1 {2\sqrt 3})##. However, I have to follow your lead and use ##\vec k \cdot \vec a_\nu## instead of ##\vec k \cdot \vec a_\nu/2 ## for the argument of the cosine function.

If I construct the band structure graph using the path ##\Gamma##-##K_2##-##M_2##-##\Gamma## with ##\vec M_2 = \dfrac{2\pi}{a}(0, \frac 1 {\sqrt 3})##, I get a graph that differs from 5(c). That's not surprising. I think this is the graph that your code would produce:

View attachment 343613

Path ##\Gamma##-##K_1##-##M_2##-##\Gamma## should also reproduce 5(c) since this path is equivalent to ##\Gamma##-##K_2##-##M_1##-##\Gamma##.

I don't know Python, so I used different software.

[Edited to insert the clip of code.]
thank you
 
  • #7
PhDeezNutz said:
Am I going insane? When I run your code I get the following which looks correct to me. The only thing I had to change was

##k_K \rightarrow K##

##k_M \rightarrow M##

##k_Gamma \rightarrow \Gamma##

View attachment 343629
The middle part of your graph, K -> M, differs from Figure 5(c) in the paper. This is due to point M in the paper's graph corresponding to M1. But M in @randomquestion's code is M2.

1713447456279.png


1713447536585.png


The first and last segments of the two graphs are the same.
 
  • Like
Likes randomquestion and PhDeezNutz

FAQ: Reproduce band structure Kagome Fermi-Hubbard using Python

What is the Kagome lattice and why is it important in condensed matter physics?

The Kagome lattice is a two-dimensional network of corner-sharing triangles. It is important in condensed matter physics because it hosts a variety of interesting phenomena, including geometrical frustration, topological order, and exotic quantum states. Its unique geometry allows for the study of correlated electron systems and the emergence of novel phases of matter.

What is the Fermi-Hubbard model and how does it relate to the Kagome lattice?

The Fermi-Hubbard model is a theoretical framework used to describe interacting fermions on a lattice. It incorporates both hopping terms, which allow particles to move between sites, and interaction terms, which account for the repulsion between particles. When applied to the Kagome lattice, the Fermi-Hubbard model helps in understanding the behavior of electrons in this geometry, including phenomena such as Mott insulators and superconductivity.

How can I implement the band structure calculation for the Kagome Fermi-Hubbard model in Python?

To implement the band structure calculation for the Kagome Fermi-Hubbard model in Python, you can use libraries such as NumPy for numerical operations and Matplotlib for visualization. You will need to define the Hamiltonian matrix for the system, calculate its eigenvalues and eigenvectors, and then plot the dispersion relation (band structure) over the desired momentum space. Additionally, libraries like Kwant or PySCF can be useful for more complex calculations.

What are some common challenges when reproducing the band structure of the Kagome Fermi-Hubbard model?

Common challenges include accurately defining the Hamiltonian, handling numerical instabilities, and ensuring that the lattice structure is correctly implemented. Additionally, interpreting the results can be complex, especially when dealing with many-body interactions and the emergence of various phases. Debugging the code and validating results against known benchmarks or experimental data can also be time-consuming.

Where can I find resources or tutorials for simulating the Kagome Fermi-Hubbard model in Python?

Resources for simulating the Kagome Fermi-Hubbard model in Python can be found in scientific literature, online repositories like GitHub, and educational platforms. Websites such as arXiv.org often have preprints of relevant research papers, while platforms like YouTube and Medium may host tutorials. Additionally, community forums like Stack Overflow or Physics Stack Exchange can provide assistance and insights from other researchers working in the field.

Back
Top