def create_interstitial_supercells(structure,element,size=2): ''' Create interstitial structures with InFiT (Interstitialcy Finding Tool) algorithm with Pymatgen. Parameters ---------- structure: (Pymatgen Structure) Bulk structure. element: (str or Element) interstitial element. Returns ------- interstitials: (dict) Dictionary with sites (Site object) and supercell structures (Structure object) ''' int_object = StructureMotifInterstitial(structure,element) int_sites = int_object.enumerate_defectsites() int_supercells = int_object.make_supercells_with_defects([[size,0,0],[0,size,0],[0,0,size]]) interstitials = {} interstitial_sites = {} interstitial_structures = {} for i in range(0,len(int_sites)): int_coord_type = int_object.get_motif_type(i) interstitial_sites[int_coord_type] = int_sites[i] struct_int = int_supercells[i+1] interstitial_structures[int_coord_type] = struct_int interstitials['sites'] = interstitial_sites interstitials['structures'] = interstitial_structures return interstitials
class StructureMotifInterstitialTest(PymatgenTest): def setUp(self): self.silicon = Structure( Lattice.from_lengths_and_angles([5.47, 5.47, 5.47], [90.0, 90.0, 90.0]), ["Si", "Si", "Si", "Si", "Si", "Si", "Si", "Si"], [[0.000000, 0.000000, 0.500000], [0.750000, 0.750000, 0.750000], [0.000000, 0.500000, 1.000000], [0.750000, 0.250000, 0.250000], [0.500000, 0.000000, 1.000000], [0.250000, 0.750000, 0.250000], [0.500000, 0.500000, 0.500000], [0.250000, 0.250000, 0.750000]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=False, site_properties=None) self.smi = StructureMotifInterstitial( self.silicon, "Si", motif_types=["tetrahedral", "octahedral"], op_threshs=[0.3, 0.5], dl=0.4, doverlap=1.0, facmaxdl=1.51) self.diamond = Structure( Lattice([[2.189, 0, 1.264], [0.73, 2.064, 1.264], [0, 0, 2.528]]), ["C0+", "C0+"], [[2.554, 1.806, 4.423], [0.365, 0.258, 0.632]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.nacl = Structure(Lattice([[3.485, 0, 2.012], [1.162, 3.286, 2.012], [0, 0, 4.025]]), ["Na1+", "Cl1-"], [[0, 0, 0], [2.324, 1.643, 4.025]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.cscl = Structure(Lattice([[4.209, 0, 0], [0, 4.209, 0], [0, 0, 4.209]]), ["Cl1-", "Cs1+"], [[2.105, 2.105, 2.105], [0, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.square_pyramid = Structure(Lattice([[100, 0, 0], [0, 100, 0], [0, 0, 100]]), ["C", "C", "C", "C", "C", "C"], [[0, 0, 0], [1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.trigonal_bipyramid = Structure( Lattice([[100, 0, 0], [0, 100, 0], [0, 0, 100]]), ["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) def test_all(self): self.assertIsInstance(self.smi, StructureMotifInterstitial) self.assertEqual(len(self.smi.enumerate_defectsites()), 1) self.assertIsInstance(self.smi.enumerate_defectsites()[0], PeriodicSite) self.assertEqual("Si", self.smi.enumerate_defectsites()[0].species_string) self.assertEqual("tetrahedral", self.smi.get_motif_type(0)) elem_cn_dict = self.smi.get_coordinating_elements_cns(0) self.assertEqual(len(list(elem_cn_dict.keys())), 1) self.assertEqual(list(elem_cn_dict.keys())[0], "Si") self.assertEqual(elem_cn_dict["Si"], 4) structs = self.smi.make_supercells_with_defects(np.array([1, 1, 1])) self.assertEqual(len(structs), 2) self.assertIsInstance(structs[0], Structure) def tearDown(self): del self.smi del self.silicon del self.diamond del self.nacl del self.cscl
class StructureMotifInterstitialTest(PymatgenTest): def setUp(self): self.silicon = Structure( Lattice.from_lengths_and_angles([5.47, 5.47, 5.47], [90.0, 90.0, 90.0]), ["Si", "Si", "Si", "Si", "Si", "Si", "Si", "Si"], [[0.000000, 0.000000, 0.500000], [0.750000, 0.750000, 0.750000], [0.000000, 0.500000, 1.000000], [0.750000, 0.250000, 0.250000], [0.500000, 0.000000, 1.000000], [0.250000, 0.750000, 0.250000], [0.500000, 0.500000, 0.500000], [0.250000, 0.250000, 0.750000]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=False, site_properties=None) self.smi = StructureMotifInterstitial( self.silicon, "Si", motif_types=["tetrahedral", "octahedral"], op_threshs=[0.3, 0.5], dl=0.4, doverlap=1.0, facmaxdl=1.51) self.diamond = Structure( Lattice([[2.189, 0, 1.264], [0.73, 2.064, 1.264], [0, 0, 2.528]]), ["C0+", "C0+"], [[2.554, 1.806, 4.423], [0.365, 0.258, 0.632]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.nacl = Structure( Lattice([[3.485, 0, 2.012], [1.162, 3.286, 2.012], [0, 0, 4.025]]), ["Na1+", "Cl1-"], [[0, 0, 0], [2.324, 1.643, 4.025]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.cscl = Structure( Lattice([[4.209, 0, 0], [0, 4.209, 0], [0, 0, 4.209]]), ["Cl1-", "Cs1+"], [[2.105, 2.105, 2.105], [0, 0, 0]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.square_pyramid = Structure( Lattice([[100, 0, 0], [0, 100, 0], [0, 0, 100]]), ["C", "C", "C", "C", "C", "C"], [[0, 0, 0], [1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1]], validate_proximity=False, to_unit_cell=False, coords_are_cartesian=True, site_properties=None) self.trigonal_bipyramid = Structure( Lattice([[100, 0, 0], [0, 100, 0], [0, 0, 100]]), ["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) def test_all(self): self.assertIsInstance(self.smi, StructureMotifInterstitial) self.assertEqual(len(self.smi.enumerate_defectsites()), 1) self.assertIsInstance(self.smi.enumerate_defectsites()[0], PeriodicSite) self.assertEqual("Si", self.smi.enumerate_defectsites()[0].species_string) self.assertEqual("tetrahedral", self.smi.get_motif_type(0)) elem_cn_dict = self.smi.get_coordinating_elements_cns(0) self.assertEqual(len(list(elem_cn_dict.keys())), 1) self.assertEqual(list(elem_cn_dict.keys())[0], "Si") self.assertEqual(elem_cn_dict["Si"], 4) structs = self.smi.make_supercells_with_defects(np.array([1, 1, 1])) self.assertEqual(len(structs), 2) self.assertIsInstance(structs[0], Structure) def tearDown(self): del self.smi del self.silicon del self.diamond del self.nacl del self.cscl