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
def get_prim_atoms(atoms, symprec=1e-4): return spglib.find_primitive(atoms, symprec=symprec)
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)
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)