Пример #1
0
    def test_run_second_order_phonons(self):
        N2_ref = """\
2   angstroem
free
N   3.571946174   3.571946174   3.620526682
N   3.571946174   3.571946174   4.71401439"""
        ref_pos = Posinp.from_string(N2_ref)
        gs = Job(posinp=ref_pos, name='N2', run_dir='tests/phonons_N2')
        phonons = Phonons(gs, order=2)
        raman = RamanSpectrum(phonons)
        assert not phonons.is_completed
        assert not raman.is_completed
        raman.run(nmpi=2, nomp=2)
        assert phonons.is_completed
        assert raman.is_completed
        # Test the only physically relevant phonon energy
        np.testing.assert_almost_equal(
            max(raman.energies), 2386.9463343478246, decimal=6)
        # Test the only physically relevant intensity
        np.testing.assert_almost_equal(
            max(raman.intensities), 22.564457304830206)
        # Test the only physically relevant depolarization ratio
        i = np.argmax(raman.energies)
        np.testing.assert_almost_equal(
            raman.depolarization_ratios[i], 0.09412173797731693)
        # Test that running the workflow again warns a UserWarning
        with pytest.warns(UserWarning):
            phonons.run()
        with pytest.warns(UserWarning):
            raman.run()
Пример #2
0
    def test_run_first_order(self):
        N2_ref = """\
2   angstroem
free
N   3.571946174   3.571946174   3.620526682
N   3.571946174   3.571946174   4.71401439"""
        ref_pos = Posinp.from_string(N2_ref)
        gs = Job(posinp=ref_pos, name='N2', run_dir='tests/phonons_N2')
        ph = Phonons(gs, order=1)
        assert not ph.is_completed
        ph.run(nmpi=2, nomp=2)
        assert ph.is_completed
        # Test the only physically relevant phonon energy
        np.testing.assert_almost_equal(
            max(ph.energies), 2386.9850607523636, decimal=6)
