def _create_supercell(self, unitcell, symprec): mat = self._supercell_matrix frame = self._get_surrounding_frame(mat) sur_cell, u2sur_map = self._get_simple_supercell(frame, unitcell) # Trim the simple supercell by the supercell matrix trim_frame = np.array([mat[0] / float(frame[0]), mat[1] / float(frame[1]), mat[2] / float(frame[2])]) supercell, sur2s_map, mapping_table = trim_cell(trim_frame, sur_cell, symprec) multi = supercell.get_number_of_atoms() // unitcell.get_number_of_atoms() if multi != determinant(self._supercell_matrix): print("Supercell creation failed.") print("Probably some atoms are overwrapped. " "The mapping table is give below.") print(mapping_table) Atoms.__init__(self) else: Atoms.__init__(self, numbers=supercell.get_atomic_numbers(), masses=supercell.get_masses(), magmoms=supercell.get_magnetic_moments(), scaled_positions=supercell.get_scaled_positions(), cell=supercell.get_cell(), pbc=True) self._u2s_map = np.arange(unitcell.get_number_of_atoms()) * multi self._u2u_map = dict([(j, i) for i, j in enumerate(self._u2s_map)]) self._s2u_map = np.array(u2sur_map)[sur2s_map] * multi
def _create_supercell(self, unitcell, symprec): mat = self._supercell_matrix frame = self._get_surrounding_frame(mat) sur_cell, u2sur_map = self._get_simple_supercell(frame, unitcell) # Trim the simple supercell by the supercell matrix trim_frame = np.array([ mat[0] / float(frame[0]), mat[1] / float(frame[1]), mat[2] / float(frame[2]) ]) supercell, sur2s_map, mapping_table = trim_cell( trim_frame, sur_cell, symprec) num_satom = supercell.get_number_of_atoms() num_uatom = unitcell.get_number_of_atoms() multi = num_satom // num_uatom if multi != determinant(self._supercell_matrix): print("Supercell creation failed.") print("Probably some atoms are overwrapped. " "The mapping table is give below.") print(mapping_table) Atoms.__init__(self) else: Atoms.__init__(self, numbers=supercell.get_atomic_numbers(), masses=supercell.get_masses(), magmoms=supercell.get_magnetic_moments(), scaled_positions=supercell.get_scaled_positions(), cell=supercell.get_cell(), pbc=True) self._u2s_map = np.arange(num_uatom) * multi self._u2u_map = dict([(j, i) for i, j in enumerate(self._u2s_map)]) self._s2u_map = np.array(u2sur_map)[sur2s_map] * multi
def _primitive_cell(self, supercell): trimed_cell, p2s_map, mapping_table = trim_cell( self._primitive_matrix, supercell, self._symprec) Atoms.__init__(self, numbers=trimed_cell.get_atomic_numbers(), masses=trimed_cell.get_masses(), magmoms=trimed_cell.get_magnetic_moments(), scaled_positions=trimed_cell.get_scaled_positions(), cell=trimed_cell.get_cell(), pbc=True) self._p2s_map = np.array(p2s_map, dtype='intc')
def _create_supercell(self, unitcell, symprec): mat = self._supercell_matrix if self._is_old_style: P = None multi = self._get_surrounding_frame(mat) # trim_fram is to trim overlapping atoms. trim_frame = np.array([ mat[0] / float(multi[0]), mat[1] / float(multi[1]), mat[2] / float(multi[2]) ]) else: # In the new style, it is unnecessary to trim atoms, if (np.diag(np.diagonal(mat)) != mat).any(): snf = SNF3x3(mat) snf.run() P = snf.P multi = np.diagonal(snf.A) else: P = None multi = np.diagonal(mat) trim_frame = np.eye(3) sur_cell, u2sur_map = self._get_simple_supercell(unitcell, multi, P) trimmed_cell_ = _trim_cell(trim_frame, sur_cell, symprec) if trimmed_cell_: supercell, sur2s_map, mapping_table = trimmed_cell_ else: return False num_satom = supercell.get_number_of_atoms() num_uatom = unitcell.get_number_of_atoms() N = num_satom // num_uatom if N != determinant(self._supercell_matrix): print("Supercell creation failed.") print("Probably some atoms are overwrapped. " "The mapping table is give below.") print(mapping_table) PhonopyAtoms.__init__(self) else: PhonopyAtoms.__init__( self, numbers=supercell.get_atomic_numbers(), masses=supercell.get_masses(), magmoms=supercell.get_magnetic_moments(), scaled_positions=supercell.get_scaled_positions(), cell=supercell.get_cell(), pbc=True) self._u2s_map = np.arange(num_uatom) * N self._u2u_map = {j: i for i, j in enumerate(self._u2s_map)} self._s2u_map = np.array(u2sur_map)[sur2s_map] * N
def _primitive_cell(self, supercell): trimed_cell, p2s_map, mapping_table = trim_cell(self._primitive_matrix, supercell, self._symprec) Atoms.__init__(self, numbers=trimed_cell.get_atomic_numbers(), masses=trimed_cell.get_masses(), magmoms=trimed_cell.get_magnetic_moments(), scaled_positions=trimed_cell.get_scaled_positions(), cell=trimed_cell.get_cell(), pbc=True) self._p2s_map = np.array(p2s_map, dtype='intc')
def _create_supercell(self, unitcell, symprec): mat = self._supercell_matrix if self._is_old_style: P = None multi = self._get_surrounding_frame(mat) # trim_fram is to trim overlapping atoms. trim_frame = np.array([mat[0] / float(multi[0]), mat[1] / float(multi[1]), mat[2] / float(multi[2])]) else: # In the new style, it is unnecessary to trim atoms, if (np.diag(np.diagonal(mat)) != mat).any(): snf = SNF3x3(mat) snf.run() P = snf.P multi = np.diagonal(snf.A) else: P = None multi = np.diagonal(mat) trim_frame = np.eye(3) sur_cell, u2sur_map = self._get_simple_supercell(unitcell, multi, P) trimmed_cell_ = _trim_cell(trim_frame, sur_cell, symprec) if trimmed_cell_: supercell, sur2s_map, mapping_table = trimmed_cell_ else: return False num_satom = supercell.get_number_of_atoms() num_uatom = unitcell.get_number_of_atoms() N = num_satom // num_uatom if N != determinant(self._supercell_matrix): print("Supercell creation failed.") print("Probably some atoms are overwrapped. " "The mapping table is give below.") print(mapping_table) PhonopyAtoms.__init__(self) else: PhonopyAtoms.__init__( self, numbers=supercell.get_atomic_numbers(), masses=supercell.get_masses(), magmoms=supercell.get_magnetic_moments(), scaled_positions=supercell.get_scaled_positions(), cell=supercell.get_cell(), pbc=True) self._u2s_map = np.arange(num_uatom) * N self._u2u_map = {j: i for i, j in enumerate(self._u2s_map)} self._s2u_map = np.array(u2sur_map)[sur2s_map] * N