# 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/.
import numpy as np
# Import sile objects
from .sile import SileVASP
from ..sile import add_sile, sile_fh_open
from sisl._internal import set_module
__all__ = ['eigenvalSileVASP']
@set_module("sisl.io.vasp")
class eigenvalSileVASP(SileVASP):
""" Kohn-Sham eigenvalues """
[docs] @sile_fh_open()
def read_data(self, k=False):
r""" Read eigenvalues, as calculated and written by VASP
Parameters
----------
k : bool, optional
also return k points and weights
Returns
-------
numpy.ndarray : all eigenvalues, shape ``(ns, nk, nb)``
where ``ns`` number of spin-components, ``nk`` number of k-points and
``nb`` number of bands
numpy.ndarray : k-points (if `k` is true), shape ``(nk, 3)``
numpy.ndarray : weights for k-points (if `k` is true), shape ``(nk)``
"""
# read first line
line = self.readline() # NIONS, NIONS, NBLOCK * KBLOCK, NSPIN
ns = int(line.split()[-1])
line = self.readline() # AOMEGA, LATT_CUR%ANORM(1:3) *1e-10, POTIM * 1e-15
line = self.readline() # TEMP
line = self.readline() # ' CAR '
line = 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)
kk = 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
kk[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)
if k:
return eigs, kk, w
return eigs
add_sile('EIGENVAL', eigenvalSileVASP, gzip=True)