Coverage for gpaw/test/lrtddft/test_kssingles_Be.py: 100%

51 statements  

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

1import pytest 

2import numpy as np 

3 

4from ase import Atoms 

5from ase.parallel import parprint 

6from ase.units import Hartree 

7 

8import gpaw.mpi as mpi 

9from gpaw import GPAW 

10from gpaw.lrtddft.kssingle import KSSingles 

11 

12 

13@pytest.mark.lrtddft 

14def test_lrtddft_kssingles_Be(in_tmp_dir): 

15 Be = Atoms('Be') 

16 Be.center(vacuum=4) 

17 if 1: 

18 # introduce a sligth non-orthgonality 

19 cell = Be.get_cell() 

20 cell[1] += 0.001 * cell[0] 

21 Be.set_cell(cell) 

22 

23 txt = None 

24 eigensolver = None 

25 

26 # modes = ['lcao', 'fd'] 

27 modes = ['fd'] 

28 

29 for mode in modes: 

30 energy = {} 

31 osz = {} 

32 for pbc in [False, True]: 

33 Be.set_pbc(pbc) 

34 if pbc: 

35 name = 'periodic' 

36 calc = GPAW(h=0.25, 

37 nbands=4, 

38 kpts=(1, 2, 2), 

39 mode=mode, 

40 poissonsolver={'name': 'fd'}, 

41 symmetry='off', 

42 eigensolver=eigensolver, 

43 txt=txt) 

44 else: 

45 name = 'zero_bc' 

46 calc = GPAW(h=0.25, nbands=4, mode=mode, 

47 poissonsolver={'name': 'fd'}, 

48 eigensolver=eigensolver, txt=txt) 

49 Be.calc = calc 

50 Be.get_potential_energy() 

51 

52 kss = KSSingles(restrict={'eps': 0.9}) 

53 kss.calculate(Be) 

54 # all s->p transitions at the same energy [Ha] and 

55 # oscillator_strength 

56 for ks in kss: 

57 assert ks.get_energy() == pytest.approx(kss[0].get_energy(), 

58 abs=5.e-3) 

59 assert ks.get_oscillator_strength()[0] == pytest.approx( 

60 kss[0].get_oscillator_strength()[0], abs=5.e-3) 

61 assert ks.get_oscillator_strength()[0] == pytest.approx( 

62 ks.get_oscillator_strength()[1:].sum() / 3, abs=1.e-15) 

63 for c in range(3): 

64 assert ks.get_oscillator_strength()[1 + c] == ( 

65 pytest.approx(ks.get_dipole_tensor()[c, c], 

66 abs=1.e-15)) 

67 energy[name] = np.array( 

68 [ks.get_energy() * Hartree for ks in kss]).mean() 

69 osz[name] = np.array( 

70 [ks.get_oscillator_strength()[0] for ks in kss]).sum() 

71 

72 parprint(name + ':') 

73 parprint(kss) 

74 

75 # I/O 

76 fname = 'kss_' + name + '.dat' 

77 kss.write(fname) 

78 mpi.world.barrier() 

79 kss = KSSingles.read(fname) 

80 kss1 = KSSingles.read(fname, restrict={'jend': 1}) 

81 assert len(kss1) == calc.wfs.kd.nibzkpts * calc.wfs.nspins 

82 

83 # periodic and non-periodic should be roughly equal 

84 assert energy['zero_bc'] == pytest.approx(energy['periodic'], 

85 abs=5.e-2) 

86 assert osz['zero_bc'] == pytest.approx(osz['periodic'], abs=2.e-2)