An effective 2D model (tight-binding)

In this example, we set up a tight-binding model for a quasi - 2D system. We consider 2 - sublattice square lattice with nearest-neighbour (inter-sublattice) and next - nearest - neighbour (intra-sublattice) hopping terms. For creating this model, the tbmodels package is used.

Using different parameters t1 and t2 and modifying the settings (currently they’re the default values) can give you a feeling of the different parameters. Try setting num_lines very low (e.g. 3) and see how the convergence criteria will affect the result.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import itertools

import z2pack
import tbmodels
import matplotlib.pyplot as plt

logging.getLogger('z2pack').setLevel(logging.WARNING)

t1, t2 = (0.2, 0.3)

settings = {
    'num_lines': 11,
    'pos_tol': 1e-2,
    'gap_tol': 2e-2,
    'move_tol': 0.3,
    'iterator': range(8, 27, 2),
    'min_neighbour_dist': 1e-2,
}

model = tbmodels.Model(
    on_site=(1, 1, -1, -1),
    pos=[[0., 0., 0.], [0., 0., 0.], [0.5, 0.5, 0.], [0.5, 0.5, 0.]],
    occ=2
)

for p, R in zip([1, 1j, -1j, -1], itertools.product([0, -1], [0, -1], [0])):
    model.add_hop(overlap=p * t1, orbital_1=0, orbital_2=2, R=R)
    model.add_hop(overlap=p.conjugate() * t1, orbital_1=1, orbital_2=3, R=R)

for R in ((r[0], r[1], 0) for r in itertools.permutations([0, 1])):
    model.add_hop(t2, 0, 0, R)
    model.add_hop(t2, 1, 1, R)
    model.add_hop(-t2, 2, 2, R)
    model.add_hop(-t2, 3, 3, R)

tb_system = z2pack.tb.System(model)

result = z2pack.surface.run(
    system=tb_system, surface=lambda s, t: [s / 2., t, 0], **settings
)

fig, ax = plt.subplots()
z2pack.plot.wcc(result, axis=ax)
plt.savefig('plots/wcc.pdf', bbox_inches='tight')

print(
    "t1: {0}, t2: {1}, Z2 invariant: {2}".format(
        t1, t2, z2pack.invariant.z2(result)
    )
)