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

1# fmt: off 

2 

3import re 

4 

5import ase.io.orca as io 

6from ase.calculators.genericfileio import ( 

7 BaseProfile, 

8 CalculatorTemplate, 

9 GenericFileIOCalculator, 

10) 

11 

12 

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) 

16 

17 

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) 

24 

25 def get_calculator_command(self, inputfile): 

26 return [inputfile] 

27 

28 

29class OrcaTemplate(CalculatorTemplate): 

30 _label = 'orca' 

31 

32 def __init__(self): 

33 super().__init__('orca', 

34 implemented_properties=['energy', 'free_energy', 

35 'forces', 'dipole']) 

36 

37 self.inputname = f'{self._label}.inp' 

38 self.outputname = f'{self._label}.out' 

39 self.errorname = f'{self._label}.err' 

40 

41 def execute(self, directory, profile) -> None: 

42 profile.run(directory, self.inputname, self.outputname, 

43 errorfile=self.errorname) 

44 

45 def write_input(self, profile, directory, atoms, parameters, properties): 

46 parameters = dict(parameters) 

47 

48 kw = dict(charge=0, mult=1, orcasimpleinput='B3LYP def2-TZVP', 

49 orcablocks='%pal nprocs 1 end') 

50 kw.update(parameters) 

51 

52 io.write_orca(directory / self.inputname, atoms, kw) 

53 

54 def read_results(self, directory): 

55 return io.read_orca_outputs(directory, directory / self.outputname) 

56 

57 def load_profile(self, cfg, **kwargs): 

58 return OrcaProfile.from_config(cfg, self.name, **kwargs) 

59 

60 

61class ORCA(GenericFileIOCalculator): 

62 """Class for doing ORCA calculations. 

63 

64 Example: 

65 

66 calc = ORCA(charge=0, mult=1, orcasimpleinput='B3LYP def2-TZVP', 

67 orcablocks='%pal nprocs 16 end') 

68 """ 

69 

70 def __init__(self, *, profile=None, directory='.', **kwargs): 

71 """Construct ORCA-calculator object. 

72 

73 Parameters 

74 ========== 

75 charge: int 

76 

77 mult: int 

78 

79 orcasimpleinput : str 

80 

81 orcablocks: str 

82 

83 

84 Examples 

85 ======== 

86 Use default values: 

87 

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')) 

97 

98 """ 

99 

100 super().__init__(template=OrcaTemplate(), 

101 profile=profile, directory=directory, 

102 parameters=kwargs)