Source code for sisl.io.vasp.eigenval

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from __future__ import annotations

import numpy as np

from sisl._internal import set_module
from sisl.messages import deprecate_argument
from sisl.typing import UnitsVar
from sisl.unit import serialize_units_arg, unit_convert

from ..sile import add_sile, sile_fh_open

# Import sile objects
from .sile import SileVASP

__all__ = ["eigenvalSileVASP"]


@set_module("sisl.io.vasp")
class eigenvalSileVASP(SileVASP):
    """Kohn-Sham eigenvalues"""

[docs] @sile_fh_open() @deprecate_argument( "k", "ret_k", "use ret_k instead of k", "0.15", "0.16", ) def read_data(self, ret_k: bool = False, units: UnitsVar = "eV"): r"""Read eigenvalues as calculated by VASP Parameters ---------- ret_k : also return k points and weights units : selects units in the returned data Returns ------- eigenvalues : numpy.ndarray all eigenvalues, shape ``(ns, nk, nb)`` where ``ns`` number of spin-components, ``nk`` number of k-points and ``nb`` number of bands k_points : numpy.ndarray k-points (if `ret_k` is true), shape ``(nk, 3)`` weights: numpy.ndarray weights for k-points (if `ret_k` is true), shape ``(nk)`` """ units = serialize_units_arg(units) eV2unit = unit_convert("eV", units["energy"]) # read first line line = self.readline() # NIONS, NIONS, NBLOCK * KBLOCK, NSPIN ns = int(line.split()[-1]) self.readline() # AOMEGA, LATT_CUR%ANORM(1:3) *1e-10, POTIM * 1e-15 self.readline() # TEMP self.readline() # ' CAR ' self.readline() # name line = list(map(int, self.readline().split())) # electrons, k-points, bands nk = line[1] nb = line[2] eigs = np.empty([ns, nk, nb], np.float64) k = np.empty([nk, 3], np.float64) w = np.empty([nk], np.float64) for ik in range(nk): self.readline() # empty line line = self.readline().split() # k-point, weight k[ik, :] = list(map(float, line[:3])) w[ik] = float(line[3]) for ib in range(nb): # band, eig_UP, eig_DOWN, pop_UP, pop_DOWN # We currently neglect the populations E = map(float, self.readline().split()[1 : ns + 1]) eigs[:, ik, ib] = list(E) eigs *= eV2unit if ret_k: return eigs, k, w return eigs
add_sile("EIGENVAL", eigenvalSileVASP, gzip=True)