File: test_nwchem_writer.py

package info (click to toggle)
python-ase 3.26.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,484 kB
  • sloc: python: 148,112; xml: 2,728; makefile: 110; javascript: 47
file content (99 lines) | stat: -rw-r--r-- 3,046 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# fmt: off
import numpy as np
import pytest

from ase import Atom, Atoms
from ase.io.nwchem import write_nwchem_in


@pytest.fixture()
def atomic_configuration():
    molecule = Atoms(pbc=False)
    molecule.append(Atom('C', [0, 0, 0]))
    molecule.append(Atom('O', [1.6, 0, 0]))
    return molecule


@pytest.fixture()
def calculator_parameters():
    params = dict(
        memory='1024 mb',
        dft=dict(xc='b3lyp', mult=1, maxiter=300),
        basis='6-311G*',
    )
    return params


def test_echo(atomic_configuration, calculator_parameters, tmp_path):
    with (tmp_path / 'nwchem.in').open('w') as fd:
        write_nwchem_in(
            fd, atomic_configuration, echo=False, **calculator_parameters
        )
    content = (tmp_path / 'nwchem.in').read_text().splitlines()
    assert 'echo' not in content

    with (tmp_path / 'nwchem.in').open('w') as fd:
        write_nwchem_in(
            fd, atomic_configuration, echo=True, **calculator_parameters
        )
    content = (tmp_path / 'nwchem.in').read_text().splitlines()
    assert 'echo' in content


def test_params(atomic_configuration, calculator_parameters, tmp_path):
    with (tmp_path / 'nwchem.in').open('w') as fd:
        write_nwchem_in(fd, atomic_configuration, **calculator_parameters)
    content = (tmp_path / 'nwchem.in').read_text().splitlines()

    for key, value in calculator_parameters.items():
        for line in content:
            flds = line.split()
            if len(flds) == 0:
                continue
            if flds[0] == key:
                break
        else:
            assert False
        if key == 'basis':  # special case
            pass
        elif isinstance(value, str):
            assert len(value.split()) == len(flds[1:])
            assert all(v == f for v, f in zip(value.split(), flds[1:]))
        elif isinstance(value, (int, float)):
            assert len(flds[1:]) == 1
            assert np.isclose(value, float(flds[1]))


def test_write_nwchem_in_set_params(
    atomic_configuration, calculator_parameters, tmp_path
):
    """
    Tests writing NWChem input file with a dictionary
    in the 'set' parameter, ensuring correct section order.
    Closes #1578
    """
    cparams = calculator_parameters
    cparams['set'] = {'geom:dont_verify': True}
    with (tmp_path / 'nwchem.in').open('w') as fd:
        write_nwchem_in(fd, atomic_configuration, echo=False, **cparams)
    content = (tmp_path / 'nwchem.in').read_text().splitlines()
    # 'set geom:dont_verify .true.' must appear before 'geometry'
    set_line_index = next(
        (
            i
            for i, line in enumerate(content)
            if line.strip() == 'set geom:dont_verify .true.'
        ),
        None,
    )
    geometry_line_index = next(
        (
            i
            for i, line in enumerate(content)
            if line.strip().startswith('geometry')
        ),
        None,
    )

    assert set_line_index is not None and geometry_line_index is not None
    assert set_line_index < geometry_line_index