Source code for meanfi.tb.utils

from itertools import product
import numpy as np

from meanfi.tb.tb import _tb_type
from meanfi.mf import fermi_on_kgrid
from meanfi.tb.transforms import tb_to_kgrid


[docs] def guess_tb( tb_keys: list[tuple[None] | tuple[int, ...]], ndof: int, scale: float = 1 ) -> _tb_type: """Generate hermitian guess tight-binding dictionary. Parameters ---------- tb_keys : List of hopping vectors (tight-binding dictionary keys) the guess contains. ndof : Number internal degrees of freedom within the unit cell. scale : Scale of the random guess. Returns ------- : Hermitian guess tight-binding dictionary. """ guess = {} for vector in tb_keys: if vector not in guess.keys(): amplitude = scale * np.random.rand(ndof, ndof) phase = 2 * np.pi * np.random.rand(ndof, ndof) rand_hermitian = amplitude * np.exp(1j * phase) if np.linalg.norm(np.array(vector)) == 0: rand_hermitian += rand_hermitian.T.conj() rand_hermitian /= 2 guess[vector] = rand_hermitian else: guess[vector] = rand_hermitian guess[tuple(-np.array(vector))] = rand_hermitian.T.conj() return guess
[docs] def generate_tb_keys(cutoff: int, dim: int) -> list[tuple[None] | tuple[int, ...]]: """Generate tight-binding dictionary keys up to a cutoff. Parameters ---------- cutoff : Maximum distance along each dimension to generate tight-bindign dictionary keys for. dim : Dimension of the tight-binding dictionary. Returns ------- : List of generated tight-binding dictionary keys up to a cutoff. """ return [*product(*([[*range(-cutoff, cutoff + 1)]] * dim))]
[docs] def fermi_energy(tb: _tb_type, filling: float, nk: int = 100): """ Calculate the Fermi energy of a given tight-binding dictionary. Parameters ---------- tb : Tight-binding dictionary. filling : Number of particles in a unit cell. Used to determine the Fermi level. nk : Number of k-points in a grid to sample the Brillouin zone along each dimension. If the system is 0-dimensional (finite), this parameter is ignored. Returns ------- : Fermi energy. """ kham = tb_to_kgrid(tb, nk) vals = np.linalg.eigvalsh(kham) return fermi_on_kgrid(vals, filling)