Ejemplo n.º 1
0
    def test_all_nn_classes(self):
        self.assertEqual(MinimumDistanceNN(cutoff=5, get_all_sites=True).get_cn(
            self.cscl, 0), 14)
        self.assertEqual(MinimumDistanceNN().get_cn(self.diamond, 0), 4)
        self.assertEqual(MinimumDistanceNN().get_cn(self.nacl, 0), 6)
        self.assertEqual(MinimumDistanceNN().get_cn(self.lifepo4, 0), 6)
        self.assertEqual(MinimumDistanceNN(tol=0.01).get_cn(self.cscl, 0), 8)
        self.assertEqual(MinimumDistanceNN(tol=0.1).get_cn(self.mos2, 0), 6)

        for image in MinimumDistanceNN(tol=0.1).get_nn_images(self.mos2, 0):
            self.assertTrue(image in [(0, 0, 0), (0, 1, 0), (-1, 0, 0),
                                      (0, 0, 0), (0, 1, 0), (-1, 0, 0)])

        okeeffe = MinimumOKeeffeNN(tol=0.01)
        self.assertEqual(okeeffe.get_cn(self.diamond, 0), 4)
        self.assertEqual(okeeffe.get_cn(self.nacl, 0), 6)
        self.assertEqual(okeeffe.get_cn(self.cscl, 0), 8)
        self.assertEqual(okeeffe.get_cn(self.lifepo4, 0), 2)

        virenn = MinimumVIRENN(tol=0.01)
        self.assertEqual(virenn.get_cn(self.diamond, 0), 4)
        self.assertEqual(virenn.get_cn(self.nacl, 0), 6)
        self.assertEqual(virenn.get_cn(self.cscl, 0), 8)
        self.assertEqual(virenn.get_cn(self.lifepo4, 0), 2)

        brunner_recip = BrunnerNN_reciprocal(tol=0.01)
        self.assertEqual(brunner_recip.get_cn(self.diamond, 0), 4)
        self.assertEqual(brunner_recip.get_cn(self.nacl, 0), 6)
        self.assertEqual(brunner_recip.get_cn(self.cscl, 0), 14)
        self.assertEqual(brunner_recip.get_cn(self.lifepo4, 0), 6)

        brunner_rel = BrunnerNN_relative(tol=0.01)
        self.assertEqual(brunner_rel.get_cn(self.diamond, 0), 4)
        self.assertEqual(brunner_rel.get_cn(self.nacl, 0), 6)
        self.assertEqual(brunner_rel.get_cn(self.cscl, 0), 14)
        self.assertEqual(brunner_rel.get_cn(self.lifepo4, 0), 6)

        brunner_real = BrunnerNN_real(tol=0.01)
        self.assertEqual(brunner_real.get_cn(self.diamond, 0), 4)
        self.assertEqual(brunner_real.get_cn(self.nacl, 0), 6)
        self.assertEqual(brunner_real.get_cn(self.cscl, 0), 14)
        self.assertEqual(brunner_real.get_cn(self.lifepo4, 0), 30)

        econn = EconNN()
        self.assertEqual(econn.get_cn(self.diamond, 0), 4)
        self.assertEqual(econn.get_cn(self.nacl, 0), 6)
        self.assertEqual(econn.get_cn(self.cscl, 0), 14)
        self.assertEqual(econn.get_cn(self.lifepo4, 0), 6)

        voroinn = VoronoiNN(tol=0.5)
        self.assertEqual(voroinn.get_cn(self.diamond, 0), 4)
        self.assertEqual(voroinn.get_cn(self.nacl, 0), 6)
        self.assertEqual(voroinn.get_cn(self.cscl, 0), 8)
        self.assertEqual(voroinn.get_cn(self.lifepo4, 0), 6)

        crystalnn = CrystalNN()
        self.assertEqual(crystalnn.get_cn(self.diamond, 0), 4)
        self.assertEqual(crystalnn.get_cn(self.nacl, 0), 6)
        self.assertEqual(crystalnn.get_cn(self.cscl, 0), 8)
        self.assertEqual(crystalnn.get_cn(self.lifepo4, 0), 6)
Ejemplo n.º 2
0
    def test_noble_gas_material(self):
        cnn = CrystalNN()

        self.assertEqual(cnn.get_cn(self.he_bcc, 0, use_weights=False), 0)

        cnn = CrystalNN(distance_cutoffs=(1.25, 5))
        self.assertEqual(cnn.get_cn(self.he_bcc, 0, use_weights=False), 8)
Ejemplo n.º 3
0
    def test_noble_gas_material(self):
        cnn = CrystalNN()

        self.assertEqual(cnn.get_cn(self.he_bcc, 0, use_weights=False), 0)

        cnn = CrystalNN(distance_cutoffs=(1.25, 5))
        self.assertEqual(cnn.get_cn(self.he_bcc, 0, use_weights=False), 8)
