Source code for dpgen2.fp.gaussian

"""Prep and Run Gaussian tasks."""
from dflow.python import (
    TransientError,
)
from typing import (
    Tuple,
    List,
    Any,
)
import dpdata
from dargs import (
    dargs, 
    Argument,
)

from .prep_fp import PrepFp
from .run_fp import RunFp
from dpgen2.constants import (
    fp_default_out_data_name,
)
from dpgen2.utils.run_command import run_command

# global static variables
gaussian_input_name = 'task.gjf'
# this output name is generated by Gaussian
gaussian_output_name = 'task.log'


[docs]class GaussianInputs:
[docs] @staticmethod def args() -> List[Argument]: r"""The arguments of the GaussianInputs class.""" doc_keywords = "Gaussian keywords, e.g. force b3lyp/6-31g**. If a list, run multiple steps." doc_multiplicity = ( "spin multiplicity state. It can be a number. If auto, multiplicity will be detected " "automatically, with the following rules:\n\n" "fragment_guesses=True multiplicity will +1 for each radical, and +2 for each oxygen molecule\n\n" "fragment_guesses=False multiplicity will be 1 or 2, but +2 for each oxygen molecule." ) doc_charge = "molecule charge. Only used when charge is not provided by the system" doc_basis_set = "custom basis set" doc_keywords_high_multiplicity = ( "keywords for points with multiple raicals. multiplicity should be auto. " "If not set, fallback to normal keywords" ) doc_fragment_guesses = ( "initial guess generated from fragment guesses. If True, multiplicity should be auto" ) doc_nproc = "Number of CPUs to use" return [ Argument('keywords', [str, list], optional=False, doc=doc_keywords), Argument('multiplicity', [int, str], optional=True, default="auto", doc=doc_multiplicity), Argument('charge', int, optional=True, default=0, doc=doc_charge), Argument('basis_set', str, optional=True, doc=doc_basis_set), Argument('keywords_high_multiplicity', str, optional=True, doc=doc_keywords_high_multiplicity), Argument('fragment_guesses', bool, optional=True, default=False, doc=doc_fragment_guesses), Argument('nproc', int, optional=True, default=1, doc=doc_nproc), ]
def __init__(self, **kwargs: Any): self.data = kwargs
[docs]class PrepGaussian(PrepFp):
[docs] def prep_task( self, conf_frame: dpdata.System, inputs: GaussianInputs, ): r"""Define how one Gaussian task is prepared. Parameters ---------- conf_frame : dpdata.System One frame of configuration in the dpdata format. inputs: GaussianInputs The GaussianInputs object handels all other input files of the task. """ conf_frame.to('gaussian/gjf', gaussian_input_name, **inputs.data)
[docs]class RunGaussian(RunFp):
[docs] def input_files(self) -> List[str]: r"""The mandatory input files to run a Gaussian task. Returns ------- files: List[str] A list of madatory input files names. """ return [gaussian_input_name]
[docs] def optional_input_files(self) -> List[str]: r"""The optional input files to run a Gaussian task. Returns ------- files: List[str] A list of optional input files names. """ return []
[docs] def run_task( self, command : str, out: str, ) -> Tuple[str, str]: r"""Defines how one FP task runs Parameters ---------- command: str The command of running gaussian task out: str The name of the output data file. Returns ------- out_name: str The file name of the output data in the dpdata.LabeledSystem format. log_name: str The file name of the log. """ # run gaussian out_name = out command = ' '.join([command, gaussian_input_name]) ret, out, err = run_command(command, shell=True) if ret != 0: raise TransientError( 'gaussian failed\n', 'out msg', out, '\n', 'err msg', err, '\n' ) # convert the output to deepmd/npy format sys = dpdata.LabeledSystem(gaussian_output_name, fmt='gaussian/log') sys.to('deepmd/npy', out_name) return out_name, gaussian_output_name
[docs] @staticmethod def args() -> List[dargs.Argument]: r"""The argument definition of the `run_task` method. Returns ------- arguments: List[dargs.Argument] List of dargs.Argument defines the arguments of `run_task` method. """ doc_gaussian_cmd = "The command of Gaussian" doc_gaussian_out = "The output dir name of labeled data. In `deepmd/npy` format provided by `dpdata`." return [ Argument("command", str, optional=True, default='g16', doc=doc_gaussian_cmd), Argument("out", str, optional=True, default=fp_default_out_data_name, doc=doc_gaussian_out), ]