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

50 statements  

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

1import pytest 

2from ase import Atom, Atoms 

3 

4from gpaw import GPAW 

5from gpaw.analyse.overlap import Overlap 

6from gpaw.lrtddft.kssingle import KSSingles 

7 

8txt = '-' 

9txt = None 

10load = True 

11load = False 

12xc = 'LDA' 

13 

14# run 

15 

16R = 0.7 # approx. experimental bond length 

17a = 4.0 

18c = 5.0 

19 

20 

21@pytest.mark.lrtddft 

22def test_lrtddft_placzek_profeta_albrecht(in_tmp_dir): 

23 from ase.vibrations.albrecht import Albrecht 

24 from ase.vibrations.placzek import Placzek, Profeta 

25 from ase.vibrations.resonant_raman import ResonantRamanCalculator 

26 

27 H2 = Atoms([Atom('H', (a / 2, a / 2, (c - R) / 2)), 

28 Atom('H', (a / 2, a / 2, (c + R) / 2))], 

29 cell=(a, a, c)) 

30 

31 name = exname = 'rraman' 

32 exkwargs = {'restrict': {'eps': 0.0, 'jend': 3}} 

33 

34 calc = GPAW( 

35 mode='fd', 

36 xc=xc, nbands=7, 

37 convergence={'bands': 3}, 

38 spinpol=False, 

39 # eigensolver='rmm-diis', 

40 symmetry={'point_group': False}, 

41 txt=txt) 

42 H2.calc = calc 

43 # H2.get_potential_energy() 

44 

45 rr = ResonantRamanCalculator( 

46 H2, KSSingles, name=name, exname=exname, 

47 exkwargs=exkwargs, 

48 # XXX full does not work in parallel due to boxes 

49 # on different nodes 

50 # overlap=lambda x, y: Overlap(x).full(y)[0], 

51 overlap=lambda x, y: Overlap(x).pseudo(y)[0], 

52 txt=txt) 

53 rr.run() 

54 

55 # check 

56 

57 # Different Placzeck implementations should agree 

58 

59 om = 5 

60 pz = Placzek(H2, KSSingles, name=name, exname=exname, txt=txt) 

61 pzi = pz.get_absolute_intensities(omega=om)[-1] 

62 

63 pr = Profeta(H2, KSSingles, name=name, exname=exname, 

64 approximation='Placzek', txt=txt) 

65 pri = pr.get_absolute_intensities(omega=om)[-1] 

66 assert pzi == pytest.approx(pri, abs=0.1) 

67 

68 pr = Profeta(H2, KSSingles, name=name, exname=exname, 

69 overlap=True, 

70 approximation='Placzek', txt=txt) 

71 pri = pr.get_absolute_intensities(omega=om)[-1] 

72 assert pzi == pytest.approx(pri, abs=0.1) 

73 

74 """Albrecht and Placzek are approximately equal""" 

75 

76 al = Albrecht(H2, KSSingles, name=name, exname=exname, 

77 overlap=True, 

78 approximation='Albrecht', txt=txt) 

79 ali = al.get_absolute_intensities(omega=om)[-1] 

80 assert pzi == pytest.approx(ali, abs=1.5) 

81 

82 """Albrecht A and P-P are approximately equal""" 

83 

84 pr = Profeta(H2, KSSingles, name=name, exname=exname, 

85 overlap=True, 

86 approximation='P-P', txt=txt) 

87 pri = pr.get_absolute_intensities(omega=om)[-1] 

88 

89 al = Albrecht(H2, KSSingles, name=name, exname=exname, 

90 overlap=True, 

91 approximation='Albrecht A', txt=txt) 

92 ali = al.get_absolute_intensities(omega=om)[-1] 

93 assert pri == pytest.approx(ali, abs=3) 

94 

95 """Albrecht B+C and Profeta are approximately equal""" 

96 

97 pr = Profeta(H2, KSSingles, name=name, exname=exname, 

98 overlap=True, 

99 approximation='Profeta', txt=txt) 

100 pri = pr.get_absolute_intensities(omega=om)[-1] 

101 

102 al = Albrecht(H2, KSSingles, name=name, exname=exname, 

103 overlap=True, 

104 approximation='Albrecht BC', txt=txt) 

105 ali = al.get_absolute_intensities(omega=om)[-1] 

106 assert pri == pytest.approx(ali, abs=3)