Coverage for gpaw/directmin/locfunc/etdm_localization_fdpw.py: 26%

23 statements  

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

1from gpaw.directmin.fdpw.pz_localization import PZLocalization 

2from gpaw.directmin.fdpw.etdm_inner_loop import ETDMInnerLoop 

3import numpy as np 

4 

5 

6class FDPWETDMLocalize: 

7 

8 def __init__(self, obj_f, wfs, maxiter=300, g_tol=1.0e-3, randval=0.01): 

9 

10 self.obj_f = obj_f 

11 self.randval = randval 

12 

13 if obj_f.name == 'Zero': 

14 self.iloop = ETDMInnerLoop( 

15 obj_f, wfs, 'all', 5.0e-4, maxiter, 

16 g_tol=g_tol, useprec=True) 

17 else: 

18 self.iloop = PZLocalization( 

19 obj_f, wfs, maxiter=maxiter, 

20 g_tol=g_tol) 

21 

22 def run(self, wfs, dens, ham=None, rewritepsi=True, log=None, seed=None): 

23 

24 wfs.timer.start('Inner loop') 

25 

26 if self.obj_f.name == 'Zero': 

27 etotal, counter = self.iloop.run(wfs, dens, log, 0, ham=ham) 

28 else: 

29 counter = self.iloop.run(0.0, wfs, dens, log, 0, 

30 randvalue=self.randval, seed=seed) 

31 

32 if rewritepsi: 

33 for kpt in wfs.kpt_u: 

34 k = self.iloop.n_kps * kpt.s + kpt.q 

35 dim1 = self.iloop.U_k[k].shape[0] 

36 kpt.psit_nG[:dim1] = np.tensordot( 

37 self.iloop.U_k[k].T, kpt.psit_nG[:dim1], axes=1) 

38 wfs.pt.integrate(kpt.psit_nG, kpt.P_ani, kpt.q) 

39 

40 wfs.timer.stop('Inner loop') 

41 

42 return counter