From 518d0ad09f82aa3011bd7bfcee1035173e8b4d55 Mon Sep 17 00:00:00 2001 From: guanjihuan Date: Thu, 30 Dec 2021 03:59:52 +0800 Subject: [PATCH] 39 --- API_reference.py | 1 + PyPI/setup.cfg | 2 +- .../guan/calculate_topological_invariant.py | 36 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/API_reference.py b/API_reference.py index f536154..29fce1c 100644 --- a/API_reference.py +++ b/API_reference.py @@ -98,6 +98,7 @@ guan.print_or_write_scattering_matrix(fermi_energy, h00, h01, length=100, on_pri # calculate topological invariant # Source code: https://py.guanjihuan.com/source-code/calculate_topological_invariant chern_number = guan.calculate_chern_number_for_square_lattice(hamiltonian_function, precision=100) +chern_number = guan.calculate_chern_number_for_honeycomb_lattice(hamiltonian_function, a=1, precision=300) wilson_loop_array = guan.calculate_wilson_loop(hamiltonian_function, k_min=-pi, k_max=pi, precision=100) # read and write # Source code: https://py.guanjihuan.com/read_and_write diff --git a/PyPI/setup.cfg b/PyPI/setup.cfg index 3531a70..d40984b 100644 --- a/PyPI/setup.cfg +++ b/PyPI/setup.cfg @@ -1,7 +1,7 @@ [metadata] # replace with your username: name = guan -version = 0.0.37 +version = 0.0.39 author = guanjihuan author_email = guanjihuan@163.com description = An open source python package diff --git a/PyPI/src/guan/calculate_topological_invariant.py b/PyPI/src/guan/calculate_topological_invariant.py index e667aef..5059faf 100644 --- a/PyPI/src/guan/calculate_topological_invariant.py +++ b/PyPI/src/guan/calculate_topological_invariant.py @@ -38,6 +38,42 @@ def calculate_chern_number_for_square_lattice(hamiltonian_function, precision=10 chern_number = chern_number/(2*pi*1j) return chern_number +def calculate_chern_number_for_honeycomb_lattice(hamiltonian_function, a=1, precision=300): + if np.array(hamiltonian_function(0, 0)).shape==(): + dim = 1 + else: + dim = np.array(hamiltonian_function(0, 0)).shape[0] + chern_number = np.zeros(dim, dtype=complex) + L1 = 4*sqrt(3)*pi/9/a + L2 = 2*sqrt(3)*pi/9/a + L3 = 2*pi/3/a + delta1 = 2*L1/precision + delta3 = 2*L3/precision + for kx in np.arange(-L1, L1, delta1): + for ky in np.arange(-L3, L3, delta3): + if (-L2<=kx<=L2) or (kx>L2 and -(L1-kx)*tan(pi/3)<=ky<=(L1-kx)*tan(pi/3)) or (kx<-L2 and -(kx-(-L1))*tan(pi/3)<=ky<=(kx-(-L1))*tan(pi/3)): + H = hamiltonian_function(kx, ky) + vector = guan.calculate_eigenvector(H) + H_delta_kx = hamiltonian_function(kx+delta1, ky) + vector_delta_kx = guan.calculate_eigenvector(H_delta_kx) + H_delta_ky = hamiltonian_function(kx, ky+delta3) + vector_delta_ky = guan.calculate_eigenvector(H_delta_ky) + H_delta_kx_ky = hamiltonian_function(kx+delta1, ky+delta3) + vector_delta_kx_ky = guan.calculate_eigenvector(H_delta_kx_ky) + for i in range(dim): + vector_i = vector[:, i] + vector_delta_kx_i = vector_delta_kx[:, i] + vector_delta_ky_i = vector_delta_ky[:, i] + vector_delta_kx_ky_i = vector_delta_kx_ky[:, i] + Ux = np.dot(np.conj(vector_i), vector_delta_kx_i)/abs(np.dot(np.conj(vector_i), vector_delta_kx_i)) + Uy = np.dot(np.conj(vector_i), vector_delta_ky_i)/abs(np.dot(np.conj(vector_i), vector_delta_ky_i)) + Ux_y = np.dot(np.conj(vector_delta_ky_i), vector_delta_kx_ky_i)/abs(np.dot(np.conj(vector_delta_ky_i), vector_delta_kx_ky_i)) + Uy_x = np.dot(np.conj(vector_delta_kx_i), vector_delta_kx_ky_i)/abs(np.dot(np.conj(vector_delta_kx_i), vector_delta_kx_ky_i)) + F = cmath.log(Ux*Uy_x*(1/Ux_y)*(1/Uy)) + chern_number[i] = chern_number[i] + F + chern_number = chern_number/(2*pi*1j) + return chern_number + def calculate_wilson_loop(hamiltonian_function, k_min=-pi, k_max=pi, precision=100): k_array = np.linspace(k_min, k_max, precision) dim = np.array(hamiltonian_function(0)).shape[0]