Ejemplo n.º 1
0
def find_primitive(atoms, symprec=1e-4):
    """
    find the primitive cell withh regard to the magnetic structure. a atoms object is returned.
    """
    #atoms_mag,sym_dict=ref_atoms_mag(atoms)
    cell, scaled_pos, chem_nums = spglib.find_primitive(atoms, symprec=symprec)
    print(chem_nums)
    chem_sym = 'H%d' % (len(chem_nums))
    new_atoms = Atoms(chem_sym)

    new_atoms.set_atomic_numbers(chem_nums)
    new_atoms.set_cell(cell)
    new_atoms.set_scaled_positions(scaled_pos)
    #new_atoms=rev_ref_atoms(new_atoms,sym_dict)
    return new_atoms
Ejemplo n.º 2
0
def get_prim_atoms(atoms, symprec=1e-4):
    return spglib.find_primitive(atoms, symprec=symprec)
Ejemplo n.º 3
0
def get_primitive(input_file='POSCAR',
                  input_format=None,
                  output_file=None,
                  output_format=None,
                  threshold=1e-5,
                  angle_tolerance=-1.,
                  verbose=False):

    if output_file is None:
        verbose = True

    if verbose:

        def vprint(*args):
            for arg in args:
                print(arg,)
            print("")
    else:

        def vprint(*args):
            pass

    try:
        if input_format is None:
            A = ase.io.read(input_file)
        else:
            A = ase.io.read(input_file, format=input_format)
    except IOError as e:
        raise Exception("I/O error({0}): {1}".format(e.errno, e.strerror))

    vprint(
        "# Space group: ",
        str(
            spglib.get_spacegroup(
                A, symprec=threshold, angle_tolerance=angle_tolerance)),
        '\n')

    cell, positions, atomic_numbers = spglib.find_primitive(
        A, symprec=threshold, angle_tolerance=angle_tolerance)

    if positions is None:
        print("This space group doesn't have a more primitive unit cell.")

    else:
        vprint("Primitive cell vectors:")
        vprint(cell, '\n')
        vprint("Atomic positions and proton numbers:")
        for position, number in zip(positions, atomic_numbers):
            vprint(position, '\t', number)

        if output_file is None:
            pass
        else:
            atoms = ase.Atoms(
                scaled_positions=positions,
                cell=cell,
                numbers=atomic_numbers,
                pbc=True)
            if output_format is None:
                try:
                    atoms.write(output_file, vasp5=True)
                except TypeError:
                    atoms.write(output_file)
            elif output_format is "vasp":
                atoms.write(output_file, format="vasp", vasp5=True)
            else:
                atoms.write(output_file, format=output_format)
Ejemplo n.º 4
0
def get_primitive(input_file='POSCAR',
                  input_format=None,
                  output_file=None,
                  output_format=None,
                  threshold=1e-5,
                  angle_tolerance=-1.,
                  verbose=False):

    if output_file is None:
        verbose = True

    if verbose:

        def vprint(*args):
            for arg in args:
                print(arg, )
            print("")
    else:

        def vprint(*args):
            pass

    try:
        if input_format is None:
            A = ase.io.read(input_file)
        else:
            A = ase.io.read(input_file, format=input_format)
    except IOError as e:
        raise Exception("I/O error({0}): {1}".format(e.errno, e.strerror))

    vprint(
        "# Space group: ",
        str(
            spglib.get_spacegroup(A,
                                  symprec=threshold,
                                  angle_tolerance=angle_tolerance)), '\n')

    cell, positions, atomic_numbers = spglib.find_primitive(
        A, symprec=threshold, angle_tolerance=angle_tolerance)

    if positions is None:
        print("This space group doesn't have a more primitive unit cell.")

    else:
        vprint("Primitive cell vectors:")
        vprint(cell, '\n')
        vprint("Atomic positions and proton numbers:")
        for position, number in zip(positions, atomic_numbers):
            vprint(position, '\t', number)

        if output_file is None:
            pass
        else:
            atoms = ase.Atoms(scaled_positions=positions,
                              cell=cell,
                              numbers=atomic_numbers,
                              pbc=True)
            if output_format is None:
                try:
                    atoms.write(output_file, vasp5=True)
                except TypeError:
                    atoms.write(output_file)
            elif output_format is "vasp":
                atoms.write(output_file, format="vasp", vasp5=True)
            else:
                atoms.write(output_file, format=output_format)