Example #1
0
    def test_energies_and_modes(self, n2_data):
        vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
        energies, modes = vib_data.get_energies_and_modes()
        assert_array_almost_equal(n2_data['ref_frequencies'],
                                  energies / units.invcm,
                                  decimal=5)
        assert_array_almost_equal(n2_data['ref_frequencies'],
                                  vib_data.get_energies() / units.invcm,
                                  decimal=5)
        assert_array_almost_equal(n2_data['ref_frequencies'],
                                  vib_data.get_frequencies(),
                                  decimal=5)

        assert (vib_data.get_zero_point_energy() == pytest.approx(
            n2_data['ref_zpe']))

        assert vib_data.tabulate() == vibrations_n2_log

        atoms_with_forces = vib_data.show_as_force(-1, show=False)

        try:
            assert_array_almost_equal(atoms_with_forces.get_forces(),
                                      n2_data['ref_forces'])
        except AssertionError:
            # Eigenvectors may be off by a sign change, which is allowed
            assert_array_almost_equal(atoms_with_forces.get_forces(),
                                      -n2_data['ref_forces'])
Example #2
0
    def test_bad_hessian(self, n2_data):
        bad_hessians = (None, 'fish', 1, np.array([1, 2, 3]), np.eye(6),
                        np.array([[[1, 0, 0]], [[0, 0, 1]]]))

        for bad_hessian in bad_hessians:
            with pytest.raises(ValueError):
                VibrationsData(n2_data['atoms'], bad_hessian)
Example #3
0
    def test_imaginary_energies(self, n2_unstable_data):
        vib_data = VibrationsData(n2_unstable_data['atoms'],
                                  n2_unstable_data['hessian'])

        assert vib_data.tabulate() == ('\n'.join(
            VibrationsData._tabulate_from_energies(vib_data.get_energies())) +
                                       '\n')
Example #4
0
    def test_todict(self, n2_data):
        vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
        vib_data_dict = vib_data.todict()

        assert vib_data_dict['indices'] is None
        assert_array_almost_equal(vib_data_dict['atoms'].positions,
                                  n2_data['atoms'].positions)
        assert_array_almost_equal(vib_data_dict['hessian'], n2_data['hessian'])
Example #5
0
 def test_pdos(self, n2_data):
     vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
     with pytest.warns(np.ComplexWarning):
         pdos = vib_data.get_pdos()
     assert_array_almost_equal(pdos[0].get_energies(),
                               vib_data.get_energies())
     assert_array_almost_equal(pdos[1].get_energies(),
                               vib_data.get_energies())
     assert sum(pdos[0].get_weights()) == pytest.approx(3.0)
Example #6
0
 def test_new_mass(self, n2_data):
     vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
     original_masses = vib_data.get_atoms().get_masses()
     new_masses = original_masses * 3
     new_vib_data = vib_data.with_new_masses(new_masses)
     assert_array_almost_equal(new_vib_data.get_atoms().get_masses(),
                               new_masses)
     assert_array_almost_equal(vib_data.get_energies() / np.sqrt(3),
                               new_vib_data.get_energies())
Example #7
0
 def test_fixed_atoms(self, n2_data):
     vib_data = VibrationsData(n2_data['atoms'],
                               n2_data['hessian'][1:, :, 1:, :],
                               indices=[
                                   1,
                               ])
     assert vib_data.get_indices() == [
         1,
     ]
     assert vib_data.get_mask().tolist() == [False, True]
Example #8
0
    def test_dict_indices(self, n2_data, indices, expected_mask):
        vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
        vib_data_dict = vib_data.todict()
        vib_data_dict['indices'] = indices

        # Reduce size of Hessian if necessary
        if indices is not None:
            n_active = len(indices)
            vib_data_dict['hessian'] = (np.asarray(
                vib_data_dict['hessian'])[:n_active, :, :n_active, :].tolist())

        vib_data_fromdict = VibrationsData.fromdict(vib_data_dict)
        assert_array_almost_equal(vib_data_fromdict.get_mask(), expected_mask)
Example #9
0
    def test_dict_roundtrip(self, n2_data):
        vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
        vib_data_dict = vib_data.todict()
        vib_data_roundtrip = VibrationsData.fromdict(vib_data_dict)

        for getter in ('get_atoms', ):
            assert (getattr(vib_data,
                            getter)() == getattr(vib_data_roundtrip, getter)())
        for array_getter in ('get_hessian', 'get_hessian_2d', 'get_mask',
                             'get_indices'):
            assert_array_almost_equal(
                getattr(vib_data, array_getter)(),
                getattr(vib_data_roundtrip, array_getter)())
Example #10
0
    def test_jmol_roundtrip(self, testdir, n2_data):
        ir_intensities = np.random.random(6)

        vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
        vib_data.write_jmol(self.jmol_file, ir_intensities=ir_intensities)

        images = ase.io.read(self.jmol_file, index=':')
        for i, image in enumerate(images):
            assert_array_almost_equal(image.positions,
                                      vib_data.get_atoms().positions)
            assert (image.info['IR_intensity'] == pytest.approx(
                ir_intensities[i]))
            assert_array_almost_equal(image.arrays['mode'],
                                      vib_data.get_modes()[i])
Example #11
0
 def test_dos(self, n2_data):
     vib_data = VibrationsData(n2_data['atoms'], n2_data['hessian'])
     with pytest.warns(np.ComplexWarning):
         dos = vib_data.get_dos()
     assert_array_almost_equal(dos.get_energies(), vib_data.get_energies())
Example #12
0
 def test_zero_mass(self, n2_data):
     atoms = n2_data['atoms']
     atoms.set_masses([0., 1.])
     vib_data = VibrationsData(atoms, n2_data['hessian'])
     with pytest.raises(ValueError):
         vib_data.get_energies_and_modes()
Example #13
0
 def test_imaginary_energies(self, n2_unstable_data):
     vib_data = VibrationsData(n2_unstable_data['atoms'],
                               n2_unstable_data['hessian'])
     assert vib_data.tabulate() == unstable_n2_log
Example #14
0
 def test_init(self, n2_data):
     # Check that init runs without error; properties are checked in other
     # methods using the (identical) n2_vibdata fixture
     VibrationsData(n2_data['atoms'], n2_data['hessian'])
Example #15
0
 def n2_vibdata(self, n2_data):
     return VibrationsData(n2_data['atoms'], n2_data['hessian'])