Exemple #1
0
 def test_get_primitive_structure(self):
     coords = [[0, 0, 0], [0.5, 0.5, 0], [0, 0.5, 0.5], [0.5, 0, 0.5]]
     fcc_ag = IStructure(Lattice.cubic(4.09), ["Ag"] * 4, coords)
     self.assertEqual(len(fcc_ag.get_primitive_structure()), 1)
     coords = [[0, 0, 0], [0.5, 0.5, 0.5]]
     bcc_li = IStructure(Lattice.cubic(4.09), ["Li"] * 2, coords)
     self.assertEqual(len(bcc_li.get_primitive_structure()), 1)
Exemple #2
0
 def test_to_dict(self):
     si = Specie("Si", 4)
     mn = Element("Mn")
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0.75, 0.5, 0.75])
     struct = IStructure(self.lattice, [{
         si: 0.5,
         mn: 0.5
     }, {
         si: 0.5
     }], coords)
     self.assertIn("lattice", struct.to_dict)
     self.assertIn("sites", struct.to_dict)
     d = self.propertied_structure.to_dict
     self.assertEqual(d['sites'][0]['properties']['magmom'], 5)
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0.75, 0.5, 0.75])
     s = IStructure(self.lattice,
                    [{
                        Specie('O', -2, properties={"spin": 3}): 1.0
                    }, {
                        Specie('Mg', 2, properties={"spin": 2}): 0.8
                    }],
                    coords,
                    site_properties={'magmom': [5, -5]})
     d = s.to_dict
     self.assertEqual(d['sites'][0]['properties']['magmom'], 5)
     self.assertEqual(d['sites'][0]['species'][0]['properties']['spin'], 3)
Exemple #3
0
    def test_interpolate_lattice_rotation(self):
        l1 = Lattice([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
        l2 = Lattice([[-1.01, 0, 0], [0, -1.01, 0], [0, 0, 1]])
        coords = [[0, 0, 0], [0.75, 0.5, 0.75]]
        struct1 = IStructure(l1, ["Si"] * 2, coords)
        struct2 = IStructure(l2, ["Si"] * 2, coords)
        int_s = struct1.interpolate(struct2, 2, interpolate_lattices=True)

        # Assert that volume is monotonic
        self.assertTrue(struct2.lattice.volume >= int_s[1].lattice.volume)
        self.assertTrue(int_s[1].lattice.volume >= struct1.lattice.volume)
Exemple #4
0
    def test_get_primitive_structure(self):
        coords = [[0, 0, 0], [0.5, 0.5, 0], [0, 0.5, 0.5], [0.5, 0, 0.5]]
        fcc_ag = IStructure(Lattice.cubic(4.09), ["Ag"] * 4, coords)
        self.assertEqual(len(fcc_ag.get_primitive_structure()), 1)
        coords = [[0, 0, 0], [0.5, 0.5, 0.5]]
        bcc_li = IStructure(Lattice.cubic(4.09), ["Li"] * 2, coords)
        bcc_prim = bcc_li.get_primitive_structure()
        self.assertEqual(len(bcc_prim), 1)
        self.assertAlmostEqual(bcc_prim.lattice.alpha, 109.47122, 3)

        coords = [[0] * 3, [0.5] * 3, [0.25] * 3, [0.26] * 3]
        s = IStructure(Lattice.cubic(4.09), ["Ag"] * 4, coords)
        self.assertEqual(len(s.get_primitive_structure()), 4)
Exemple #5
0
 def test_bad_structure(self):
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0.75, 0.5, 0.75])
     coords.append([0.75, 0.5, 0.75])
     self.assertRaises(StructureError,
                       IStructure,
                       self.lattice, ["Si"] * 3,
                       coords,
                       validate_proximity=True)
     #these shouldn't raise an error
     IStructure(self.lattice, ["Si"] * 2, coords[:2], True)
     IStructure(self.lattice, ["Si"], coords[:1], True)