Ejemplo n.º 4
0
    def test_sanity(self):
        with self.assertRaises(ValueError):
            cnn = CrystalNN()
            cnn.get_cn(self.lifepo4, 0, use_weights=True)

        with self.assertRaises(ValueError):
            cnn = CrystalNN(weighted_cn=True)
            cnn.get_cn(self.lifepo4, 0, use_weights=False)
Ejemplo n.º 5
0
    def test_sanity(self):
        with self.assertRaises(ValueError):
            cnn = CrystalNN()
            cnn.get_cn(self.lifepo4, 0, use_weights=True)

        with self.assertRaises(ValueError):
            cnn = CrystalNN(weighted_cn=True)
            cnn.get_cn(self.lifepo4, 0, use_weights=False)
Ejemplo n.º 6
0
    def test_noble_gas_material(self):
        cnn = CrystalNN()
        with self.assertRaises(RuntimeError):
            cnn.get_cn(self.he_bcc, 0, use_weights=False)

        cnn = CrystalNN(distance_cutoffs=(1.25, 5))
        self.assertAlmostEqual(cnn.get_cn(self.he_bcc, 0, use_weights=False),
                               8)
Ejemplo n.º 7
0
    def get_coordinations(self):
        """
        Inputs
            struct: a pymatgen structure object

        Returns
            coordination_numbers: a dictionary containing each species' name and average coordination
            number rounded to nearest integer
        """
        struct = self.structure
        vnn = CrystalNN()
        coordination_numbers = {}
        stoich = defaultdict(int)
        for site in struct.as_dict()['sites']:
            elem = site['species'][0]['element']
            stoich[elem] += 1
        for spec in stoich.keys():
            coordination_numbers[spec] = 0.0
        for atom in range(len(struct)):
            try:
                cn = vnn.get_cn(struct, atom, use_weights=False)
                coordination_numbers[
                    struct[atom].species.elements[0].element.symbol] += cn
            except:
                return None
        for spec in coordination_numbers:
            coordination_numbers[
                spec] = coordination_numbers[spec] / stoich[spec]
            coordination_numbers[spec] = int(round(coordination_numbers[spec]))

        return coordination_numbers
