Coverage for /builds/alexhroom/ase/ase/calculators/orca.py: 52.94%

34 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2024-08-05 14:37 +0000

1import re 

2 

3import ase.io.orca as io 

4from ase.calculators.genericfileio import (BaseProfile, CalculatorTemplate, 

5 GenericFileIOCalculator) 

6 

7 

8def get_version_from_orca_header(orca_header): 

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

10 return match.group(1) 

11 

12 

13class OrcaProfile(BaseProfile): 

14 def version(self): 

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

16 from ase.calculators.genericfileio import read_stdout 

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

18 return get_version_from_orca_header(stdout) 

19 

20 def get_calculator_command(self, inputfile): 

21 return [inputfile] 

22 

23 

24class OrcaTemplate(CalculatorTemplate): 

25 _label = 'orca' 

26 

27 def __init__(self): 

28 super().__init__('orca', 

29 implemented_properties=['energy', 'free_energy', 

30 'forces', 'dipole']) 

31 

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

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

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

35 

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

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

38 errorfile=self.errorname) 

39 

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

41 parameters = dict(parameters) 

42 

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

44 orcablocks='%pal nprocs 1 end') 

45 kw.update(parameters) 

46 

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

48 

49 def read_results(self, directory): 

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

51 

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

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

54 

55 

56class ORCA(GenericFileIOCalculator): 

57 """Class for doing ORCA calculations. 

58 

59 Example: 

60 

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

62 orcablocks='%pal nprocs 16 end') 

63 """ 

64 

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

66 """Construct ORCA-calculator object. 

67 

68 Parameters 

69 ========== 

70 charge: int 

71 

72 mult: int 

73 

74 orcasimpleinput : str 

75 

76 orcablocks: str 

77 

78 

79 Examples 

80 ======== 

81 Use default values: 

82 

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

84 >>> h = Atoms( 

85 ... 'H', 

86 ... calculator=ORCA( 

87 ... charge=0, 

88 ... mult=1, 

89 ... directory='water', 

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

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

92 

93 """ 

94 

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

96 profile=profile, directory=directory, 

97 parameters=kwargs)