# 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.qchemlog module."""
import numpy as np
from numpy.testing import assert_equal, assert_allclose
from ..api import load_one
from ..formats.qchemlog import load_qchemlog_low
from ..utils import LineIterator, angstrom, kjmol
try:
from importlib_resources import as_file, files
except ImportError:
from importlib.resources import as_file, files
[docs]def test_load_qchemlog_low_h2o():
"""Test load_qchemlog_low with water_hf_ccpvtz_freq_qchem.out."""
with as_file(files("iodata.test.data").joinpath("water_hf_ccpvtz_freq_qchem.out")) as fq:
data = load_qchemlog_low(LineIterator(str(fq)))
# check loaded data
assert data['run_type'] == 'freq'
assert data['lot'] == 'hf'
assert data['obasis_name'] == 'cc-pvtz'
assert data['unrestricted'] == 1
assert data['symm'] == 0
assert data['g_rot'] == 1
assert data['alpha_elec'] == 5
assert data['beta_elec'] == 5
assert_allclose(data['nuclear_repulsion_energy'], 9.19775748)
assert_allclose(data['energy'], -76.0571936393)
assert data['norba'] == 58
assert data['norbb'] == 58
assert data['dipole_tol'] == 2.0231
assert_allclose(data['enthalpy_dict']['trans_enthalpy'], 0.889)
assert_allclose(data['enthalpy_dict']['rot_enthalpy'], 0.889)
assert_allclose(data['enthalpy_dict']['vib_enthalpy'], 13.883)
assert_allclose(data['enthalpy_dict']['enthalpy_total'], 16.253)
assert_allclose(data['entropy_dict']['trans_entropy'], 34.608)
assert_allclose(data['entropy_dict']['rot_entropy'], 11.82)
assert_allclose(data['entropy_dict']['vib_entropy'], 0.003)
assert_allclose(data['entropy_dict']['entropy_total'], 46.432)
assert data['imaginary_freq'] == 0
assert_allclose(data['vib_energy'], 13.882)
assert_equal(data['atnums'], np.array([8, 1, 1]))
assert_equal(data['atmasses'], [15.99491, 1.00783, 1.00783])
atcoords = np.array([[0.00575, 0.00426, -0.00301],
[0.27588, 0.88612, 0.25191],
[0.60257, -0.23578, -0.7114]]) * angstrom
assert_equal(data['atcoords'], atcoords)
assert_equal(data['mo_a_occ'], np.array([-20.5546, -1.3458, -0.7102, -0.5776, -0.5045]))
assert_equal(data['mo_b_occ'], np.array([-20.5546, -1.3458, -0.7102, -0.5776, -0.5045]))
alpha_mo_unoccupied = np.array([0.1423, 0.2041, 0.5445, 0.6021, 0.6682, 0.7874, 0.8014,
0.8052, 0.861, 0.9557, 1.1314, 1.197, 1.5276, 1.5667,
2.0366, 2.052, 2.0664, 2.1712, 2.2342, 2.591, 2.9639,
3.3568, 3.4919, 3.5814, 3.6562, 3.8012, 3.8795, 3.8849,
3.9617, 4.0196, 4.0768, 4.1932, 4.3149, 4.39, 4.5839,
4.6857, 4.8666, 5.1595, 5.2529, 5.5288, 6.0522, 6.5707,
6.9264, 6.9442, 7.0027, 7.0224, 7.068, 7.1668, 7.2377,
7.4574, 7.7953, 8.2906, 12.8843])
assert_allclose(data['mo_a_vir'], alpha_mo_unoccupied)
beta_mo_unoccupied = np.array([0.1423, 0.2041, 0.5445, 0.6021, 0.6682, 0.7874, 0.8014,
0.8052, 0.861, 0.9557, 1.1314, 1.197, 1.5276, 1.5667,
2.0366, 2.052, 2.0664, 2.1712, 2.2342, 2.591, 2.9639,
3.3568, 3.4919, 3.5814, 3.6562, 3.8012, 3.8795, 3.8849,
3.9617, 4.0196, 4.0768, 4.1932, 4.3149, 4.39, 4.5839,
4.6857, 4.8666, 5.1595, 5.2529, 5.5288, 6.0522, 6.5707,
6.9264, 6.9442, 7.0027, 7.0224, 7.068, 7.1668, 7.2377,
7.4574, 7.7953, 8.2906, 12.8843])
assert_allclose(data['mo_b_vir'], beta_mo_unoccupied)
assert_allclose(data['mulliken_charges'], np.array([-0.482641, 0.241321, 0.241321]))
assert_allclose(data['dipole'], np.array([1.4989, 1.1097, -0.784]))
assert_allclose(data['quadrupole'], [-6.1922, 0.2058, -5.0469, -0.9308, 1.1096, -5.762])
assert_allclose(data['polarizability_tensor'], [[-6.1256608, -0.1911917, 0.8593603],
[-0.1911917, -7.180854, -1.0224452],
[0.8593603, -1.0224452, -6.52088]])
hessian = np.array([[3.162861e-01, 8.366060e-02, -2.326701e-01, -8.253820e-02,
-1.226155e-01, -2.676000e-03, -2.337479e-01, 3.895480e-02, 2.353461e-01],
[8.366060e-02, 5.460341e-01, 2.252114e-01, -1.647100e-01,
-4.652302e-01, -1.071603e-01, 8.104940e-02, -8.080390e-02, -1.180510e-01],
[-2.326701e-01, 2.252114e-01, 3.738573e-01, -2.713570e-02,
-1.472865e-01, -7.031900e-02, 2.598057e-01, -7.792490e-02, -3.035382e-01],
[-8.253820e-02, -1.647100e-01, -2.713570e-02, 7.455040e-02,
1.315365e-01, 1.474740e-02, 7.987800e-03, 3.317350e-02, 1.238830e-02],
[-1.226155e-01, -4.652302e-01, -1.472865e-01, 1.315365e-01,
4.787640e-01, 1.470895e-01, -8.921000e-03, -1.353380e-02, 1.970000e-04],
[-2.676000e-03, -1.071603e-01, -7.031900e-02, 1.474740e-02,
1.470895e-01, 8.125140e-02, -1.207140e-02, -3.992910e-02, -1.093230e-02],
[-2.337479e-01, 8.104940e-02, 2.598057e-01, 7.987800e-03,
-8.921000e-03, -1.207140e-02, 2.257601e-01, -7.212840e-02, -2.477343e-01],
[3.895480e-02, -8.080390e-02, -7.792490e-02, 3.317350e-02,
-1.353380e-02, -3.992910e-02, -7.212840e-02, 9.433770e-02, 1.178541e-01],
[2.353461e-01, -1.180510e-01, -3.035382e-01, 1.238830e-02,
1.970000e-04, -1.093230e-02, -2.477343e-01, 1.178541e-01, 3.144706e-01]])
assert_allclose(data['athessian'], hessian)
[docs]def test_load_one_qchemlog_freq():
source = files("iodata.test.data").joinpath("water_hf_ccpvtz_freq_qchem.out")
with as_file(source) as fn_qchemlog:
mol = load_one(str(fn_qchemlog), fmt='qchemlog')
assert_allclose(mol.energy, -76.0571936393)
assert mol.g_rot == 1
assert mol.nelec == 10
assert mol.run_type == 'freq'
assert mol.lot == 'hf'
assert mol.obasis_name == 'cc-pvtz'
assert_allclose(mol.atcharges['mulliken'], np.array([-0.482641, 0.241321, 0.241321]))
assert_equal(mol.moments[(1, 'c')], np.array([1.4989, 1.1097, -0.784]))
assert_equal(mol.moments[(2, 'c')],
np.array([-6.1922, 0.2058, -0.9308, -5.0469, 1.1096, -5.762]))
hessian = np.array([[3.162861e-01, 8.366060e-02, -2.326701e-01, -8.253820e-02,
-1.226155e-01, -2.676000e-03, -2.337479e-01, 3.895480e-02, 2.353461e-01],
[8.366060e-02, 5.460341e-01, 2.252114e-01, -1.647100e-01,
-4.652302e-01, -1.071603e-01, 8.104940e-02, -8.080390e-02, -1.180510e-01],
[-2.326701e-01, 2.252114e-01, 3.738573e-01, -2.713570e-02,
-1.472865e-01, -7.031900e-02, 2.598057e-01, -7.792490e-02, -3.035382e-01],
[-8.253820e-02, -1.647100e-01, -2.713570e-02, 7.455040e-02,
1.315365e-01, 1.474740e-02, 7.987800e-03, 3.317350e-02, 1.238830e-02],
[-1.226155e-01, -4.652302e-01, -1.472865e-01, 1.315365e-01,
4.787640e-01, 1.470895e-01, -8.921000e-03, -1.353380e-02, 1.970000e-04],
[-2.676000e-03, -1.071603e-01, -7.031900e-02, 1.474740e-02,
1.470895e-01, 8.125140e-02, -1.207140e-02, -3.992910e-02, -1.093230e-02],
[-2.337479e-01, 8.104940e-02, 2.598057e-01, 7.987800e-03,
-8.921000e-03, -1.207140e-02, 2.257601e-01, -7.212840e-02, -2.477343e-01],
[3.895480e-02, -8.080390e-02, -7.792490e-02, 3.317350e-02,
-1.353380e-02, -3.992910e-02, -7.212840e-02, 9.433770e-02, 1.178541e-01],
[2.353461e-01, -1.180510e-01, -3.035382e-01, 1.238830e-02,
1.970000e-04, -1.093230e-02, -2.477343e-01, 1.178541e-01, 3.144706e-01]])
assert_equal(mol.athessian, hessian)
assert mol.extra['nuclear_repulsion_energy'] == 9.19775748
assert mol.extra['imaginary_freq'] == 0
# unit conversion for entropy terms, used atomic units + Kalvin
assert_allclose(mol.extra['entropy_dict']['trans_entropy'], 34.608 * 1.593601437640628e-06)
assert_allclose(mol.extra['entropy_dict']['rot_entropy'], 11.82 * 1.593601437640628e-06)
assert_allclose(mol.extra['entropy_dict']['vib_entropy'], 0.003 * 1.593601437640628e-06)
assert_allclose(mol.extra['entropy_dict']['entropy_total'], 46.432 * 1.593601437640628e-06)
assert_allclose(mol.extra['vib_energy'], 0.022122375167392933)
assert_allclose(mol.extra['enthalpy_dict']['trans_enthalpy'], 0.0014167116787071256)
assert_allclose(mol.extra['enthalpy_dict']['rot_enthalpy'], 0.0014167116787071256)
assert_allclose(mol.extra['enthalpy_dict']['vib_enthalpy'], 0.022123968768831298)
assert_allclose(mol.extra['enthalpy_dict']['enthalpy_total'], 0.025900804177758054)
polarizability_tensor = np.array([[-6.1256608, -0.1911917, 0.8593603],
[-0.1911917, -7.180854, -1.0224452],
[0.8593603, -1.0224452, -6.52088]])
assert_equal(mol.extra['polarizability_tensor'], polarizability_tensor)
atcoords = np.array([[0.00575, 0.00426, -0.00301],
[0.27588, 0.88612, 0.25191],
[0.60257, -0.23578, -0.7114]]) * angstrom
assert_equal(mol.atcoords, atcoords)
assert_equal(mol.atmasses, np.array([15.99491, 1.00783, 1.00783]))
assert_equal(mol.atnums, np.array([8, 1, 1]))
# molecule orbital related
# check number of orbitals and occupation numbers
assert mol.mo.kind == 'unrestricted'
assert mol.mo.norba == 58
assert mol.mo.norbb == 58
assert mol.mo.norb == 116
assert_equal(mol.mo.occsa, [1, 1, 1, 1, 1] + [0] * 53)
assert_equal(mol.mo.occsb, [1, 1, 1, 1, 1] + [0] * 53)
# alpha occupied orbital energies
occupied = np.array([-20.5546, -1.3458, -0.7102, -0.5776, -0.5045])
assert_allclose(mol.mo.energies[:5], occupied)
# beta occupied orbital energies
assert_allclose(mol.mo.energies[58:63], occupied)
# alpha virtual orbital energies
virtual = np.array([0.1423, 0.2041, 0.5445, 0.6021, 0.6682, 0.7874, 0.8014, 0.8052,
0.8610, 0.9557, 1.1314, 1.1970, 1.5276, 1.5667, 2.0366, 2.0520,
2.0664, 2.1712, 2.2342, 2.5910, 2.9639, 3.3568, 3.4919, 3.5814,
3.6562, 3.8012, 3.8795, 3.8849, 3.9617, 4.0196, 4.0768, 4.1932,
4.3149, 4.3900, 4.5839, 4.6857, 4.8666, 5.1595, 5.2529, 5.5288,
6.0522, 6.5707, 6.9264, 6.9442, 7.0027, 7.0224, 7.0680, 7.1668,
7.2377, 7.4574, 7.7953, 8.2906, 12.8843])
assert_allclose(mol.mo.energies[5:58], virtual)
# beta virtual orbital energies
assert_allclose(mol.mo.energies[63:], virtual)
[docs]def test_load_qchemlog_low_qchemlog_h2o_dimer_eda2():
"""Test load_qchemlog_low with h2o_dimer_eda_qchem5.3.out."""
# pylint: disable=too-many-statements
with as_file(files("iodata.test.data").joinpath("h2o_dimer_eda_qchem5.3.out")) as fq:
data = load_qchemlog_low(LineIterator(str(fq)))
# check loaded data
assert data['run_type'] == 'eda'
assert data['lot'] == 'wb97x-v'
assert data['obasis_name'] == 'def2-tzvpd'
assert not data['unrestricted']
assert not data['symm']
assert data['alpha_elec'] == 10
assert data['beta_elec'] == 10
assert_allclose(data['nuclear_repulsion_energy'], 36.66284801)
assert_allclose(data['energy'], -152.8772543727)
assert data['norba'] == 116
assert_allclose(data['dipole_tol'], 2.5701)
assert_equal(data['atnums'], np.array([8, 1, 1, 8, 1, 1]))
atcoords = np.array([[-1.5510070000, -0.1145200000, 0.0000000000],
[-1.9342590000, 0.7625030000, 0.0000000000],
[-0.5996770000, 0.0407120000, 0.0000000000],
[1.3506250000, 0.1114690000, 0.0000000000],
[1.6803980000, -0.3737410000, -0.7585610000],
[1.6803980000, -0.3737410000, 0.7585610000]]) * angstrom
assert_allclose(data['atcoords'], atcoords)
assert_allclose(data['mo_a_occ'], np.array([-19.2455, -19.1897, -1.1734, -1.1173, -0.6729,
-0.6242, -0.5373, -0.4825, -0.4530, -0.4045]))
alpha_mo_unoccupied = np.array([0.0485, 0.0863, 0.0927, 0.1035, 0.1344, 0.1474, 0.1539, 0.1880,
0.1982, 0.2280, 0.2507, 0.2532, 0.2732, 0.2865, 0.2992, 0.3216,
0.3260, 0.3454, 0.3542, 0.3850, 0.3991, 0.4016, 0.4155, 0.4831,
0.5016, 0.5133, 0.5502, 0.5505, 0.5745, 0.5992, 0.6275, 0.6454,
0.6664, 0.6869, 0.7423, 0.7874, 0.8039, 0.8204, 0.8457, 0.9021,
0.9149, 0.9749, 1.0168, 1.0490, 1.1274, 1.2009, 1.6233, 1.6642,
1.6723, 1.6877, 1.7314, 1.7347, 1.8246, 1.8635, 1.8877, 1.9254,
2.0091, 2.1339, 2.2139, 2.2489, 2.2799, 2.3420, 2.3777, 2.5255,
2.6135, 2.6373, 2.6727, 2.7228, 2.8765, 2.8841, 2.9076, 2.9624,
3.0377, 3.0978, 3.2509, 3.3613, 3.8767, 3.9603, 4.0824, 4.1424,
5.1826, 5.2283, 5.3319, 5.3817, 5.4919, 5.5386, 5.5584, 5.5648,
5.6049, 5.6226, 6.1591, 6.2079, 6.3862, 6.4446, 6.5805, 6.5926,
6.6092, 6.6315, 6.6557, 6.6703, 7.0400, 7.1334, 7.1456, 7.2547,
43.7457, 43.9166])
assert_allclose(data['mo_a_vir'], alpha_mo_unoccupied)
assert_allclose(data['mulliken_charges'], np.array([-0.610250, 0.304021, 0.337060,
-0.663525, 0.316347, 0.316347]))
assert_allclose(data['dipole'], np.array([2.5689, 0.0770, 0.0000]))
assert_allclose(data['quadrupole'], [-12.0581, -6.2544, -12.8954, -0.0000, -0.0000, -12.2310])
# check eda2 info
assert_allclose(data['eda2']['e_elec'], -65.9887)
assert_allclose(data['eda2']['e_kep_pauli'], 78.5700)
assert_allclose(data['eda2']['e_disp_free_pauli'], -14.2495)
assert_allclose(data['eda2']['e_disp'], -7.7384)
assert_allclose(data['eda2']['e_cls_elec'], -35.1257)
assert_allclose(data['eda2']['e_cls_pauli'], 25.7192)
assert_allclose(data['eda2']['e_mod_pauli'], 33.4576)
assert_allclose(data['eda2']['preparation'], 0.0000)
assert_allclose(data['eda2']['frozen'], -1.6681)
assert_allclose(data['eda2']['pauli'], 64.3205)
assert_allclose(data['eda2']['dispersion'], -7.7384)
assert_allclose(data['eda2']['polarization'], -4.6371)
assert_allclose(data['eda2']['charge transfer'], -7.0689)
assert_allclose(data['eda2']['total'], -21.1126)
# check fragments
coords1 = [[-1.551007, -0.11452, 0.0], [-1.934259, 0.762503, 0.0], [-0.599677, 0.040712, 0.0]]
coords2 = [[1.350625, 0.111469, 0.0], [1.680398, -0.373741, -0.758561],
[1.680398, -0.373741, 0.758561]]
assert_equal(len(data['frags']), 2)
assert_equal(data['frags'][0]['atnums'], [8, 1, 1])
assert_equal(data['frags'][0]['alpha_elec'], 5)
assert_equal(data['frags'][0]['beta_elec'], 5)
assert_equal(data['frags'][0]['nbasis'], 58)
assert_allclose(data['frags'][0]['atcoords'], np.array(coords1) * angstrom)
assert_allclose(data['frags'][0]['nuclear_repulsion_energy'], 9.16383018)
assert_allclose(data['frags'][0]['energy'], -76.4345994141)
assert_equal(data['frags'][1]['atnums'], [8, 1, 1])
assert_equal(data['frags'][1]['alpha_elec'], 5)
assert_equal(data['frags'][1]['beta_elec'], 5)
assert_equal(data['frags'][1]['nbasis'], 58)
assert_allclose(data['frags'][1]['atcoords'], np.array(coords2) * angstrom)
assert_allclose(data['frags'][1]['nuclear_repulsion_energy'], 9.17803894)
assert_allclose(data['frags'][1]['energy'], -76.4346136883)
[docs]def test_load_one_h2o_dimer_eda2():
"""Test load_one with h2o_dimer_eda_qchem5.3.out."""
# pylint: disable=too-many-statements
with as_file(files("iodata.test.data").joinpath("h2o_dimer_eda_qchem5.3.out")) as fn_qchemlog:
mol = load_one(str(fn_qchemlog), fmt='qchemlog')
# check loaded data
assert mol.run_type == 'eda'
assert mol.lot == 'wb97x-v'
assert mol.obasis_name == 'def2-tzvpd'
assert mol.mo.kind == 'restricted'
# assert not data['symm']
# # assert data['g_rot'] == 1
# assert data['alpha_elec'] == 10
# assert data['beta_elec'] == 10
assert_allclose(mol.extra['nuclear_repulsion_energy'], 36.66284801)
assert_allclose(mol.energy, -152.8772543727)
assert mol.mo.norba == 116
assert mol.mo.norbb == 116
assert_equal(mol.atnums, np.array([8, 1, 1, 8, 1, 1]))
# assert_equal(data['atmasses'], [15.99491, 1.00783, 1.00783])
atcoords = np.array([[-1.5510070000, -0.1145200000, 0.0000000000],
[-1.9342590000, 0.7625030000, 0.0000000000],
[-0.5996770000, 0.0407120000, 0.0000000000],
[1.3506250000, 0.1114690000, 0.0000000000],
[1.6803980000, -0.3737410000, -0.7585610000],
[1.6803980000, -0.3737410000, 0.7585610000]]) * angstrom
assert_equal(mol.atcoords, atcoords)
# check MO energies
mo_energies_a = [-19.2455, -19.1897, -1.1734, -1.1173, -0.6729, -0.6242, -0.5373, -0.4825,
-0.4530, -0.4045, 0.0485, 0.0863, 0.0927, 0.1035, 0.1344, 0.1474, 0.1539,
0.1880, 0.1982, 0.2280, 0.2507, 0.2532, 0.2732, 0.2865, 0.2992, 0.3216,
0.3260, 0.3454, 0.3542, 0.3850, 0.3991, 0.4016, 0.4155, 0.4831, 0.5016,
0.5133, 0.5502, 0.5505, 0.5745, 0.5992, 0.6275, 0.6454, 0.6664, 0.6869,
0.7423, 0.7874, 0.8039, 0.8204, 0.8457, 0.9021, 0.9149, 0.9749, 1.0168,
1.0490, 1.1274, 1.2009, 1.6233, 1.6642, 1.6723, 1.6877, 1.7314, 1.7347,
1.8246, 1.8635, 1.8877, 1.9254, 2.0091, 2.1339, 2.2139, 2.2489, 2.2799,
2.3420, 2.3777, 2.5255, 2.6135, 2.6373, 2.6727, 2.7228, 2.8765, 2.8841,
2.9076, 2.9624, 3.0377, 3.0978, 3.2509, 3.3613, 3.8767, 3.9603, 4.0824,
4.1424, 5.1826, 5.2283, 5.3319, 5.3817, 5.4919, 5.5386, 5.5584, 5.5648,
5.6049, 5.6226, 6.1591, 6.2079, 6.3862, 6.4446, 6.5805, 6.5926, 6.6092,
6.6315, 6.6557, 6.6703, 7.0400, 7.1334, 7.1456, 7.2547, 43.7457, 43.9166]
assert_allclose(mol.mo.energiesa, mo_energies_a)
assert_allclose(mol.mo.energiesb, mo_energies_a)
assert_equal(mol.atcharges['mulliken'], np.array([-0.610250, 0.304021, 0.337060,
-0.663525, 0.316347, 0.316347]))
assert_allclose(mol.moments[(1, 'c')], np.array([2.5689, 0.0770, 0.0000]))
assert_allclose(mol.moments[(2, 'c')],
[-12.0581, -6.2544, -0.0000, -12.8954, -0.0000, -12.2310])
# check eda2 info
assert_equal(mol.extra['eda2']['e_elec'], -65.9887 * kjmol)
assert_equal(mol.extra['eda2']['e_kep_pauli'], 78.5700 * kjmol)
assert_equal(mol.extra['eda2']['e_disp_free_pauli'], -14.2495 * kjmol)
assert_equal(mol.extra['eda2']['e_disp'], -7.7384 * kjmol)
assert_equal(mol.extra['eda2']['e_cls_elec'], -35.1257 * kjmol)
assert_equal(mol.extra['eda2']['e_cls_pauli'], 25.7192 * kjmol)
assert_equal(mol.extra['eda2']['e_mod_pauli'], 33.4576 * kjmol)
assert_equal(mol.extra['eda2']['preparation'], 0.0000)
assert_equal(mol.extra['eda2']['frozen'], -1.6681 * kjmol)
assert_equal(mol.extra['eda2']['pauli'], 64.3205 * kjmol)
assert_equal(mol.extra['eda2']['dispersion'], -7.7384 * kjmol)
assert_equal(mol.extra['eda2']['polarization'], -4.6371 * kjmol)
assert_equal(mol.extra['eda2']['charge transfer'], -7.0689 * kjmol)
assert_equal(mol.extra['eda2']['total'], -21.1126 * kjmol)
# check fragments
coords1 = [[-1.551007, -0.11452, 0.0], [-1.934259, 0.762503, 0.0], [-0.599677, 0.040712, 0.0]]
coords2 = [[1.350625, 0.111469, 0.0], [1.680398, -0.373741, -0.758561],
[1.680398, -0.373741, 0.758561]]
assert_equal(len(mol.extra['frags']), 2)
assert_equal(mol.extra['frags'][0]['atnums'], [8, 1, 1])
assert_equal(mol.extra['frags'][0]['alpha_elec'], 5)
assert_equal(mol.extra['frags'][0]['beta_elec'], 5)
assert_equal(mol.extra['frags'][0]['nbasis'], 58)
assert_allclose(mol.extra['frags'][0]['atcoords'], np.array(coords1) * angstrom)
assert_allclose(mol.extra['frags'][0]['nuclear_repulsion_energy'], 9.16383018)
assert_allclose(mol.extra['frags'][0]['energy'], -76.4345994141)
assert_equal(mol.extra['frags'][1]['atnums'], [8, 1, 1])
assert_equal(mol.extra['frags'][1]['alpha_elec'], 5)
assert_equal(mol.extra['frags'][1]['beta_elec'], 5)
assert_equal(mol.extra['frags'][1]['nbasis'], 58)
assert_allclose(mol.extra['frags'][1]['atcoords'], np.array(coords2) * angstrom)
assert_allclose(mol.extra['frags'][1]['nuclear_repulsion_energy'], 9.17803894)
assert_allclose(mol.extra['frags'][1]['energy'], -76.4346136883)