Coverage for gpaw/test/test_timelimit.py: 95%
39 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
1import pytest
2from ase.build import molecule
4from gpaw import GPAW, KohnShamConvergenceError
5from gpaw.lcaotddft import LCAOTDDFT
6from gpaw.tddft import TDDFT
7from gpaw.utilities.timelimit import TimeLimiter
10def test_timelimit(in_tmp_dir, gpaw_new):
11 if gpaw_new:
12 pytest.skip('rewrite later using calc.callbacks')
13 # Atoms
14 atoms = molecule('Na2')
15 atoms.center(vacuum=4.0)
17 # Ground-state calculation that will never converge
18 maxiter = 10
19 calc = GPAW(mode='lcao', basis='sz(dzp)', setups='1', nbands=1,
20 convergence={'density': 1e-100},
21 symmetry={'point_group': False},
22 maxiter=maxiter)
23 atoms.calc = calc
25 tl = TimeLimiter(calc, timelimit=0, output='scf.txt')
26 tl.reset('scf', min_updates=3)
27 try:
28 atoms.get_potential_energy()
29 except KohnShamConvergenceError:
30 assert calc.scf.maxiter < maxiter, 'TimeLimiter did not break SCF loop'
31 else:
32 raise AssertionError('SCF loop ended too early')
33 calc.write('gs.gpw', mode='all')
35 # LCAOTDDFT calculation that will never finish
36 td_calc = LCAOTDDFT('gs.gpw')
37 tl = TimeLimiter(td_calc, timelimit=0, output='lcaotddft.txt')
38 tl.reset('tddft', min_updates=3)
39 td_calc.propagate(10, maxiter - td_calc.niter)
40 assert td_calc.maxiter < maxiter, 'TimeLimiter did not break TDDFT loop'
42 # Test mode='fd'
44 # Prepare ground state
45 calc = GPAW(mode='fd', setups='1', maxiter=1, nbands=1,
46 symmetry={'point_group': False})
47 atoms.calc = calc
48 try:
49 atoms.get_potential_energy()
50 except KohnShamConvergenceError:
51 pass
52 calc.write('gs.gpw', mode='all')
54 # TDDFT calculation that will never finish
55 td_calc = TDDFT('gs.gpw')
56 tl = TimeLimiter(td_calc, timelimit=0, output='tddft.txt')
57 tl.reset('tddft', min_updates=3)
58 td_calc.propagate(10, maxiter - td_calc.niter)
59 assert td_calc.maxiter < maxiter, 'TimeLimiter did not break TDDFT loop'