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
« prev ^ index » next coverage.py v7.5.3, created at 2025-06-18 01:20 +0000
1# fmt: off
3from pathlib import Path
5from ase.calculators.abc import GetOutputsMixin
6from ase.calculators.calculator import FileIOCalculator
7from ase.io import write
8from ase.io.elk import ElkReader
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
17 fileio_rules = FileIOCalculator.ruleset(
18 stdout_name='elk.out')
20 def __init__(self, **kwargs):
21 """Construct ELK calculator.
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 """
28 super().__init__(**kwargs)
30 def write_input(self, atoms, properties=None, system_changes=None):
31 FileIOCalculator.write_input(self, atoms, properties, system_changes)
33 parameters = dict(self.parameters)
34 if 'forces' in properties:
35 parameters['tforce'] = True
37 directory = Path(self.directory)
38 write(directory / 'elk.in', atoms, parameters=parameters,
39 format='elk-in')
41 def read_results(self):
42 from ase.outputs import Properties
43 reader = ElkReader(self.directory)
44 dct = dict(reader.read_everything())
46 converged = dct.pop('converged')
47 if not converged:
48 raise RuntimeError('Did not converge')
50 # (Filter results thorugh Properties for error detection)
51 props = Properties(dct)
52 self.results = dict(props)
54 def _outputmixin_get_results(self):
55 return self.results