Coverage for /builds/ase/ase/ase/calculators/orca.py: 52.94%
34 statements
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
1# fmt: off
3import re
5import ase.io.orca as io
6from ase.calculators.genericfileio import (
7 BaseProfile,
8 CalculatorTemplate,
9 GenericFileIOCalculator,
10)
13def get_version_from_orca_header(orca_header):
14 match = re.search(r'Program Version (\S+)', orca_header, re.M)
15 return match.group(1)
18class OrcaProfile(BaseProfile):
19 def version(self):
20 # XXX Allow MPI in argv; the version call should not be parallel.
21 from ase.calculators.genericfileio import read_stdout
22 stdout = read_stdout([self.command, "does_not_exist"])
23 return get_version_from_orca_header(stdout)
25 def get_calculator_command(self, inputfile):
26 return [inputfile]
29class OrcaTemplate(CalculatorTemplate):
30 _label = 'orca'
32 def __init__(self):
33 super().__init__('orca',
34 implemented_properties=['energy', 'free_energy',
35 'forces', 'dipole'])
37 self.inputname = f'{self._label}.inp'
38 self.outputname = f'{self._label}.out'
39 self.errorname = f'{self._label}.err'
41 def execute(self, directory, profile) -> None:
42 profile.run(directory, self.inputname, self.outputname,
43 errorfile=self.errorname)
45 def write_input(self, profile, directory, atoms, parameters, properties):
46 parameters = dict(parameters)
48 kw = dict(charge=0, mult=1, orcasimpleinput='B3LYP def2-TZVP',
49 orcablocks='%pal nprocs 1 end')
50 kw.update(parameters)
52 io.write_orca(directory / self.inputname, atoms, kw)
54 def read_results(self, directory):
55 return io.read_orca_outputs(directory, directory / self.outputname)
57 def load_profile(self, cfg, **kwargs):
58 return OrcaProfile.from_config(cfg, self.name, **kwargs)
61class ORCA(GenericFileIOCalculator):
62 """Class for doing ORCA calculations.
64 Example:
66 calc = ORCA(charge=0, mult=1, orcasimpleinput='B3LYP def2-TZVP',
67 orcablocks='%pal nprocs 16 end')
68 """
70 def __init__(self, *, profile=None, directory='.', **kwargs):
71 """Construct ORCA-calculator object.
73 Parameters
74 ==========
75 charge: int
77 mult: int
79 orcasimpleinput : str
81 orcablocks: str
84 Examples
85 ========
86 Use default values:
88 >>> from ase.calculators.orca import ORCA
89 >>> h = Atoms(
90 ... 'H',
91 ... calculator=ORCA(
92 ... charge=0,
93 ... mult=1,
94 ... directory='water',
95 ... orcasimpleinput='B3LYP def2-TZVP',
96 ... orcablocks='%pal nprocs 16 end'))
98 """
100 super().__init__(template=OrcaTemplate(),
101 profile=profile, directory=directory,
102 parameters=kwargs)