Coverage for gpaw/test/lcao/test_dos.py: 100%

30 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-07-09 00:21 +0000

1"""Check that the LCAODOS works.""" 

2 

3from ase.build import molecule 

4 

5from gpaw import GPAW 

6 

7 

8def test_lcao_dos(): 

9 system = molecule('H2O') 

10 system.center(vacuum=3.0) 

11 system.pbc = 1 

12 

13 calc = GPAW(mode='lcao', basis='dzp', h=0.3, xc='oldLDA', 

14 kpts=[2, 1, 1], # parallel=dict(sl_auto=True), 

15 nbands=8, 

16 # kpts=[4, 4, 4] 

17 ) 

18 

19 system.calc = calc 

20 system.get_potential_energy() 

21 

22 from gpaw.utilities.dos import LCAODOS 

23 

24 # Use RestartLCAODOS if you just restarted from a file. 

25 # Requires one diagonalization though! 

26 

27 lcaodos = LCAODOS(calc) 

28 

29 def printdos(eps, w): 

30 print('sum of weights', sum(w)) 

31 print('energy, weight') 

32 for e0, w0 in zip(eps, w): 

33 print(e0, w0) 

34 print('-----') 

35 eps0, w0 = lcaodos.get_orbital_pdos(0) # O 2s 

36 

37 printdos(eps0, w0) 

38 

39 assert w0[0] > 1.6 # s state on which we projected with two electrons. 

40 assert (w0[1:] < 0.2).all() # there is another s with some weight ~ 0.16 

41 

42 # eps1_n, w1_n = fold(eps * 27.211, w, 600, 0.1) 

43 # pl.plot(eps1, w1) 

44 # pl.show() 

45 

46 # for e0, w0 in zip(eps, w): 

47 # print e0, w0 

48 

49 # print eps.shape 

50 # print w.shape 

51 

52 a1 = [0, 1, 2] 

53 eps1, w1 = lcaodos.get_atomic_subspace_pdos(a1) 

54 assert abs(2 * len(eps1) - sum(w1)) < 0.01 

55 

56 printdos(eps1, w1) 

57 print('indices %s' % lcaodos.get_atom_indices(a1)) 

58 

59 a2 = 0 # all BFs on the O atom 

60 eps2, w2 = lcaodos.get_atomic_subspace_pdos(a2) 

61 printdos(eps2, w2) 

62 print('indices %s' % lcaodos.get_atom_indices(a2))