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

1"""Photoelectron spectra from the (shifted) DOS approach.""" 

2 

3import numpy as np 

4 

5from gpaw.pes import BasePES 

6 

7 

8class DOSPES(BasePES): 

9 

10 """PES derived from density of states with shifted KS-energies. 

11 

12 """ 

13 

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 

23 

24 def _calculate(self): 

25 """Evaluate energies and spectroscopic factors.""" 

26 

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) 

40 

41 # find HOMO energy 

42 ex_m.sort() 

43 e_HOMO = ex_m[0] 

44 

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) 

58 

59 self.be += energy_shift