Exemple #6
0
    def test_interpolate(self):
        coords = list()
        coords.append([0, 0, 0])
        coords.append([0.75, 0.5, 0.75])
        struct = IStructure(self.lattice, ["Si"] * 2, coords)
        coords2 = list()
        coords2.append([0, 0, 0])
        coords2.append([0.5, 0.5, 0.5])
        struct2 = IStructure(self.struct.lattice, ["Si"] * 2, coords2)
        int_s = struct.interpolate(struct2, 10)
        for s in int_s:
            self.assertIsNotNone(s, "Interpolation Failed!")
            self.assertEqual(int_s[0].lattice, s.lattice)
        self.assertArrayEqual(int_s[1][1].frac_coords, [0.725, 0.5, 0.725])

        badlattice = [[1, 0.00, 0.00], [0, 1, 0.00], [0.00, 0, 1]]
        struct2 = IStructure(badlattice, ["Si"] * 2, coords2)
        self.assertRaises(ValueError, struct.interpolate, struct2)

        coords2 = list()
        coords2.append([0, 0, 0])
        coords2.append([0.5, 0.5, 0.5])
        struct2 = IStructure(self.struct.lattice, ["Si", "Fe"], coords2)
        self.assertRaises(ValueError, struct.interpolate, struct2)

        # Test autosort feature.
        s1 = Structure.from_spacegroup("Fm-3m", Lattice.cubic(3), ["Fe"],
                                       [[0, 0, 0]])
        s1.pop(0)
        s2 = Structure.from_spacegroup("Fm-3m", Lattice.cubic(3), ["Fe"],
                                       [[0, 0, 0]])
        s2.pop(2)
        random.shuffle(s2)

        for s in s1.interpolate(s2, autosort_tol=0.5):
            self.assertArrayAlmostEqual(s1[0].frac_coords, s[0].frac_coords)
            self.assertArrayAlmostEqual(s1[2].frac_coords, s[2].frac_coords)

        # Make sure autosort has no effect on simpler interpolations,
        # and with shuffled sites.
        s1 = Structure.from_spacegroup("Fm-3m", Lattice.cubic(3), ["Fe"],
                                       [[0, 0, 0]])
        s2 = Structure.from_spacegroup("Fm-3m", Lattice.cubic(3), ["Fe"],
                                       [[0, 0, 0]])
        s2[0] = "Fe", [0.01, 0.01, 0.01]
        random.shuffle(s2)

        for s in s1.interpolate(s2, autosort_tol=0.5):
            self.assertArrayAlmostEqual(s1[1].frac_coords, s[1].frac_coords)
            self.assertArrayAlmostEqual(s1[2].frac_coords, s[2].frac_coords)
            self.assertArrayAlmostEqual(s1[3].frac_coords, s[3].frac_coords)
Exemple #7
0
def get_pymatgen_formula(compound):
    """
	given a string of 'A2B1Bp1X6' return its pymatgen standard formula

	Args:
		compound: a string of form 'A2B1Bp1X6'

	Returns:
		formula : a formula style defined in pymatgen
	"""
    m = re.match(
        "([A-Za-z]+)([0-9])([A-Za-z]+)([0-9])([A-Za-z]+)([0-9])([A-Za-z]+)([0-9])",
        compound)
    A, B, Bp, X = m.group(1), m.group(3), m.group(5), m.group(7)
    struc = IStructure(lattice=[[1, 0.000000, 0.000000],
                                [0.5, sqrt(3) / 2, 0.000000],
                                [0.5, 1 / 2.0 / sqrt(3.0),
                                 sqrt(2.0 / 3.0)]],
                       species=[A, A, B, Bp, X, X, X, X, X, X],
                       coords=[[0.2500, 0.2500, 0.2500],
                               [0.7500, 0.7500, 0.7500],
                               [0.5000, 0.5000, 0.5000],
                               [0.0000, 0.0000, 0.0000],
                               [0.2550, 0.7450, 0.2550],
                               [0.7450, 0.7450, 0.2550],
                               [0.7450, 0.2550, 0.7450],
                               [0.7450, 0.2550, 0.2550],
                               [0.2550, 0.7450, 0.7450],
                               [0.2550, 0.2550, 0.7450]])
    return struc.formula
