wmaee.scopes.dos
Collection of routines for reading and plotting density of states.
David Holec david.holec@unileoben.ac.at
1""" 2Collection of routines for reading and plotting density of states. 3 4David Holec 5david.holec@unileoben.ac.at 6""" 7 8import numpy as np 9from wmaee.core.requirements import test_pmg 10 11 12class dos(): 13 14 def __init__(self): 15 """ 16 Creates new instance of DOS. 17 """ 18 19 self.energy = {'Emin': None, 'Emax': None, 'EF': None, 'EN': None, 'Eg': None, 'E': []} 20 self.TDOS = np.array([]) 21 self.PDOS: None 22 self.struct: None 23 24 25 26 # @TODO spin-polarized DOS!!! 27 def read_DOS_VASP(self, fDOSCAR='DOSCAR', fPOSCAR='POSCAR', ase_atoms=True): 28 """ 29 Reads DOSCAR file (VASP output). 30 31 Arguments: 32 fDOSCAR: File with DOSCAR format. 33 Default: DOSCAR 34 fPOSCAR: File with POSCAR format (for assignment of PDOS). 35 Default: POSCAR 36 """ 37 38 if not ase_atoms and test_pmg(): 39 from pymatgen.io.vasp import Poscar 40 self.struct = Poscar.from_file(fPOSCAR).structure 41 species = [s.species_string for s in self.struct.sites] 42 else: 43 from ase.io.vasp import read_vasp 44 self.struct = read_vasp(fPOSCAR) 45 species = self.struct.get_chemical_symbols() 46 47 with open(fDOSCAR) as f: 48 DOSCAR = f.readlines() 49 50 self.energy['Emin'] = float(DOSCAR[5].split()[1]) 51 self.energy['Emax'] = float(DOSCAR[5].split()[0]) 52 self.energy['EN'] = int(DOSCAR[5].split()[2]) 53 self.energy['EF'] = float(DOSCAR[5].split()[3]) 54 55 E = [] 56 TDOS = [] 57 for line in range(6, 6+self.energy['EN']): 58 E.append(float(DOSCAR[line].split()[0])) 59 TDOS.append(float(DOSCAR[line].split()[1])) 60 61 self.energy['E'] = np.array(E) 62 self.TDOS = np.array(TDOS) 63 self.energy['Eg'] = 0 64 for ene, dos in zip(self.energy['E'], self.TDOS): 65 if ene > self.energy['EF'] and dos < 1e-5: 66 self.energy['Eg'] = ene - self.energy['EF'] 67 elif self.energy['Eg'] > 0 and dos > 1e-5: 68 break 69 70 if(len(DOSCAR) == 5+(len(species)+1)*(self.energy['EN']+1)): 71 # print('info: PDOS seems to be available') 72 self.PDOS = [] 73 for i in range(len(species)): 74 LDOS = [] 75 s, p, d = [], [], [] 76 px, py, pz = [], [], [] 77 dxy, dyz, dz2, dxz, dx2y2 = [], [], [], [], [] 78 for line in range(6+(i+1)*(self.energy['EN']+1), 6+(i+2)*(self.energy['EN']+1)-1): 79 pdos = [float(i) for i in DOSCAR[line].split()] 80 LDOS.append(sum(pdos[1:])) 81 s.append(pdos[1]), p.append(sum(pdos[2:5])), d.append(sum(pdos[5:10])) 82 px.append(pdos[2]), py.append(pdos[3]), pz.append(pdos[4]) 83 dxy.append(pdos[5]), dyz.append(pdos[6]), dz2.append(pdos[7]), dxz.append(pdos[8]), dx2y2.append(pdos[9]) 84 self.PDOS.append({'species': species[i], 85 'LDOS': np.array(LDOS), 86 's': np.array(s), 'p': np.array(p), 'd': np.array(d), 87 'px': np.array(px), 'py': np.array(py), 'pz': np.array(pz), 88 'dxy': np.array(dxy), 'dyz': np.array(dyz), 'dz2': np.array(dz2), 89 'dxz': np.array(dxz), 'dx2y2': np.array(dx2y2)}) 90 #self.DOS = DOS
class
dos:
13class dos(): 14 15 def __init__(self): 16 """ 17 Creates new instance of DOS. 18 """ 19 20 self.energy = {'Emin': None, 'Emax': None, 'EF': None, 'EN': None, 'Eg': None, 'E': []} 21 self.TDOS = np.array([]) 22 self.PDOS: None 23 self.struct: None 24 25 26 27 # @TODO spin-polarized DOS!!! 28 def read_DOS_VASP(self, fDOSCAR='DOSCAR', fPOSCAR='POSCAR', ase_atoms=True): 29 """ 30 Reads DOSCAR file (VASP output). 31 32 Arguments: 33 fDOSCAR: File with DOSCAR format. 34 Default: DOSCAR 35 fPOSCAR: File with POSCAR format (for assignment of PDOS). 36 Default: POSCAR 37 """ 38 39 if not ase_atoms and test_pmg(): 40 from pymatgen.io.vasp import Poscar 41 self.struct = Poscar.from_file(fPOSCAR).structure 42 species = [s.species_string for s in self.struct.sites] 43 else: 44 from ase.io.vasp import read_vasp 45 self.struct = read_vasp(fPOSCAR) 46 species = self.struct.get_chemical_symbols() 47 48 with open(fDOSCAR) as f: 49 DOSCAR = f.readlines() 50 51 self.energy['Emin'] = float(DOSCAR[5].split()[1]) 52 self.energy['Emax'] = float(DOSCAR[5].split()[0]) 53 self.energy['EN'] = int(DOSCAR[5].split()[2]) 54 self.energy['EF'] = float(DOSCAR[5].split()[3]) 55 56 E = [] 57 TDOS = [] 58 for line in range(6, 6+self.energy['EN']): 59 E.append(float(DOSCAR[line].split()[0])) 60 TDOS.append(float(DOSCAR[line].split()[1])) 61 62 self.energy['E'] = np.array(E) 63 self.TDOS = np.array(TDOS) 64 self.energy['Eg'] = 0 65 for ene, dos in zip(self.energy['E'], self.TDOS): 66 if ene > self.energy['EF'] and dos < 1e-5: 67 self.energy['Eg'] = ene - self.energy['EF'] 68 elif self.energy['Eg'] > 0 and dos > 1e-5: 69 break 70 71 if(len(DOSCAR) == 5+(len(species)+1)*(self.energy['EN']+1)): 72 # print('info: PDOS seems to be available') 73 self.PDOS = [] 74 for i in range(len(species)): 75 LDOS = [] 76 s, p, d = [], [], [] 77 px, py, pz = [], [], [] 78 dxy, dyz, dz2, dxz, dx2y2 = [], [], [], [], [] 79 for line in range(6+(i+1)*(self.energy['EN']+1), 6+(i+2)*(self.energy['EN']+1)-1): 80 pdos = [float(i) for i in DOSCAR[line].split()] 81 LDOS.append(sum(pdos[1:])) 82 s.append(pdos[1]), p.append(sum(pdos[2:5])), d.append(sum(pdos[5:10])) 83 px.append(pdos[2]), py.append(pdos[3]), pz.append(pdos[4]) 84 dxy.append(pdos[5]), dyz.append(pdos[6]), dz2.append(pdos[7]), dxz.append(pdos[8]), dx2y2.append(pdos[9]) 85 self.PDOS.append({'species': species[i], 86 'LDOS': np.array(LDOS), 87 's': np.array(s), 'p': np.array(p), 'd': np.array(d), 88 'px': np.array(px), 'py': np.array(py), 'pz': np.array(pz), 89 'dxy': np.array(dxy), 'dyz': np.array(dyz), 'dz2': np.array(dz2), 90 'dxz': np.array(dxz), 'dx2y2': np.array(dx2y2)}) 91 #self.DOS = DOS
dos()
15 def __init__(self): 16 """ 17 Creates new instance of DOS. 18 """ 19 20 self.energy = {'Emin': None, 'Emax': None, 'EF': None, 'EN': None, 'Eg': None, 'E': []} 21 self.TDOS = np.array([]) 22 self.PDOS: None 23 self.struct: None
Creates new instance of DOS.
def
read_DOS_VASP(self, fDOSCAR='DOSCAR', fPOSCAR='POSCAR', ase_atoms=True):
28 def read_DOS_VASP(self, fDOSCAR='DOSCAR', fPOSCAR='POSCAR', ase_atoms=True): 29 """ 30 Reads DOSCAR file (VASP output). 31 32 Arguments: 33 fDOSCAR: File with DOSCAR format. 34 Default: DOSCAR 35 fPOSCAR: File with POSCAR format (for assignment of PDOS). 36 Default: POSCAR 37 """ 38 39 if not ase_atoms and test_pmg(): 40 from pymatgen.io.vasp import Poscar 41 self.struct = Poscar.from_file(fPOSCAR).structure 42 species = [s.species_string for s in self.struct.sites] 43 else: 44 from ase.io.vasp import read_vasp 45 self.struct = read_vasp(fPOSCAR) 46 species = self.struct.get_chemical_symbols() 47 48 with open(fDOSCAR) as f: 49 DOSCAR = f.readlines() 50 51 self.energy['Emin'] = float(DOSCAR[5].split()[1]) 52 self.energy['Emax'] = float(DOSCAR[5].split()[0]) 53 self.energy['EN'] = int(DOSCAR[5].split()[2]) 54 self.energy['EF'] = float(DOSCAR[5].split()[3]) 55 56 E = [] 57 TDOS = [] 58 for line in range(6, 6+self.energy['EN']): 59 E.append(float(DOSCAR[line].split()[0])) 60 TDOS.append(float(DOSCAR[line].split()[1])) 61 62 self.energy['E'] = np.array(E) 63 self.TDOS = np.array(TDOS) 64 self.energy['Eg'] = 0 65 for ene, dos in zip(self.energy['E'], self.TDOS): 66 if ene > self.energy['EF'] and dos < 1e-5: 67 self.energy['Eg'] = ene - self.energy['EF'] 68 elif self.energy['Eg'] > 0 and dos > 1e-5: 69 break 70 71 if(len(DOSCAR) == 5+(len(species)+1)*(self.energy['EN']+1)): 72 # print('info: PDOS seems to be available') 73 self.PDOS = [] 74 for i in range(len(species)): 75 LDOS = [] 76 s, p, d = [], [], [] 77 px, py, pz = [], [], [] 78 dxy, dyz, dz2, dxz, dx2y2 = [], [], [], [], [] 79 for line in range(6+(i+1)*(self.energy['EN']+1), 6+(i+2)*(self.energy['EN']+1)-1): 80 pdos = [float(i) for i in DOSCAR[line].split()] 81 LDOS.append(sum(pdos[1:])) 82 s.append(pdos[1]), p.append(sum(pdos[2:5])), d.append(sum(pdos[5:10])) 83 px.append(pdos[2]), py.append(pdos[3]), pz.append(pdos[4]) 84 dxy.append(pdos[5]), dyz.append(pdos[6]), dz2.append(pdos[7]), dxz.append(pdos[8]), dx2y2.append(pdos[9]) 85 self.PDOS.append({'species': species[i], 86 'LDOS': np.array(LDOS), 87 's': np.array(s), 'p': np.array(p), 'd': np.array(d), 88 'px': np.array(px), 'py': np.array(py), 'pz': np.array(pz), 89 'dxy': np.array(dxy), 'dyz': np.array(dyz), 'dz2': np.array(dz2), 90 'dxz': np.array(dxz), 'dx2y2': np.array(dx2y2)}) 91 #self.DOS = DOS
Reads DOSCAR file (VASP output).
Arguments: fDOSCAR: File with DOSCAR format. Default: DOSCAR fPOSCAR: File with POSCAR format (for assignment of PDOS). Default: POSCAR