def read_pwscf(filename): pwscf_in = PwscfIn(open(filename).readlines()) tags = pwscf_in.get_tags() lattice = tags['cell_parameters'] positions = [pos[1] for pos in tags['atomic_positions']] species = [pos[0] for pos in tags['atomic_positions']] mass_map = {} pp_map = {} for vals in tags['atomic_species']: mass_map[vals[0]] = vals[1] pp_map[vals[0]] = vals[2] masses = [mass_map[x] for x in species] pp_all_filenames = [pp_map[x] for x in species] unique_species = [] for x in species: if x not in unique_species: unique_species.append(x) numbers = [] is_unusual = False for x in species: if x in symbol_map: numbers.append(symbol_map[x]) else: numbers.append(-unique_species.index(x)) is_unusual = True if is_unusual: positive_numbers = [] for n in numbers: if n > 0: if n not in positive_numbers: positive_numbers.append(n) available_numbers = range(1, 119) for pn in positive_numbers: available_numbers.remove(pn) for i, n in enumerate(numbers): if n < 1: numbers[i] = available_numbers[-n] cell = Atoms(numbers=numbers, masses=masses, cell=lattice, scaled_positions=positions) else: cell = Atoms(numbers=numbers, cell=lattice, scaled_positions=positions) unique_symbols = [] pp_filenames = {} for i, symbol in enumerate(cell.get_chemical_symbols()): if symbol not in unique_symbols: unique_symbols.append(symbol) pp_filenames[symbol] = pp_all_filenames[i] return cell, pp_filenames
def phonopyAtoms_to_aseAtoms(PhonopyAtoms, pbc=[True, True, True]): aseAtoms = ase.Atoms(symbols=PhonopyAtoms.get_chemical_symbols(), positions=PhonopyAtoms.get_positions(), cell=PhonopyAtoms.get_cell()) aseAtoms.set_pbc(pbc) aseAtoms.set_masses(PhonopyAtoms.get_masses()) Atomic_numbers = PhonopyAtoms.get_atomic_numbers() Atomic_type_tags = np.zeros(np.shape(Atomic_numbers)) atomic_type_unique = np.unique(Atomic_numbers) for i, iZ in enumerate(atomic_type_unique): Atomic_type_tags[Atomic_numbers == iZ] = i aseAtoms.set_tags(Atomic_type_tags) aseAtoms.set_initial_charges() return aseAtoms
def get_cell_from_phonopy_structure(ph_structure: PhonopyAtoms, use_atomic_number: bool = False) -> tuple: """ Get cell from phonopy structure Args: ph_structure: PhonopyAtoms object use_atomic_number: if True, use atomic number intead of atomic symbol Returns: tuple: (lattice, scaled_positions, symbols). """ lattice = ph_structure.get_cell() scaled_positions = ph_structure.get_scaled_positions() if use_atomic_number: elements = list(ph_structure.get_atomic_numbers()) else: elements = ph_structure.get_chemical_symbols() return (lattice, scaled_positions, elements)