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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-08 00:17 +0000
1import pytest
2import numpy as np
4from ase import Atoms
5from ase.parallel import parprint
6from ase.units import Hartree
8import gpaw.mpi as mpi
9from gpaw import GPAW
10from gpaw.lrtddft.kssingle import KSSingles
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)
23 txt = None
24 eigensolver = None
26 # modes = ['lcao', 'fd']
27 modes = ['fd']
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()
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()
72 parprint(name + ':')
73 parprint(kss)
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
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)