Exemple #8
0
 def test_primitive_structure_volume_check(self):
     l = Lattice.tetragonal(10, 30)
     coords = [[0.5, 0.8, 0], [0.5, 0.2, 0], [0.5, 0.8, 0.333],
               [0.5, 0.5, 0.333], [0.5, 0.5, 0.666], [0.5, 0.2, 0.666]]
     s = IStructure(l, ["Ag"] * 6, coords)
     sprim = s.get_primitive_structure(tolerance=0.1)
     self.assertEqual(len(sprim), 6)
Exemple #9
0
 def test_fractional_occupations(self):
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0.75, 0.5, 0.75])
     s = IStructure(self.lattice, [{'O': 1.0}, {'Mg': 0.8}], coords)
     self.assertEqual(str(s.composition), 'Mg0.8 O1')
     self.assertFalse(s.is_ordered)
Exemple #10
0
 def test_get_sorted_structure(self):
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0.75, 0.5, 0.75])
     s = IStructure(self.lattice, ["O", "Li"],
                    coords,
                    site_properties={'charge': [-2, 1]})
     sorted_s = s.get_sorted_structure()
     self.assertEqual(sorted_s[0].species_and_occu, Composition("Li"))
     self.assertEqual(sorted_s[1].species_and_occu, Composition("O"))
     self.assertEqual(sorted_s[0].charge, 1)
     self.assertEqual(sorted_s[1].charge, -2)
     s = IStructure(self.lattice, ["Se", "C", "Se", "C"],
                    [[0] * 3, [0.5] * 3, [0.25] * 3, [0.75] * 3])
     self.assertEqual(
         [site.specie.symbol for site in s.get_sorted_structure()],
         ["C", "C", "Se", "Se"])
Exemple #11
0
 def test_specie_init(self):
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0.75, 0.5, 0.75])
     s = IStructure(self.lattice, [{
         Specie('O', -2): 1.0
     }, {
         Specie('Mg', 2): 0.8
     }], coords)
     self.assertEqual(str(s.composition), 'Mg2+0.8 O2-1')
Exemple #12
0
 def setUp(self):
     coords = [[0, 0, 0], [0.75, 0.5, 0.75]]
     self.lattice = Lattice([[3.8401979337, 0.00, 0.00],
                             [1.9200989668, 3.3257101909, 0.00],
                             [0.00, -2.2171384943, 3.1355090603]])
     self.struct = IStructure(self.lattice, ["Si"] * 2, coords)
     self.assertEqual(len(self.struct), 2,
                      "Wrong number of sites in structure!")
     self.assertTrue(self.struct.is_ordered)
     self.assertTrue(self.struct.ntypesp == 1)
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0., 0, 0.0000001])
     self.assertRaises(StructureError, IStructure, self.lattice, ["Si"] * 2,
                       coords, True)
     self.propertied_structure = IStructure(
         self.lattice, ["Si"] * 2,
         coords,
         site_properties={'magmom': [5, -5]})
Exemple #13
0
 def test_interpolate_lattice(self):
     coords = list()
     coords.append([0, 0, 0])
     coords.append([0.75, 0.5, 0.75])
     struct = IStructure(self.lattice, ["Si"] * 2, coords)
     coords2 = list()
     coords2.append([0, 0, 0])
     coords2.append([0.5, 0.5, 0.5])
     l2 = Lattice.from_lengths_and_angles([3, 4, 4], [100, 100, 70])
     struct2 = IStructure(l2, ["Si"] * 2, coords2)
     int_s = struct.interpolate(struct2, 2, interpolate_lattices=True)
     self.assertArrayAlmostEqual(struct.lattice.abc, int_s[0].lattice.abc)
     self.assertArrayAlmostEqual(struct.lattice.angles,
                                 int_s[0].lattice.angles)
     self.assertArrayAlmostEqual(struct2.lattice.abc, int_s[2].lattice.abc)
     self.assertArrayAlmostEqual(struct2.lattice.angles,
                                 int_s[2].lattice.angles)
     int_angles = [(a + struct2.lattice.angles[i]) / 2
                   for i, a in enumerate(struct.lattice.angles)]
     self.assertArrayAlmostEqual(int_angles, int_s[1].lattice.angles)
