Source code for iodata.test.test_inputs

# IODATA is an input and output module for quantum chemistry.
# Copyright (C) 2011-2019 The IODATA Development Team
#
# This file is part of IODATA.
#
# IODATA is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# IODATA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>
# --
"""Test iodata.inputs module."""

import os
import numpy as np

from ..iodata import IOData
from ..utils import angstrom
from ..api import load_one, write_input

try:
    from importlib_resources import as_file, files
except ImportError:
    from importlib.resources import as_file, files


[docs]def check_load_input_and_compare(fname: str, fname_expected: str): """Load saved input file and compare to expected input file. Parameters ---------- fname : str Path to input file name to load. fname_expected : str Path to expected input file to load. """ with open(fname, 'r') as ifn: content = "".join(ifn.readlines()) with open(fname_expected, 'r') as efn: expected = "".join(efn.readlines()) assert content == expected
[docs]def test_input_gaussian_from_xyz(tmpdir): # load geometry from xyz file & add level of theory & basis set with as_file(files("iodata.test.data").joinpath("water_number.xyz")) as fn: mol = load_one(fn) mol.nelec = 10 mol.lot = 'ub3lyp' mol.obasis_name = '6-31g*' # write input in a temporary folder using the user-template fname = os.path.join(tmpdir, 'input_from_xyz.com') template = """\ %chk=gaussian.chk %mem=3500MB %nprocs=4 #p {lot}/{obasis_name} opt scf(tight,xqc,fermi) integral(grid=ultrafine) {extra_cmd} {title} {lot}/{obasis_name} opt-force 0 1 {geometry} --Link1-- %chk=gaussian.chk %mem=3500MB %nprocs=4 #p {lot}/{obasis_name} force guess=read geom=allcheck integral(grid=ultrafine) output=wfn gaussian.wfn """ write_input(mol, fname, fmt='gaussian', template=template, extra_cmd="nosymmetry") # compare saved input to expected input source = files("iodata.test.data").joinpath("input_gaussian_h2o_opt_ub3lyp.txt") with as_file(source) as fname_expected: check_load_input_and_compare(fname, fname_expected)
[docs]def test_input_gaussian_from_iodata(tmpdir): # make an instance of IOData for HCl anion data = {"atcoords": np.array([[0.0, 0.0, 0.0], [angstrom, 0.0, 0.0]]), "atnums": np.array([1, 17]), "nelec": 19, "run_type": 'opt', "spinpol": 1} mol = IOData(**data) # write input in a temporary file fname = os.path.join(tmpdir, 'input_from_iodata.com') write_input(mol, fname, fmt='gaussian') # compare saved input to expected input source = files("iodata.test.data").joinpath("input_gaussian_hcl_anion_opt_hf.txt") with as_file(source) as fname_expected: check_load_input_and_compare(fname, fname_expected)
[docs]def test_input_gaussian_from_fchk(tmpdir): # load fchk with as_file(files("iodata.test.data").joinpath("water_hfs_321g.fchk")) as fn: mol = load_one(fn) # write input in a temporary file fname = os.path.join(tmpdir, 'input_from_fchk.in') write_input(mol, fname, fmt='gaussian') # compare saved input to expected input source = files("iodata.test.data").joinpath("input_gaussian_hcl_sp_rhf.txt") with as_file(source) as fname_expected: check_load_input_and_compare(fname, fname_expected)
[docs]def test_input_orca_from_xyz(tmpdir): # load geometry from xyz file & add level of theory & basis set with as_file(files("iodata.test.data").joinpath("water_number.xyz")) as fn: mol = load_one(fn) mol.nelec = 10 mol.lot = 'B3LYP' mol.obasis_name = 'def2-SVP' # write input in a temporary folder using the user-template fname = os.path.join(tmpdir, 'input_from_xyz.com') template = """\ ! {lot} {obasis_name} {grid_stuff} KeepDens # {title} %output PrintLevel Mini Print[ P_Mulliken ] 1 Print[P_AtCharges_M] 1 end %pal nprocs 4 end %coords CTyp xyz Charge {charge} Mult {spinmult} Units Angs coords {geometry} end end """ grid_stuff = "Grid4 TightSCF NOFINALGRID" write_input(mol, fname, fmt='orca', template=template, grid_stuff=grid_stuff) # compare saved input to expected input source = files("iodata.test.data").joinpath("input_orca_h2o_sp_b3lyp.txt") with as_file(source) as fname_expected: check_load_input_and_compare(fname, fname_expected)
[docs]def test_input_orca_from_iodata(tmpdir): # make an instance of IOData for HCl anion data = {"atcoords": np.array([[0.0, 0.0, 0.0], [angstrom, 0.0, 0.0]]), "atnums": np.array([1, 17]), "nelec": 19, "run_type": 'opt', "spinpol": 1} mol = IOData(**data) # write input in a temporary file fname = os.path.join(tmpdir, 'input_from_iodata.com') write_input(mol, fname, fmt='orca') # compare saved input to expected input source = files("iodata.test.data").joinpath("input_orca_hcl_anion_opt_hf.txt") with as_file(source) as fname_expected: check_load_input_and_compare(fname, fname_expected)
[docs]def test_input_orca_from_molden(tmpdir): # load orca molden with as_file(files("iodata.test.data").joinpath("nh3_orca.molden")) as fn: mol = load_one(fn) # write input in a temporary file fname = os.path.join(tmpdir, 'input_from_molden.in') write_input(mol, fname, fmt='orca') # compare saved input to expected input source = files("iodata.test.data").joinpath("input_orca_nh3_sp_hf.txt") with as_file(source) as fname_expected: check_load_input_and_compare(fname, fname_expected)