Example #1
0
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
Example #2
0
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
Example #3
0
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)