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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-08 00:17 +0000
1import pytest
2from io import StringIO
4from ase.io import read
5from ase.units import Ha
7from gpaw import GPAW, FermiDirac
8from gpaw.lrtddft import LrTDDFT
9from gpaw.lrtddft2 import LrTDDFT2
12jend = 12 # LUMO
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)
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
42@pytest.mark.old_gpaw_only
43def test_lrtddft2(C3H6O, in_tmp_dir):
44 """Test equivalence"""
45 atoms = C3H6O
47 istart = 10 # HOMO-1
49 evs = atoms.calc.get_eigenvalues() / Ha
50 energy_differences = evs[jend] - evs[istart:jend]
52 lr = LrTDDFT(atoms.calc, restrict={'istart': istart, 'jend': jend})
54 lr2 = LrTDDFT2('C3H6O_lr', atoms.calc, fxc='LDA',
55 min_occ=istart, max_unocc=jend)
56 lr2.calculate()
58 # check for Kohn-Sham properties
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)
65 assert ks.mur == pytest.approx(ks2.dip_mom_r, 1e-3)
66 assert ks.magn == pytest.approx(ks2.magn_mom, 1e-6)
68 # check for TDDFT properties
70 (w, S, R, Sx, Sy, Sz) = lr2.get_transitions()
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)