def test_equality_of_sqs_objects_with_different_indexing(): """SQS structures that are the same, but indexed differently should be equal.""" # TODO: implement this behavior in SQS.__eq__ config_1 = [['A', 'B'], ['A']] occupancy_1 = [[0.25, 0.75], [1]] site_ratios_1 = [3, 1] config_2 = [['A'], ['A', 'B']] occupancy_2 = [[1], [0.25, 0.75]] site_ratios_2 = [1, 3] s1 = PRLStructure(Lattice.hexagonal(1, 2), ['Mg', 'Mg'], [[0, 0, 0], [0.3333, 0.66666, 0.5]], sublattice_configuration=config_1, sublattice_occupancies=occupancy_1, sublattice_site_ratios=site_ratios_1) s2 = PRLStructure(Lattice.hexagonal(1, 2), ['Mg', 'Mg'], [[0, 0, 0], [0.3333, 0.66666, 0.5]], sublattice_configuration=config_2, sublattice_occupancies=occupancy_2, sublattice_site_ratios=site_ratios_2) assert s1 == s2
def test_structure(self): quartz = self.quartz.structure np.testing.assert_array_almost_equal( quartz.lattice.matrix, [[4.913400, 0, 0], [-2.456700, 4.255129, 0], [0, 0, 5.405200]]) self.assertEqual(quartz.formula, "Si3 O6") self.assertNotIn("molecule-ID", self.quartz.atoms.columns) ethane = self.ethane.structure np.testing.assert_array_almost_equal(ethane.lattice.matrix, np.diag([10.0] * 3)) lbounds = np.array(self.ethane.box.bounds)[:, 0] coords = self.ethane.atoms[["x", "y", "z"]].values - lbounds np.testing.assert_array_almost_equal(ethane.cart_coords, coords) np.testing.assert_array_almost_equal(ethane.site_properties["charge"], self.ethane.atoms["q"]) tatb = self.tatb.structure frac_coords = tatb.frac_coords[381] real_frac_coords = frac_coords - np.floor(frac_coords) np.testing.assert_array_almost_equal( real_frac_coords, [0.01553397, 0.71487872, 0.14134139]) co = Structure.from_spacegroup(194, Lattice.hexagonal(2.50078, 4.03333), ["Co"], [[1 / 3, 2 / 3, 1 / 4]]) ld_co = LammpsData.from_structure(co) self.assertEqual(ld_co.structure.composition.reduced_formula, "Co") ni = Structure.from_spacegroup(225, Lattice.cubic(3.50804), ["Ni"], [[0, 0, 0]]) ld_ni = LammpsData.from_structure(ni) self.assertEqual(ld_ni.structure.composition.reduced_formula, "Ni")
def test_structure(self): quartz = self.quartz.structure np.testing.assert_array_equal(quartz.lattice.matrix, [[4.913400, 0, 0], [-2.456700, 4.255129, 0], [0, 0, 5.405200]]) self.assertEqual(quartz.formula, "Si3 O6") self.assertNotIn("molecule-ID", self.quartz.atoms.columns) ethane = self.ethane.structure np.testing.assert_array_equal(ethane.lattice.matrix, np.diag([10.0] * 3)) lbounds = np.array(self.ethane.box.bounds)[:, 0] coords = self.ethane.atoms[["x", "y", "z"]].values - lbounds np.testing.assert_array_equal(ethane.cart_coords, coords) np.testing.assert_array_equal(ethane.site_properties["charge"], self.ethane.atoms["q"]) tatb = self.tatb.structure frac_coords = tatb.frac_coords[381] real_frac_coords = frac_coords - np.floor(frac_coords) np.testing.assert_array_almost_equal(real_frac_coords, [0.01553397, 0.71487872, 0.14134139]) co = Structure.from_spacegroup(194, Lattice.hexagonal(2.50078, 4.03333), ["Co"], [[1/3, 2/3, 1/4]]) ld_co = LammpsData.from_structure(co) self.assertEqual(ld_co.structure.composition.reduced_formula, "Co") ni = Structure.from_spacegroup(225, Lattice.cubic(3.50804), ["Ni"], [[0, 0, 0]]) ld_ni = LammpsData.from_structure(ni) self.assertEqual(ld_ni.structure.composition.reduced_formula, "Ni")
def test_equality_of_sqs_objects(): """SQS structures with different underlying crystal structures are equivalent iff sublattice models are equivalent.""" config = [['A', 'B'], ['A']] occupancy = [[0.5, 0.5], [1]] site_ratios = [3, 1] # Use same sublattice for different underlying structures. Should be equal s1 = PRLStructure(Lattice.hexagonal(1, 2), ['Mg', 'Mg'], [[0, 0, 0], [0.3333, 0.66666, 0.5]], sublattice_configuration=config, sublattice_occupancies=occupancy, sublattice_site_ratios=site_ratios) s2 = PRLStructure(Lattice.cubic(1), ['Fe'], [[0, 0, 0]], sublattice_configuration=config, sublattice_occupancies=occupancy, sublattice_site_ratios=site_ratios) assert s1 == s2 # Use same underlying crystal structures, but different sublattice configurations. Should be not equal s1.sublattice_site_ratios = [2, 1] assert s1 != s2 s1.sublattice_site_ratios = site_ratios s1.sublattice_occupancies = [[0.25, 0.5], [1]] assert s1 != s2 s1.sublattice_occupancies = occupancy s1.sublattice_configuration = [['A', 'A'], ['A']] assert s1 != s2 s1.sublattice_configuration = config assert s1 == s2
def setUp(self): self.single_bond = Structure( Lattice.cubic(10), ["H", "H", "H"], [[1, 0, 0], [0, 0, 0], [6, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.linear = Structure( Lattice.cubic(10), ["H", "H", "H"], [[1, 0, 0], [0, 0, 0], [2, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.bent45 = Structure( Lattice.cubic(10), ["H", "H", "H"], [[0, 0, 0], [0.707, 0.707, 0], [0.707, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.cubic = Structure( Lattice.cubic(1), ["H"], [[0, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=False, site_properties=None) self.bcc = Structure( Lattice.cubic(1), ["H", "H"], [[0, 0, 0], [0.5, 0.5, 0.5]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=False, site_properties=None) self.fcc = Structure( Lattice.cubic(1), ["H", "H", "H", "H"], [[0, 0, 0], [0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=False, site_properties=None) self.hcp = Structure( Lattice.hexagonal(1, 1.633), ["H", "H"], [[0.3333, 0.6667, 0.25], [0.6667, 0.3333, 0.75]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=False, site_properties=None) self.diamond = Structure( Lattice.cubic(1), ["H", "H", "H", "H", "H", "H", "H", "H"], [[0, 0, 0.5], [0.75, 0.75, 0.75], [0, 0.5, 0], [0.75, 0.25, 0.25], [0.5, 0, 0], [0.25, 0.75, 0.25], [0.5, 0.5, 0.5], [0.25, 0.25, 0.75]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=False, site_properties=None) self.trigonal_off_plane = Structure( Lattice.cubic(100), ["H", "H", "H", "H"], [[0.50, 0.50, 0.50], [0.25, 0.75, 0.25], [0.25, 0.25, 0.75], [0.75, 0.25, 0.25]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.regular_triangle = Structure( Lattice.cubic(30), ["H", "H", "H", "H"], [[15, 15.28867, 15.65], [14.5, 15, 15], [15.5, 15, 15], [15, 15.866, 15]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.trigonal_planar = Structure( Lattice.cubic(30), ["H", "H", "H", "H"], [[15, 15.28867, 15], [14.5, 15, 15], [15.5, 15, 15], [15, 15.866, 15]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.square_planar = Structure( Lattice.cubic(30), ["H", "H", "H", "H", "H"], [[15, 15, 15], [14.75, 14.75, 15], [14.75, 15.25, 15], [15.25, 14.75, 15], [15.25, 15.25, 15]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.square = Structure( Lattice.cubic(30), ["H", "H", "H", "H", "H"], [[15, 15, 15.707], [14.75, 14.75, 15], [14.75, 15.25, 15], [15.25, 14.75, 15], [15.25, 15.25, 15]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.T_shape = Structure( Lattice.cubic(30), ["H", "H", "H", "H"], [[15, 15, 15], [15, 15, 15.5], [15, 15.5, 15], [15, 14.5, 15]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.square_pyramid = Structure( Lattice.cubic(30), ["H", "H", "H", "H", "H", "H"], [[15, 15, 15], [15, 15, 15.3535], [14.75, 14.75, 15], [14.75, 15.25, 15], [15.25, 14.75, 15], [15.25, 15.25, 15]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.pentagonal_planar = Structure( Lattice.cubic(30), ["Xe", "F", "F", "F", "F", "F"], [[0, -1.6237, 0], [1.17969, 0, 0], [-1.17969, 0, 0], [1.90877, -2.24389, 0], [-1.90877, -2.24389, 0], [0, -3.6307, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.pentagonal_pyramid = Structure( Lattice.cubic(30), ["Xe", "F", "F", "F", "F", "F", "F"], [[0, -1.6237, 0], [0, -1.6237, 1.17969], [1.17969, 0, 0], [-1.17969, 0, 0], [1.90877, -2.24389, 0], [-1.90877, -2.24389, 0], [0, -3.6307, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.pentagonal_bipyramid = Structure( Lattice.cubic(30), ["Xe", "F", "F", "F", "F", "F", "F", "F"], [[0, -1.6237, 0], [0, -1.6237, -1.17969], [0, -1.6237, 1.17969], [1.17969, 0, 0], [-1.17969, 0, 0], [1.90877, -2.24389, 0], [-1.90877, -2.24389, 0], [0, -3.6307, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.hexagonal_planar = Structure( Lattice.cubic(30), ["H", "C", "C", "C", "C", "C", "C"], [[0, 0, 0], [0.71, 1.2298, 0], [-0.71, 1.2298, 0], [0.71, -1.2298, 0], [-0.71, -1.2298, 0], [1.4199, 0, 0], [-1.4199, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.hexagonal_pyramid = Structure( Lattice.cubic(30), ["H", "Li", "C", "C", "C", "C", "C", "C"], [[0, 0, 0], [0, 0, 1.675], [0.71, 1.2298, 0], [-0.71, 1.2298, 0], [0.71, -1.2298, 0], [-0.71, -1.2298, 0], [1.4199, 0, 0], [-1.4199, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.hexagonal_bipyramid = Structure( Lattice.cubic(30), ["H", "Li", "Li", "C", "C", "C", "C", "C", "C"], [[0, 0, 0], [0, 0, 1.675], [0, 0, -1.675], [0.71, 1.2298, 0], [-0.71, 1.2298, 0], [0.71, -1.2298, 0], [-0.71, -1.2298, 0], [1.4199, 0, 0], [-1.4199, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.trigonal_pyramid = Structure( Lattice.cubic(30), ["P", "Cl", "Cl", "Cl", "Cl"], [[0, 0, 0], [0, 0, 2.14], [0, 2.02, 0], [1.74937, -1.01, 0], [-1.74937, -1.01, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.trigonal_bipyramidal = Structure( Lattice.cubic(30), ["P", "Cl", "Cl", "Cl", "Cl", "Cl"], [[0, 0, 0], [0, 0, 2.14], [0, 2.02, 0], [1.74937, -1.01, 0], [-1.74937, -1.01, 0], [0, 0, -2.14]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.cuboctahedron = Structure( Lattice.cubic(30), ["H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H"], [[15, 15, 15], [15, 14.5, 14.5], [15, 14.5, 15.5], [15, 15.5, 14.5], [15, 15.5, 15.5], [14.5, 15, 14.5], [14.5, 15, 15.5], [15.5, 15, 14.5], [15.5, 15, 15.5], [14.5, 14.5, 15], [14.5, 15.5, 15], [15.5, 14.5, 15], [15.5, 15.5, 15]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.see_saw_rect = Structure( Lattice.cubic(30), ["H", "H", "H", "H", "H"], [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, -1.0, 0.0], [0.0, 0.0, -1.0], [-1.0, 0.0, 0.0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.sq_face_capped_trig_pris = Structure( Lattice.cubic(30), ["H", "H", "H", "H", "H", "H", "H", "H"], [[0, 0, 0], [-0.6546536707079771, -0.37796447300922725, 0.6546536707079771], [0.6546536707079771, -0.37796447300922725, 0.6546536707079771], [0.0, 0.7559289460184545, 0.6546536707079771], [-0.6546536707079771, -0.37796447300922725, -0.6546536707079771], [0.6546536707079771, -0.37796447300922725, -0.6546536707079771], [0.0, 0.7559289460184545, -0.6546536707079771], [0.0, -1.0, 0.0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None)
from pymatgen import Structure, Lattice from crystal_toolkit.helpers.asymptote import write_asy_file from crystal_toolkit.components.structure import StructureMoleculeComponent import os example_struct = Structure.from_spacegroup( "P6_3mc", Lattice.hexagonal(3.22, 5.24), ["Ga", "N"], [[1 / 3, 2 / 3, 0], [1 / 3, 2 / 3, 3 / 8]], ) smc = StructureMoleculeComponent(example_struct, hide_incomplete_bonds=True) file_name = "./asy_test/single/GaN.asy" write_asy_file(smc, file_name) write_asy_file(smc, "./asy_test/multi/GaN.asy") example_struct = Structure.from_spacegroup( "P6_3mc", Lattice.hexagonal(3.22, 5.24), ["In", "N"], [[1 / 3, 2 / 3, 0], [1 / 3, 2 / 3, 3 / 8]], ) smc = StructureMoleculeComponent(example_struct, hide_incomplete_bonds=True) write_asy_file(smc, "./asy_test/multi/InN.asy") example_struct = Structure.from_spacegroup( "P6_3mc", Lattice.hexagonal(3.22, 5.24), ["Al", "N"], [[1 / 3, 2 / 3, 0], [1 / 3, 2 / 3, 3 / 8]], )
write_structure(f,'POSCAR_F1expected') write_structure(final,'POSCAR_F1') #Test 2 - Test in all 3 dimensions ssize=[5,5,5] fsize=[8,8,8] psize=[1,1,1] primordialstructure = primf.copy() primordialstructure.make_supercell(psize) f = primf.copy() f.make_supercell(fsize) write_structure(primordialstructure, 'POSCAR_prim2') final = finite_size_scale('POSCAR_Fdefect', ssize, 'POSCAR_prim2', fsize, psize) write_structure(f,'POSCAR_F2expected') write_structure(final,'POSCAR_F2') #Test 3 - Test for non-cubic lattice ssize = [4,4,4] fsize=[8,8,8] psize=[1,1,1] mglat = Lattice.hexagonal(3.21,5.21) primmg = Structure(mglat,["Mg","Mg"],[[1./3.,2./3.,3./4.],[2./3.,1./3.,1./4.]]) primordialstructure = primmg.copy() primordialstructure.make_supercell(psize) f = primmg.copy() f.make_supercell(fsize) write_structure(primordialstructure,'POSCAR_prim3') final = finite_size_scale('POSCAR_Mdefect', ssize, 'POSCAR_prim3', fsize, psize) write_structure(f,'POSCAR_Mg3expected') write_structure(final,'POSCAR_Mg3')
ssize = [5, 5, 5] fsize = [8, 8, 8] psize = [1, 1, 1] primordialstructure = primf.copy() primordialstructure.make_supercell(psize) f = primf.copy() f.make_supercell(fsize) write_structure(primordialstructure, 'POSCAR_prim2') final = finite_size_scale('POSCAR_Fdefect', ssize, 'POSCAR_prim2', fsize, psize) write_structure(f, 'POSCAR_F2expected') write_structure(final, 'POSCAR_F2') #Test 3 - Test for non-cubic lattice ssize = [4, 4, 4] fsize = [8, 8, 8] psize = [1, 1, 1] mglat = Lattice.hexagonal(3.21, 5.21) primmg = Structure( mglat, ["Mg", "Mg"], [[1. / 3., 2. / 3., 3. / 4.], [2. / 3., 1. / 3., 1. / 4.]]) primordialstructure = primmg.copy() primordialstructure.make_supercell(psize) f = primmg.copy() f.make_supercell(fsize) write_structure(primordialstructure, 'POSCAR_prim3') final = finite_size_scale('POSCAR_Mdefect', ssize, 'POSCAR_prim3', fsize, psize) write_structure(f, 'POSCAR_Mg3expected') write_structure(final, 'POSCAR_Mg3')