Exemple #14
0
    def test_interpolate(self):
        coords = list()
        coords.append([0, 0, 0])
        coords.append([0.75, 0.5, 0.75])
        struct = IStructure(self.lattice, ["Si"] * 2, coords)
        coords2 = list()
        coords2.append([0, 0, 0])
        coords2.append([0.5, 0.5, 0.5])
        struct2 = IStructure(self.struct.lattice, ["Si"] * 2, coords2)
        int_s = struct.interpolate(struct2, 10)
        for s in int_s:
            self.assertIsNotNone(s, "Interpolation Failed!")
        self.assertArrayEqual(int_s[1][1].frac_coords, [0.725, 0.5, 0.725])

        badlattice = [[1, 0.00, 0.00], [0, 1, 0.00], [0.00, 0, 1]]
        struct2 = IStructure(badlattice, ["Si"] * 2, coords2)
        self.assertRaises(ValueError, struct.interpolate, struct2)

        coords2 = list()
        coords2.append([0, 0, 0])
        coords2.append([0.5, 0.5, 0.5])
        struct2 = IStructure(self.struct.lattice, ["Si", "Fe"], coords2)
        self.assertRaises(ValueError, struct.interpolate, struct2)
Exemple #15
0
    def test_interpolate_lattice(self):
        coords = list()
        coords.append([0, 0, 0])
        coords.append([0.75, 0.5, 0.75])
        struct = IStructure(self.lattice, ["Si"] * 2, coords)
        coords2 = list()
        coords2.append([0, 0, 0])
        coords2.append([0.5, 0.5, 0.5])
        l2 = Lattice.from_lengths_and_angles([3, 4, 4], [100, 100, 70])
        struct2 = IStructure(l2, ["Si"] * 2, coords2)
        int_s = struct.interpolate(struct2, 2, interpolate_lattices=True)
        self.assertArrayAlmostEqual(struct.lattice.abc, int_s[0].lattice.abc)
        self.assertArrayAlmostEqual(struct.lattice.angles,
                                    int_s[0].lattice.angles)
        self.assertArrayAlmostEqual(struct2.lattice.abc, int_s[2].lattice.abc)
        self.assertArrayAlmostEqual(struct2.lattice.angles,
                                    int_s[2].lattice.angles)
        int_angles = [110.3976469, 94.5359731, 64.5165856]
        self.assertArrayAlmostEqual(int_angles, int_s[1].lattice.angles)

        # Assert that volume is monotonic
        self.assertTrue(struct2.lattice.volume >= int_s[1].lattice.volume)
        self.assertTrue(int_s[1].lattice.volume >= struct.lattice.volume)
Exemple #16
0
    def test_copy(self):
        new_struct = self.propertied_structure.copy(
            site_properties={'charge': [2, 3]})
        self.assertEqual(new_struct[0].magmom, 5)
        self.assertEqual(new_struct[1].magmom, -5)
        self.assertEqual(new_struct[0].charge, 2)
        self.assertEqual(new_struct[1].charge, 3)

        coords = list()
        coords.append([0, 0, 0])
        coords.append([0., 0, 0.0000001])

        structure = IStructure(self.lattice, ["O", "Si"],
                               coords,
                               site_properties={'magmom': [5, -5]})

        new_struct = structure.copy(site_properties={'charge': [2, 3]},
                                    sanitize=True)
        self.assertEqual(new_struct[0].magmom, -5)
        self.assertEqual(new_struct[1].magmom, 5)
        self.assertEqual(new_struct[0].charge, 3)
        self.assertEqual(new_struct[1].charge, 2)
        self.assertAlmostEqual(new_struct.volume, structure.volume)
