Source code for molSimplify.Scripts.periodic_QE

# @file periodic_QE.py
#  Generates Quantum ESPRESSO input files from slab builder
#
#  Written by JP Janet for HJK Group
#
#  Dpt of Chemical Engineering, MIT

from molSimplify.Classes.globalvars import globalvars


###############################


[docs]def write_periodic_mol3d_to_qe(mol, cell_vector, path): psd = {"Ti": 'Ti.pbe-sp-van_ak.UPF', 'O': 'O.pbe-van_ak.UPF', 'Si': 'Si.pbe-n-van.UPF'} # set global properties unique_atoms = mol.getAtomTypes() globs = globalvars() # print(globs) # start writing this file: with open(path, 'w') as f: f.write("&CONTROL\n") f.write('calculation = "relax" \n') f.write('prefix = clean\n') f.write('pseudo_dir = "/opt/espresso-5.1/pseudo"\n') f.write('outdir = "./"\n') f.write('wf_collect = .true\n') f.write('tprnfor = .true.\n') f.write('restart_mode = "from_scratch"\n') f.write('nstep = 1000\n') f.write("/ \n") with open(path, 'a') as f: f.write("&SYSTEM\n") f.write("ibrav = 0 \n") f.write("nat = " + str(mol.natoms) + "\n") f.write("ntyp = " + str(len(unique_atoms)) + "\n") f.write("nspin = 1\n") f.write('occupations = "smearing"\n') f.write('degauss = 0.01\n') f.write('ecutwfc = 25.0 \n') f.write('ecutrho = 250.0 \n') f.write("/ \n") with open(path, 'a') as f: f.write("&ELECTRONS\n") f.write("mixing_beta = 0.4 \n") f.write("electron_maxstep = 350 \n") f.write("/ \n") with open(path, 'a') as f: f.write("&IONS\n") f.write("ion_dynamics = 'bfgs' \n") f.write("/ \n") with open(path, 'a') as f: f.write("CELL_PARAMETERS {angstrom}\n") for cv in cell_vector: ss = " ".join(str(e) for e in cv) + "\n" f.write(ss) f.write(" \n") with open(path, 'a') as f: f.write("ATOMIC_SPECIES\n") for elements in unique_atoms: ps_info = ".pbe-van_ak.UPF" if str(elements) in list(psd.keys()): ps_info = str(psd[str(elements)]) if len(elements) == 1: f.write(str(elements) + " " + str(globs.amass() [elements][0]) + " " + ps_info + '\n') else: f.write(str(elements) + " " + str(globs.amass() [elements][0]) + " " + ps_info + '\n') with open(path, 'a') as f: pos_list = list() write_list = list() f.write("ATOMIC_POSITIONS {angstrom}\n") for atom in mol.atoms: xyz = atom.coords() if atom.frozen: freeze_vect = [0, 0, 0] else: freeze_vect = [1, 1, 1] pos_list.append(xyz[2]) write_list.append( (atom.sym, xyz[0], xyz[1], xyz[2], freeze_vect[0], freeze_vect[1], freeze_vect[2])) sorted_inds = [i[0] for i in sorted(enumerate(pos_list), key=lambda x:x[1])] for inds in sorted_inds: f.write("%s %f %f %f %f %f %f\n" % write_list[inds]) # f.write("%s %f %f %f %f %f %f\n" % (atom.sym,xyz[0],xyz[1],xyz[2],freeze_vect[0],freeze_vect[1],freeze_vect[2])) with open(path, 'a') as f: f.write("K_POINTS {automatic}\n") f.write("4 4 1 0 0 0\n")