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
« prev ^ index » next coverage.py v7.5.3, created at 2025-03-06 04:00 +0000
1from pathlib import Path
3from ase.calculators.abc import GetOutputsMixin
4from ase.calculators.calculator import FileIOCalculator
5from ase.io import write
6from ase.io.elk import ElkReader
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
15 fileio_rules = FileIOCalculator.ruleset(
16 stdout_name='elk.out')
18 def __init__(self, **kwargs):
19 """Construct ELK calculator.
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 """
26 super().__init__(**kwargs)
28 def write_input(self, atoms, properties=None, system_changes=None):
29 FileIOCalculator.write_input(self, atoms, properties, system_changes)
31 parameters = dict(self.parameters)
32 if 'forces' in properties:
33 parameters['tforce'] = True
35 directory = Path(self.directory)
36 write(directory / 'elk.in', atoms, parameters=parameters,
37 format='elk-in')
39 def read_results(self):
40 from ase.outputs import Properties
41 reader = ElkReader(self.directory)
42 dct = dict(reader.read_everything())
44 converged = dct.pop('converged')
45 if not converged:
46 raise RuntimeError('Did not converge')
48 # (Filter results thorugh Properties for error detection)
49 props = Properties(dct)
50 self.results = dict(props)
52 def _outputmixin_get_results(self):
53 return self.results