def test_distances(self): """Tests that the periodicity is taken into account when calculating distances. """ scaled_positions = [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]] system = System( scaled_positions=scaled_positions, symbols=["H", "H"], cell=[ [5, 5, 0], [0, -5, -5], [5, 0, 5] ], ) disp = system.get_displacement_tensor() # For a non-periodic system, periodicity should not be taken into # account even if cell is defined. pos = system.get_positions() assumed = np.array([ [pos[0] - pos[0], pos[1] - pos[0]], [pos[0] - pos[1], pos[1] - pos[1]], ]) self.assertTrue(np.allclose(assumed, disp)) # For a periodic system, the nearest copy should be considered when # comparing distances to neighbors or to self system.set_pbc([True, True, True]) disp = system.get_displacement_tensor() assumed = np.array([ [[5.0, 5.0, 0.0], [5, 0, 0]], [[-5, 0, 0], [5.0, 5.0, 0.0]]]) self.assertTrue(np.allclose(assumed, disp)) # Tests that the displacement tensor is found correctly even for highly # non-orthorhombic systems. positions = np.array([ [1.56909, 2.71871, 6.45326], [3.9248, 4.07536, 6.45326] ]) cell = np.array([ [4.7077, -2.718, 0.], [0., 8.15225, 0.], [0., 0., 50.] ]) system = System( positions=positions, symbols=["H", "H"], cell=cell, pbc=True, ) # Fully periodic with minimum image convention dist_mat = system.get_distance_matrix() distance = dist_mat[0, 1] # The minimum image should be within the same cell expected = np.linalg.norm(positions[0, :] - positions[1, :]) self.assertTrue(np.allclose(distance, expected))
def test_set_positions(self): """Test the method set_positions() of the System class """ scaled_positions = [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]] system = System( scaled_positions=scaled_positions, symbols=["H", "H"], cell=[ [5, 5, 0], [0, -5, -5], [5, 0, 5] ], ) pos = system.get_positions() new_pos = pos * 2 system.set_positions(new_pos) new_pos = system.get_positions() self.assertTrue(np.allclose(pos * 2, new_pos)) self.assertFalse(np.allclose(pos, new_pos))