Source code for jarvis.analysis.thermodynamics.energetics
"""Get formation energy."""
import os
import json
# from jarvis.io.vasp.outputs import Vasprun
# import glob
from jarvis.db.figshare import data
from jarvis.core.atoms import Atoms
# OptB88vdW energy per atoms for elements
unary_json_file = str(os.path.join(os.path.dirname(__file__), "unary.json"))
unary_json = open(unary_json_file, "r")
unary_data = json.load(unary_json)
unary_json.close()
[docs]def isfloat(value):
"""Check if a number is float.
TODO: replace with isinstance.
"""
try:
float(value)
return True
except ValueError:
return False
[docs]def unary_energy(el="Na"):
"""Provide energy per atoms of an element."""
en = "na"
for i, j in unary_data.items():
if str(i) == str(el):
en = j["energy"]
return en
[docs]def get_twod_defect_energy(vrun="", jid="", atom=""):
"""Get mono 2D defect formation energy with OptB88vdW data."""
dft2d = data("dft_2d")
def get_enp_jid(jid=""):
for i in dft2d:
if i["jid"] == jid:
return (
i["optb88vdw_total_energy"]
/ Atoms.from_dict(i["atoms"]).num_atoms
)
# dir='JVASP-667_C_C_c'
# tmp=dir.split('_')
# jid=tmp[0]
# atom=tmp[2]
strt = vrun.all_structures[-1]
natoms = strt.num_atoms
fin_en = vrun.final_energy
chem_pot = unary_energy(atom)
bulk_en_pa = get_enp_jid(jid)
Ef = fin_en - (natoms + 1) * bulk_en_pa + chem_pot
return Ef
# https://wiki.fysik.dtu.dk/ase/_modules/ase/phasediagram.html#PhaseDiagram
# class EnergyConvexHull(object):
# def __init__(entries=None):
# # [array of [composition_as_dict,total_energy]]
# self.entries = entries
# def chull(self):
# for i in self.entries:
"""
if __name__ == "__main__":
from jarvis.io.vasp.inputs import Poscar
p = Poscar.from_file(
"../..//POSCAR"
).atoms
total_energy = -9.974648
fen = form_enp(atoms=p, total_energy=total_energy)
print("fen", fen)
x = [
{"comp": {"Al": 2, "O": 1}, "energy": -0.15, "id": "xyz"},
{"comp": {"Al": 2, "O": 3}, "energy": -16.5, "id": "xyz"},
{"comp": {"Al": 1, "O": 1}, "energy": -4.86, "id": "xyz"},
]
# entries = [[{'Al':2,'O':1},-0.15],[{'Al':2,'O':3},
-16.065],[{'Al':1,'O':1},-2.8],[{'Al':1,'O':3},-4.865]]
print(x)
"""