From 8c9f0ab6e498a0c658372c6a8265841e6ad628ef Mon Sep 17 00:00:00 2001 From: Holger Kruse Date: Thu, 10 Aug 2023 17:11:30 +0200 Subject: [PATCH] update gCP levels and extend D4 defaults (#393) * add new gCP levels and extend D4 defaults * add backwards compatibility for dftd4 * Update gcp.py * Update qcengine/testing.py Co-authored-by: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> * fix no d4 error * Update qcengine/programs/empirical_dispersion_resources.py Co-authored-by: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> * Update qcengine/programs/empirical_dispersion_resources.py Co-authored-by: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> * qcel parse_version --------- Co-authored-by: Lori A. Burns Co-authored-by: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> --- .../empirical_dispersion_resources.py | 32 ++++++++++++++++++- qcengine/programs/gcp.py | 13 ++++++-- qcengine/testing.py | 1 + 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/qcengine/programs/empirical_dispersion_resources.py b/qcengine/programs/empirical_dispersion_resources.py index 2812284c1..c6f60ecc7 100644 --- a/qcengine/programs/empirical_dispersion_resources.py +++ b/qcengine/programs/empirical_dispersion_resources.py @@ -5,6 +5,7 @@ from typing import Dict, List, Optional, Union from ..exceptions import InputError +from qcelemental.util import parse_version ## ==> Dispersion Aliases and Parameters <== ## @@ -881,7 +882,17 @@ "bibtex": "Caldeweyher:2019:154122", "doi": "10.1063/1.5090222150", "default": collections.OrderedDict( - [("a1", 1.0), ("a2", 1.0), ("alp", 16.0), ("s6", 1.0), ("s8", 1.0), ("s9", 1.0)] + [ + ("a1", 1.0), + ("a2", 1.0), + ("alp", 16.0), + ("s6", 1.0), + ("s8", 1.0), + ("s9", 1.0), + ("ga", 3.0), + ("gc", 2.0), + ("wf", 6.0), + ] ), "definitions": { # D4 parameters loaded below from authoritative source below. Keep a couple for reference @@ -891,6 +902,18 @@ }, } +try: + from dftd4 import __version__ as d4_version + + new_d4_api = parse_version(d4_version) >= parse_version("3.5.0") +except (ModuleNotFoundError, ImportError): + new_d4_api = False + +# different defaults for dftd4 versions < 3.5.0 +if not new_d4_api: + dashcoeff["d4bjeeqatm"]["default"] = collections.OrderedDict( + [("a1", 1.0), ("a2", 1.0), ("alp", 16.0), ("s6", 1.0), ("s8", 1.0), ("s9", 1.0)] + ) # for d3*atm, only skeleton entries with metadata defined above. below copies in parameters from d3*2b for d in ["d3zero", "d3bj", "d3mzero", "d3mbj", "d3op"]: @@ -964,6 +987,13 @@ def get_params(entry: dict, base: dict, defaults: list) -> dict: except KeyError: continue + # defaults ga, gc, wf are not in the toml parameter file and need to be provided by qcengine + if new_d4_api: + for entry in definitions.keys(): + definitions[entry]["params"]["ga"] = 3.0 + definitions[entry]["params"]["gc"] = 2.0 + definitions[entry]["params"]["wf"] = 6.0 + return definitions diff --git a/qcengine/programs/gcp.py b/qcengine/programs/gcp.py index 17929d672..368f82521 100644 --- a/qcengine/programs/gcp.py +++ b/qcengine/programs/gcp.py @@ -160,16 +160,25 @@ def build_input( # thus code blocks with FILE below are not used yet. # 'file', ] + # some methods not available in legacy version + mctc_gcp_levels = ["B973C", "R2SCAN3C"] + + executable = self._defaults["name"].lower() + if executable == "mctc-gcp": + available_levels.extend(mctc_gcp_levels) + available_levels = [f.upper() for f in available_levels] # temp until actual options object method = input_model.model.method.upper() if method not in available_levels: - raise InputError(f"GCP does not have method: {method}") + if method in mctc_gcp_levels and executable == "gcp": + raise InputError(f"GCP does not have method {method} but MCTC-GCP does.") + else: + raise InputError(f"GCP does not have method: {method}") # Need 'real' field later and that's only guaranteed for molrec molrec = qcel.molparse.from_schema(input_model.molecule.dict()) - executable = self._defaults["name"].lower() calldash = {"gcp": "-", "mctc-gcp": "--"}[executable] command = [executable, "gcp_geometry.xyz", calldash + "level", method] diff --git a/qcengine/testing.py b/qcengine/testing.py index b4d3c6315..3f7ff1ff7 100644 --- a/qcengine/testing.py +++ b/qcengine/testing.py @@ -157,6 +157,7 @@ def get_job(self): "dftd3": which("dftd3", return_bool=True), "dftd3_321": is_program_new_enough("dftd3", "3.2.1"), "dftd4": which_import("dftd4", return_bool=True), + "dftd4_350": is_program_new_enough("dftd4", "3.5.0"), "s-dftd3": which_import("dftd3", return_bool=True), "qcore": is_program_new_enough("qcore", "0.8.9"), "gamess": which("rungms", return_bool=True),