# 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.formats.cube module."""
from importlib.resources import as_file, files
import numpy as np
from numpy.testing import assert_allclose, assert_equal
from ..api import dump_one, load_one
[docs]
def test_load_aelta():
with as_file(files("iodata.test.data").joinpath("aelta.cube")) as fn_cube:
mol = load_one(str(fn_cube))
assert mol.title == "Some random cube for testing (sort of) useless data"
assert_equal(mol.natom, 72)
assert_allclose(mol.atcoords[5, 0], 27.275511, atol=1.0e-5)
assert_allclose(mol.atcoords[-2, 2], 26.460812, atol=1.0e-5)
assert_equal(mol.cube.shape, (12, 12, 12))
my_cellvecs = (
np.array([[1.8626, 0.1, 0.0], [0.0, 1.8626, 0.0], [0.0, 0.0, 1.8626]], dtype=float) * 12
)
assert_allclose(mol.cellvecs, my_cellvecs, atol=1.0e-5)
my_axes = np.array([[1.8626, 0.1, 0.0], [0.0, 1.8626, 0.0], [0.0, 0.0, 1.8626]], dtype=float)
assert_allclose(mol.cube.axes, my_axes, atol=1.0e-5)
assert_allclose(mol.cube.origin, np.array([0.0, 1.2, 0.0]), atol=1.0e-10)
assert_allclose(mol.cube.data[0, 0, 0], 9.49232e-06, atol=1.0e-12)
assert_allclose(mol.cube.data[-1, -1, -1], 2.09856e-04, atol=1.0e-10)
pn = mol.atcorenums
assert_allclose(pn[0], 1.0, atol=1.0e-10)
assert_allclose(pn[1], 0.1, atol=1.0e-10)
assert_allclose(pn[-2], 0.2, atol=1.0e-10)
assert_allclose(pn[-1], mol.atnums[-1], atol=1.0e-10)
[docs]
def test_load_dump_load_aelta(tmpdir):
with as_file(files("iodata.test.data").joinpath("aelta.cube")) as fn_cube1:
mol1 = load_one(str(fn_cube1))
fn_cube2 = "{}/{}".format(tmpdir, "aelta.cube")
dump_one(mol1, fn_cube2)
mol2 = load_one(fn_cube2)
with open(fn_cube2) as f:
block_counter = 0
for iline, line in enumerate(f):
if iline > 6 + len(mol2.atnums):
if mol2.cube.shape[2] % 6 == 0:
assert len(line.split()) == 6
if mol2.cube.shape[2] % 6 != 0:
block_line_counter = iline - (
6 + len(mol2.atnums) + block_counter * (mol2.cube.shape[2] // 6 + 1)
)
if 1 <= block_line_counter <= mol2.cube.shape[2] // 6:
assert len(line.split()) == 6
if block_line_counter == mol2.cube.shape[2] // 6 + 1:
assert len(line.split()) == mol2.cube.shape[2] % 6
assert mol1.title == mol2.title
assert_allclose(mol1.atcoords, mol2.atcoords, atol=1.0e-4)
assert_equal(mol1.atnums, mol2.atnums)
cube1 = mol1.cube
cube2 = mol2.cube
assert_allclose(cube1.axes, cube2.axes, atol=1.0e-4)
assert_equal(cube1.shape, cube2.shape)
assert_allclose(mol1.cube.data, mol2.cube.data, atol=1.0e-4)
assert_allclose(mol1.atcorenums, mol2.atcorenums, atol=1.0e-4)
[docs]
def test_load_dump_h2o_5points(tmpdir):
# load cube file
with as_file(files("iodata.test.data").joinpath("cubegen_h2o_5points.cube")) as fn_cube1:
mol1 = load_one(str(fn_cube1))
# write cube file in a temporary directory
fn_cube2 = tmpdir.join("iodata_h2o_5points.cube")
dump_one(mol1, fn_cube2)
# read the contents as string (skip the first 2 lines) & compare
with open(fn_cube1) as f:
content1 = f.read().split("\n", 2)[-1]
content2 = fn_cube2.read().split("\n", 2)[-1]
assert content1 == content2
[docs]
def test_load_dump_ch4_6points(tmpdir):
# load cube file
with as_file(files("iodata.test.data").joinpath("cubegen_ch4_6points.cube")) as fn_cube1:
mol1 = load_one(str(fn_cube1))
# write cube file in a temporary directory
fn_cube2 = tmpdir.join("iodata_ch4_6points.cube")
dump_one(mol1, fn_cube2)
# read the contents as string (skip the first 2 lines) & compare
with open(fn_cube1) as f:
content1 = f.read().split("\n", 2)[-1]
content2 = fn_cube2.read().split("\n", 2)[-1]
assert content1 == content2
[docs]
def test_load_dump_nh3_7points(tmpdir):
# load cube file
with as_file(files("iodata.test.data").joinpath("cubegen_nh3_7points.cube")) as fn_cube1:
mol1 = load_one(str(fn_cube1))
# write cube file in a temporary directory
fn_cube2 = tmpdir.join("iodata_nh3_7points.cube")
dump_one(mol1, fn_cube2)
# read the contents as string (skip the first 2 lines) & compare
with open(fn_cube1) as f:
content1 = f.read().split("\n", 2)[-1]
content2 = fn_cube2.read().split("\n", 2)[-1]
assert content1 == content2