def test_shortest_vector(self): raise SkipTest # simple cases uc = UnitCell(numpy.identity(3,float)*3) self.assertArraysAlmostEqual(uc.shortest_vector([3, 0, 1]), numpy.array([0, 0, 1])) self.assertArraysAlmostEqual(uc.shortest_vector([-3, 0, 1]), numpy.array([0, 0, 1])) self.assertArraysAlmostEqual(uc.shortest_vector([-2, 0, 1]), numpy.array([1, 0, 1])) self.assertArraysAlmostEqual(uc.shortest_vector([-1.6, 1, 1]), numpy.array([1.4, 1, 1])) self.assertArraysAlmostEqual(uc.shortest_vector([-1.4, 1, 1]), numpy.array([-1.4, 1, 1])) # simple cases uc = UnitCell(numpy.identity(3,float)*3, numpy.array([True, False, False])) self.assertArraysAlmostEqual(uc.shortest_vector([3, 0, 1]), numpy.array([0, 0, 1])) self.assertArraysAlmostEqual(uc.shortest_vector([3, 0, 3]), numpy.array([0, 0, 3])) # random tests for uc_counter in xrange(1000): uc = self.get_random_uc(full=False) for r_counter in xrange(10): r0 = numpy.random.normal(0, 10, 3) r1 = uc.shortest_vector(r0) change = r1 - r0 self.assert_(numpy.dot(change, r0) <= 0) #self.assert_(numpy.linalg.norm(r0) >= numpy.linalg.norm(r1)) index = uc.to_fractional(r0-r1) self.assertArraysAlmostEqual(index, numpy.round(index), doabs=True) index = uc.to_fractional(r1) self.assert_(index.max()<0.5) self.assert_(index.max()>=-0.5) r0 = numpy.random.normal(0, 10, (10,3)) r1 = uc.shortest_vector(r0) for i in xrange(10): r1_row_bis = uc.shortest_vector(r0[i]) self.assertArraysAlmostEqual(r1_row_bis, r1[i], doabs=True)
def test_distance_matrix_periodic(self): for i in xrange(1000): N = 6 unit_cell = UnitCell( numpy.random.uniform(0,1,(3,3)), numpy.random.randint(0,2,3).astype(bool), ) fractional = numpy.random.uniform(0,1,(N,3)) coordinates = unit_cell.to_cartesian(fractional) from molmod.ext import molecules_distance_matrix dm = molecules_distance_matrix(coordinates, unit_cell.matrix, unit_cell.reciprocal) for i in xrange(N): for j in xrange(i,N): delta = coordinates[j]-coordinates[i] delta = unit_cell.shortest_vector(delta) distance = numpy.linalg.norm(delta) self.assertAlmostEqual(dm[i,j], distance)
def test_shortest_vector_aperiodic(self): unit_cell = UnitCell(numpy.identity(3, float), numpy.zeros(3, bool)) shortest = unit_cell.shortest_vector(numpy.ones(3, float)) expected = numpy.ones(3, float) self.assertArraysAlmostEqual(shortest, expected)
def test_shortest_vector_trivial(self): uc = UnitCell(numpy.identity(3, float)) half = numpy.array([0.5,0.5,0.5]) self.assertArraysEqual(uc.shortest_vector(half), -half) self.assertArraysEqual(uc.shortest_vector(-half), -half)