Ejemplo n.º 8
0
    def test_discrete_cn(self):
        cnn = CrystalNN()
        cn_array = []
        expected_array = [6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4,
                          4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
        for idx, _ in enumerate(self.lifepo4):
            cn_array.append(cnn.get_cn(self.lifepo4, idx))

        self.assertSequenceEqual(cn_array, expected_array)
Ejemplo n.º 9
0
    def test_discrete_cn(self):
        cnn = CrystalNN()
        cn_array = []
        expected_array = [6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4,
                          4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
        for idx, _ in enumerate(self.lifepo4):
            cn_array.append(cnn.get_cn(self.lifepo4, idx))

        self.assertSequenceEqual(cn_array, expected_array)
Ejemplo n.º 10
0
    def test_weighted_cn(self):
        cnn = CrystalNN(weighted_cn=True)
        cn_array = []
        expected_array = [6.0449, 6.0431, 6.0449, 6.0431, 5.6262, 5.6253,
                          5.6258, 5.6258, 3.9936, 3.9936, 3.9936, 3.9936,
                          3.9183, 3.7318, 3.7259, 3.781, 3.781, 3.7259,
                          3.7318, 3.9183, 3.9183, 3.7318, 3.7248, 3.7819,
                          3.7819, 3.7248, 3.7318, 3.9183]
        for idx, _ in enumerate(self.lifepo4):
            cn_array.append(cnn.get_cn(self.lifepo4, idx, use_weights=True))

        self.assertArrayAlmostEqual(expected_array, cn_array, 2)
Ejemplo n.º 11
0
    def test_weighted_cn(self):
        cnn = CrystalNN(weighted_cn=True)
        cn_array = []

        expected_array = [5.863, 5.8716, 5.863, 5.8716, 5.7182, 5.7182, 5.719,
                          5.7181, 3.991, 3.991, 3.991, 3.9907, 3.5997, 3.525,
                          3.4133, 3.4714, 3.4727, 3.4133, 3.525, 3.5997,
                          3.5997, 3.525, 3.4122, 3.4738, 3.4728, 3.4109,
                          3.5259, 3.5997]
        for idx, _ in enumerate(self.lifepo4):
            cn_array.append(cnn.get_cn(self.lifepo4, idx, use_weights=True))

        self.assertArrayAlmostEqual(expected_array, cn_array, 2)
Ejemplo n.º 12
0
    def test_weighted_cn(self):
        cnn = CrystalNN(weighted_cn=True)
        cn_array = []

        expected_array = [5.8962, 5.8996, 5.8962, 5.8996, 5.7195, 5.7195,
                          5.7202, 5.7194, 4.0012, 4.0012, 4.0012, 4.0009,
                          3.3897, 3.2589, 3.1218, 3.1914, 3.1914, 3.1218,
                          3.2589, 3.3897, 3.3897, 3.2589, 3.1207, 3.1924,
                          3.1915, 3.1207, 3.2598, 3.3897]
        for idx, _ in enumerate(self.lifepo4):
            cn_array.append(cnn.get_cn(self.lifepo4, idx, use_weights=True))

        self.assertArrayAlmostEqual(expected_array, cn_array, 2)
Ejemplo n.º 13
0
    def test_weighted_cn(self):
        cnn = CrystalNN(weighted_cn=True)
        cn_array = []

        expected_array = [5.863, 5.8716, 5.863 , 5.8716, 5.7182, 5.7182, 5.719,
                          5.7181, 3.991 , 3.991 , 3.991 , 3.9907, 3.5997, 3.525,
                          3.4133, 3.4714, 3.4727, 3.4133, 3.525 , 3.5997,
                          3.5997, 3.525 , 3.4122, 3.4738, 3.4728, 3.4109,
                          3.5259, 3.5997]
        for idx, _ in enumerate(self.lifepo4):
            cn_array.append(cnn.get_cn(self.lifepo4, idx, use_weights=True))

        self.assertArrayAlmostEqual(expected_array, cn_array, 2)
Ejemplo n.º 14
0
    def test_weighted_cn(self):
        cnn = CrystalNN(weighted_cn=True)
        cn_array = []
        expected_array = [
            6.0449, 6.0431, 6.0449, 6.0431, 5.6262, 5.6253, 5.6258, 5.6258,
            3.9936, 3.9936, 3.9936, 3.9936, 3.9183, 3.7318, 3.7259, 3.781,
            3.781, 3.7259, 3.7318, 3.9183, 3.9183, 3.7318, 3.7248, 3.7819,
            3.7819, 3.7248, 3.7318, 3.9183
        ]
        for idx, _ in enumerate(self.lifepo4):
            cn_array.append(cnn.get_cn(self.lifepo4, idx, use_weights=True))

        self.assertArrayAlmostEqual(expected_array, cn_array, 2)
def get_Species_Substitution_Order(structure, dummies, species, to_ignore):

    els_removed = species.copy()
    for element in to_ignore:
        els_removed.remove(Element(element))

    subs = [list(p) for p in permutations(els_removed)]
    diff_coords = []
    struct_copies = []
    for sub in subs:
        copy = structure.copy()
        for dummy_ind in range(len(dummies)):
            copy[dummies[dummy_ind].symbol] = sub[dummy_ind]
        struct_copies.append(copy)
        coordination_numbers = []
        CN = CrystalNN(weighted_cn=True)
        for element_ind in range(len(copy.species)):
            cn = CN.get_cn(copy, element_ind, use_weights=True)
            coordination_numbers.append((copy.species[element_ind], cn))
        diff_coords.append(coordination_numbers)

    unique_cn_els = []
    for cn in diff_coords:
        cns = []
        for i in range(len(cn)):
            if cn[i] not in cns:
                cns.append(cn[i])
        unique_cn_els.append(cns)

    substitution_ind = None
    check_len = 300  # arbitrarily high number to start, used to get substitution scheme with lowest number of unique sites
    for unique_cn_el_ind in range(len(unique_cn_els)):
        if len(unique_cn_els[unique_cn_el_ind]) < check_len:
            substitution_ind = unique_cn_el_ind
            check_len = len(unique_cn_els[unique_cn_el_ind])
        else:
            continue

    ox_transform = AutoOxiStateDecorationTransformation()
    ox_species = ox_transform.apply_transformation(
        struct_copies[substitution_ind]).types_of_specie
    for specie in ox_species:
        for element in to_ignore:
            if specie.symbol == Element(element).symbol:
                ox_species.remove(specie)

    return subs[substitution_ind], ox_species
Ejemplo n.º 16
0
 def test_x_diff_weight(self):
     cnn = CrystalNN(weighted_cn=True, x_diff_weight=0)
     self.assertAlmostEqual(cnn.get_cn(self.lifepo4, 0, use_weights=True),
                            5.9522, 2)
Ejemplo n.º 17
0
 def test_cation_anion(self):
     cnn = CrystalNN(weighted_cn=True, cation_anion=True)
     self.assertAlmostEqual(cnn.get_cn(self.lifepo4, 0, use_weights=True),
                            5.8630, 2)
Ejemplo n.º 18
0
 def test_x_diff_weight(self):
     cnn = CrystalNN(weighted_cn=True, x_diff_weight=0)
     self.assertAlmostEqual(cnn.get_cn(self.lifepo4, 0, use_weights=True),
                            5.9522, 2)
Ejemplo n.º 19
0
 def test_cation_anion(self):
     cnn = CrystalNN(weighted_cn=True, cation_anion=True)
     self.assertAlmostEqual(cnn.get_cn(self.lifepo4, 0, use_weights=True),
                            5.8630, 2)