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.

energy
TDOS
PDOS: None
struct: None
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