calculate_chern_number_for_square_lattice_with_Wilson_loop
This commit is contained in:
		| @@ -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 | ||||
| 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) | ||||
| wilson_loop_array = guan.calculate_wilson_loop(hamiltonian_function, k_min=-pi, k_max=pi, precision=100) | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| [metadata] | ||||
| # replace with your username: | ||||
| name = guan | ||||
| version = 0.0.42 | ||||
| version = 0.0.43 | ||||
| author = guanjihuan | ||||
| author_email = guanjihuan@163.com | ||||
| description = An open source python package | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| # Hamiltonian of finite size systems | ||||
|  | ||||
| import numpy as np | ||||
| import guan | ||||
|  | ||||
| def finite_size_along_one_direction(N, on_site=0, hopping=1, period=0): | ||||
|     on_site = np.array(on_site) | ||||
| @@ -106,9 +107,9 @@ def hopping_along_zigzag_direction_for_graphene(N): | ||||
|     return hopping | ||||
|  | ||||
| def finite_size_along_two_directions_for_graphene(N1, N2, period_1=0, period_2=0): | ||||
|     on_site = finite_size_along_one_direction(4) | ||||
|     hopping_1 = hopping_along_zigzag_direction_for_graphene(1) | ||||
|     on_site = guan.finite_size_along_one_direction(4) | ||||
|     hopping_1 = guan.hopping_along_zigzag_direction_for_graphene(1) | ||||
|     hopping_2 = np.zeros((4, 4), dtype=complex) | ||||
|     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 | ||||
| @@ -38,6 +38,45 @@ 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_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): | ||||
|     if np.array(hamiltonian_function(0, 0)).shape==(): | ||||
|         dim = 1 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user