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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1"""Check that the LCAODOS works."""
3from ase.build import molecule
5from gpaw import GPAW
8def test_lcao_dos():
9 system = molecule('H2O')
10 system.center(vacuum=3.0)
11 system.pbc = 1
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 )
19 system.calc = calc
20 system.get_potential_energy()
22 from gpaw.utilities.dos import LCAODOS
24 # Use RestartLCAODOS if you just restarted from a file.
25 # Requires one diagonalization though!
27 lcaodos = LCAODOS(calc)
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
37 printdos(eps0, w0)
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
42 # eps1_n, w1_n = fold(eps * 27.211, w, 600, 0.1)
43 # pl.plot(eps1, w1)
44 # pl.show()
46 # for e0, w0 in zip(eps, w):
47 # print e0, w0
49 # print eps.shape
50 # print w.shape
52 a1 = [0, 1, 2]
53 eps1, w1 = lcaodos.get_atomic_subspace_pdos(a1)
54 assert abs(2 * len(eps1) - sum(w1)) < 0.01
56 printdos(eps1, w1)
57 print('indices %s' % lcaodos.get_atom_indices(a1))
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))