def test_primitive_cell_for_cubic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_cubic_lattice(-1) pc = PrimitiveCell.for_cubic_lattice(self.a) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.CUBIC) assert_array_equal(pc.p1, (self.a, 0, 0)) assert_array_equal(pc.p2, (0, self.a, 0)) assert_array_equal(pc.p3, (0, 0, self.a))
def test_primitive_cell_for_tetragonal_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_tetragonal_lattice(-1, -2) pc = PrimitiveCell.for_tetragonal_lattice(self.a, self.c) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.TETRAGONAL) assert_array_equal(pc.p1, (self.a, 0, 0)) assert_array_equal(pc.p2, (0, self.a, 0)) assert_array_equal(pc.p3, (0, 0, self.c))
def test_primitive_cell_for_orthorhombic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_orthorhombic_lattice(-1, -2, -3) pc = PrimitiveCell.for_orthorhombic_lattice(self.a, self.b, self.c) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.ORTHORHOMBIC) assert_array_equal(pc.p1, (self.a, 0, 0)) assert_array_equal(pc.p2, (0, self.b, 0)) assert_array_equal(pc.p3, (0, 0, self.c))
def test_primitive_cell_for_triclinic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_triclinic_lattice(-1, -2, -3, 0.5, 0.6, 0.7) with self.assertRaises(ValueError): PrimitiveCell.for_triclinic_lattice(1, 2, 3, 0, np.pi, np.pi) with self.assertRaises(ValueError): PrimitiveCell.for_triclinic_lattice(1, 2, 3, 0.1, 0.2, 0.8) with self.assertRaises(ValueError): # angles too big PrimitiveCell.for_triclinic_lattice(1, 2, 3, 2.1, 2.1, 2.1) cosa = np.cos(self.alpha) cosb = np.cos(self.beta) sinb = np.sin(self.beta) cosg = np.cos(self.gamma) sing = np.sin(self.gamma) p1 = (self.a, 0, 0) p2 = (self.b*cosg, self.b*sing, 0) p3 = (self.c*cosb, self.c*(cosa-cosb*cosg) / sing, self.c*np.sqrt(sinb**2 - ((cosa-cosb*cosg) / sing)**2)) pc = PrimitiveCell.for_triclinic_lattice( self.a, self.b, self.c, self.alpha, self.beta, self.gamma) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.TRICLINIC) assert_array_equal(pc.p1, p1) assert_array_equal(pc.p2, p2) assert_array_equal(pc.p3, p3)
def test_primitive_cell_for_triclinic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_triclinic_lattice(-1, -2, -3, 0.5, 0.6, 0.7) with self.assertRaises(ValueError): PrimitiveCell.for_triclinic_lattice(1, 2, 3, 0, np.pi, np.pi) with self.assertRaises(ValueError): PrimitiveCell.for_triclinic_lattice(1, 2, 3, 0.1, 0.2, 0.8) with self.assertRaises(ValueError): # angles too big PrimitiveCell.for_triclinic_lattice(1, 2, 3, 2.1, 2.1, 2.1) cosa = np.cos(self.alpha) cosb = np.cos(self.beta) sinb = np.sin(self.beta) cosg = np.cos(self.gamma) sing = np.sin(self.gamma) p1 = (self.a, 0, 0) p2 = (self.b * cosg, self.b * sing, 0) p3 = (self.c * cosb, self.c * (cosa - cosb * cosg) / sing, self.c * np.sqrt(sinb**2 - ((cosa - cosb * cosg) / sing)**2)) pc = PrimitiveCell.for_triclinic_lattice(self.a, self.b, self.c, self.alpha, self.beta, self.gamma) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.TRICLINIC) assert_array_equal(pc.p1, p1) assert_array_equal(pc.p2, p2) assert_array_equal(pc.p3, p3)
def test_primitive_cell_for_monoclinic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_monoclinic_lattice(-1, -2, -3, np.pi / 4) with self.assertRaises(ValueError): PrimitiveCell.for_monoclinic_lattice(1, 2, 3, np.pi) pc = PrimitiveCell.for_monoclinic_lattice(self.a, self.b, self.c, self.beta) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.MONOCLINIC) assert_array_equal( pc.p1, (self.a * np.sin(self.beta), 0, self.a * np.cos(self.beta))) assert_array_equal(pc.p2, (0, self.b, 0)) assert_array_equal(pc.p3, (0, 0, self.c))
def test_primitive_cell_for_monoclinic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_monoclinic_lattice(-1, -2, -3, np.pi/4) with self.assertRaises(ValueError): PrimitiveCell.for_monoclinic_lattice(1, 2, 3, np.pi) pc = PrimitiveCell.for_monoclinic_lattice( self.a, self.b, self.c, self.beta) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.MONOCLINIC) assert_array_equal(pc.p1, (self.a*np.sin(self.beta), 0, self.a*np.cos(self.beta))) assert_array_equal(pc.p2, (0, self.b, 0)) assert_array_equal(pc.p3, (0, 0, self.c))
def test_primitive_cell_for_rhombohedral_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_rhombohedral_lattice(-1, np.pi / 4) with self.assertRaises(ValueError): PrimitiveCell.for_rhombohedral_lattice(1, np.pi) with self.assertRaises(ValueError): # angle too big PrimitiveCell.for_rhombohedral_lattice(1, np.pi * 2. / 3. + 0.1) cosa = np.cos(self.alpha) sina = np.sin(self.alpha) p1 = (self.a, 0, 0) p2 = (self.a * cosa, self.a * sina, 0) p3 = (self.a * cosa, self.a * (cosa - cosa**2) / sina, self.a * np.sqrt(sina**2 - ((cosa - cosa**2) / sina)**2)) pc = PrimitiveCell.for_rhombohedral_lattice(self.a, self.alpha) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.RHOMBOHEDRAL) assert_array_equal(pc.p1, p1) assert_array_equal(pc.p2, p2) assert_array_equal(pc.p3, p3)
def test_primitive_cell_for_rhombohedral_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_rhombohedral_lattice(-1, np.pi/4) with self.assertRaises(ValueError): PrimitiveCell.for_rhombohedral_lattice(1, np.pi) with self.assertRaises(ValueError): # angle too big PrimitiveCell.for_rhombohedral_lattice(1, np.pi*2./3.+0.1) cosa = np.cos(self.alpha) sina = np.sin(self.alpha) p1 = (self.a, 0, 0) p2 = (self.a*cosa, self.a*sina, 0) p3 = (self.a*cosa, self.a*(cosa-cosa**2) / sina, self.a*np.sqrt(sina**2 - ((cosa-cosa**2) / sina)**2)) pc = PrimitiveCell.for_rhombohedral_lattice(self.a, self.alpha) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.RHOMBOHEDRAL) assert_array_equal(pc.p1, p1) assert_array_equal(pc.p2, p2) assert_array_equal(pc.p3, p3)
def test_primitive_cell_for_base_centered_monoclinic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_base_centered_monoclinic_lattice(-1, -2, -3, 0.5) with self.assertRaises(ValueError): PrimitiveCell.for_base_centered_monoclinic_lattice(1, 2, 3, np.pi) p1 = (self.a * np.sin(self.beta), 0, self.a * np.cos(self.beta)) p2 = (self.a * np.sin(self.beta) / 2, self.b / 2, self.a * np.cos(self.beta) / 2) pc = PrimitiveCell.for_base_centered_monoclinic_lattice( self.a, self.b, self.c, self.beta) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.BASE_CENTERED_MONOCLINIC) assert_array_equal(pc.p1, p1) assert_array_equal(pc.p2, p2) assert_array_equal(pc.p3, (0, 0, self.c))
def setUp(self): self.addTypeEqualityFunc( DataContainer, partial(compare_data_containers, testcase=self)) self.addTypeEqualityFunc( LatticeNode, partial(compare_lattice_nodes, testcase=self)) self.primitive_cell = PrimitiveCell.for_cubic_lattice(0.2) self.size = (5, 10, 15) self.origin = (-2.0, 0.0, 1.0) self.container = self.container_factory( 'my_name', self.primitive_cell, self.size, self.origin)
def test_lattice_source_name(self): # given primitive_cell = PrimitiveCell.for_cubic_lattice(0.1) lattice = VTKLattice.empty('my_lattice', primitive_cell, (5, 10, 12), (0, 0, 0)) # when source = self.tested_class(cuds=lattice) # then self.assertEqual(source.name, 'my_lattice (CUDS Lattice)')
def test_exception_guess_vectors_with_unsorted_points(self): # given primitive_cell = PrimitiveCell.for_rhombohedral_lattice(0.1, 0.7) # when p1, p2, p3 = self._get_primitive_vectors(primitive_cell) points = create_points_from_pc(p1, p2, p3, (4, 5, 3)) numpy.random.shuffle(points) # then with self.assertRaises(ValueError): lattice_tools.guess_primitive_vectors(points)
def test_source_from_a_vtk_lattice(self): # given primitive_cell = PrimitiveCell.for_cubic_lattice(0.1) lattice = VTKLattice.empty( 'test', primitive_cell, (5, 10, 12), (0, 0, 0)) # when source = self.tested_class(cuds=lattice) # then self.assertIs(source._vtk_cuds, lattice) self.assertIs(source.data, lattice.data_set)
def test_primitive_cell_for_base_centered_monoclinic_lattice(self): with self.assertRaises(ValueError): PrimitiveCell.for_base_centered_monoclinic_lattice( -1, -2, -3, 0.5) with self.assertRaises(ValueError): PrimitiveCell.for_base_centered_monoclinic_lattice( 1, 2, 3, np.pi) p1 = (self.a*np.sin(self.beta), 0, self.a*np.cos(self.beta)) p2 = (self.a*np.sin(self.beta)/2, self.b/2, self.a*np.cos(self.beta)/2) pc = PrimitiveCell.for_base_centered_monoclinic_lattice( self.a, self.b, self.c, self.beta) self.assertIsInstance(pc, PrimitiveCell) self.assertEqual(pc.bravais_lattice, BravaisLattice.BASE_CENTERED_MONOCLINIC) assert_array_equal(pc.p1, p1) assert_array_equal(pc.p2, p2) assert_array_equal(pc.p3, (0, 0, self.c))
def make_face_centered_cubic_lattice(name, h, size, origin=(0, 0, 0)): """Create and return a 3D face-centered cubic lattice. Parameters ---------- name : str h : float lattice spacing size : int[3] Number of lattice nodes in each axis direction. origin : float[3], default value = (0, 0, 0) lattice origin Returns ------- lattice : Lattice A reference to a Lattice object. """ pc = PrimitiveCell.for_face_centered_cubic_lattice(h) return Lattice(name, pc, size, origin)
def test_version(self): filename = os.path.join(self.temp_dir, "test_file.cuds") group_name = "dummy_component_name" with tables.open_file(filename, "w") as handle: group = handle.create_group(handle.root, group_name) # given/when H5Lattice.create_new(group, PrimitiveCell.for_cubic_lattice(0.2), size=(5, 10, 15), origin=(-2, 0, 1)) # then self.assertTrue(isinstance(group._v_attrs.cuds_version, int)) # when with tables.open_file(filename, "a") as handle: handle.get_node("/{}".format(group_name))._v_attrs.cuds_version = -1 # then with tables.open_file(filename, "a") as handle: with self.assertRaises(ValueError): H5Lattice(handle.get_node("/" + group_name))
def make_orthorhombic_lattice(name, hs, size, origin=(0, 0, 0)): """Create and return a 3D orthorhombic lattice. Parameters ---------- name : str hs : float[3] lattice spacings in each axis direction size : int[3] Number of lattice nodes in each axis direction. origin : float[3], default value = (0, 0, 0) lattice origin Returns ------- lattice : Lattice A reference to a Lattice object. """ pc = PrimitiveCell.for_orthorhombic_lattice(hs[0], hs[1], hs[2]) return Lattice(name, pc, size, origin)
def make_monoclinic_lattice(name, hs, beta, size, origin=(0, 0, 0)): """Create and return a 3D monoclinic lattice. Parameters ---------- name : str hs : float[3] lattice spacings in each axis direction beta: float angle between the (conventional) unit cell edges (in radians), size : int[3] Number of lattice nodes in each axis direction. origin : float[3], default value = (0, 0, 0) lattice origin Returns ------- lattice : Lattice A reference to a Lattice object. """ pc = PrimitiveCell.for_monoclinic_lattice(hs[0], hs[1], hs[2], beta) return Lattice(name, pc, size, origin)
def make_hexagonal_lattice(name, hxy, hz, size, origin=(0, 0, 0)): """Create and return a 3D hexagonal lattice. Parameters ---------- name : str hxy : float lattice spacing in the xy-plane hz : float lattice spacing in the z-direction size : int[3] Number of lattice nodes in each axis direction. origin : float[3], default value = (0, 0, 0) lattice origin Returns ------- lattice : Lattice A reference to a Lattice object. """ pc = PrimitiveCell.for_hexagonal_lattice(hxy, hz) return Lattice(name, pc, size, origin)
def make_rhombohedral_lattice(name, h, angle, size, origin=(0, 0, 0)): """Create and return a 3D rhombohedral lattice. Parameters ---------- name : str h : float lattice spacing angle : float angle between the (conventional) unit cell edges (in radians) size : int[3] Number of lattice nodes in each axis direction. origin : float[3], default value = (0, 0, 0) lattice origin Returns ------- lattice : Lattice A reference to a Lattice object. """ pc = PrimitiveCell.for_rhombohedral_lattice(h, angle) return Lattice(name, pc, size, origin)
def test_version(self): filename = os.path.join(self.temp_dir, 'test_file.cuds') group_name = "dummy_component_name" with tables.open_file(filename, 'w') as handle: group = handle.create_group(handle.root, group_name) # given/when H5Lattice.create_new(group, PrimitiveCell.for_cubic_lattice(0.2), size=(5, 10, 15), origin=(-2, 0, 1)) # then self.assertTrue(isinstance(group._v_attrs.cuds_version, int)) # when with tables.open_file(filename, 'a') as handle: handle.get_node( "/{}".format(group_name))._v_attrs.cuds_version = -1 # then with tables.open_file(filename, 'a') as handle: with self.assertRaises(ValueError): H5Lattice(handle.get_node("/" + group_name))
def from_dataset(cls, name, data_set, data=None): """ Create a new Lattice and try to guess the ``primitive_cell`` Parameters ---------- name : str data_set : tvtk.ImageData or tvtk.PolyData The dataset to wrap in the CUDS api. If it is a PolyData, the points are assumed to be arranged in C-contiguous order data : DataContainer The data attribute to attach to the container. Default is None. Returns ------- lattice : VTKLattice Raises ------ TypeError : If data_set is not either tvtk.ImageData or tvtk.PolyData IndexError: If the lattice nodes are not arranged in C-contiguous order """ if isinstance(data_set, tvtk.ImageData): spacing = data_set.spacing unique_spacing = numpy.unique(spacing) if len(unique_spacing) == 1: primitive_cell = PrimitiveCell.for_cubic_lattice(spacing[0]) elif len(unique_spacing) == 2: a, c = unique_spacing if sum(spacing == a) == 2: primitive_cell = PrimitiveCell.for_tetragonal_lattice(a, c) else: primitive_cell = PrimitiveCell.for_tetragonal_lattice(c, a) else: factory = PrimitiveCell.for_orthorhombic_lattice primitive_cell = factory(*spacing) return cls(name=name, primitive_cell=primitive_cell, data=data, data_set=data_set) if not isinstance(data_set, tvtk.PolyData): # Not ImageData nor PolyData message = 'Cannot convert {} to a cuds Lattice' raise TypeError(message.format(type(data_set))) # data_set is an instance of tvtk.PolyData points = data_set.points.to_array() # Assumed C-contiguous order of points p1, p2, p3 = guess_primitive_vectors(points) # This will raise a TypeError if no bravais lattice type matches bravais_lattice = find_lattice_type(p1, p2, p3) primitive_cell = PrimitiveCell(p1, p2, p3, bravais_lattice) return cls(name=name, primitive_cell=primitive_cell, data=data, data_set=data_set)
import numpy from simphony.core.cuba import CUBA from simphony.cuds.primitive_cell import PrimitiveCell from simphony.visualisation import mayavi_tools cubic = mayavi_tools.VTKLattice.empty( "test", PrimitiveCell.for_cubic_lattice(0.1), (5, 10, 12), (0, 0, 0)) lattice = cubic new_nodes = [] for node in lattice.iter(item_type=CUBA.NODE): index = numpy.array(node.index) + 1.0 node.data[CUBA.TEMPERATURE] = numpy.prod(index) new_nodes.append(node) lattice.update(new_nodes) if __name__ == '__main__': # Visualise the Lattice object mayavi_tools.show(lattice)
def test_cell_volume(self): pc = PrimitiveCell.for_triclinic_lattice(1, 1, 1, np.pi/2, np.pi/2, np.pi/2) self.assertAlmostEqual(pc.volume, 1)
def test_cell_volume(self): pc = PrimitiveCell.for_triclinic_lattice(1, 1, 1, np.pi / 2, np.pi / 2, np.pi / 2) self.assertAlmostEqual(pc.volume, 1)
''' # rotate x-y for angle1 about z xy_rot = numpy.array([[numpy.cos(angle1), numpy.sin(angle1), 0], [numpy.sin(-angle1), numpy.cos(angle1), 0], [0, 0, 1]]) # rotate y-z for angle2 about x yz_rot = numpy.array([[1, 0, 0], [0, numpy.cos(angle2), numpy.sin(angle2)], [0, numpy.sin(-angle2), numpy.cos(angle2)]]) # rotate x-y, then y-z xyz_rot = numpy.inner(xy_rot, yz_rot) return tuple(numpy.inner(xyz_rot, p) for p in (pc.p1, pc.p2, pc.p3)) # a cubic lattice on a rotated coordinates represented using PolyData pcs = rotate_primitive_cell(PrimitiveCell.for_cubic_lattice(1.)) datasets.append(create_polydata_from_pc(*pcs)) # BCC lattice in a rotated coor. sys. pcs = rotate_primitive_cell(PrimitiveCell.for_body_centered_cubic_lattice(1.)) datasets.append(create_polydata_from_pc(*pcs)) # FCC lattice in a rotated coor. sys. pcs = rotate_primitive_cell(PrimitiveCell.for_face_centered_cubic_lattice(1.)) datasets.append(create_polydata_from_pc(*pcs)) # rhombohedral lattice in a rotated coor. sys. pcs = rotate_primitive_cell(PrimitiveCell.for_rhombohedral_lattice(1., 1.)) datasets.append(create_polydata_from_pc(*pcs)) # tetragonal lattice in a rotated coor. sys.
def test_no_parallel_edges(self): with self.assertRaises(ValueError): PrimitiveCell((1, 0, 0), (1, 0, 0), (0, 0, 1), BravaisLattice.CUBIC)
def test_edge_lengths_positive(self): with self.assertRaises(ValueError): PrimitiveCell((0, 0, 0), (0, 0, 0), (0, 0, 0), BravaisLattice.CUBIC)