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 | # 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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user