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

1import pytest 

2from ase.build import molecule 

3 

4from gpaw import GPAW, KohnShamConvergenceError 

5from gpaw.lcaotddft import LCAOTDDFT 

6from gpaw.tddft import TDDFT 

7from gpaw.utilities.timelimit import TimeLimiter 

8 

9 

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) 

16 

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 

24 

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') 

34 

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' 

41 

42 # Test mode='fd' 

43 

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') 

53 

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'