[关闭]
@zhouhuibin 2021-03-17T08:09:53.000000Z 字数 5650 阅读 690

Kagome能带的数值解法

Python


不考虑SOC

import matplotlib.pyplot as plt
import numpy as np
import os
from matplotlib.ticker import MultipleLocator
from find_data import load_elecdata
from scipy.interpolate import griddata
from find_data import load_elecdata,load_fulldata
from pymodelfit.builtins import LinearModel
import math
from fractions import Fraction

# empty array
k_1 = []
k_2 = []
k_3 = []
band_0 = []
band_1 = []
band_2 = []
k_distance = []
k_spacer = 0

# basis vector of real space
a1 = np.array([1,0])
a2 = np.array([Fraction(1,2),np.sqrt(3)/2])
# extra basis
a3 = np.array([-Fraction(1,2),np.sqrt(3)/2]) 

# basis vector of reciprocal space
b1 = 3.1415926*np.array([1,-1/np.sqrt(3)]) 
b2 = 3.1415926*np.array([0,2/np.sqrt(3)]) 

# high symmetry point
Gamma = np.array([0,0])
K = 3.1415926*np.array([Fraction(1,3),1/np.sqrt(3)])
M = 3.1415926*np.array([0, 1/np.sqrt(3)])
print a2

number_band = 3

savepath = maindir = r'D:\Zhouhuibin\20200309_Lab\data\000_python code\exercise\band structure of kagome'

# high symmetry line
k_line = np.array([M, Gamma, K, M])


for i in range(k_line.shape[0]-1):    
    k_xi = np.linspace(k_line[i,0],k_line[i+1,0],101) # kx sample in high-symmetry line
    if k_line[i,0] == k_line[i+1,0]:
        k_yi = np.linspace(k_line[i,1],k_line[i+1,1],101)
    elif k_line[i,1] == k_line[i+1,1]:
        k_yi = np.linspace(k_line[i,1],k_line[i+1,1],101)
    else:
        slope_xy = (k_line[i+1,1]-k_line[i,1])/(k_line[i+1,0]-k_line[i,0])
        k_yi = slope_xy*(k_xi - k_line[i,0]) + k_line[i,1] # interpolate ky from kx

    k_1i = k_xi*a1[0]+k_yi*a1[1]
    k_2i = k_xi*a2[0]+k_yi*a2[1]
    k_3i = k_xi*a3[0]+k_yi*a3[1]

    k_1.extend(k_1i)
    k_2.extend(k_2i)
    k_3.extend(k_3i)

    if i > 0:     
        #compute the distances between high-symmetric points
        k_spacer =  k_spacer + np.sqrt(pow((k_line[i,0]-k_line[i-1,0]),2) + pow((k_line[i,1]-k_line[i-1,1]),2))
        print i,k_spacer
    #compute the distances between k points
    k_distance_i = np.sqrt(pow((k_xi-k_line[i,0]),2) + pow((k_yi-k_line[i,1]),2)) + k_spacer
    k_distance.extend(k_distance_i)

k_1 = np.array(k_1)
k_2 = np.array(k_2)
k_3 = np.array(k_3)

t = 1
for i in range(len(k_1)):
    k_1i = k_1[i]
    k_2i = k_2[i]
    k_3i = k_3[i]
    H = 2*t*np.array([[0, np.cos(k_1i), np.cos(k_2i)],[np.cos(k_1i), 0, np.cos(k_3i)],[np.cos(k_2i), np.cos(k_3i), 0]])
    E = np.linalg.eig(H)
    band_0.append(E[0][0])
    band_1.append(E[0][1])
    band_2.append(E[0][2])


# BandData Title 
BandData = np.r_[[k_distance],[band_0],[band_1],[band_2]]
BandData = np.transpose(BandData)

BandDATA = os.path.join(maindir,'kagome_band_without SOC_numerical solution_matrix method.txt')
np.savetxt(BandDATA, BandData)
openfile=open(BandDATA,'r+')
content = openfile.read()  
openfile.seek(0, 0)
openfile.write('k_point\t'+'band1\t'+'band2\t'+'band3\t'+'\n')
openfile.write('1/a\t'+'t\t'+'t\t'+'t\t'+'\n')
openfile.write('kagome\t'+'kagome\t'+'kagome\t'+'kagome\t'+'\n')
openfile.write('\n'+content)
openfile.close()

plt.cla()
plt.clf()
plt.plot(k_distance,band_0,'ro',k_distance,band_1,'ro',k_distance,band_2,'go')
plt.savefig(os.path.join(savepath,'kagome_band_without SOC_numerical solution_matrix method.png'))
plt.show()

考虑SOC

