Source code for pyiron_atomistics.dft.waves.electronic

# coding: utf-8
# Copyright (c) Max-Planck-Institut für Eisenforschung GmbH - Computational Materials Design (CM) Department
# Distributed under the terms of "New BSD License", see the LICENSE file.

from __future__ import print_function

import numpy as np
from vaspparser.dft.waves.electronic import ElectronicStructure as _ElectronicStructure

from pyiron_atomistics.atomistics.structure.atoms import (
    Atoms,
    dict_group_to_hdf,
    structure_dict_to_hdf,
)

__author__ = "Sudarsan Surendralal"
__copyright__ = (
    "Copyright 2021, Max-Planck-Institut für Eisenforschung GmbH "
    "- Computational Materials Design (CM) Department"
)
__version__ = "1.0"
__maintainer__ = "Sudarsan Surendralal"
__email__ = "surendralal@mpie.de"
__status__ = "development"
__date__ = "Sep 1, 2017"


[docs] def electronic_structure_dict_to_hdf(data_dict, hdf, group_name): with hdf.open(group_name) as h_es: for k, v in data_dict.items(): if k not in ["structure", "dos"]: h_es[k] = v if "structure" in data_dict.keys(): structure_dict_to_hdf(data_dict=data_dict["structure"], hdf=h_es) dict_group_to_hdf(data_dict=data_dict, hdf=h_es, group="dos")
[docs] class ElectronicStructure(_ElectronicStructure):
[docs] def to_hdf(self, hdf, group_name="electronic_structure"): """ Store the object to hdf5 file Args: hdf: Path to the hdf5 file/group in the file group_name: Name of the group under which the attributes are o be stored """ electronic_structure_dict_to_hdf( data_dict=self.to_dict(), hdf=hdf, group_name=group_name )
[docs] def from_hdf(self, hdf, group_name="electronic_structure"): """ Retrieve the object from the hdf5 file Args: hdf: Path to the hdf5 file/group in the file group_name: Name of the group under which the attributes are stored """ if "dos" not in hdf[group_name].list_groups(): self.from_hdf_old(hdf=hdf, group_name=group_name) else: with hdf.open(group_name) as h_es: if "TYPE" not in h_es.list_nodes(): h_es["TYPE"] = str(type(self)) nodes = h_es.list_nodes() if self.structure is not None: self.structure.to_hdf(h_es) self.kpoint_list = h_es["k_points"] self.kpoint_weights = h_es["k_weights"] if len(h_es["eig_matrix"].shape) == 2: self.eigenvalue_matrix = np.array([h_es["eig_matrix"]]) self.occupancy_matrix = np.array([h_es["occ_matrix"]]) else: self._eigenvalue_matrix = h_es["eig_matrix"] self._occupancy_matrix = h_es["occ_matrix"] self.n_spins = len(self._eigenvalue_matrix) if "efermi" in nodes: self.efermi = h_es["efermi"] with h_es.open("dos") as h_dos: nodes = h_dos.list_nodes() self.dos_energies = h_dos["energies"] self.dos_densities = h_dos["tot_densities"] self.dos_idensities = h_dos["int_densities"] if "grand_dos_matrix" in nodes: self.grand_dos_matrix = h_dos["grand_dos_matrix"] if "resolved_densities" in nodes: self.resolved_densities = h_dos["resolved_densities"] self._output_dict = h_es.copy() self.generate_from_matrices()
[docs] def from_hdf_old(self, hdf, group_name="electronic_structure"): """ Retrieve the object from the hdf5 file Args: hdf: Path to the hdf5 file/group in the file group_name: Name of the group under which the attributes are stored """ with hdf.open(group_name) as h_es: if "structure" in h_es.list_nodes(): self.structure = Atoms().from_hdf(h_es) nodes = h_es.list_nodes() self.kpoint_list = h_es["k_points"] self.kpoint_weights = h_es["k_point_weights"] self.eigenvalue_matrix = np.array([h_es["eigenvalue_matrix"]]) self.occupancy_matrix = np.array([h_es["occupancy_matrix"]]) try: self.dos_energies = h_es["dos_energies"] self.dos_densities = h_es["dos_densities"] self.dos_idensities = h_es["dos_idensities"] except ValueError: pass if "fermi_level" in nodes: self.efermi = h_es["fermi_level"] if "grand_dos_matrix" in nodes: self.grand_dos_matrix = h_es["grand_dos_matrix"] if "resolved_densities" in nodes: self.resolved_densities = h_es["resolved_densities"] self._output_dict = h_es.copy() self.generate_from_matrices()