Source code for defermi.corrections.freysoldt
"""
FNV corrections
"""
import os.path as op
import importlib
from pymatgen.io.vasp.outputs import Locpot
from pymatgen.analysis.defects.corrections.freysoldt import get_freysoldt_correction, plot_plnr_avg
from ..structure import defect_finder
[docs]
def get_freysoldt_correction_from_locpot(
charge,
dielectric_constant,
defect_path_locpot,
bulk_path_locpot,
get_correction_data=True,
get_plot=True,
plot_axis_index=0,
finder_kwargs={},
**kwargs):
"""
Get Freysoldt correction from defect and bulk LOCPOT files, using `pymatgen-analysis-defects`.
Parameters
----------
charge : int
Charge of the defect cell in electron units.
dielectric_constant : float
Dielectric constant of the material
defect_path_locpot : str
Defect LOCPOT file.
bulk_path_locpot : str
Bulk LOCPOT file.
get_correction_data : bool
Return pymatgen's CorrectionResult object. If False only the correction value is returned.
get_plot : bool
Get Matplotlib object with plot. The default is False.
plot_axis_index : int
Axis for planar average plot. The default is 0.
finder_kwargs : dict
Kwargs to pass to defect_finder.
kwargs : dict
Kwargs to pass to pymatgen's get_freysoldt_correction.
Returns
-------
correction, ax : tuple
CorrectionResult object if get_correction_data is set to True, else just the float with correction value, matplotlib axis object
"""
q = charge
defect_locpot = Locpot.from_file(defect_path_locpot)
bulk_locpot = Locpot.from_file(bulk_path_locpot)
if finder_kwargs:
if 'verbose' not in finder_kwargs.keys():
finder_kwargs['verbose'] = True
defect = defect_finder(defect_locpot.structure,bulk_locpot.structure,**finder_kwargs)
defect_frac_coords = defect.site.frac_coords
lattice = defect_locpot.structure.lattice
correction = get_freysoldt_correction(q=q,dielectric=dielectric_constant,defect_locpot=defect_locpot,
bulk_locpot=bulk_locpot,defect_frac_coords=defect_frac_coords,
lattice=lattice,**kwargs)
corr = correction if get_correction_data else correction.correction_energy
if get_plot:
ax = plot_plnr_avg(correction.metadata['plot_data'][plot_axis_index])
return corr, ax
else:
return corr