Coverage for gpaw/pes/dos.py: 92%
38 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
1"""Photoelectron spectra from the (shifted) DOS approach."""
3import numpy as np
5from gpaw.pes import BasePES
8class DOSPES(BasePES):
10 """PES derived from density of states with shifted KS-energies.
12 """
14 def __init__(self, mother, daughter=None, shift=False, vde=None,
15 f_min=0.1):
16 self.c_m = mother
17 self.c_d = daughter
18 self.f = None
19 self.be = None
20 self.shift = shift
21 self.vde = vde
22 self.f_min = f_min
24 def _calculate(self):
25 """Evaluate energies and spectroscopic factors."""
27 self.be = []
28 self.f = []
29 ex_m = []
30 for spin in range(self.c_m.get_number_of_spins()):
31 # use only the Gamma point
32 eps_n = self.c_m.get_eigenvalues(0, spin)
33 f_n = self.c_m.get_occupation_numbers(0, spin)
34 for e, f in zip(eps_n, f_n):
35 if f > self.f_min:
36 self.be.append(-e)
37 self.f.append(f)
38 ex_m.append(-e)
39 self.be = np.array(self.be)
41 # find HOMO energy
42 ex_m.sort()
43 e_HOMO = ex_m[0]
45 if self.vde is not None:
46 assert not self.shift
47 energy_shift = -e_HOMO + self.vde
48 else:
49 if self.shift:
50 e_m = self.c_m.get_potential_energy()
51 try:
52 energy_shift = float(self.c_d) - e_HOMO
53 except (TypeError, AttributeError):
54 e_d = self.c_d.get_potential_energy()
55 energy_shift = e_d - e_m - e_HOMO
56 else:
57 energy_shift = float(self.shift)
59 self.be += energy_shift