Coverage for /builds/debichem-team/python-ase/ase/calculators/elk.py: 96.77%

31 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2025-03-06 04:00 +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 fileio_rules = FileIOCalculator.ruleset( 

16 stdout_name='elk.out') 

17 

18 def __init__(self, **kwargs): 

19 """Construct ELK calculator. 

20 

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

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

23 native keywords. 

24 """ 

25 

26 super().__init__(**kwargs) 

27 

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

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

30 

31 parameters = dict(self.parameters) 

32 if 'forces' in properties: 

33 parameters['tforce'] = True 

34 

35 directory = Path(self.directory) 

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

37 format='elk-in') 

38 

39 def read_results(self): 

40 from ase.outputs import Properties 

41 reader = ElkReader(self.directory) 

42 dct = dict(reader.read_everything()) 

43 

44 converged = dct.pop('converged') 

45 if not converged: 

46 raise RuntimeError('Did not converge') 

47 

48 # (Filter results thorugh Properties for error detection) 

49 props = Properties(dct) 

50 self.results = dict(props) 

51 

52 def _outputmixin_get_results(self): 

53 return self.results