|
| 1 | +#!/usr/bin/env python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | + |
| 4 | +import logging |
| 5 | + |
| 6 | +import z2pack |
| 7 | +import numpy as np |
| 8 | +from numpy import cos, sin, kron, sqrt |
| 9 | +import matplotlib.pyplot as plt |
| 10 | + |
| 11 | +logging.getLogger('z2pack').setLevel(logging.WARNING) |
| 12 | + |
| 13 | +# defining pauli matrices |
| 14 | +identity = np.identity(2, dtype=complex) |
| 15 | +pauli_x = np.array([[0, 1], [1, 0]], dtype=complex) |
| 16 | +pauli_y = np.array([[0, -1j], [1j, 0]], dtype=complex) |
| 17 | +pauli_z = np.array([[1, 0], [0, -1]], dtype=complex) |
| 18 | + |
| 19 | +def get_kane_mele_hamiltonian(t, lambda_v, lambda_R, lambda_SO): |
| 20 | + def inner(k): |
| 21 | + k = np.array(k) * 2 * np.pi |
| 22 | + kx, ky, kz = k |
| 23 | + x = kx / 2 |
| 24 | + y = sqrt(3) * ky / 2 |
| 25 | + return ( |
| 26 | + t * (1 + 2 * cos(x) * cos(y)) * kron(pauli_x, identity) + |
| 27 | + lambda_v * kron(pauli_z, identity) + |
| 28 | + lambda_R * (1 - cos(x) * cos(y)) * kron(pauli_y, pauli_x) + |
| 29 | + -sqrt(3) * lambda_R * sin(x) * sin(y) * kron(pauli_y, pauli_y) + |
| 30 | + 2 * t * cos(x) * sin(y) * kron(pauli_y, identity) + |
| 31 | + lambda_SO * (2 * sin(2 * x) - 4 * sin(x) * cos(y)) * kron(pauli_z, pauli_z) + |
| 32 | + lambda_R * cos(x) * sin(y) * kron(pauli_x, pauli_x) + |
| 33 | + -sqrt(3) * lambda_R * sin(x) * cos(y) * kron(pauli_x, pauli_y) |
| 34 | + ) |
| 35 | + return inner |
| 36 | + |
| 37 | +def get_z2(hamiltonian): |
| 38 | + system = z2pack.hm.System(hamiltonian, bands=2) |
| 39 | + res = z2pack.surface.run(system=system, surface=lambda s, t: [s / 2, t, 0]) |
| 40 | + return z2pack.invariant.z2(res) |
| 41 | + |
| 42 | +if __name__ == '__main__': |
| 43 | + print('Z2 invariant: {}'.format(get_z2(get_kane_mele_hamiltonian(t=1, lambda_v=0.1, lambda_R=0.05, lambda_SO=0.06)))) |
0 commit comments