#
from __future__ import annotations
import numpy as np
import os
from EPWpy.utilities.check_util import datatyp
[docs]
class WriteQEFiles:
"""
** This class performs QE file writing
**
** This is mostly an internally used class
and should not be called externally
**
"""
def __init__(self,write):
self.write=write
[docs]
def write_custom(self, name='custom', extra=None):
if extra is None:
extra = {}
with open(f'{name}.in','w') as f:
if ('string' in self.custom_input.keys()):
for inputs in self.custom_input['string']:
f.write(f'{inputs}\n')
else:
for key in self.custom_input.keys():
f.write(str(key)+' '+str(self.custom_input[key]))
f.write('\n')
for key in extra.keys():
f.write(str(key)+' '+str(extra[key]))
f.write('\n')
[docs]
def write_scf(self,name='scf'):
with open(str(name)+'.in','w') as f:
f.write('&CONTROL\n')
for key in self.pw_control.keys():
if (self.pw_control[key] != None):
f.write(str(key)+' = '+str(self.pw_control[key]))
f.write('\n')
f.write('/\n')
f.write('&SYSTEM\n')
for key in self.pw_system.keys():
if(self.pw_system[key] != None):
f.write(str(key)+' = '+str(self.pw_system[key]))
f.write('\n')
if (str(key) == 'ecutwfc') and (self.pw_system['ecutwfc'] is None):
f.write(str(key)+' = '+str(self.get_ecutwfc()))
f.write('\n')
f.write('/\n')
f.write('&ELECTRONS\n')
for key in self.pw_electrons.keys():
if (self.pw_electrons[key] !=None):
f.write(str(key)+' = '+str(self.pw_electrons[key]))
f.write('\n')
f.write('/\n')
if(self.iondynamics==True):
f.write('&IONS\n')
for key in self.pw_ions.keys():
if (self.pw_ions[key] !=None):
f.write(str(key)+' = '+str(self.pw_ions[key]))
f.write('\n')
f.write('/\n')
if(self.celldynamics==True):
f.write('&CELL\n')
for key in self.pw_cell.keys():
if (self.pw_cell[key] != None):
f.write(str(key)+' = '+str(self.pw_cell[key]))
f.write('\n')
f.write('/\n')
f.write('ATOMIC_SPECIES\n')
for i in range(len(self.pw_atomic_species['atomic_species'])):
f.write(self.pw_atomic_species['atomic_species'][i])
f.write(' ')
f.write(str(self.pw_atomic_species['mass'][i]))
f.write(' ')
f.write(self.pw_atomic_species['pseudo'][i])
f.write(' ')
f.write('\n')
f.write('ATOMIC_POSITIONS ')
f.write(self.pw_atomic_positions['atomic_position_type'])
f.write('\n')
for i in range(len(self.pw_atomic_positions['atoms'])):#self.default_pw_atomic_positions['num']):
f.write(self.pw_atomic_positions['atoms'][i])
f.write(' ')
for j in range(3):
f.write(str((self.pw_atomic_positions['atomic_pos'][i,j])))
f.write(' ')
f.write('\n')
f.write('\n')
f.write('K_POINTS ')
f.write(self.pw_kpoints['kpoints_type'])
if(self.pw_kpoints['kpoints_type']!='automatic'):
f.write('\n')
f.write(' ')
f.write(str(len(self.pw_kpoints['kpoints'])))
f.write('\n')
for i in range(len(self.pw_kpoints['kpoints'])):
for j in range(len(np.array(self.pw_kpoints['kpoints'])[i,:])):
f.write(str(np.array(self.pw_kpoints['kpoints'])[i,j]))
f.write(' ')
if(self.pw_kpoints['kpoints_type']=='automatic'):
for j in range(3):
f.write(str(np.array(self.pw_kpoints['shift'])[i,j]))
f.write(' ')
f.write('\n')
f.write('\n')
if(int(self.pw_system['ibrav'])==0):
f.write('CELL_PARAMETERS ')
f.write(self.pw_cell_parameters['cell_type']+'\n')
for i in range(len(np.array(self.pw_cell_parameters['lattice_vector'])[:,0])):
for j in range(len(np.array(self.pw_cell_parameters['lattice_vector'])[0,:])):
f.write(str(np.array(self.pw_cell_parameters['lattice_vector'])[i,j])+ ' ')
f.write('\n')
if (len(self.card_params) != 0):
for card in self.card_params:
f.write(card)
f.write('\n')
for key in self.card_params[card].keys():
f.write(str(key)+' '+str(self.card_params[card][key]))
f.write('\n')
f.close()
[docs]
def write_ph(self, name='ph'):
prefix=self.prefix.replace('\'','')
with open(str(name)+'.in','w') as f:
f.write('&inputph\n')
for key in self.ph_params.keys():
f.write(str(key)+' = '+str(self.ph_params[key]))
f.write('\n')
f.write('\n')
f.write('/\n')
if (len(self.ph_qpoints) != 0):
nqs = self.ph_qpoints['nqs']
f.write(f'{nqs}\n')
for i in range(len(self.ph_qpoints['qpoints'])):
for j in range(len(np.array(self.ph_qpoints['qpoints'])[i,:])):
f.write(str(np.array(self.ph_qpoints['qpoints'])[i,j]))
f.write(' ')
f.write('\n')
f.close()
[docs]
def write_QE_pp(self, name='pp'):
prefix=self.prefix.replace('\'','')
with open(str(name)+'.in','w') as f:
f.write('&inputpp\n')
for key in self.pp_inputpp.keys():
f.write(str(key)+' = '+str(self.pp_inputpp[key]))
f.write('\n')
f.write('\n')
f.write('/\n')
if (len(self.pp_plot) != 0):
f.write('&plot\n')
for key in self.pp_plot.keys():
f.write(str(key)+' = '+str(self.pp_plot[key]))
f.write('\n')
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_q2r(self, name='q2r'):
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.q2r_params.keys():
f.write(str(key)+' = '+str(self.q2r_params[key]))
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_dvscf_q2r(self, name='dvscf_q2r'):
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.dvscf_q2r_params.keys():
f.write(str(key)+' = '+str(self.dvscf_q2r_params[key]))
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_postahc(self, name='postahc'):
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.postahc_params.keys():
f.write(str(key)+' = '+str(self.postahc_params[key]))
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_bands(self, bands=None, name='bands'):
if bands is None:
bands = {}
with open(str(name)+'.in','w') as f:
f.write('&BANDS\n')
for key in self.pw_bands.keys():
if(key not in bands.keys()):
f.write(str(key)+' = '+str(self.pw_bands[key]))
f.write('\n')
for key in bands.keys():
f.write(str(key)+' = '+str(bands[key]))
f.write('\n')
f.write('/')
[docs]
def write_nscf2supercond(self, nscf2supercond=None, name='nscf2supercond'):
if nscf2supercond is None:
nscf2supercond = {}
with open(str(name)+'.in','w') as f:
f.write('&BANDS\n')
for key in self.nscf_supercond.keys():
if(key not in nscf2supercond.keys()):
f.write(str(key)+' = '+str(self.nscf_supercond[key]))
f.write('\n')
for key in nscf2supercond.keys():
f.write(str(key)+' = '+str(nscf2supercond[key]))
f.write('\n')
f.write('/')
[docs]
def write_dynmat(self, name='dynmat'):
"""
Writer for dynmat
"""
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.dynmat_input.keys():
f.write(str(key)+' = '+str(self.dynmat_input[key]))
f.write('\n')
f.write('/\n')
f.close()
def write_matdyn(self, matdyn=None, name='matdyn'):
if matdyn is None:
matdyn = {}
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.matdyn_input.keys():
if (key not in matdyn.keys()):
if(key == 'mass'):
for i in range(len(self.matdyn_input[key])):
f.write('amass('+str(i+1)+') = '+str(self.matdyn_input[key][i]))
f.write('\n')
else:
f.write(str(key)+' = '+str(self.matdyn_input[key]))
f.write('\n')
for key in matdyn.keys():
f.write(str(key)+' = '+str(matdyn[key]))
f.write('\n')
f.write('/\n')
if ('dos' not in matdyn or matdyn['dos'] == '.false.'):
f.write(str(len(self.matdyn_kpoints['kpoints'])))
f.write('\n')
for i in range(len(self.matdyn_kpoints['kpoints'])):
for j in range(len(np.array(self.matdyn_kpoints['kpoints'])[i,:])):
f.write(str(np.array(self.matdyn_kpoints['kpoints'])[i,j]))
f.write(' ')
f.write('\n')
f.close()
def write_phdos(self, phdos=None, name='phdos'):
if phdos is None:
phdos = {}
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.phdos_input.keys():
if (key not in phdos.keys()):
if(key=='mass'):
for i in range(len(self.phdos_input[key])):
f.write('amass('+str(i+1)+') = '+str(self.phdos_input[key][i]))
f.write('\n')
else:
f.write(str(key)+' = '+str(self.phdos_input[key]))
f.write('\n')
for key in phdos.keys():
f.write(str(key)+' = '+str(phdos[key]))
f.write('\n')
f.write('/\n')
f.close()
def write_dos(self, dos=None, name='dos'):
if dos is None:
dos = {}
with open(str(name)+'.in','w') as f:
f.write('&dos\n')
for key in self.dos_input.keys():
if (key not in dos.keys()):
f.write(str(key)+' = '+str(self.dos_input[key]))
f.write('\n')
for key in dos.keys():
f.write(str(key)+' = '+str(dos[key]))
f.write('\n')
f.write('/\n')
f.close()
def write_pdos(self, pdos=None, name='pdos'):
if pdos is None:
pdos = {}
with open(str(name)+'.in','w') as f:
f.write('&projwfc\n')
for key in self.pdos_input.keys():
if (key not in pdos.keys()):
f.write(str(key)+' = '+str(self.pdos_input[key]))
f.write('\n')
for key in pdos.keys():
f.write(str(key)+' = '+str(pdos[key]))
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_matdyn(self, matdyn=None, name='matdyn'):
if matdyn is None:
matdyn = {}
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.matdyn_input.keys():
if (key not in matdyn.keys()):
if(key=='mass'):
for i in range(len(self.matdyn_input[key])):
f.write('amass('+str(i+1)+') = '+str(self.matdyn_input[key][i]))
f.write('\n')
else:
f.write(str(key)+' = '+str(self.matdyn_input[key]))
f.write('\n')
for key in matdyn.keys():
f.write(str(key)+' = '+str(matdyn[key]))
f.write('\n')
f.write('/\n')
if ('dos' not in matdyn or matdyn['dos'] == '.false.'):
f.write(str(len(self.matdyn_kpoints['kpoints'])))
f.write('\n')
for i in range(len(self.matdyn_kpoints['kpoints'])):
for j in range(len(np.array(self.matdyn_kpoints['kpoints'])[i,:])):
f.write(str(np.array(self.matdyn_kpoints['kpoints'])[i,j]))
f.write(' ')
f.write('\n')
f.close()
[docs]
def write_phdos(self, phdos=None, name='phdos'):
if phdos is None:
phdos = {}
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.phdos_input.keys():
if (key not in phdos.keys()):
if(key=='mass'):
for i in range(len(self.phdos_input[key])):
f.write('amass('+str(i+1)+') = '+str(self.phdos_input[key][i]))
f.write('\n')
else:
f.write(str(key)+' = '+str(self.phdos_input[key]))
f.write('\n')
for key in phdos.keys():
f.write(str(key)+' = '+str(phdos[key]))
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_dos(self, dos=None, name='dos'):
if dos is None:
dos = {}
with open(str(name)+'.in','w') as f:
f.write('&dos\n')
for key in self.dos_input.keys():
if (key not in dos.keys()):
f.write(str(key)+' = '+str(self.dos_input[key]))
f.write('\n')
for key in dos.keys():
f.write(str(key)+' = '+str(dos[key]))
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_pdos(self, pdos=None, name='pdos'):
if pdos is None:
pdos = {}
with open(str(name)+'.in','w') as f:
f.write('&projwfc\n')
for key in self.pdos_input.keys():
if (key not in pdos.keys()):
f.write(str(key)+' = '+str(self.pdos_input[key]))
f.write('\n')
for key in pdos.keys():
f.write(str(key)+' = '+str(pdos[key]))
f.write('\n')
f.write('/\n')
f.close()
[docs]
def write_zg(self, name='zg'):
with open(str(name)+'.in','w') as f:
f.write('&input\n')
for key in self.zg_inputzg.keys():
if (self.zg_inputzg[key] != None):
f.write(str(key)+' = '+str(self.zg_inputzg[key]))
f.write('\n')
f.write('/\n')
if (len(self.zg_inputazg) > 0):
f.write('&A_ZG\n')
for key in self.zg_inputazg.keys():
if (self.zg_inputazg[key] != None):
f.write(str(key)+' = '+str(self.zg_inputazg[key]))
f.write('\n')
f.write('/')
f.close()
[docs]
def write_eps(self, name='eps'):
with open(str(name)+'.in','w') as f:
f.write('&inputpp\n')
for key in self.eps_inputpp.keys():
f.write(str(key)+' = '+str(self.eps_inputpp[key]))
f.write('\n')
f.write('/\n')
f.write('&energy_grid\n')
for key in self.eps_energy_grid.keys():
f.write(str(key)+' = '+str(self.eps_energy_grid[key]))
f.write('\n')
f.write('/')
f.close()
[docs]
def write_epw(self, name='epw'):
# print(os.getcwd(),name)
with open(str(name)+'.in', 'w') as f:
f.write('&inputepw')
f.write('\n')
for key in self.epw_params.keys():
if (datatyp(self.epw_params[key]) != None):
if (key == 'mass'):
for i in range(len(self.epw_params[key])):
f.write('amass('+str(i+1)+') = '+str(self.epw_params[key][i]))
f.write('\n')
elif (key == 'wdata'):
for i in range(len(self.epw_params[key])):
f.write(f'wdata({i+1}) = ')
f.write(f'\'{self.epw_params[key][i]}\'')
f.write('\n')
elif (key == 'proj'):
for i in range(len(self.epw_params[key])):
f.write('proj('+str(i+1)+') = '+self.epw_params[key][i])
f.write('\n')
else:
if (self.epw_params[key] !=None):
f.write(str(key)+' = '+str(self.epw_params[key]))
f.write('\n')
#else:
# print(datatyp(self.epw_params[key]), key, self.epw_params[key], type(self.epw_params[key]))
f.write('/\n')
f.close()
[docs]
def write_wann(self, name='.win'):
prefix=self.prefix.replace('\'','')
with open(prefix+'.'+name,'w') as f:
for key in self.wannier_params.keys():
if(key == 'projections'):
if(self.wannier_params['projections'] !='auto_projections'):
f.write('begin projections\n')
for proj in self.wannier_params['projections']:
for data in (np.array(proj).astype(str)):
f.write(str(data)+' ')
f.write('\n')
f.write('end projections\n')
else:
f.write('projections = auto_projections')
self.wannier_params['scdm_proj']='.true.'
elif(key == 'atomic_positions'):
f.write('begin atoms_frac\n')
for i in range(len(self.wannier_params['atomic_positions'][:,0])):
f.write(self.pw_atomic_positions['atoms'][i]+' ')
for j in range(3):
f.write(str(self.wannier_params['atomic_positions'][i,j])+' ')
f.write('\n')
f.write('end atoms_frac\n\n')
elif(key == 'kpoints'):
f.write('mp_grid : ')
for nk in self.grid:
f.write(str(nk)+' ')
f.write('\n')
f.write('begin kpoints\n')
self.k = np.array(self.k)
for l in range(len(self.k[:,0])):
for j in self.k[l,:3]:
f.write(str(j)+' ')
f.write('\n')
f.write('end kpoints\n\n')
elif(key == 'cell_parameters'):
f.write('begin unit_cell_cart\n')
for i in range(len(self.wannier_params['cell_parameters'][:,0])):
for j in (self.wannier_params['cell_parameters'][i,:]):
f.write(str(j) + ' ')
f.write('\n')
f.write('end unit_cell_cart\n')
elif(key == 'string'):
for string in self.wannier_params[key]:
f.write(str(string)+'\n')
else:
f.write(str(key)+' = '+str(self.wannier_params[key]))
f.write('\n')
f.close()
with open(prefix+'.pw2wan','w') as f:
f.write('&inputpp\n')
f.write('prefix = '+str(self.prefix))
f.write('\n')
for key in self.pw2wann_params:
f.write(str(key)+' = '+str(self.pw2wann_params[key]))
f.write('\n')
f.write('/')