Exemple #17
0
def simple_cubic():
    lattice = Lattice.cubic(1.0)
    coords = [[0.0, 0.0, 0.0]]
    return IStructure(lattice=lattice, species=["H"], coords=coords)
Exemple #18
0
 def construct_graph(self, traj_coords, lattices, atom_types, target_index):
     if self.backend == 'kdtree':
         nbr_lists, diag_lattices = [], []
         for coord, lattice in tqdm(zip(traj_coords, lattices),
                                    total=len(traj_coords),
                                    disable=not self.verbose):
             # take the diagonal part of the lattice matrix
             lattice = np.diagonal(lattice)
             diag_lattices.append(lattice)
             pkdt = PeriodicCKDTree(lattice, coord)
             all_nbrs_idxes = pkdt.query_ball_point(coord, self.radius)
             nbr_list = []
             for idx, nbr_idxes in enumerate(all_nbrs_idxes):
                 nbr_dists = distance_pbc(coord[idx], coord[nbr_idxes],
                                          lattice)
                 nbr_idx_dist = sorted(zip(nbr_idxes, nbr_dists),
                                       key=lambda x: x[1])
                 assert nbr_idx_dist[0][1] == 0 and\
                     nbr_idx_dist[0][0] == idx and\
                     len(nbr_idx_dist) >= self.n_nbrs + 1
                 nbr_list.append(
                     [idx for idx, dist in nbr_idx_dist[1:self.n_nbrs + 1]])
             nbr_lists.append(np.stack(np.array(nbr_list, dtype='int32')))
         nbr_lists = np.stack(nbr_lists)
         diag_lattices = np.stack(diag_lattices)
         return {
             'traj_coords': traj_coords,
             'lattices': diag_lattices,
             'atom_types': atom_types,
             'target_index': target_index,
             'nbr_lists': nbr_lists
         }
     elif self.backend == 'direct':
         nbr_lists, nbr_dists = [], []
         for coord, lattice in tqdm(zip(traj_coords, lattices),
                                    total=len(traj_coords),
                                    disable=not self.verbose):
             crystal = IStructure(lattice=lattice,
                                  species=atom_types,
                                  coords=coord,
                                  coords_are_cartesian=True)
             all_nbrs = crystal.get_all_neighbors(r=self.radius,
                                                  include_index=True)
             all_nbrs = [
                 sorted(nbrs, key=lambda x: x[1]) for nbrs in all_nbrs
             ]
             nbr_list, nbr_dist = [], []
             for nbr in all_nbrs:
                 assert len(nbr) >= self.n_nbrs, 'not find enough neighbors'
                 nbr_list.append(
                     list(map(lambda x: x[2], nbr[:self.n_nbrs])))
                 nbr_dist.append(
                     list(map(lambda x: x[1], nbr[:self.n_nbrs])))
             nbr_lists.append(np.array(nbr_list, dtype='int32'))
             nbr_dists.append(np.array(nbr_dist, dtype='float32'))
         nbr_lists, nbr_dists = np.stack(nbr_lists), np.stack(nbr_dists)
         return {
             'traj_coords': traj_coords,
             'atom_types': atom_types,
             'target_index': target_index,
             'nbr_lists': nbr_lists,
             'nbr_dists': nbr_dists
         }
