Source code for strucscan.properties.eos

from ase.eos import EquationOfState

import numpy as np
import os

volume_range = 0.1
num_of_point = 11


[docs]def generate_structures(atoms): """ :param atoms: (ASE atoms object) :return: (ASE atoms object list) list of modified ASE atoms objects """ vol_min = 1 - volume_range vol_max = 1 + volume_range strained_structures = [] for strain in np.linspace(vol_min, vol_max, num_of_point): basis = atoms.copy() cell = basis.get_cell() cell *= strain ** (1. / 3.) basis.set_cell(cell, scale_atoms=True) strained_structures.append(basis) return strained_structures
[docs]def get_EOS_properties(calc, absolute_path): """ :param calc: (strucscan.engine.generalengine.GeneralEngine object) calculator object :param absolute_path: (str) absolute path to job directory :return: (dict) python dictionary with summarized results """ energy_list = [] volume_list = [] stress_list = [] pressure_list = [] result_filename = calc.get_result_filename() for filename in os.listdir(absolute_path): if (result_filename in filename): final_struct = calc.read_final_structure(absolute_path, resultfilename=filename) energy_list.append(final_struct.get_potential_energy()) volume_list.append(final_struct.get_volume()) stress = final_struct.get_stress() stress_list.append(stress) pressure_list.append(-1./3.*sum(stress[0:3])) eos = EquationOfState(volume_list, energy_list, eos='murnaghan') v0, e0, B = eos.fit() outputdict = {} outputdict["volume"] = np.array(volume_list) outputdict["energy"] = np.array(energy_list) outputdict['stresses'] = np.array(stress_list) outputdict['pressure'] = np.array(pressure_list) outputdict["equilibrium_energy"] = e0 outputdict["equilibrium_volume"] = v0 outputdict["equilibrium_bulk_modulus"] = B return outputdict