Source code for atomate2.turbomole.custodian.jobs

# Part of atomate2-turbomole package.

"""Module containing the custodian jobs for the atomate2-turbomole package."""

import shlex
import subprocess
from pathlib import Path

from custodian.custodian import Job


[docs] class TMJob(Job): """A job to run one of the TM executables.""" def __init__(self, executable, output_file=None, stderr_file=None, options=None): """Construct the custodian Job. Args: executable: Turbomole executable. output_file: Filename to use for the stdout. stderr_file: Filename to use for the stderr. options: Options for jobex (e.g. "-rijk", ["-level", "cc2"], "-time", ...). """ self.executable = executable self.output_file = output_file or Path(self.executable).name + ".out" self.stderr_file = stderr_file or Path(self.executable).name + ".err" if options is None: self.options = [] elif isinstance(options, str): self.options = shlex.split(options) elif isinstance(options, list): self.options = list(options) or [] else: raise TypeError( f'"options" should be a string, a list or None, ' f"while it is {type(options)}" )
[docs] def setup(self, directory="./"): """Set up the custodian job. Nothing at this stage.""" pass # pragma: no cover
[docs] def run(self, directory="./"): """ Run the selected executable. Returns ------- a Popen process """ cmd = [self.executable, *self.options] with ( open(self.output_file, "w") as f_out, open(self.stderr_file, "w", buffering=1) as f_err, ): p = subprocess.Popen(cmd, stdout=f_out, stderr=f_err) return p
[docs] def postprocess(self, directory="./"): """Postprocess the custodian job. Nothing at this stage.""" pass # pragma: no cover
[docs] @classmethod def dscf(cls, **kwargs): """Create custodian TMJob for dscf.""" return cls(executable="dscf", **kwargs)
[docs] @classmethod def ridft(cls, **kwargs): """Create custodian TMJob for ridft.""" return cls(executable="ridft", **kwargs)
[docs] @classmethod def jobex(cls, jobex_time=True, **kwargs): """Create custodian TMJob for jobex.""" options = kwargs.pop("options", []) if isinstance(options, str): options = shlex.split(options) if jobex_time and "-time" not in options: options.append("-time") if not jobex_time and "-time" in options: raise ValueError( "Explicitly asked jobex_time=False while -time option is set." ) return cls(executable="jobex", options=options, **kwargs)
[docs] @classmethod def ricc2(cls, **kwargs): """Create custodian TMJob for ricc2.""" return cls(executable="ricc2", **kwargs)
[docs] @classmethod def riper(cls, **kwargs): """Create custodian TMJob for riper.""" return cls(executable="riper", **kwargs)
[docs] @classmethod def statpt(cls, **kwargs): """Create custodian TMJob for statpt.""" return cls(executable="statpt", **kwargs)