Coverage for /builds/ericyuan00000/ase/ase/calculators/elk.py: 96.77%

31 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2025-06-18 01:20 +0000

1# fmt: off 

2 

3from pathlib import Path 

4 

5from ase.calculators.abc import GetOutputsMixin 

6from ase.calculators.calculator import FileIOCalculator 

7from ase.io import write 

8from ase.io.elk import ElkReader 

9 

10 

11class ELK(FileIOCalculator, GetOutputsMixin): 

12 _legacy_default_command = 'elk > elk.out' 

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

14 ignored_changes = {'pbc'} 

15 discard_results_on_any_change = True 

16 

17 fileio_rules = FileIOCalculator.ruleset( 

18 stdout_name='elk.out') 

19 

20 def __init__(self, **kwargs): 

21 """Construct ELK calculator. 

22 

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

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

25 native keywords. 

26 """ 

27 

28 super().__init__(**kwargs) 

29 

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

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

32 

33 parameters = dict(self.parameters) 

34 if 'forces' in properties: 

35 parameters['tforce'] = True 

36 

37 directory = Path(self.directory) 

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

39 format='elk-in') 

40 

41 def read_results(self): 

42 from ase.outputs import Properties 

43 reader = ElkReader(self.directory) 

44 dct = dict(reader.read_everything()) 

45 

46 converged = dct.pop('converged') 

47 if not converged: 

48 raise RuntimeError('Did not converge') 

49 

50 # (Filter results thorugh Properties for error detection) 

51 props = Properties(dct) 

52 self.results = dict(props) 

53 

54 def _outputmixin_get_results(self): 

55 return self.results