#!/usr/bin/env amspython from __future__ import annotations from pathlib import Path from scm.base import ChemicalSystem, InputParser from scm.plams import AMSJob, Settings, finish, init def build_formaldehyde() -> tuple[ChemicalSystem, str]: """Build formaldehyde from the requested SMILES and impose molecular symmetry.""" system = ChemicalSystem.from_smiles("C=O") point_group = system.symmetrize_molecule(tolerance=0.10) return system, point_group def adf_settings() -> Settings: settings = Settings() settings.input.ams.Task = "GeometryOptimization" settings.input.ams.Properties.NormalModes = "Yes" settings.input.ams.Properties.PESPointCharacter = "Yes" settings.input.adf.Basis.Type = "DZP" settings.input.adf.Basis.Core = "None" settings.input.adf.XC.GGA = "PBE" settings.input.adf.XC.Dispersion = "GRIMME3 BJDAMP" return settings def main() -> None: system, point_group = build_formaldehyde() settings = adf_settings() job = AMSJob(molecule=system, settings=settings, name="formaldehyde_adf_pbe_dzp") input_text = job.get_input() InputParser().to_dict("ams", input_text) Path("validated_input.in").write_text(input_text, encoding="utf-8") print(f"Built formaldehyde from SMILES C=O and symmetrized it to {point_group}.") print("Validated the serialized AMS/ADF input against the installed input definitions.") init(folder="01-run_workdir") results = job.run() if not job.ok(): raise RuntimeError(f"AMS job did not finish successfully: {results.job.path}") print(f"Completed job: {job.path}") finish() if __name__ == "__main__": main()