Coverage for gpaw/test/directopt/test_mom_directopt_fd_hybrids.py: 80%

41 statements  

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

1import pytest 

2 

3import numpy as np 

4 

5from ase import Atoms 

6from ase.units import Bohr 

7 

8from gpaw import GPAW, FD 

9from gpaw.directmin.etdm_fdpw import FDPWETDM 

10from gpaw.xc.hybrid import HybridXC 

11from gpaw.eigensolvers import RMMDIIS 

12from gpaw.mom import prepare_mom_calculation 

13 

14 

15@pytest.mark.do 

16def test_mom_directopt_fd_hybrids(in_tmp_dir): 

17 d = 1.4 * Bohr 

18 h2 = Atoms('H2', 

19 positions=[[-d / 2, 0, 0], 

20 [d / 2, 0, 0]]) 

21 h2.center(vacuum=3) 

22 

23 # Total and orbital energies calculated using 

24 # RMMDIIS with disabled code below 

25 e_ref = -5.969348 

26 eig_ref = np.array([-11.94789695, 2.02930128]) 

27 e_ref_es = 21.861924 

28 eig_ref_es = np.array([-15.98483801, -3.4381461]) 

29 

30 # XXX(rg): Fails with gpwfile, see tchem-gl-14 

31 calc = GPAW(mode=FD(), 

32 h=0.3, 

33 xc=HybridXC('PBE0', unocc=True), 

34 eigensolver=FDPWETDM(converge_unocc=True), 

35 mixer={'backend': 'no-mixing'}, 

36 occupations={'name': 'fixed-uniform'}, 

37 symmetry='off', 

38 nbands=3, 

39 convergence={'eigenstates': 4.0e-6}, 

40 ) 

41 h2.calc = calc 

42 e = h2.get_potential_energy() 

43 eig = calc.get_eigenvalues() 

44 

45 calc.set(eigensolver=FDPWETDM(excited_state=True, 

46 converge_unocc=True)) 

47 f_sn = [[0, 1, 0]] 

48 prepare_mom_calculation(calc, h2, f_sn) 

49 

50 e_es = h2.get_potential_energy() 

51 eig_es = calc.get_eigenvalues() 

52 

53 assert e == pytest.approx(e_ref, abs=1.0e-3) 

54 assert eig[:-1] == pytest.approx(eig_ref, abs=0.1) 

55 assert e_es == pytest.approx(e_ref_es, abs=1.0e-3) 

56 assert eig_es[:-1] == pytest.approx(eig_ref_es, abs=0.1) 

57 

58 reference_calc = False 

59 if reference_calc: 

60 calc = GPAW(mode=FD(), 

61 h=0.3, 

62 xc=HybridXC('PBE0', unocc=True), 

63 symmetry='off', 

64 nbands=3, 

65 convergence={'eigenstates': 4.0e-6, 

66 'bands': 2}, 

67 eigensolver=RMMDIIS() 

68 ) 

69 h2.calc = calc 

70 h2.get_potential_energy() 

71 calc.get_eigenvalues()[:-1] 

72 

73 f_sn = [[0, 1, 0]] 

74 prepare_mom_calculation(calc, h2, f_sn) 

75 

76 h2.get_potential_energy() 

77 calc.get_eigenvalues()[:-1]