def test_copy(self): pos, cell = generate_fcc_lattice() basis = Atoms(symbols='Al', positions=pos, cell=cell) basis_copy = basis.copy() self.assertEqual(basis, basis_copy) basis_copy[:] = "Pt" self.assertNotEqual(basis, basis_copy)
def test_get_symmetry_dataset(self): cell = 2.2 * np.identity(3) Al_sc = Atoms('AlAl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) Al_sc.set_repeat([2, 2, 2]) self.assertEqual(Al_sc.get_symmetry_dataset()['number'], 229)
def setUp(self): pass self.CO2 = Atoms("CO2", positions=[[0, 0, 0], [0, 0, 1.5], [0, 1.5, 0]]) C = Atom('C').element self.C3 = Atoms([C, C, C], positions=[[0, 0, 0], [0, 0, 2], [0, 2, 0]]) self.C2 = Atoms(2 * [Atom('C')])
def test_pbc(self): CO = Atoms("CO", positions=[[0, 0, 0], [0, 0, 2]], cell=[[1, 0, 0], [0, 1, 0], [0, 0, 1]], pbc=[True, True, True]) self.assertTrue((CO.pbc == np.array([True, True, True])).all()) CO.set_pbc((True, True, False))
def test_get_distance(self): cell = 2.2 * np.identity(3) NaCl = Atoms('NaCl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) self.assertAlmostEqual(NaCl.get_distance(0, 1), 2.2 * 0.5 * np.sqrt(3)) self.assertAlmostEqual(NaCl.get_distance(0, [0, 0, 0.5]), 0.5) self.assertAlmostEqual(NaCl.get_distance([0, 0, 0], [0, 0, 0.5]), 0.5)
def test_boundary(self): cell = 2.2 * np.identity(3) NaCl = Atoms('NaCl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) NaCl.set_repeat([3, 3, 3]) # NaCl.plot3d() NaCl_bound = NaCl.get_boundary_region(0.2)
def test_get_primitive_cell(self): cell = 2.2 * np.identity(3) Al_sc = Atoms('AlFe', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) Al_sc.set_repeat([2, 2, 2]) primitive_cell = Al_sc.get_primitive_cell() self.assertEqual(primitive_cell.get_spacegroup()['Number'], 221)
def test_get_bonds(self): dim = 3 cell = 2.62 * np.identity(dim) d1, d2 = 0.6, 0.6 H2O = Atoms('H2O', scaled_positions=[(d1, d2, 0), (d1, -d2, 0), (0, 0, 0)], cell=cell) H2O.set_repeat([1, 1, 3])
def test_get_shells(self): dim = 3 cell = 2.2 * np.identity(dim) Al_sc = Atoms('AlAl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) Al_sc.set_repeat([3, 3, 3]) self.assertEqual(np.round(Al_sc.get_shells()[2], 6), 2.2)
def test_cell(self): CO = Atoms("CO", positions=[[0, 0, 0], [0, 0, 2]], cell=[[1, 0, 0], [0, 1, 0], [0, 0, 1]], pbc=[True, True, True]) self.assertTrue((CO.get_cell() == np.identity(3)).all()) self.assertTrue((CO.cell == np.identity(3)).all()) CO.cell[2][2] = 10. self.assertTrue(CO.cell[2, 2] == 10.)
def test_set_scaled_positions(self): pos, cell = generate_fcc_lattice() basis = Atoms(symbols='Al', positions=pos, cell=cell, a=4.2) basis.set_scaled_positions(np.array([[0.5, 0.5, 0.5]])) self.assertTrue( np.array_equal(basis.scaled_positions, [[0.5, 0.5, 0.5]])) self.assertTrue( np.array_equal(basis.positions, np.dot([[0.5, 0.5, 0.5]], basis.cell)))
def test_from_hdf(self): if sys.version_info[0] >= 3: filename = "../static/pyiron_atomistics/structure_hdf" abs_filename = os.path.abspath(filename) hdf_obj = FileHDFio(abs_filename) basis = Atoms().from_hdf(hdf_obj, group_name="simple_structure") self.assertEqual(len(basis), 8) self.assertEqual(basis.get_majority_species()[1], "Al") self.assertEqual(basis.get_spacegroup()['Number'], 225)
def test_get_chemical_symbols(self): self.assertTrue( np.array_equal(self.CO2.get_chemical_symbols(), ["C", "O", "O"])) cell = np.eye(3) * 10.0 pse = PeriodicTable() pse.add_element("O", "O_up", spin="up") o_up = pse.element("O_up") basis = Atoms([o_up], scaled_positions=[[0.27, 0.27, 0.27]], cell=cell) self.assertTrue(np.array_equal(basis.get_chemical_symbols(), ["O_up"]))
def test_get_neighbors(self): cell = 2.2 * np.identity(3) NaCl = Atoms('NaCl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) # NaCl.repeat([3, 3, 3]) # NaCl.positions = [(1,1,1)] boundary = NaCl.get_boundary_region(3.5) extended_cell = NaCl + boundary # extended_cell.plot3d() nbr_dict = NaCl.get_neighbors(num_neighbors=12, t_vec=True)
def create_Fe_bcc(self): self.pse = PeriodicTable() self.pse.add_element("Fe", "Fe_up", spin="up", pseudo_name='GGA') self.pse.add_element("Fe", "Fe_down", spin="down", pseudo_name='GGA') Fe_up = self.pse.element("Fe_up") Fe_down = self.pse.element("Fe_down") self.Fe_bcc = Atoms([Fe_up, Fe_down], scaled_positions=[[0, 0, 0], [0.25, 0.25, 0.25]], cell=np.identity(3)) self.Fe_bcc.add_tag("group") self.Fe_bcc.group[:] = 0
def test__delitem__(self): cell = np.eye(3) * 10.0 basis_0 = Atoms(["O"], scaled_positions=[[0.5, 0.5, 0.5]], cell=cell) basis_1 = Atoms(["H"], scaled_positions=[[0.75, 0.75, 0.75]], cell=cell) basis_2 = Atoms(["H"], scaled_positions=[[0.25, 0.25, 0.25]], cell=cell) basis_3 = Atoms(["H", "O", "N"], scaled_positions=[[0.35, 0.35, 0.35], [0., 0., 0.], [0., 0., 0.1]], cell=cell) pse = PeriodicTable() pse.add_element("O", "O_up", spin="up") o_up = pse.element("O_up") basis_4 = Atoms([o_up], scaled_positions=[[0.27, 0.27, 0.27]], cell=cell) b = basis_0 + basis_1 + basis_2 + basis_3 + basis_4 O_indices = b.select_index("O") self.assertEqual(len(b), 7) self.assertEqual(len(b.indices), 7) self.assertEqual(len(b.species), 4) b.__delitem__(O_indices[0]) self.assertEqual(b.get_chemical_formula(), "H3NOO_up") self.assertEqual(len(b), 6) self.assertEqual(len(b.indices), 6) self.assertEqual(len(b._tag_list), 6) self.assertEqual(len(b.species), 4) O_indices = b.select_index("O") b.__delitem__(O_indices) self.assertEqual(b.get_chemical_formula(), "H3NO_up") self.assertEqual(len(b), 5) self.assertEqual(len(b.indices), 5) self.assertEqual(len(b.species), 3) self.assertEqual(np.max(b.indices), 2) N_indices = b.select_index("N") b.__delitem__(N_indices) self.assertEqual(b.get_chemical_formula(), "H3O_up") self.assertEqual(len(b), 4) self.assertEqual(len(b.indices), 4) self.assertEqual(len(b.species), 2) self.assertEqual(np.max(b.indices), 1) O_indices = b.select_index(o_up) b.__delitem__(O_indices) self.assertEqual(b.get_chemical_formula(), "H3") self.assertEqual(len(b), 3) self.assertEqual(len(b.indices), 3) self.assertEqual(len(b.species), 1) self.assertEqual(np.max(b.indices), 0)
def test_get_parent_basis(self): periodic_table = PeriodicTable() periodic_table.add_element(parent_element="O", new_element="O_up") O_up = periodic_table.element("O_up") O_basis = Atoms([O_up], cell=10.0 * np.eye(3), scaled_positions=[[0.5, 0.5, 0.5]]) O_simple = Atoms(["O"], cell=10.0 * np.eye(3), scaled_positions=[[0.5, 0.5, 0.5]]) O_parent = O_basis.get_parent_basis() self.assertNotEqual(O_basis, O_parent) self.assertEqual(O_simple, O_parent) self.assertEqual(O_parent[0].symbol, "O") periodic_table.add_element(parent_element="O", new_element="O_down") O_down = periodic_table.element("O_down") O_basis = Atoms([O_up, O_down], cell=10.0 * np.eye(3), scaled_positions=[[0.5, 0.5, 0.5], [0, 0, 0]]) O_simple = Atoms(["O", "O"], cell=10.0 * np.eye(3), scaled_positions=[[0.5, 0.5, 0.5]]) O_parent = O_basis.get_parent_basis() self.assertNotEqual(O_basis, O_parent) self.assertEqual(O_simple, O_parent) self.assertEqual(O_parent.get_chemical_formula(), "O2") self.assertEqual(len(O_basis.species), 2) self.assertEqual(len(O_simple.species), 1) self.assertEqual(len(O_parent.species), 1)
def test_get_array(self): pos, cell = generate_fcc_lattice() basis = Atoms(symbols='Al', positions=pos, cell=cell) basis.set_repeat([10, 10, 10]) spins = np.ones(len(basis), dtype=float) basis.set_array(name="spins", a=2 * spins, dtype=int) self.assertTrue(np.array_equal(basis.arrays['spins'], 2 * spins)) self.assertTrue( np.array_equal(basis.get_array(name="spins"), 2 * spins))
def test_center_coordinates(self): cell = 2.2 * np.identity(3) NaCl = Atoms('NaCl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) NaCl.set_repeat([3, 3, 3]) NaCl.positions += [2.2, 2.2, 2.2] NaCl.center_coordinates_in_unit_cell(origin=-0.5) self.assertTrue(-0.5 < np.min(NaCl.scaled_positions)) self.assertTrue(np.max(NaCl.scaled_positions < 0.5)) NaCl.center_coordinates_in_unit_cell(origin=0.) self.assertTrue(0 <= np.min(NaCl.positions)) self.assertTrue(np.max(NaCl.scaled_positions < 1))
def test_new_array(self): pos, cell = generate_fcc_lattice() basis = Atoms(symbols='Al', positions=pos, cell=cell) basis.set_repeat([10, 10, 10]) spins = np.ones(len(basis)) basis.new_array(name="spins", a=spins) self.assertTrue(np.array_equal(basis.arrays['spins'], spins))
def test_set_absolute(self): a = 4.05 # Gold lattice constant b = a / 2. positions = np.array([(0.5, 0.4, 0.)]) fcc = Atoms(symbols=['Au'], scaled_positions=positions, cell=[(0, b, b), (b, 0, b), (b, b, 0)], pbc=True) # fcc.set_absolute() # print fcc.positions # fcc.set_relative() self.assertTrue( np.linalg.norm(fcc.scaled_positions - positions) < 1e-10)
def test_to_hdf(self): if sys.version_info[0] >= 3: filename = "../static/pyiron_atomistics/test_hdf" abs_filename = os.path.abspath(filename) hdf_obj = FileHDFio(abs_filename) pos, cell = generate_fcc_lattice() basis = Atoms(symbols='Al', positions=pos, cell=cell) basis.set_repeat([2, 2, 2]) basis.to_hdf(hdf_obj, "test_structure") self.assertTrue( np.array_equal(hdf_obj["test_structure/positions"], basis.positions)) basis_new = Atoms().from_hdf(hdf_obj, "test_structure") self.assertEqual(basis, basis_new)
def test_set_species(self): pos, cell = generate_fcc_lattice() pse = PeriodicTable() el = pse.element("Pt") basis = Atoms(symbols='Al', positions=pos, cell=cell) self.assertEqual(basis.get_chemical_formula(), "Al") basis.set_species([el]) self.assertEqual(basis.get_chemical_formula(), "Pt") self.assertTrue("Al" not in [sp.Abbreviation] for sp in basis._species_to_index_dict.keys()) self.assertTrue("Pt" in [sp.Abbreviation] for sp in basis._species_to_index_dict.keys())
def test_cluster_analysis(self): import random cell = 2.2 * np.identity(3) Al_sc = Atoms(elements=['Al', 'Al'], scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) Al_sc.set_repeat([4, 4, 4]) radius = Al_sc.get_shell_radius() neighbors = Al_sc.get_neighbors(radius=radius, num_neighbors=100, t_vec=False, exclude_self=True) c_Zn = 0.1 pse = PeriodicTable() Zn = pse.element("Zn") random.seed(123456) for _ in range(1): Zn_ind = random.sample(range(len(Al_sc)), int(c_Zn * len(Al_sc))) # for i_Zn in Zn_ind: # Al_sc.elements[i_Zn] = Zn cluster = Al_sc.cluster_analysis(Zn_ind, neighbors) cluster_len = np.sort([len(v) for k, v in cluster.items()])
def from_hdf(self, hdf=None, group_name=None): super(StructureContainer, self).from_hdf(hdf=hdf, group_name=group_name) with self.project_hdf5.open("input") as hdf5_input: self.structure = Atoms().from_hdf(hdf5_input)
def test__add__(self): cell = np.eye(3) * 10.0 basis_0 = Atoms(["O"], scaled_positions=[[0.5, 0.5, 0.5]], cell=cell) basis_1 = Atoms(["H"], scaled_positions=[[0.75, 0.75, 0.75]], cell=cell) basis_2 = Atoms(["H"], scaled_positions=[[0.25, 0.25, 0.25]], cell=cell) basis_3 = Atoms(["H", "O", "N"], scaled_positions=[[0.35, 0.35, 0.35], [0., 0., 0.], [0., 0., 0.1]], cell=cell) pse = PeriodicTable() pse.add_element("O", "O_up", spin="up") o_up = pse.element("O_up") basis_4 = Atoms([o_up], scaled_positions=[[0.27, 0.27, 0.27]], cell=np.eye(3) * 20.0) b = basis_0 + basis_1 self.assertEqual(b.get_chemical_formula(), "HO") b = basis_0 + basis_1 + basis_2 self.assertEqual(b.get_chemical_formula(), "H2O") b += basis_2 self.assertEqual(b.get_chemical_formula(), "H3O") b = basis_0 + basis_1 + basis_2 + basis_3 self.assertEqual(b.get_chemical_formula(), "H3NO2") self.assertTrue( np.array_equal(b.scaled_positions[b.select_index("N")], [[0., 0., 0.1]])) self.assertTrue( np.allclose( b.scaled_positions[b.select_index("H")], [[0.75, 0.75, 0.75], [0.25, 0.25, 0.25], [0.35, 0.35, 0.35]])) self.assertTrue( np.allclose(b.scaled_positions[b.select_index("O")], [[0.5, 0.5, 0.5], [0., 0., 0.]])) b.set_repeat([2, 2, 2]) self.assertEqual(b.get_chemical_formula(), "H24N8O16") b += basis_4 self.assertEqual(b.get_chemical_formula(), "H24N8O16O_up") self.assertTrue( np.allclose(b.scaled_positions[b.select_index(o_up)], [[0.27, 0.27, 0.27]])) COX = self.C2 + Atom("O", position=[0, 0, -2]) COX += Atom("O", position=[0, 0, -4]) COX += COX n_objects = len(set(COX.get_species_objects())) n_species = len(set(COX.get_chemical_elements())) self.assertEqual(n_objects, n_species) self.assertEqual(n_objects, 2) self.assertEqual(n_species, 2) basis_Mg = CrystalStructure("Mg", bravais_basis="fcc", lattice_constant=4.2) basis_O = CrystalStructure("O", bravais_basis="fcc", lattice_constant=4.2) # basis_O.set_relative() basis_O.scaled_positions += [0., 0., 0.5] basis = basis_Mg + basis_O self.assertEqual(len(basis._tag_list), len(basis_Mg._tag_list) + len(basis_O._tag_list)) basis.center_coordinates_in_unit_cell() self.assertEqual(basis.get_spacegroup()["Number"], 225)
def test_get_equivalent_atoms(self): cell = 2.2 * np.identity(3) Al_sc = Atoms('AlFe', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) Al_sc.set_repeat([2, 2, 2])
def test_get_ir_reciprocal_mesh(self): cell = 2.2 * np.identity(3) Al_sc = Atoms('AlAl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) self.assertEqual(len(Al_sc.get_ir_reciprocal_mesh([3, 3, 3])[0]), 27)
def test_get_space_group(self): cell = 2.2 * np.identity(3) Al_sc = Atoms('AlAl', scaled_positions=[(0, 0, 0), (0.5, 0.5, 0.5)], cell=cell) self.assertEqual(Al_sc.get_spacegroup()['InternationalTableSymbol'], 'Im-3m') self.assertEqual(Al_sc.get_spacegroup()['Number'], 229) cell = 4.2 * (0.5 * np.ones((3, 3)) - 0.5 * np.eye(3)) Al_fcc = Atoms('Al', scaled_positions=[(0, 0, 0)], cell=cell) self.assertEqual(Al_fcc.get_spacegroup()['InternationalTableSymbol'], 'Fm-3m') self.assertEqual(Al_fcc.get_spacegroup()['Number'], 225) a = 3.18 c = 1.623 * a cell = np.eye(3) cell[0, 0] = a cell[2, 2] = c cell[1, 0] = -a / 2. cell[1, 1] = np.sqrt(3) * a / 2. pos = np.array([[0., 0., 0.], [1. / 3., 2. / 3., 1. / 2.]]) Mg_hcp = Atoms('Mg2', scaled_positions=pos, cell=cell) self.assertEqual(Mg_hcp.get_spacegroup()['Number'], 194) cell = np.eye(3) cell[0, 0] = a cell[2, 2] = c cell[1, 1] = np.sqrt(3) * a pos = np.array([[0., 0., 0.], [0.5, 0.5, 0.], [0.5, 0.16666667, 0.5], [0., 0.66666667, 0.5]]) Mg_hcp = Atoms('Mg4', scaled_positions=pos, cell=cell) self.assertEqual(Mg_hcp.get_spacegroup()['Number'], 194)
def test__init__(self): pos, cell = generate_fcc_lattice() pse = PeriodicTable() el = pse.element("Al") basis = Atoms() self.assertIsInstance(basis, Atoms) self.assertIsInstance(basis.info, dict) self.assertIsInstance(basis.arrays, dict) self.assertIsInstance(basis.adsorbate_info, dict) self.assertIsInstance(basis.units, dict) self.assertIsInstance(basis.pbc, (bool, list, np.ndarray)) self.assertIsInstance(basis.indices, np.ndarray) self.assertIsNone(basis._internal_positions) self.assertIsNone(basis.positions) self.assertIsNone(basis.scaled_positions) self.assertIsInstance(basis.species, list) self.assertIsInstance(basis.elements, np.ndarray) self.assertIsNone(basis.cell) basis = Atoms(symbols='Al', positions=pos, cell=cell) self.assertIsInstance(basis, Atoms) self.assertEqual(basis.get_spacegroup()["Number"], 225) basis = Atoms(elements='Al', positions=pos, cell=cell) self.assertIsInstance(basis, Atoms) basis = Atoms(elements=['Al'], positions=pos, cell=cell) self.assertIsInstance(basis, Atoms) self.assertRaises(ValueError, Atoms, symbols="Pt", elements='Al', positions=pos, cell=cell) basis = Atoms(numbers=[13], positions=pos, cell=cell) self.assertEqual(basis.get_majority_species()[1], "Al") basis = Atoms(species=[el], indices=[0], positions=pos, cell=cell) self.assertEqual(basis.get_majority_species()[1], "Al") self.assertIsInstance(basis, Atoms) self.assertIsInstance(basis.info, dict) self.assertIsInstance(basis.arrays, dict) self.assertIsInstance(basis.adsorbate_info, dict) self.assertIsInstance(basis.units, dict) self.assertIsInstance(basis.pbc, (bool, list, np.ndarray)) self.assertIsInstance(basis.indices, np.ndarray) self.assertIsInstance(basis.species, list) self.assertIsInstance(basis.cell, np.ndarray) self.assertIsInstance(basis._internal_positions, np.ndarray) self.assertIsInstance(basis.positions, np.ndarray) self.assertIsInstance(basis.scaled_positions, np.ndarray) self.assertIsInstance(basis.elements, np.ndarray)