diff --git a/academic_codes/2022.11.07_band_folding_correspondence/band_folding_correspondence_1.py b/academic_codes/2022.11.07_band_folding_correspondence/band_folding_correspondence_1.py new file mode 100644 index 0000000..7c7dd17 --- /dev/null +++ b/academic_codes/2022.11.07_band_folding_correspondence/band_folding_correspondence_1.py @@ -0,0 +1,89 @@ +""" +This code is supported by the website: https://www.guanjihuan.com +The newest version of this code is on the web page: https://www.guanjihuan.com/archives/27605 +""" + +import guan +import numpy as np + + +# one dimensional chain model +unit_cell = 0 +hopping = 1 +hamiltonian_function_1 = guan.one_dimensional_fourier_transform_with_k(unit_cell, hopping) +k_array_1 = np.linspace(-np.pi, np.pi, 520) +eigenvalue_array_1 = guan.calculate_eigenvalue_with_one_parameter(k_array_1, hamiltonian_function_1) +# guan.plot(k_array_1, eigenvalue_array_1, xlabel='k', ylabel='E', style='k', title='one dimensional chain model') + + +# n times band folding +n = 7 +unit_cell = np.zeros((n, n)) +for i0 in range(int(n)): + for j0 in range(int(n)): + if abs(i0-j0)==1: + unit_cell[i0, j0] = 1 +hopping = np.zeros((n, n)) +hopping[0, n-1] = 1 +k_array_2 = np.linspace(-np.pi, np.pi, 500) +hamiltonian_function_2 = guan.one_dimensional_fourier_transform_with_k(unit_cell, hopping) +eigenvalue_array_2 = guan.calculate_eigenvalue_with_one_parameter(k_array_2, hamiltonian_function_2) +# guan.plot(k_array_2, eigenvalue_array_2, xlabel='k', ylabel='E', style='k', title='%i times band folding'%n) + + + +### 以下通过速度和能量查找能带折叠前后的对应关系 + + +# 获取速度 +velocity_array_1 = [] +for i0 in range(k_array_1.shape[0]-1): + velocity_1 = (eigenvalue_array_1[i0+1]-eigenvalue_array_1[i0])/(k_array_1[i0+1]-k_array_1[i0]) + velocity_array_1.append(velocity_1) + +# 获取速度 +velocity_array_2 = [] +for i0 in range(k_array_2.shape[0]-1): + velocity_2 = (eigenvalue_array_2[i0+1]-eigenvalue_array_2[i0])/(k_array_2[i0+1]-k_array_2[i0]) + velocity_array_2.append(velocity_2*n) + + +plt_1, fig_1, ax_1 = guan.import_plt_and_start_fig_ax() +plt_2, fig_2, ax_2 = guan.import_plt_and_start_fig_ax() +for i00 in range(n): + k_array_new_2 = [] + k_array_new_1 = [] + index_array_new_2 = [] + index_array_new_1 = [] + for i0 in range(k_array_2.shape[0]-1): + for j0 in range(k_array_1.shape[0]-1): + if abs(eigenvalue_array_2[i0][i00]-eigenvalue_array_1[j0])<1e-2 and abs(velocity_array_2[i0][i00]-velocity_array_1[j0])<1e-2: + k_array_new_2.append(k_array_2[i0]) + k_array_new_1.append(k_array_1[j0]) + index_array_new_2.append(i0) + index_array_new_1.append(j0) + if i00 == 0: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1], style='*r') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*r') + elif i00 == 1: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1], style='*b') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*b') + elif i00 == 2: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1], style='*g') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*g') + elif i00 == 3: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1], style='*c') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*c') + elif i00 == 4: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1], style='*m') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*m') + elif i00 == 5: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1], style='*y') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*y') + else: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1], style='*k') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*k') +guan.plot_without_starting_fig(plt_1, fig_1, ax_1, [], [], xlabel='k', ylabel='E', title='one dimensional chain model') +guan.plot_without_starting_fig(plt_2, fig_2, ax_2, [], [], xlabel='k', ylabel='E', title='%i times band folding'%n) +plt_1.show() +plt_2.show() \ No newline at end of file diff --git a/academic_codes/2022.11.07_band_folding_correspondence/band_folding_correspondence_2.py b/academic_codes/2022.11.07_band_folding_correspondence/band_folding_correspondence_2.py new file mode 100644 index 0000000..fd68e1c --- /dev/null +++ b/academic_codes/2022.11.07_band_folding_correspondence/band_folding_correspondence_2.py @@ -0,0 +1,96 @@ +""" +This code is supported by the website: https://www.guanjihuan.com +The newest version of this code is on the web page: https://www.guanjihuan.com/archives/27605 +""" + +import guan +import numpy as np + + +# double chain model with different potentials +unit_cell = np.array([[0, 0], [0, 0.5]]) +hopping = np.eye(2) +hamiltonian_function_1 = guan.one_dimensional_fourier_transform_with_k(unit_cell, hopping) +k_array_1 = np.linspace(-np.pi, np.pi, 600) +eigenvalue_array_1 = guan.calculate_eigenvalue_with_one_parameter(k_array_1, hamiltonian_function_1) +# guan.plot(k_array_1, eigenvalue_array_1, xlabel='k', ylabel='E', style='k', title='double chain model with different potentials') + +# n times band folding +n = 2 +unit_cell = np.zeros((2*n, 2*n)) +for i0 in range(int(n)): + for j0 in range(int(n)): + if abs(i0-j0)==1: + unit_cell[i0, j0] = 1 +for i0 in range(int(n)): + unit_cell[n+i0, n+i0] = 0.5 + for j0 in range(int(n)): + if abs(i0-j0)==1: + unit_cell[n+i0, n+j0] = 1 +hopping = np.zeros((2*n, 2*n)) +hopping[0, n-1] = 1 +hopping[n, 2*n-1] = 1 +hamiltonian_function_2 = guan.one_dimensional_fourier_transform_with_k(unit_cell, hopping) +k_array_2 = np.linspace(-np.pi, np.pi, 620) +eigenvalue_array_2 = guan.calculate_eigenvalue_with_one_parameter(k_array_2, hamiltonian_function_2) +# guan.plot(k_array_2, eigenvalue_array_2, xlabel='k', ylabel='E', style='k', title='%i times band folding'%n) + + + +### 以下通过速度和能量查找能带折叠前后的对应关系 + + +# 获取速度 +velocity_array_1 = [] +for i0 in range(k_array_1.shape[0]-1): + velocity_1 = (eigenvalue_array_1[i0+1]-eigenvalue_array_1[i0])/(k_array_1[i0+1]-k_array_1[i0]) + velocity_array_1.append(velocity_1) + +# 获取速度 +velocity_array_2 = [] +for i0 in range(k_array_2.shape[0]-1): + velocity_2 = (eigenvalue_array_2[i0+1]-eigenvalue_array_2[i0])/(k_array_2[i0+1]-k_array_2[i0]) + velocity_array_2.append(velocity_2*n) + +dim = 2 # 维度为两倍 + +plt_1, fig_1, ax_1 = guan.import_plt_and_start_fig_ax() +plt_2, fig_2, ax_2 = guan.import_plt_and_start_fig_ax() +for j00 in range(dim): + for i00 in range(n*dim): + k_array_new_2 = [] + k_array_new_1 = [] + index_array_new_2 = [] + index_array_new_1 = [] + for i0 in range(k_array_2.shape[0]-1): + for j0 in range(k_array_1.shape[0]-1): + if abs(eigenvalue_array_2[i0][i00]-eigenvalue_array_1[j0][j00])<1e-2 and abs(velocity_array_2[i0][i00]-velocity_array_1[j0][j00])<1e-2: + k_array_new_2.append(k_array_2[i0]) + k_array_new_1.append(k_array_1[j0]) + index_array_new_2.append(i0) + index_array_new_1.append(j0) + if i00 == 0 and j00 == 0: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1, j00], style='*r') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*r') + elif i00 == 0 and j00 == 1: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1, j00], style='*b') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*b') + elif i00 == 1 and j00 == 0: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1, j00], style='*g') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*g') + elif i00 == 1 and j00 == 1: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1, j00], style='*c') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*c') + elif i00 == 2 and j00 == 0: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1, j00], style='*m') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*m') + elif i00 == 2 and j00 == 1: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1, j00], style='*y') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*y') + else: + guan.plot_without_starting_fig(plt_1, fig_1, ax_1, k_array_new_1, eigenvalue_array_1[index_array_new_1, j00], style='*k') + guan.plot_without_starting_fig(plt_2, fig_2, ax_2, k_array_new_2, eigenvalue_array_2[index_array_new_2, i00], style='*k') +guan.plot_without_starting_fig(plt_1, fig_1, ax_1, [], [], xlabel='k', ylabel='E', title='one dimensional chain model') +guan.plot_without_starting_fig(plt_2, fig_2, ax_2, [], [], xlabel='k', ylabel='E', title='%i times band folding'%n) +plt_1.show() +plt_2.show() \ No newline at end of file