Chirality of a Weyl point (tight-binding)

In this example, the chirality of a Weyl point is calculated for a tight-binding model of WTe2. This is done by calculating the Chern number on a sphere surrounding the Weyl point.

The Chern number is a measure for the flux of Berry curvature, thus it can be used to determine if the Weyl point is a source or sink of Berry curvature (i.e., determine its chirality).

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

import os
import lzma
import pickle
from contextlib import suppress

import z2pack
from tbmodels import Model
import matplotlib.pyplot as plt

MODEL_NAME = 'wte2_soc'
MODEL_SOURCE = os.path.join('data', MODEL_NAME + '.json')
MODEL_PATH = os.path.join('data', MODEL_NAME + '.p')

# creating the necessary subfolders
subfolders = ['results', 'plots']
for s in subfolders:
    with suppress(FileExistsError):

def calculate_chirality(tag, center, radius, overwrite=False, **kwargs):
    # converting the Model to the pickle format (which is quicker to load)
    # Note that keeping only the pickle format is dangerous, because it
    # may become unreadable -- use the JSON format for long-term saving.
        with open(MODEL_PATH, 'rb') as f:
            model = pickle.load(f)
    except IOError:
        # The .xz compression is used to avoid the GitHub file size limit
        with +
                       '.xz') as fin, open(MODEL_SOURCE, 'wb') as fout:

        model = Model.from_json_file(MODEL_SOURCE)
        with open(MODEL_PATH, 'wb') as f:
            pickle.dump(model, f, protocol=pickle.HIGHEST_PROTOCOL)

    system = z2pack.tb.System(model)
    full_name = MODEL_NAME + '_' + tag
    res =
        surface=z2pack.shape.Sphere(center, radius),
        save_file=os.path.join('results', full_name + '.p'),
        load=not overwrite,
    # Again, the pickle format is used because it is faster than JSON
    # or msgpack. If you wish to permanently store the result, use
    #, os.path.join('results', full_name + '.json'))
    print('Chern number:', z2pack.invariant.chern(res))

def plot_chirality(tag, ax):
    full_name = MODEL_NAME + '_' + tag
    res ='results', full_name + '.p'))
    z2pack.plot.chern(res, axis=ax)

if __name__ == "__main__":
    # calculate
    calculate_chirality('0', [0.1203, 0.05232, 0.], 0.005)
        '1', [0.1211, 0.02887, 0.], 0.005, iterator=range(10, 33, 2)

    # plot
    fig, ax = plt.subplots(
        1, 2, figsize=[4, 2], sharey=True, gridspec_kw=dict(wspace=0.3)
    ax[0].set_xticks([0, 1])
    ax[1].set_xticks([0, 1])
    ax[0].set_xticklabels([r'$-\pi$', r'$0$'])
    ax[1].set_xticklabels([r'$-\pi$', r'$0$'])
    ax[0].set_yticks([0, 1])
    ax[1].set_yticks([0, 1])
    ax[1].set_yticklabels([r'$0$', r'$2\pi$'])
    ax[0].set_ylabel(r'$\bar{\varphi}$', rotation='horizontal')
    ax[0].text(-0.2, 1.05, r'(a)', ha='right')
    ax[1].text(-0.05, 1.05, r'(b)', ha='right')
    plot_chirality('0', ax[0])
    plot_chirality('1', ax[1])
        'plots/WTe2_chirality.pdf', bbox_inches='tight', rasterized=True