Пример #3
0
class TestPosinp:

    # Posinp with surface boundary conditions
    surface_filename = os.path.join(tests_fol, "surface.xyz")
    pos = Posinp.from_file(surface_filename)
    # Posinp with free boundary conditions
    free_filename = os.path.join(tests_fol, "free.xyz")
    free_pos = Posinp.from_file(free_filename)
    # Posinp read from a string
    string = """\
4   atomic
free
C    0.6661284109   0.000000000   1.153768252
C    3.330642055    0.000000000   1.153768252
C    4.662898877    0.000000000   3.461304757
C    7.327412521    0.000000000   3.461304757"""
    str_pos = Posinp.from_string(string)
    # Posinp read from an N2 calculation of bad quality
    log_pos = Logfile.from_file(logname).posinp
    # Posinp read from an InputParams instance with surface BC
    surf_inp = InputParams({
        'posinp': {
            'units': 'angstroem',
            'cell': [8.0, '.inf', 8.0],
            'positions': [{
                'C': [0.0, 0.0, 0.0]
            }]
        }
    })
    surf_pos = surf_inp.posinp
    # Posinp read from an InputParams instance with periodic BC
    per_inp = InputParams({
        'posinp': {
            'units': 'angstroem',
            'cell': [8.0, 1.0, 8.0],
            'positions': [{
                'C': [0.0, 0.0, 0.0]
            }]
        }
    })
    per_pos = per_inp.posinp

    @pytest.mark.parametrize("value, expected", [
        (len(pos), 4),
        (pos.units, "reduced"),
        (len(pos), 4),
        (pos.boundary_conditions, "surface"),
        (pos.cell, [8.07007483423, 'inf', 4.65925987792]),
        (pos[0], Atom('C', [0.08333333333, 0.5, 0.25])),
    ])
    def test_from_file(self, value, expected):
        assert value == expected

    @pytest.mark.parametrize("value, expected", [
        (len(log_pos), 2),
        (log_pos.units, "angstroem"),
        (len(log_pos), 2),
        (log_pos.boundary_conditions, "free"),
        (log_pos.cell, None),
        (log_pos[0],
         Atom('N', [
             2.9763078243490115e-23, 6.872205952043537e-23, 0.01071619987487793
         ])),
    ])
    def test_from_Logfile(self, value, expected):
        assert value == expected

    @pytest.mark.parametrize("value, expected", [
        (len(surf_pos), 1),
        (surf_pos.units, "angstroem"),
        (len(surf_pos), 1),
        (surf_pos.boundary_conditions, "surface"),
        (surf_pos.cell, [8, "inf", 8]),
        (surf_pos[0], Atom('C', [0, 0, 0])),
    ])
    def test_from_surface_InputParams(self, value, expected):
        assert value == expected

    @pytest.mark.parametrize("value, expected", [
        (len(per_pos), 1),
        (per_pos.units, "angstroem"),
        (len(per_pos), 1),
        (per_pos.boundary_conditions, "periodic"),
        (per_pos.cell, [8, 1.0, 8]),
        (per_pos[0], Atom('C', [0, 0, 0])),
    ])
    def test_from_periodic_InputParams(self, value, expected):
        assert value == expected

    def test_from_string(self):
        assert self.str_pos == self.free_pos

    def test_repr(self):
        atoms = [Atom('C', [0, 0, 0]), Atom('N', [0, 0, 1])]
        new_pos = Posinp(atoms, units="angstroem", boundary_conditions="free")
        msg = "Posinp([Atom('C', [0.0, 0.0, 0.0]), Atom('N', [0.0, 0.0, "\
              "1.0])], 'angstroem', 'free', cell=None)"
        assert repr(new_pos) == msg

    def test_write(self):
        fname = os.path.join(tests_fol, "test.xyz")
        self.pos.write(fname)
        assert self.pos == Posinp.from_file(fname)
        os.remove(fname)

    def test_free_boundary_conditions_has_no_cell(self):
        assert self.free_pos.cell is None

    def test_translate_atom(self):
        new_pos = self.pos.translate_atom(0, [0.5, 0, 0])
        assert new_pos != self.pos
        assert new_pos[0] == Atom("C", [0.58333333333, 0.5, 0.25])

    @pytest.mark.parametrize("fname", [
        "free_reduced.xyz",
        "missing_atom.xyz",
        "additional_atom.xyz",
    ])
    def test_init_raises_ValueError(self, fname):
        with pytest.raises(ValueError):
            Posinp.from_file(os.path.join(tests_fol, fname))

    @pytest.mark.parametrize("to_evaluate", [
        "Posinp([Atom('C', [0, 0, 0])], 'bohr', 'periodic')",
        "Posinp([Atom('C', [0, 0, 0])], 'bohr', 'periodic', cell=[1, 1])",
        "Posinp([Atom('C', [0, 0, 0])], 'bohr', 'periodic', cell=[1,'inf',1])",
    ])
    def test_init_raises_ValueError2(self, to_evaluate):
        with pytest.raises(ValueError):
            eval(to_evaluate)

    def test_positions(self):
        expected = [7.327412521, 0.0, 3.461304757]
        pos1 = Posinp([Atom('C', expected)],
                      units="angstroem",
                      boundary_conditions="free")
        pos2 = pos1.translate_atom(0, [-7.327412521, 0.0, -3.461304757])
        assert np.allclose(pos1.positions, expected)
        assert np.allclose(pos2.positions, [0, 0, 0])

    def test___eq__(self):
        atom1 = Atom('N', [0.0, 0.0, 0.0])
        atom2 = Atom('N', [0.0, 0.0, 1.1])
        pos1 = Posinp([atom1, atom2], 'angstroem', 'free')
        pos2 = Posinp([atom2, atom1], 'angstroem', 'free')
        assert pos1 == pos2  # The order of the atoms in the list do not count
        assert pos1 != 1  # No error if other object is not a posinp

    def test_with_surface_boundary_conditions(self):
        # Two Posinp instances with surface BC are the same even if they
        # have a different cell size along y-axis
        pos_with_inf = Posinp([
            Atom('N', [
                2.97630782434901e-23, 6.87220595204354e-23, 0.0107161998748779
            ]),
            Atom('N', [
                -1.10434491945017e-23, -4.87342174483075e-23, 1.10427379608154
            ])
        ],
                              'angstroem',
                              'surface',
                              cell=[40, ".inf", 40])
        pos_wo_inf = Posinp([
            Atom('N', [
                2.97630782434901e-23, 6.87220595204354e-23, 0.0107161998748779
            ]),
            Atom('N', [
                -1.10434491945017e-23, -4.87342174483075e-23, 1.10427379608154
            ])
        ],
                            'angstroem',
                            'surface',
                            cell=[40, 40, 40])
        assert pos_with_inf == pos_wo_inf
        # They are obviously different if the cell size along the other
        # directions are not the same
        pos2_wo_inf = Posinp([
            Atom('N', [
                2.97630782434901e-23, 6.87220595204354e-23, 0.0107161998748779
            ]),
            Atom('N', [
                -1.10434491945017e-23, -4.87342174483075e-23, 1.10427379608154
            ])
        ],
                             'angstroem',
                             'surface',
                             cell=[20, "inf", 40])
        assert pos_with_inf != pos2_wo_inf
        # They still have the same BC
        assert \
            pos2_wo_inf.boundary_conditions == pos_with_inf.boundary_conditions
        # You can only have a cell with ".inf" in 2nd positiion to
        # initialize a calculation with surface BC without using a
        # Posinp instance
        inp_with_inf = InputParams({
            "posinp": {
                "units":
                "angstroem",
                "cell": [40, ".inf", 40],
                "positions": [
                    {
                        'N': [
                            2.97630782434901e-23, 6.87220595204354e-23,
                            0.0107161998748779
                        ]
                    },
                    {
                        'N': [
                            -1.10434491945017e-23, -4.87342174483075e-23,
                            1.10427379608154
                        ]
                    },
                ]
            }
        })
        assert pos_with_inf == inp_with_inf.posinp

    def test_to_centroid(self):
        atoms = [Atom('N', [0, 0, 0]), Atom('N', [0, 0, 1.1])]
        pos = Posinp(atoms, units="angstroem", boundary_conditions="free")
        expected_atoms = [Atom('N', [0, 0, -0.55]), Atom('N', [0, 0, 0.55])]
        expected_pos = Posinp(expected_atoms,
                              units="angstroem",
                              boundary_conditions="free")
        assert pos.to_centroid() == expected_pos

    def test_to_barycenter(self):
        atoms = [Atom('N', [0, 0, 0]), Atom('N', [0, 0, 1.1])]
        pos = Posinp(atoms, units="angstroem", boundary_conditions="free")
        expected_atoms = [Atom('N', [0, 0, -0.55]), Atom('N', [0, 0, 0.55])]
        expected_pos = Posinp(expected_atoms,
                              units="angstroem",
                              boundary_conditions="free")
        assert pos.to_barycenter() == expected_pos