Coverage for gpaw/test/directopt/test_mom_directopt_lcao.py: 100%

34 statements  

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

1import pytest 

2 

3from gpaw import GPAW 

4from gpaw.directmin.tools import excite 

5from gpaw.mom import prepare_mom_calculation 

6from gpaw.directmin.etdm_lcao import LCAOETDM 

7from gpaw.directmin.tools import rotate_orbitals 

8 

9import numpy as np 

10 

11 

12@pytest.mark.mom 

13@pytest.mark.do 

14def test_mom_directopt_lcao(in_tmp_dir, gpw_files): 

15 calc = GPAW(gpw_files['h2o_mom_do_lcao']) 

16 # XXX(rg): Remove hack after tchem-gl-13 

17 calc.set_positions() 

18 calc.wfs.eigensolver.initialize_dm_helper( 

19 calc.wfs, calc.hamiltonian, 

20 calc.density, calc.log 

21 ) 

22 H2O = calc.atoms 

23 H2O.calc = calc 

24 

25 calc.set(eigensolver=LCAOETDM(excited_state=True)) 

26 f_sn = excite(calc, 0, 0, spin=(0, 0)) 

27 prepare_mom_calculation(calc, H2O, f_sn) 

28 

29 def rotate_homo_lumo(calc=calc): 

30 angle = 70 

31 iters = calc.get_number_of_iterations() 

32 if iters == 3: 

33 # Exercise rotate_orbitals 

34 C_M_old = calc.wfs.kpt_u[0].C_nM.copy() 

35 rotate_orbitals(calc.wfs.eigensolver, calc.wfs, 

36 [[3, 4]], [angle], [0]) 

37 angle *= np.pi / 180.0 

38 C_M_new = np.cos(angle) * C_M_old[3] + np.sin(angle) * C_M_old[4] 

39 assert calc.wfs.kpt_u[0].C_nM[3] == \ 

40 pytest.approx(C_M_new, abs=1e-4) 

41 

42 counter = calc.wfs.eigensolver.update_ref_orbs_counter 

43 calc.wfs.eigensolver.update_ref_orbs_counter = iters + 1 

44 calc.wfs.eigensolver.update_ref_orbitals(calc.wfs, 

45 calc.hamiltonian, 

46 calc.density) 

47 calc.wfs.eigensolver.update_ref_orbs_counter = counter 

48 

49 calc.attach(rotate_homo_lumo, 1) 

50 e = H2O.get_potential_energy() 

51 

52 assert e == pytest.approx(-4.854496813259008, abs=1.0e-4)