calculate_chern_number_for_square_lattice_with_Wilson_loop
This commit is contained in:
parent
c2409871c9
commit
44ea172ead
@ -99,6 +99,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
|
# 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_square_lattice(hamiltonian_function, precision=100)
|
||||||
|
chern_number = guan.calculate_chern_number_for_square_lattice_with_Wilson_loop(hamiltonian_function, precision_of_plaquettes=10, precision_of_Wilson_loop=100)
|
||||||
chern_number = guan.calculate_chern_number_for_honeycomb_lattice(hamiltonian_function, a=1, precision=300)
|
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)
|
wilson_loop_array = guan.calculate_wilson_loop(hamiltonian_function, k_min=-pi, k_max=pi, precision=100)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[metadata]
|
[metadata]
|
||||||
# replace with your username:
|
# replace with your username:
|
||||||
name = guan
|
name = guan
|
||||||
version = 0.0.42
|
version = 0.0.43
|
||||||
author = guanjihuan
|
author = guanjihuan
|
||||||
author_email = guanjihuan@163.com
|
author_email = guanjihuan@163.com
|
||||||
description = An open source python package
|
description = An open source python package
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
# Hamiltonian of finite size systems
|
# Hamiltonian of finite size systems
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
import guan
|
||||||
|
|
||||||
def finite_size_along_one_direction(N, on_site=0, hopping=1, period=0):
|
def finite_size_along_one_direction(N, on_site=0, hopping=1, period=0):
|
||||||
on_site = np.array(on_site)
|
on_site = np.array(on_site)
|
||||||
@ -106,9 +107,9 @@ def hopping_along_zigzag_direction_for_graphene(N):
|
|||||||
return hopping
|
return hopping
|
||||||
|
|
||||||
def finite_size_along_two_directions_for_graphene(N1, N2, period_1=0, period_2=0):
|
def finite_size_along_two_directions_for_graphene(N1, N2, period_1=0, period_2=0):
|
||||||
on_site = finite_size_along_one_direction(4)
|
on_site = guan.finite_size_along_one_direction(4)
|
||||||
hopping_1 = hopping_along_zigzag_direction_for_graphene(1)
|
hopping_1 = guan.hopping_along_zigzag_direction_for_graphene(1)
|
||||||
hopping_2 = np.zeros((4, 4), dtype=complex)
|
hopping_2 = np.zeros((4, 4), dtype=complex)
|
||||||
hopping_2[3, 0] = 1
|
hopping_2[3, 0] = 1
|
||||||
hamiltonian = finite_size_along_two_directions_for_square_lattice(N1, N2, on_site, hopping_1, hopping_2, period_1, period_2)
|
hamiltonian = guan.finite_size_along_two_directions_for_square_lattice(N1, N2, on_site, hopping_1, hopping_2, period_1, period_2)
|
||||||
return hamiltonian
|
return hamiltonian
|
@ -38,6 +38,45 @@ def calculate_chern_number_for_square_lattice(hamiltonian_function, precision=10
|
|||||||
chern_number = chern_number/(2*pi*1j)
|
chern_number = chern_number/(2*pi*1j)
|
||||||
return chern_number
|
return chern_number
|
||||||
|
|
||||||
|
def calculate_chern_number_for_square_lattice_with_Wilson_loop(hamiltonian_function, precision_of_plaquettes=10, precision_of_Wilson_loop=100):
|
||||||
|
delta = 2*pi/precision_of_plaquettes
|
||||||
|
chern_number = 0
|
||||||
|
for kx in np.arange(-pi, pi, delta):
|
||||||
|
for ky in np.arange(-pi, pi, delta):
|
||||||
|
vector_array = []
|
||||||
|
# line_1
|
||||||
|
for i0 in range(precision_of_Wilson_loop+1):
|
||||||
|
H_delta = hamiltonian_function(kx+delta/precision_of_Wilson_loop*i0, ky)
|
||||||
|
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||||
|
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))]
|
||||||
|
vector_array.append(vector_delta)
|
||||||
|
# line_2
|
||||||
|
for i0 in range(precision_of_Wilson_loop):
|
||||||
|
H_delta = hamiltonian_function(kx+delta, ky+delta/precision_of_Wilson_loop*(i0+1))
|
||||||
|
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||||
|
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))]
|
||||||
|
vector_array.append(vector_delta)
|
||||||
|
# line_3
|
||||||
|
for i0 in range(precision_of_Wilson_loop):
|
||||||
|
H_delta = hamiltonian_function(kx+delta-delta/precision_of_Wilson_loop*(i0+1), ky+delta)
|
||||||
|
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||||
|
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))]
|
||||||
|
vector_array.append(vector_delta)
|
||||||
|
# line_4
|
||||||
|
for i0 in range(precision_of_Wilson_loop-1):
|
||||||
|
H_delta = hamiltonian_function(kx, ky+delta-delta/precision_of_Wilson_loop*(i0+1))
|
||||||
|
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||||
|
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))]
|
||||||
|
vector_array.append(vector_delta)
|
||||||
|
Wilson_loop = 1
|
||||||
|
for i0 in range(len(vector_array)-1):
|
||||||
|
Wilson_loop = Wilson_loop*np.dot(vector_array[i0].transpose().conj(), vector_array[i0+1])
|
||||||
|
Wilson_loop = Wilson_loop*np.dot(vector_array[len(vector_array)-1].transpose().conj(), vector_array[0])
|
||||||
|
arg = np.log(np.diagonal(Wilson_loop))/1j
|
||||||
|
chern_number = chern_number + arg
|
||||||
|
chern_number = chern_number/(2*pi)
|
||||||
|
return chern_number
|
||||||
|
|
||||||
def calculate_chern_number_for_honeycomb_lattice(hamiltonian_function, a=1, precision=300):
|
def calculate_chern_number_for_honeycomb_lattice(hamiltonian_function, a=1, precision=300):
|
||||||
if np.array(hamiltonian_function(0, 0)).shape==():
|
if np.array(hamiltonian_function(0, 0)).shape==():
|
||||||
dim = 1
|
dim = 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user