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

39 statements  

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

1import pytest 

2from io import StringIO 

3 

4from ase.io import read 

5from ase.units import Ha 

6 

7from gpaw import GPAW, FermiDirac 

8from gpaw.lrtddft import LrTDDFT 

9from gpaw.lrtddft2 import LrTDDFT2 

10 

11 

12jend = 12 # LUMO 

13 

14 

15@pytest.fixture 

16def C3H6O(): 

17 atoms = read(StringIO("""10 

18https://cccbdb.nist.gov/ Geometry for C3H6O (Propylene oxide), CISD/6-31G* 

19O 0.8171 -0.7825 -0.2447 

20C -1.5018 0.1019 -0.1473 

21H -1.3989 0.3323 -1.2066 

22H -2.0652 -0.8262 -0.0524 

23H -2.0715 0.8983 0.3329 

24C -0.1488 -0.0393 0.4879 

25H -0.1505 -0.2633 1.5506 

26C 1.0387 0.6105 -0.0580 

27H 0.9518 1.2157 -0.9531 

28H 1.8684 0.8649 0.5908 

29"""), format='xyz') 

30 atoms.center(vacuum=3) 

31 

32 atoms.calc = GPAW(mode='fd', h=0.3, 

33 occupations=FermiDirac(width=0.1), 

34 nbands=15, convergence={ 

35 'eigenstates': 1e-4, 

36 'bands': jend}, 

37 txt=None) 

38 atoms.get_potential_energy() 

39 return atoms 

40 

41 

42@pytest.mark.old_gpaw_only 

43def test_lrtddft2(C3H6O, in_tmp_dir): 

44 """Test equivalence""" 

45 atoms = C3H6O 

46 

47 istart = 10 # HOMO-1 

48 

49 evs = atoms.calc.get_eigenvalues() / Ha 

50 energy_differences = evs[jend] - evs[istart:jend] 

51 

52 lr = LrTDDFT(atoms.calc, restrict={'istart': istart, 'jend': jend}) 

53 

54 lr2 = LrTDDFT2('C3H6O_lr', atoms.calc, fxc='LDA', 

55 min_occ=istart, max_unocc=jend) 

56 lr2.calculate() 

57 

58 # check for Kohn-Sham properties 

59 

60 for de, ks, ks2 in zip(energy_differences, 

61 lr.kss, lr2.ks_singles.kss_list[::-1]): 

62 assert de == pytest.approx(ks.energy, 1e-10) 

63 assert de == pytest.approx(ks2.energy_diff, 1e-8) 

64 

65 assert ks.mur == pytest.approx(ks2.dip_mom_r, 1e-3) 

66 assert ks.magn == pytest.approx(ks2.magn_mom, 1e-6) 

67 

68 # check for TDDFT properties 

69 

70 (w, S, R, Sx, Sy, Sz) = lr2.get_transitions() 

71 

72 assert len(lr) == len(w) 

73 for i, ex in enumerate(lr): 

74 assert ex.energy * Ha == pytest.approx(w[i], 1e-6) 

75 f = ex.get_oscillator_strength() 

76 assert f[0] == pytest.approx(S[i], 1e-4) 

77 assert f[1] == pytest.approx(Sx[i], 1e-3) 

78 assert f[2] == pytest.approx(Sy[i], 1e-3) 

79 assert f[3] == pytest.approx(Sz[i], 1e-3) 

80 assert ex.get_rotatory_strength() == pytest.approx(R[i], 1e-4)