Skip to content

Commit 600bc12

Browse files
committed
additional initial defect requirements for parsing in defect wf
1 parent a565706 commit 600bc12

File tree

3 files changed

+54
-5
lines changed

3 files changed

+54
-5
lines changed

atomate/vasp/drones.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from monty.io import zopen
2121
from monty.json import jsanitize
2222
from monty.os.path import which
23+
from monty.shutil import decompress_file
2324

2425
import numpy as np
2526

@@ -28,7 +29,8 @@
2829
from pymatgen.core.operations import SymmOp
2930
from pymatgen.electronic_structure.bandstructure import BandStructureSymmLine
3031
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
31-
from pymatgen.io.vasp import BSVasprun, Vasprun, Outcar, Locpot, Chgcar
32+
from pymatgen.io.vasp import BSVasprun, Vasprun, Outcar, Locpot, Chgcar, \
33+
parse_defect_states, Procar, Wavecar
3234
from pymatgen.io.vasp.inputs import Poscar, Potcar, Incar, Kpoints
3335
from pymatgen.apps.borg.hive import AbstractDrone
3436
from pymatgen.command_line.bader_caller import bader_analysis_from_path
@@ -83,7 +85,8 @@ class VaspDrone(AbstractDrone):
8385

8486
def __init__(self, runs=None, parse_dos="auto", bandstructure_mode="auto",
8587
parse_locpot=True, additional_fields=None, use_full_uri=True,
86-
parse_bader=bader_exe_exists, parse_chgcar=False, parse_aeccar=False):
88+
parse_bader=bader_exe_exists, parse_chgcar=False, parse_aeccar=False,
89+
defect_wf_parsing=None):
8790
"""
8891
Initialize a Vasp drone to parse vasp outputs
8992
Args:
@@ -106,6 +109,10 @@ def __init__(self, runs=None, parse_dos="auto", bandstructure_mode="auto",
106109
parse_bader (bool): Run and parse Bader charge data. Defaults to True if Bader is present
107110
parse_chgcar (bool): Run and parse CHGCAR file
108111
parse_aeccar (bool): Run and parse AECCAR0 and AECCAR2 files
112+
defect_wf_parsing (Site): If Site is provided, drone considers Procar and
113+
Wavecar parsing relative to the position of Site.
114+
Useful for consideration of defect localization
115+
Defaults to None (no extra procar or wavecar parsing occurs)
109116
"""
110117
self.parse_dos = parse_dos
111118
self.additional_fields = additional_fields or {}
@@ -117,6 +124,7 @@ def __init__(self, runs=None, parse_dos="auto", bandstructure_mode="auto",
117124
self.parse_bader = parse_bader
118125
self.parse_chgcar = parse_chgcar
119126
self.parse_aeccar = parse_aeccar
127+
self.defect_wf_parsing = defect_wf_parsing
120128

121129
def assimilate(self, path):
122130
"""
@@ -210,6 +218,35 @@ def generate_doc(self, dir_name, vasprun_files, outcar_files):
210218
logger.error("Bad run stats for {}.".format(fullpath))
211219
d["run_stats"] = run_stats
212220

221+
# store defect localization/band filling information
222+
if self.defect_wf_parsing:
223+
# need to make sure all procars and wavecars are zipped
224+
for propat in self.filter_files(fullpath, file_pattern="PROCAR").values():
225+
decompress_file(os.path.join(fullpath, propat))
226+
for wavepat in self.filter_files(fullpath, file_pattern="WAVECAR").values():
227+
decompress_file(os.path.join(fullpath, wavepat))
228+
procar_paths = [os.path.join(fullpath, ppath) for ppath in
229+
self.filter_files(fullpath, file_pattern="PROCAR").values()]
230+
wavecar_paths = [os.path.join(fullpath, wpath) for wpath in
231+
self.filter_files(fullpath, file_pattern="WAVECAR").values()]
232+
233+
for i, d_calc in enumerate(d["calcs_reversed"]):
234+
if d_calc.get("output"):
235+
if len(procar_paths) and len(wavecar_paths):
236+
procar = Procar(procar_paths[i])
237+
wavecar = Wavecar(wavecar_paths[i])
238+
structure = Structure.from_dict(d_calc["output"]["structure"])
239+
defect_data = parse_defect_states(structure, self.defect_wf_parsing, wavecar, procar)
240+
d_calc["output"].update({"defect": defect_data})
241+
242+
filename = list(vasprun_files.values())[i]
243+
vasprun_file = os.path.join(dir_name, filename)
244+
vrun = Vasprun(vasprun_file)
245+
eigenvalues = vrun.eigenvalues.copy()
246+
kpoint_weights = vrun.actual_kpoints_weights
247+
vr_eigenvalue_dict = {'eigenvalues': eigenvalues, 'kpoint_weights': kpoint_weights}
248+
d_calc["output"].update({"vr_eigenvalue_dict": vr_eigenvalue_dict})
249+
213250
# reverse the calculations data order so newest calc is first
214251
d["calcs_reversed"].reverse()
215252

atomate/vasp/firetasks/parse_outputs.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ def run_task(self, fw_spec):
9191
parse_dos=self.get("parse_dos", False),
9292
bandstructure_mode=self.get("bandstructure_mode", False),
9393
parse_chgcar=self.get("parse_chgcar", False),
94-
parse_aeccar=self.get("parse_aeccar", False))
94+
parse_aeccar=self.get("parse_aeccar", False),
95+
defect_wf_parsing=self.get("defect_wf_parsing", None))
9596

9697
# assimilate (i.e., parse)
9798
task_doc = drone.assimilate(calc_dir)

atomate/vasp/fireworks/core.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,9 @@ def __init__(self, structure, transformations, transformation_params=None,
538538
vasp_input_set=None, prev_calc_dir=None,
539539
name="structure transmuter", vasp_cmd="vasp",
540540
copy_vasp_outputs=True, db_file=None,
541-
parents=None, override_default_vasp_params=None, **kwargs):
541+
parents=None, bandstructure_mode=None,
542+
override_default_vasp_params=None,
543+
defect_wf_parsing=None, **kwargs):
542544
"""
543545
Apply the transformations to the input structure, write the input set corresponding
544546
to the transformed structure, and run vasp on them. Note that if a transformation yields
@@ -559,7 +561,14 @@ def __init__(self, structure, transformations, transformation_params=None,
559561
prev_calc_dir (str): Path to a previous calculation to copy from
560562
db_file (string): Path to file specifying db credentials.
561563
parents (Firework): Parents of this particular Firework. FW or list of FWS.
564+
bandstructure_mode (str): Set to "uniform" for uniform band structure.
565+
Set to "line" for line mode. If not set, band structure will not
566+
be parsed.
562567
override_default_vasp_params (dict): additional user input settings for vasp_input_set.
568+
defect_wf_parsing (Site): If Site is provided, drone considers Procar and
569+
Wavecar localization parsing relative to the position of Site.
570+
Useful for consideration of defect localization
571+
Defaults to None (no extra procar or wavecar parsing occurs for VaspToDb)
563572
\*\*kwargs: Other kwargs that are passed to Firework.__init__.
564573
"""
565574
fw_name = "{}-{}".format(structure.composition.reduced_formula, name)
@@ -603,7 +612,9 @@ def __init__(self, structure, transformations, transformation_params=None,
603612
"task_label": name,
604613
"transmuter": {"transformations": transformations,
605614
"transformation_params": transformation_params}
606-
}))
615+
},
616+
bandstructure_mode=bandstructure_mode,
617+
defect_wf_parsing=defect_wf_parsing))
607618

608619
super(TransmuterFW, self).__init__(t, parents=parents,
609620
name=fw_name, **kwargs)

0 commit comments

Comments
 (0)