예제 #1
0
    def set_miller(self, miller, miller_angle=0.0, orient=[0., 0., 1.]):
        lattice_vectors = self.lattice_vectors
        direction = numpy.array(orient, dtype=float)
        miller = numpy.array(miller)

        # normal vector to the desired miller plane (miller vector)
        lattice_vectors_sum = numpy.sum(lattice_vectors, axis=0)
        miller = numpy.array([miller[0], miller[1],
                              miller[2]]) * lattice_vectors_sum

        rotation_vector = numpy.cross(miller, direction)
        rotation_vector = rotation_vector / numpy.linalg.norm(rotation_vector)

        rotation_angle = math.acos(numpy.dot(miller, direction) /
                                   (numpy.linalg.norm(miller) *
                                    numpy.linalg.norm(direction)))

        rmatrix = math_tools.rotation_matrix(rotation_vector, rotation_angle)
        rmatrix_main = math_tools.rotation_matrix(direction, miller_angle)

        lattice_final = [None]*3
        for i in xrange(3):
            lattice_final[i] = numpy.dot(rmatrix_main,
                                         numpy.dot(rmatrix, lattice_vectors[i]))

        self.set_lattice_vectors(numpy.array(lattice_final))
예제 #2
0
    def rotate(self, axis, theta, center=[0, 0, 0]):
        rotation_matrix = math_tools.rotation_matrix(axis, theta)
        rotation_center = numpy.array([center[0], center[1], center[2]],
                                      dtype=float)

        log.info("Rotating molecule around [%f, %f, %f] by %f radians"
                 % (axis[0], axis[1], axis[2], theta))

        coords = self.coords
        for i in xrange(len(coords)):
            atom_position = numpy.copy(coords[i])
            atom_position -= rotation_center
            atom_position = numpy.dot(rotation_matrix, atom_position)
            atom_position += rotation_center
            coords[i] = atom_position