From 9ea3d0a41e8daa5b80fee3647afad41901bc0323 Mon Sep 17 00:00:00 2001 From: guanjihuan Date: Thu, 25 Jan 2024 23:30:24 +0800 Subject: [PATCH] Update Wilson_loop_in_SSH_model.py --- .../Wilson_loop_in_SSH_model.py | 45 ++++++++----------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/2021.03.01_Wilson_loop_in_SSH_model/Wilson_loop_in_SSH_model.py b/2021.03.01_Wilson_loop_in_SSH_model/Wilson_loop_in_SSH_model.py index 64afdc6..02ef9d4 100644 --- a/2021.03.01_Wilson_loop_in_SSH_model/Wilson_loop_in_SSH_model.py +++ b/2021.03.01_Wilson_loop_in_SSH_model/Wilson_loop_in_SSH_model.py @@ -7,7 +7,6 @@ import numpy as np import cmath from math import * - def hamiltonian(k): # SSH模型哈密顿量 gamma = 0.5 lambda0 = 1 @@ -18,15 +17,14 @@ def hamiltonian(k): # SSH模型哈密顿量 h[1,0] = gamma+lambda0*cmath.exp(1j*k) return h - def main(): Num_k = 100 k_array = np.linspace(-pi, pi, Num_k) vector_array = [] for k in k_array: vector = get_occupied_bands_vectors(k, hamiltonian) - vector_array.append(vector) - # vector_array.append(vector*cmath.exp(1j*np.random.uniform(0, pi))) # 随机相位测试 + # vector_array.append(vector) + vector_array.append(vector*cmath.exp(1j*np.random.uniform(0, pi))) # 随机相位测试 # 波函数固定一个规范 vector_sum = 0 @@ -34,11 +32,9 @@ def main(): vector_sum += np.abs(vector_array[i0]) index = np.argmax(np.abs(vector_sum)) for i0 in range(Num_k): - vector_array[i0] = find_vector_with_fixed_gauge_by_making_one_component_real(vector_array[i0], index=index) - - # # 波函数固定一个规范 - # import guan - # vector_array = guan.find_vector_array_with_fixed_gauge_by_making_one_component_real(vector_array, precision=0.005) + angle = cmath.phase(vector_array[i0][index]) + vector_array[i0] = vector_array[i0]*cmath.exp(-1j*angle) + # vector_array[i0] = find_vector_with_fixed_gauge_by_making_one_component_real(vector_array[i0], index=index) # 或者使用这种寻找查找方法,计算效率比较低 # 计算Wilson loop W_k = 1 @@ -48,30 +44,27 @@ def main(): nu = np.log(W_k)/2/pi/1j # if np.real(nu) < 0: # nu += 1 - print('p=', nu, '\n') + print('p=', nu) - def get_occupied_bands_vectors(x, matrix): matrix0 = matrix(x) eigenvalue, eigenvector = np.linalg.eig(matrix0) vector = eigenvector[:, np.argsort(np.real(eigenvalue))[0]] return vector - -def find_vector_with_fixed_gauge_by_making_one_component_real(vector, precision=0.005, index=None): - if index == None: - index = np.argmax(np.abs(vector)) - sign_pre = np.sign(np.imag(vector[index])) - for phase in np.arange(0, 2*np.pi, precision): - sign = np.sign(np.imag(vector[index]*cmath.exp(1j*phase))) - if np.abs(np.imag(vector[index]*cmath.exp(1j*phase))) < 1e-9 or sign == -sign_pre: - break - sign_pre = sign - vector = vector*cmath.exp(1j*phase) - if np.real(vector[index]) < 0: - vector = -vector - return vector - +# def find_vector_with_fixed_gauge_by_making_one_component_real(vector, precision=0.005, index=None): +# if index == None: +# index = np.argmax(np.abs(vector)) +# sign_pre = np.sign(np.imag(vector[index])) +# for phase in np.arange(0, 2*np.pi, precision): +# sign = np.sign(np.imag(vector[index]*cmath.exp(1j*phase))) +# if np.abs(np.imag(vector[index]*cmath.exp(1j*phase))) < 1e-9 or sign == -sign_pre: +# break +# sign_pre = sign +# vector = vector*cmath.exp(1j*phase) +# if np.real(vector[index]) < 0: +# vector = -vector +# return vector if __name__ == '__main__': main() \ No newline at end of file