Source code for asimtools.asimmodules.eos.postprocess

'''.Xauthority'''

from typing import Dict, Tuple
import numpy as np
import matplotlib.pyplot as plt
from ase.eos import EquationOfState
from ase. units import GPa
# from asimtools.job import load_output_images, load_input_images
from asimtools.utils import (
    write_csv_from_dict,
    get_images,
    get_atoms,
)

[docs] def postprocess( images: Dict, initial_image: Dict, ) -> Tuple[None,Dict]: """Plot an eos given a number of images and the initial image :param images: Scaled images specification, see :func:`asimtools.utils.get_images` :type images: Dict :param initial_image: Original image specification, see :func:`asimtools.utils.get_atoms` :type initial_image: Dict :return: Empty dict :rtype: Tuple[None,Dict] """ images = get_images(**images) volumes = np.array([at.get_volume() for at in images]) energies = np.array([at.get_potential_energy() for at in images]) write_csv_from_dict( 'eos_output.csv', {'volumes': volumes, 'energies': energies} ) eos_fit = EquationOfState(volumes, energies) try: v0, e0, B = eos_fit.fit() except ValueError: print('ERROR: Could not fit EOS, check structures') v0, e0, B = None, None, None fig, ax = plt.subplots() if v0 is not None: B_GPa = B / GPa # eV/Ang^3 to GPa eos_fit.plot(ax=ax) # Get equilibrium lattice scaling by interpolation xs = [atoms.info['scale'] for atoms in images] vs = [] atoms = get_atoms(**initial_image) for x in xs: samp_atoms = atoms.copy() samp_atoms.cell = samp_atoms.cell*x vs.append(samp_atoms.get_volume()) x0 = np.interp(v0, vs, xs) results = { 'equilibrium_volume': float(v0), 'equilibrium_energy': float(e0), 'equilibrium_scale': float(x0), 'bulk_modulus': float(B_GPa), 'bulk_modulus_unit': 'GPa', } else: ax.plot(volumes, energies) results = {} ax.set_xlabel(r'Volume ($\AA$)') ax.set_ylabel(r'Energy (eV)') plt.savefig('eos.png') plt.close(fig) return results