Source code for EPWpy.Abinit.set_Abinit

#
"""
QE class for interfacing with quantum espresso
"""
from __future__ import annotations
import numpy as np
import argparse
import os
from EPWpy.default.default import *
from EPWpy.structure.lattice import *
from EPWpy.structure.position_atoms import unit2prim
from EPWpy.utilities.k_gen import *
from EPWpy.utilities.epw_pp import *
from EPWpy.utilities.save_state import *
from EPWpy.utilities.printing import *
from EPWpy.utilities.constants import *

[docs] class SetAbinit: """ This class sets input files for quantum espresso and EPW. The default values are provided in set_vals class """ def __init__(self, type_input, system='si',code='.',env='mpirun'): """ ** Initialization of the set_QE class ** This class is mostly used for inheritance """ self.system = system self.code = code self.home = os.getcwd() self.env = env os.system('mkdir '+self.system) self.default_values() self.set_values(type_input)
[docs] def set_abi(self, input_abi): if ('quadrupole' in input_abi.keys()): self.abinit_params['control'] = self._quadrupole_calc() self._set_QE2Abinit() if('control' in input_abi.keys()): for key in input_abi['control'].keys(): self.abinit_params['control'][key] = input_abi[key] if('common' in input_abi.keys()): self._set_common(input_abi,'atom') self._set_common(input_abi,'cell') self._set_common(input_abi,'kpoints') self._set_common(input_abi,'band') self._set_common(input_abi,'electron') self._set_common(input_abi,'pseudo') self.abinit_params['common']={} for key in input_abi['common'].keys(): self.abinit_params['common'][key] = input_abi['common'][key]
def _set_common(self,input_abi,keyin): delete = [] for key in input_abi['common'].keys(): if key in self.abinit_params[keyin].keys(): self.abinit_params[keyin][key] = input_abi['common'][key] print(key,self.abinit_params[keyin][key]) delete.append(key) for key in delete: del input_abi['common'][key] def _set_QE2Abinit(self): self._set_cell() self._set_atom() self._set_band() self._set_kpoints() self._set_electron() self._set_pseudo() def _set_cell(self, input_abi = None): self.abinit_params['cell'] = {} a,self.abinit_params['cell']['rprim']= unit2prim(self.QE.pw_cell_parameters['lattice_vector']) a = a/Bohr2Ang self.abinit_params['cell']['acell'] = f'3*{a}' def _set_atom(self, input_abi= None): self.abinit_params['atom'] = {} self.abinit_params['atom']['type']= 'xred' #pw_atomic_positions['atomic_position_type'] typeat = [1] typ_prev = self.QE.pw_atomic_positions['atoms'][0] self.abinit_params['atom']['ntypat']= self.QE.pw_system['ntyp'] #pw_atomic_positions['atomic_position_type'] self.abinit_params['atom']['natom']= self.QE.pw_system['nat'] #pw_atomic_positions['atomic_position_type'] self.abinit_params['atom']['znucl'] = [] for i in range(len(self.QE.pw_atomic_species['mass'])): self.abinit_params['atom']['znucl'].append(int(np.floor(self.QE.pw_atomic_species['mass'][i]/2))) for i,typ in enumerate(self.QE.pw_atomic_positions['atoms']): if typ != typ_prev: typeat.append(typeat[-1]+1) else: if(i > 0): typeat.append(typeat[-1]) self.abinit_params['atom']['typat'] = typeat self.abinit_params['atom']['atomic_pos'] = self.QE.pw_atomic_positions['atomic_pos'] def _set_band(self, input_abi= None): self.abinit_params['band'] = {} if ('nband' in self.QE.pw_system.keys()): self.abinit_params['nband'] = self.QE.pw_system['nband'] else: self.abinit_params['band']['nband'] = None self.abinit_params['band']['ecut'] = self.QE.pw_system['ecutwfc']*Ryd2Hart def _set_kpoints(self, input_abi = None): self.abinit_params['kpoints'] = {} T = ' ' for i in range(len(self.QE.pw_kpoints['kpoints'][:,0])): for j in range(len(self.QE.pw_kpoints['kpoints'][0,:])): T += str(int(self.QE.pw_kpoints['kpoints'][i,j]))+' ' self.abinit_params['kpoints']['ngkpt'] = T # self.QE.pw_kpoints['kpoints'] def _set_electron(self, input_abi = None): self.abinit_params['electron'] = {'nstep': 100, 'diemac': 9.0} def _set_pseudo(self, input_abi = None): self.abinit_params['pseudo'] = {} self.abinit_params['pseudo']['pp_dirpath'] = self.QE.pw_control['pseudo_dir'] self.abinit_params['pseudo']['pseudo'] = self.QE.pw_atomic_species['pseudo'] def _quadrupole_calc(self): quadrupole_inp = {'ndtset':5, '###dset 1': ' ', 'getwfk1':0, 'kptopt1':1, 'nqpt1':0, 'tolvrs1':'1.0d-10', '###dset 2': ' ', 'iscf2':-3, 'rfelfd2':2, 'tolwfr2':'1.0d-22', 'rfdir2':'1 1 1', '###dset 3': ' ', 'getddk3':2, 'iscf3':'-3', 'rf2_dkdk3':3, 'tolwfr3': '1.0d-22', '###dset 4': ' ', 'getddk4':2, 'rfelfd4':3, 'rfphon4':1, 'rfatpol4':'1 2', 'rfdir4':'1 1 1', 'tolvrs4':'1.0d-10', 'prepalw4': 2, '###dset 5': ' ', 'optdriver5': 10, 'get1wf5':4, 'get1den5':4, 'getddk5':2, 'getdkdk5':3, 'lw_qdrpl5':1, '###Common': ' ', 'getwfk': 1, 'useylm':1, 'kptopt':2} return(quadrupole_inp)