# #
# This file is distributed as part of the WannierBerri code #
# under the terms of the GNU General Public License. See the #
# file 'LICENSE' in the root directory of the WannierBerri #
# distribution, or http://www.gnu.org/copyleft/gpl.txt #
# #
# The WannierBerri code is hosted on GitHub: #
# https://github.com/stepan-tsirkin/wannier-berri #
# written by #
# Stepan Tsirkin, University of Zurich #
# #
# ------------------------------------------------------------
import numpy as np
import os
from termcolor import cprint
from ..fourier.rvectors import Rvectors
from .system_R import System_R
[docs]
class System_tb(System_R):
"""
System initialized from the `*_tb.dat` file, which can be written either by `Wannier90 <http://wannier.org>`__ code,
or composed by the user based on some tight-binding model.
See Wannier90 `code <https://github.com/wannier-developers/wannier90/blob/2f4aed6a35ab7e8b38dbe196aa4925ab3e9deb1b/src/hamiltonian.F90#L698-L799>`_
for details of the format.
Parameters
----------
tb_file : str
name (and path) of file to be read
convention_II_to_I : bool
By default, the tb file in wannier90 format is in the convention II, which is different from the convention I used in wannierberri.
If the file is already in the convention I, set this parameter to False.
wannier_centers_cart : np.ndarray(num_wann, 3)
If provided, will override the wannier centers read from the file. (and hence they will be subtracted from the AA_R matrix if convention_II_to_I is True)
Notes
-----
see also parameters of the :class:`~wannierberri.system.System`
"""
def __init__(self, tb_file="wannier90_tb.dat",
convention_II_to_I=True,
wannier_centers_cart=None,
**parameters):
if "name" not in parameters:
parameters["name"] = os.path.splitext(os.path.split(tb_file)[-1])[0]
super().__init__(**parameters)
for key in self.needed_R_matrices:
if key not in ['Ham', 'AA']:
raise ValueError(f"System_tb class cannot be used for evaluation of {key}_R")
self.seedname = tb_file.split("/")[-1].split("_")[0]
f = open(tb_file, "r")
line = f.readline().strip()
cprint(f"reading TB file {tb_file} ( {line} )", 'green', attrs=['bold'])
self.real_lattice = np.array([f.readline().split()[:3] for _ in range(3)], dtype=float)
self.num_wann = int(f.readline())
nRvec = int(f.readline())
Ndegen = []
while len(Ndegen) < nRvec:
Ndegen += f.readline().split()
Ndegen = np.array(Ndegen, dtype=int)
iRvec = []
Ham_R = np.zeros((nRvec, self.num_wann, self.num_wann), dtype=complex)
for ir in range(nRvec):
f.readline()
iRvec.append(f.readline().split())
hh = np.array(
[[f.readline().split()[2:4] for _ in range(self.num_wann)] for _ in range(self.num_wann)],
dtype=float).transpose((1, 0, 2))
Ham_R[ir] = (hh[:, :, 0] + 1j * hh[:, :, 1]) / Ndegen[ir]
self.set_R_mat('Ham', Ham_R)
iRvec = np.array(iRvec, dtype=int)
iR0 = Rvectors(lattice=self.real_lattice, iRvec=iRvec).iR0
if 'AA' in self.needed_R_matrices:
AA_R = np.zeros((nRvec, self.num_wann, self.num_wann, 3), dtype=complex)
for ir in range(nRvec):
f.readline()
assert np.all(np.array(f.readline().split(), dtype=int) == iRvec[ir])
aa = np.array(
[[f.readline().split()[2:8] for _ in range(self.num_wann)] for _ in range(self.num_wann)],
dtype=float)
AA_R[ir] = (aa[:, :, 0::2] + 1j * aa[:, :, 1::2]).transpose((1, 0, 2)) / Ndegen[ir]
if wannier_centers_cart is None:
wannier_centers_cart = np.diagonal(AA_R[iR0], axis1=0, axis2=1).T.copy().real
if convention_II_to_I:
# convert to convention I
# print(f"convention_II_to_I = {convention_II_to_I} wannier_centers_cart = \n{wannier_centers_cart}\n num_wann = {self.num_wann}, A.shape = {AA_R.shape}")
AA_R[iR0, np.arange(self.num_wann), np.arange(self.num_wann), :] -= wannier_centers_cart
self.set_R_mat('AA', AA_R)
elif wannier_centers_cart is None:
wannier_centers_cart = np.zeros((3, self.num_wann), dtype=float)
for ir in range(iR0):
f.readline()
assert np.all(np.array(f.readline().split(), dtype=int) == iRvec[ir])
for _ in range(self.num_wann**2):
f.readline()
ir = iR0
f.readline()
assert np.all(np.array(f.readline().split(), dtype=int) == iRvec[ir])
aa = np.array(
[[f.readline().split()[2:8] for _ in range(self.num_wann)] for _ in range(self.num_wann)],
dtype=float)
aa = (aa[:, :, 0::2] + 1j * aa[:, :, 1::2]).transpose((1, 0, 2)) / Ndegen[ir]
wannier_centers_cart = np.diagonal(aa, axis1=0, axis2=1).T.real
self.wannier_centers_cart = wannier_centers_cart
self.clear_cached_wcc()
self.rvec = Rvectors(
lattice=self.real_lattice,
iRvec=iRvec,
shifts_left_red=self.wannier_centers_red,
)
f.close()
self.do_at_end_of_init()
cprint(f"Reading the system from {tb_file} finished successfully", 'green', attrs=['bold'])