Source code for custodian.feff.interpreter

# coding: utf-8

"""
Implements various interpreters and modders for FEFF calculations.
"""

import os

from pymatgen.io.feff.sets import FEFFDictSet

from custodian.ansible.actions import FileActions, DictActions
from custodian.ansible.interpreter import Modder


[docs]class FeffModder(Modder): """ A Modder for FeffInput sets """ def __init__(self, actions=None, strict=True, feffinp=None): """ Args: actions ([Action]): A sequence of supported actions. See actions ([Action]): A sequence of supported actions. See :mod:`custodian.ansible.actions`. Default is None, which means DictActions and FileActions are supported. strict (bool): Indicating whether to use strict mode. In non-strict mode, unsupported actions are simply ignored without any errors raised. In strict mode, if an unsupported action is supplied, a ValueError is raised. Defaults to True. feffinp (FEFFInput): A FeffInput object from the current directory. Initialized automatically if not passed (but passing it will avoid having to reparse the directory). """ self.feffinp = feffinp or FEFFDictSet.from_directory(".") self.feffinp = self.feffinp.all_input() actions = actions or [FileActions, DictActions] super().__init__(actions, strict)
[docs] def apply_actions(self, actions): """ Applies a list of actions to the FEFF Input Set and rewrites modified files. Args: actions [dict]: A list of actions of the form {'file': filename, 'action': moddermodification} or {'dict': feffinput_key, 'action': moddermodification} """ modified = [] for a in actions: if "dict" in a: k = a["dict"] modified.append(k) self.feffinp[k] = self.modify_object(a["action"], self.feffinp[k]) elif "file" in a: self.modify(a["action"], a["file"]) else: raise ValueError("Unrecognized format: {}".format(a)) if modified: feff = self.feffinp feff_input = "\n\n".join( str(feff[k]) for k in ["HEADER", "PARAMETERS", "POTENTIALS", "ATOMS"] if k in feff ) for k, v in feff.items(): with open(os.path.join(".", k), "w") as f: f.write(str(v)) with open(os.path.join(".", "feff.inp"), "w") as f: f.write(feff_input)