Exemple #19
0
 def construct_graph(self, traj_coords, lattices, atom_types, target_index):
     if self.backend == 'kdtree':
         nbr_lists, diag_lattices = [], []
         for coord, lattice in tqdm(zip(traj_coords, lattices),
                                    total=len(traj_coords),
                                    disable=not self.verbose):
             # take the diagonal part of the lattice matrix
             lattice = np.diagonal(lattice)
             diag_lattices.append(lattice)
             pkdt = PeriodicCKDTree(lattice, coord)
             all_nbrs_idxes = pkdt.query_ball_point(coord, self.radius)
             nbr_list = []
             for idx, nbr_idxes in enumerate(all_nbrs_idxes):
                 nbr_dists = distance_pbc(coord[idx], coord[nbr_idxes],
                                          lattice)
                 nbr_idx_dist = sorted(zip(nbr_idxes, nbr_dists),
                                       key=lambda x: x[1])
                 assert nbr_idx_dist[0][1] == 0 and\
                     nbr_idx_dist[0][0] == idx and\
                     len(nbr_idx_dist) >= self.n_nbrs + 1
                 nbr_list.append(
                     [idx for idx, dist in nbr_idx_dist[1:self.n_nbrs + 1]])
             nbr_lists.append(np.stack(np.array(nbr_list, dtype='int32')))
         nbr_lists = np.stack(nbr_lists)
         diag_lattices = np.stack(diag_lattices)
         return {
             'traj_coords': traj_coords,
             'lattices': diag_lattices,
             'atom_types': atom_types,
             'target_index': target_index,
             'nbr_lists': nbr_lists
         }
     elif self.backend == 'direct':
         nbr_lists, nbr_dists = [], []
         for coord, lattice in tqdm(zip(traj_coords, lattices),
                                    total=len(traj_coords),
                                    disable=not self.verbose):
             crystal = IStructure(lattice=lattice,
                                  species=atom_types,
                                  coords=coord,
                                  coords_are_cartesian=True)
             all_nbrs = crystal.get_all_neighbors(r=self.radius,
                                                  include_index=True)
             all_nbrs = [
                 sorted(nbrs, key=lambda x: x[1]) for nbrs in all_nbrs
             ]
             nbr_list, nbr_dist = [], []
             for nbr in all_nbrs:
                 assert len(nbr) >= self.n_nbrs, 'not find enough neighbors'
                 nbr_list.append(
                     list(map(lambda x: x[2], nbr[:self.n_nbrs])))
                 nbr_dist.append(
                     list(map(lambda x: x[1], nbr[:self.n_nbrs])))
             nbr_lists.append(np.array(nbr_list, dtype='int32'))
             nbr_dists.append(np.array(nbr_dist, dtype='float32'))
         nbr_lists, nbr_dists = np.stack(nbr_lists), np.stack(nbr_dists)
         return {
             'traj_coords': traj_coords,
             'atom_types': atom_types,
             'target_index': target_index,
             'nbr_lists': nbr_lists,
             'nbr_dists': nbr_dists
         }
     elif self.backend == 'ndirect':
         stcs = [
             Structure(lattice=lattices[i],
                       species=atom_types,
                       coords=traj_coords[i],
                       coords_are_cartesian=True)
             for i in tqdm(range(len(traj_coords)),
                           desc='Generating structure...',
                           disable=not self.verbose)
         ]
         a, b, c = [
             np.ceil(2 * self.radius / d).astype('int')
             for d in stcs[0].lattice.abc
         ]
         if [a, b, c] != [1, 1, 1]:
             _ = [
                 stc.make_supercell([
                     np.ceil(2 * self.radius / d).astype('int')
                     for d in stc.lattice.abc
                 ]) for stc in tqdm(stcs,
                                    desc='Building supercell...',
                                    disable=not self.verbose)
             ]
         nbr_lists = np.array([
             stc.distance_matrix.argsort()[:, 1:1 + self.n_nbrs]
             for stc in tqdm(stcs,
                             desc='Generating neighbor index...',
                             disable=not self.verbose)
         ],
                              dtype='int32')
         nbr_dists = np.array([
             np.sort(stc.distance_matrix)[:, 1:1 + self.n_nbrs]
             for stc in tqdm(stcs,
                             desc='Generating neighbor distance...',
                             disable=not self.verbose)
         ],
                              dtype='float32')
         nbr_lists, nbr_dists = np.stack(nbr_lists), np.stack(nbr_dists)
         if not np.all((nbr_dists < self.radius) & (nbr_dists > 0)):
             raise ('not find enough neighbors')
         return {
             'traj_coords': traj_coords,
             'atom_types': atom_types,
             'target_index': target_index,
             'nbr_lists': nbr_lists,
             'nbr_dists': nbr_dists
         }