Coverage for /builds/kinetik161/ase/ase/calculators/elk.py: 96.67%

30 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-12-10 11:04 +0000

1from pathlib import Path 

2 

3from ase.calculators.abc import GetOutputsMixin 

4from ase.calculators.calculator import FileIOCalculator 

5from ase.io import write 

6from ase.io.elk import ElkReader 

7 

8 

9class ELK(FileIOCalculator, GetOutputsMixin): 

10 _legacy_default_command = 'elk > elk.out' 

11 implemented_properties = ['energy', 'forces'] 

12 ignored_changes = {'pbc'} 

13 discard_results_on_any_change = True 

14 

15 def __init__(self, **kwargs): 

16 """Construct ELK calculator. 

17 

18 The keyword arguments (kwargs) can be one of the ASE standard 

19 keywords: 'xc', 'kpts' and 'smearing' or any of ELK' 

20 native keywords. 

21 """ 

22 

23 super().__init__(**kwargs) 

24 

25 def write_input(self, atoms, properties=None, system_changes=None): 

26 FileIOCalculator.write_input(self, atoms, properties, system_changes) 

27 

28 parameters = dict(self.parameters) 

29 if 'forces' in properties: 

30 parameters['tforce'] = True 

31 

32 directory = Path(self.directory) 

33 write(directory / 'elk.in', atoms, parameters=parameters, 

34 format='elk-in') 

35 

36 def read_results(self): 

37 from ase.outputs import Properties 

38 reader = ElkReader(self.directory) 

39 dct = dict(reader.read_everything()) 

40 

41 converged = dct.pop('converged') 

42 if not converged: 

43 raise RuntimeError('Did not converge') 

44 

45 # (Filter results thorugh Properties for error detection) 

46 props = Properties(dct) 

47 self.results = dict(props) 

48 

49 def _outputmixin_get_results(self): 

50 return self.results