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()
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)
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