Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
add_analysis_task: Analyze polarization and energy trends as part of workflow. Default False.
wfid (string): Unique worfklow id starting with "wfid_". If None this is atomatically generated (recommended).
tags (list of strings): Additional tags to add such as identifiers for structures.
Returns:
"""
wf = []
if wfid is None:
wfid = 'wfid_' + get_a_unique_id()
if tags is None:
tags = []
if relax:
polar_relax = OptimizeFW(structure=polar_structure, name="_polar_relaxation",
vasp_cmd=vasp_cmd, db_file=db_file, vasp_input_set=vasp_relax_input_set_polar)
nonpolar_relax = OptimizeFW(structure=nonpolar_structure, name="_nonpolar_relaxation",
vasp_cmd=vasp_cmd, db_file=db_file, vasp_input_set=vasp_relax_input_set_nonpolar)
wf.append(polar_relax)
wf.append(nonpolar_relax)
parents_polar = polar_relax
parents_nonpolar = nonpolar_relax
else:
parents_polar = None
parents_nonpolar = None
# Run polarization calculation on polar structure.
# Defuse workflow if polar structure is metallic.
polar = LcalcpolFW(structure=polar_structure,
name="_polar_polarization",
static_name="_polar_static",
args=hold_args, parents=[_fw_list[-1]], priority=priority,
previous_structure=True, insert_db=True, **kwargs)
_fw_list.append(_fw)
if quench_type in ["slow_quench", "mp_quench"]:
# Relax OptimizeFW and StaticFW
run_args = {"run_specs": {"vasp_input_set": None, "vasp_cmd": ">>vasp_cmd<<",
"db_file": ">>db_file<<",
"spec": {"_priority": priority}
},
"optional_fw_params": {"override_default_vasp_params": {}}
}
run_args = recursive_update(run_args, quench_args)
_name = "snap_" + str(i)
fw1 = OptimizeFW(structure=structure, name=_name + descriptor + "_optimize",
parents=[_fw_list[-1]] if len(_fw_list) > 0 else [],
**run_args["run_specs"], **run_args["optional_fw_params"],
max_force_threshold=None)
if len(_fw_list) > 0:
fw1 = powerups.add_cont_structure(fw1)
fw1 = powerups.add_pass_structure(fw1)
fw2 = StaticFW(structure=structure, name=_name + descriptor + "_static",
parents=[fw1], **run_args["run_specs"],
**run_args["optional_fw_params"])
fw2 = powerups.add_cont_structure(fw2)
fw2 = powerups.add_pass_structure(fw2)
_fw_list.extend([fw1, fw2])
fw_list.extend(_fw_list)
transformations = [
"SlabTransformation", "SupercellTransformation",
"InsertSitesTransformation", "AddSitePropertyTransformation"]
trans_params = [slab_trans_params,
{"scaling_matrix": supercell_trans.scaling_matrix},
{"species": [site.species_string for site in ads_sites],
"coords": [site.frac_coords for site in ads_sites]},
{"site_properties": site_props}]
fw = TransmuterFW(name=name, structure=oriented_bulk,
transformations=transformations,
transformation_params=trans_params,
copy_vasp_outputs=True, db_file=db_file,
vasp_cmd=vasp_cmd, parents=parents,
vasp_input_set=vasp_input_set)
else:
fw = OptimizeFW(name=name, structure=slab,
vasp_input_set=vasp_input_set, vasp_cmd=vasp_cmd,
db_file=db_file, parents=parents, job_type="normal")
# Add slab metadata
if add_slab_metadata:
parent_structure_metadata = get_meta_from_structure(
slab.oriented_unit_cell)
fw.tasks[-1]["additional_fields"].update(
{"slab": slab, "parent_structure": slab.oriented_unit_cell,
"parent_structure_metadata": parent_structure_metadata})
return fw
vasp_input_set (DictSet): VaspInputSet for molecules
db_file (string): database file path
vasp_cmd (string): VASP command
name (string): name for workflow
Returns:
workflow consisting of molecule calculations
"""
fws = []
for molecule in molecules:
# molecule in box
m_struct = molecule.get_boxed_structure(10, 10, 10,
offset=np.array([5, 5, 5]))
vis = vasp_input_set or MPSurfaceSet(m_struct)
fws.append(OptimizeFW(structure=molecule, job_type="normal",
vasp_input_set=vis, db_file=db_file,
vasp_cmd=vasp_cmd))
name = name or "molecules workflow"
return Workflow(fws, name=name)
Workflow
TODO: insert task to compute average electrostatic potential and pass it along
"""
# if not given, just do the neutral system calculations
charge_states = charge_states or [0]
# input set for relaxation
vis_relax = vasp_input_set or MPRelaxSet(structure, force_gamma=True)
if user_kpoints_settings:
v = vis_relax.as_dict()
v.update({"user_kpoints_settings": user_kpoints_settings})
vis_relax = vis_relax.__class__.from_dict(v)
# Structure optimization firework
fws = [OptimizeFW(structure=structure, vasp_input_set=vis_relax, vasp_cmd=vasp_cmd,
db_file=db_file, name="{} structure optimization".format(tag))]
# Static firework: copy previous outputs and do a static run on the defect-free system
uis_static = {"ISTART": 1}
uis_static_relax_ions = {"ISTART": 1, "IBRION": 2, "NSW": 100}
vis_static = MPStaticSet(structure, force_gamma=True, lepsilon=lepsilon,
user_kpoints_settings=user_kpoints_settings,
user_incar_settings=uis_static_relax_ions)
nelect_input = vis_static.nelect
fws.append(StaticFW(structure, vasp_input_set=vis_static, vasp_cmd=vasp_cmd,
db_file=db_file, name="{} static calculation".format(tag),
copy_vasp_outputs=True, parents=fws[0]))
# Apply each defect transformation and run static calculations for each charge state
# ==> n_fireworks = n_defect_transformations * n_charge_states + n_defect_transformations
for i, dt in enumerate(defect_transformations):
vasp_cmd (str): vasp command to run.
db_file (str): path to file containing the database credentials.
Returns:
Workflow
"""
modes = modes or range(3 * len(structure))
vis = MPRelaxSet(structure, force_gamma=True)
# displacements in + and - direction along the normal mode so that the central difference scheme
# can be used for the evaluation of Raman tensor (derivative of epsilon wrt displacement)
displacements = [-step_size, step_size]
fws = []
# Structure optimization
fw_opt = OptimizeFW(structure=structure, vasp_input_set=vis, ediffg=None, vasp_cmd=vasp_cmd,
db_file=db_file)
fws.append(fw_opt)
# Static run: compute the normal modes and pass
fw_leps = DFPTFW(structure=structure, vasp_cmd=vasp_cmd, db_file=db_file, parents=fw_opt, pass_nm_results=True)
fws.append(fw_leps)
# Static runs to compute epsilon for each mode and displacement along that mode.
fws_nm_disp = []
for mode in modes:
for disp in displacements:
fws_nm_disp.append(RamanFW(mode, disp, structure=structure,
parents=fw_leps, vasp_cmd=vasp_cmd, db_file=db_file))
fws.extend(fws_nm_disp)
:return:
"""
wfs = []
structures = get_sample_structures(xdatcar_path=xdatcar_file, n=n, steps_skip_first=steps_skip_first)
if sim_anneal:
for i in range(len(structures)):
s = structures[i]
diffusion = True if i == 0 else False
wflow_name=s.composition.reduced_formula
_wf = get_simulated_anneal_wf(s, start_temp=2500, name='snap_' + str(i), diffusion=diffusion,
wflow_name=wflow_name, calc_home=calc_home, copy_calcs=copy_calcs,
db_file=db_file, snap_num=i, priority_spec=priority_spec)
wfs.append(_wf)
else:
for s in structures:
fw1 = OptimizeFW(s, vasp_cmd=vasp_cmd, db_file=db_file, parents=[], spec=priority_spec, **kwargs)
fw2 = StaticFW(s, vasp_cmd=vasp_cmd, db_file=db_file, parents=[fw1], spec=priority_spec)
wfs.append(Workflow([fw1, fw2], name=name + str(s.composition.reduced_formula)))
return wfs
def get_relax_static_wf(structures, vasp_cmd=">>vasp_cmd<<", db_file=">>db_file<<",
name="regular_relax", copy_calcs=False, calc_home="~/wflows", snap=0, priority_spec={}, **kwargs):
"""
:param structures:
:param vasp_cmd:
:param db_file:
:param name:
:param kwargs:
:return:
"""
wfs = []
calc_home = os.path.join(calc_home, "snap_" + str(snap))
for s in structures:
fw1 = OptimizeFW(s, vasp_cmd=vasp_cmd, db_file=db_file, parents=[], spec=priority_spec, **kwargs)
fw2 = StaticFW(s, vasp_cmd=vasp_cmd, db_file=db_file, parents=[fw1], spec=priority_spec)
t = [CopyVaspOutputs(calc_loc=True, contcar_to_poscar=True, additional_files=["XDATCAR", "OSZICAR", "DOSCAR"])]
if copy_calcs:
t.append(CopyCalsHome(calc_home=calc_home, run_name=name))
fw3 = Firework(t, name="relax_copy_calcs", parents=[fw2], spec=priority_spec)
_wf = Workflow([fw1, fw2, fw3], name=str(s.composition.reduced_formula) + "_" + str(snap) + "_" + name)
wfs.append(_wf)
return wfs