import matplotlib.pyplot as plt
import numpy as np
import os
from matplotlib.ticker import MultipleLocator
from find_data import load_elecdata
from scipy.interpolate import griddata
from find_data import load_elecdata,load_fulldata
from pymodelfit.builtins import LinearModel
import math
from fractions import Fraction

# empty array
k_1 = []
k_2 = []
k_3 = []
band_0 = []
band_1 = []
band_2 = []
k_distance = []
k_spacer = 0

# basis vector of real space
a1 = np.array([1,0])
a2 = np.array([Fraction(1,2),np.sqrt(3)/2])
# extra basis
a3 = np.array([-Fraction(1,2),np.sqrt(3)/2]) 

# basis vector of reciprocal space
b1 = 3.1415926*np.array([1,-1/np.sqrt(3)]) 
b2 = 3.1415926*np.array([0,2/np.sqrt(3)]) 

# high symmetry point
Gamma = np.array([0,0])
K = 3.1415926*np.array([Fraction(1,3),1/np.sqrt(3)])
M = 3.1415926*np.array([0, 1/np.sqrt(3)])

number_band = 3

savepath = maindir = r'D:\Zhouhuibin\20200309_Lab\data\000_python code\exercise\band structure of kagome'

# high symmetry line
k_line = np.array([M, Gamma, K, M])


for i in range(k_line.shape[0]-1):    
    k_xi = np.linspace(k_line[i,0],k_line[i+1,0],101) # kx sample in high-symmetry line
    if k_line[i,0] == k_line[i+1,0]:
        k_yi = np.linspace(k_line[i,1],k_line[i+1,1],101)
    elif k_line[i,1] == k_line[i+1,1]:
        k_yi = np.linspace(k_line[i,1],k_line[i+1,1],101)
    else:
        slope_xy = (k_line[i+1,1]-k_line[i,1])/(k_line[i+1,0]-k_line[i,0])
        k_yi = slope_xy*(k_xi - k_line[i,0]) + k_line[i,1] # interpolate ky from kx

    k_1i = k_xi*a1[0]+k_yi*a1[1]
    k_2i = k_xi*a2[0]+k_yi*a2[1]
    k_3i = k_xi*a3[0]+k_yi*a3[1]

    k_1.extend(k_1i)
    k_2.extend(k_2i)
    k_3.extend(k_3i)

    if i > 0:     
        #compute the distances between high-symmetric points
        k_spacer =  k_spacer + np.sqrt(pow((k_line[i,0]-k_line[i-1,0]),2) + pow((k_line[i,1]-k_line[i-1,1]),2))
        print i,k_spacer
    #compute the distances between k points
    k_distance_i = np.sqrt(pow((k_xi-k_line[i,0]),2) + pow((k_yi-k_line[i,1]),2)) + k_spacer
    k_distance.extend(k_distance_i)

k_1 = np.array(k_1)
k_2 = np.array(k_2)
k_3 = np.array(k_3)

lamda = 0.05
t = 1
for i in range(len(k_1)):
    k_1i = k_1[i]
    k_2i = k_2[i]
    k_3i = k_3[i]
    H = 2*lamda*np.array([[0, np.cos(k_2i+k_3i)*1j, -np.cos(k_3i-k_1i)*1j],[-np.cos(k_3i+k_2i)*1j, 0, np.cos(k_1i+k_2i)*1j],[np.cos(k_3i-k_1i)*1j, -np.cos(k_1i+k_2i)*1j, 0]]) + 2*t*np.array([[0, np.cos(k_1i), np.cos(k_2i)],[np.cos(k_1i), 0, np.cos(k_3i)],[np.cos(k_2i), np.cos(k_3i), 0]])
    E = np.linalg.eig(H)
    band_0.append(E[0][0])
    band_1.append(E[0][1])
    band_2.append(E[0][2])


# BandData Title 
BandData = np.r_[[k_distance],[band_0],[band_1],[band_2]]
BandData = np.transpose(BandData)

BandDATA = os.path.join(maindir,'kagome_band_with SOC_numerical solution_matrix method.txt')
np.savetxt(BandDATA, BandData)
openfile=open(BandDATA,'r+')
content = openfile.read()  
openfile.seek(0, 0)
openfile.write('k_point\t'+'band1\t'+'band2\t'+'band3\t'+'\n')
openfile.write('1/a\t'+'t\t'+'t\t'+'t\t'+'\n')
openfile.write('kagome\t'+'kagome\t'+'kagome\t'+'kagome\t'+'\n')
openfile.write('\n'+content)
openfile.close()

plt.cla()
plt.clf()
plt.plot(k_distance,band_0,'ro',k_distance,band_1,'ro',k_distance,band_2,'go')
plt.savefig(os.path.join(savepath,'kagome_band_with SOC_numerical solution_matrix method.png'))
plt.show()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注