Coverage for /builds/debichem-team/python-ase/ase/calculators/orca.py: 52.94%

34 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2025-03-06 04:00 +0000

1import re 

2 

3import ase.io.orca as io 

4from ase.calculators.genericfileio import ( 

5 BaseProfile, 

6 CalculatorTemplate, 

7 GenericFileIOCalculator, 

8) 

9 

10 

11def get_version_from_orca_header(orca_header): 

12 match = re.search(r'Program Version (\S+)', orca_header, re.M) 

13 return match.group(1) 

14 

15 

16class OrcaProfile(BaseProfile): 

17 def version(self): 

18 # XXX Allow MPI in argv; the version call should not be parallel. 

19 from ase.calculators.genericfileio import read_stdout 

20 stdout = read_stdout([self.command, "does_not_exist"]) 

21 return get_version_from_orca_header(stdout) 

22 

23 def get_calculator_command(self, inputfile): 

24 return [inputfile] 

25 

26 

27class OrcaTemplate(CalculatorTemplate): 

28 _label = 'orca' 

29 

30 def __init__(self): 

31 super().__init__('orca', 

32 implemented_properties=['energy', 'free_energy', 

33 'forces', 'dipole']) 

34 

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

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

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

38 

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

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

41 errorfile=self.errorname) 

42 

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

44 parameters = dict(parameters) 

45 

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

47 orcablocks='%pal nprocs 1 end') 

48 kw.update(parameters) 

49 

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

51 

52 def read_results(self, directory): 

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

54 

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

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

57 

58 

59class ORCA(GenericFileIOCalculator): 

60 """Class for doing ORCA calculations. 

61 

62 Example: 

63 

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

65 orcablocks='%pal nprocs 16 end') 

66 """ 

67 

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

69 """Construct ORCA-calculator object. 

70 

71 Parameters 

72 ========== 

73 charge: int 

74 

75 mult: int 

76 

77 orcasimpleinput : str 

78 

79 orcablocks: str 

80 

81 

82 Examples 

83 ======== 

84 Use default values: 

85 

86 >>> from ase.calculators.orca import ORCA 

87 >>> h = Atoms( 

88 ... 'H', 

89 ... calculator=ORCA( 

90 ... charge=0, 

91 ... mult=1, 

92 ... directory='water', 

93 ... orcasimpleinput='B3LYP def2-TZVP', 

94 ... orcablocks='%pal nprocs 16 end')) 

95 

96 """ 

97 

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

99 profile=profile, directory=directory, 

100 parameters=kwargs)