Source code for tightbinder.main
#!/usr/bin/python
# Implementation of general tight-binding model based on the Slater-Koser approximation to parametrize
# the hopping amplitudes in term of the angles and orbitals between atoms.
# Requires an input file with the data regarding the model (dimensionality, number of atoms in motif, orbitals,
# interaction values)
import argparse
import sys
import time
import matplotlib.pyplot as plt
from tightbinder.fileparse import parse_config_file
from tightbinder.topology import calculate_wannier_centre_flow, calculate_z2_invariant, plot_wannier_centre_flow
from tightbinder.models import SlaterKoster
[docs]
def main():
""" Main routine """
# ------------------------------ Argument & file parsing ------------------------------
parser = argparse.ArgumentParser()
parser.add_argument('file', help='input file for tight-binding model')
parser.add_argument('-v', '--verbose', action='store_true', help='verbose output')
parser.add_argument('-cv', '--crystalview', action='store_true', help='3D view of the crystal')
parser.add_argument('-z2', '--z2invariant', action='store_true', help='Compute Z2 invariant')
parser.add_argument('-z2p', '--z2plot', action='store_true', help='Plot Wannier charge centers used for Z2 computation')
parser.add_argument('-e', '--export', action='store_true', help='Export model Hamiltonian to file')
args = parser.parse_args()
try:
file = open(args.file, 'r')
except IOError:
print('Error: Input file does not exist')
sys.exit(1)
configuration = parse_config_file(args.file)
if 'Radius' in configuration:
model = SlaterKoster(configuration, mode='radius', r=configuration['Radius'])
else:
model = SlaterKoster(configuration)
# Possible system modifications before initialize_hamiltonian
model.initialize_hamiltonian()
print(len(model.bonds))
if args.crystalview:
model.visualize()
if args.z2invariant:
wcc = calculate_wannier_centre_flow(model, 20)
z2 = calculate_z2_invariant(wcc)
print(f'Z2 invariant is: {z2}')
if args.z2plot:
plot_wannier_centre_flow(wcc, show_midpoints=True)
if args.export:
modelfile = args.file
# Remove extension if present and blanks
modelfile = modelfile.replace(".txt", '').strip() + ".model"
model.export_model(modelfile, fmt="%10.6f")
print(f"Written model to file {modelfile}")
labels = configuration['SymmetryPoints']
print(labels)
kpoints = model.high_symmetry_path(configuration['Mesh'][0], labels)
results = model.solve(kpoints)
results.plot_along_path(labels, title=f'{model.system_name}')
plt.show()
if __name__ == "__main__":
initial_time = time.time()
main()
print(f'Elapsed time: {time.time() - initial_time}s')