Source code for custodian.lobster.handlers

""" This module implements specific error handler for Lobster runs. """

import os

from pymatgen.io.lobster import Lobsterout

from custodian.custodian import Validator

__author__ = "Janine George, Guido Petretto"
__copyright__ = "Copyright 2020, The Materials Project"
__version__ = "0.1"
__maintainer__ = "Janine George"
__email__ = "janine.george@uclouvain.be"
__date__ = "April 27, 2020"


[docs]class EnoughBandsValidator(Validator): """ validates if enough bands for COHP calculation are available """ def __init__(self, output_filename: str = "lobsterout"): """ Args: output_filename: filename of output file, usually lobsterout """ self.output_filename = output_filename
[docs] def check(self) -> bool: """ checks if the VASP calculation had enough bands Returns: (bool) if True, too few bands have been applied """ # checks if correct number of bands is available try: with open(self.output_filename) as f: data = f.read() return 'You are employing too few bands in your PAW calculation.' in data except OSError: return False
[docs]class LobsterFilesValidator(Validator): """ Check for existence of some of the files that lobster normally create upon running. Check if lobster terminated normally by looking for finished """ def __init__(self): """ Dummy init """ pass
[docs] def check(self) -> bool: """ Check for errors. """ for vfile in ["lobsterout"]: if not os.path.exists(vfile): return True with open("lobsterout") as f: data = f.read() return 'finished' not in data
[docs]class ChargeSpillingValidator(Validator): """ Check if spilling is below certain threshold! """ def __init__(self, output_filename: str = 'lobsterout', charge_spilling_limit: float = 0.05): """ Args: output_filename: filename of the output file of lobter, usually lobsterout charge_spilling_limit: limit of the charge spilling that will be considered okay """ self.output_filename = output_filename self.charge_spilling_limit = charge_spilling_limit
[docs] def check(self) -> bool: """open lobsterout and find charge spilling""" if os.path.exists(self.output_filename): lobsterout = Lobsterout(self.output_filename) if lobsterout.chargespilling[0] > self.charge_spilling_limit: return True if len(lobsterout.chargespilling) > 1: if lobsterout.chargespilling[1] > self.charge_spilling_limit: return True return False return False