Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Define conformer_sp_level #766

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions arc/job/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,8 @@ def set_file_paths(self):
self.local_path = os.path.join(self.project_directory, 'calcs', folder_name, self.species_label, self.job_name)
else:
self.local_path = os.path.join(self.project_directory, 'calcs', folder_name, self.species[0].multi_species, self.job_name)
self.local_path_to_input_file = os.path.join(self.local_path, settings['input_filenames'][self.job_adapter]) \
if self.job_adapter in settings['input_filenames'] else 'input.gjf'
self.local_path_to_output_file = os.path.join(self.local_path, settings['output_filenames'][self.job_adapter]) \
if self.job_adapter in settings['output_filenames'] else 'output.out'
self.local_path_to_orbitals_file = os.path.join(self.local_path, 'orbitals.fchk')
Expand Down
33 changes: 23 additions & 10 deletions arc/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@
instead (e.g., ``opt_level``).
composite_method (str, dict, Level, optional): Composite method.
conformer_level (str, dict, Level, optional): Level of theory for conformer searches.
conformer_opt_level (str, dict, Level, optional): Level of theory for conformer searches, interchangable with `conformer_level`.
conformer_sp_level (str, dict, Level, optional): Level of theory for conformer sp jobs after opt.
opt_level (str, dict, Level, optional): Level of theory for geometry optimization.
freq_level (str, dict, Level, optional): Level of theory for frequency calculations.
sp_level (str, dict, Level, optional): Level of theory for single point calculations.
Expand Down Expand Up @@ -167,7 +169,8 @@
reactions (list): A list of :ref:`ARCReaction <reaction>` objects.
level_of_theory (str): A shortcut representing either sp//geometry levels or a composite method.
composite_method (Level): Composite method.
conformer_level (Level): Level of theory for conformer searches.
conformer_opt_level (Level): Level of theory for conformer searches.
conformer_sp_level (str, dict, Level, optional): Level of theory for conformer sp jobs after opt.
opt_level (Level): Level of theory for geometry optimization.
freq_level (Level): Level of theory for frequency calculations.
sp_level (Level): Level of theory for single point calculations.
Expand Down Expand Up @@ -245,6 +248,8 @@
compute_thermo: bool = True,
compute_transport: bool = False,
conformer_level: Optional[Union[str, dict, Level]] = None,
conformer_opt_level: Optional[Union[str, dict, Level]] = None,
conformer_sp_level: Optional[Union[str, dict, Level]] = None,
dont_gen_confs: List[str] = None,
e_confs: float = 5.0,
ess_settings: Dict[str, Union[str, List[str]]] = None,
Expand Down Expand Up @@ -346,7 +351,8 @@
# attributes related to level of theory specifications
self.level_of_theory = level_of_theory
self.composite_method = composite_method or None
self.conformer_level = conformer_level or None
self.conformer_opt_level = conformer_level or conformer_opt_level or None
self.conformer_sp_level = conformer_sp_level or None
self.opt_level = opt_level or None
self.freq_level = freq_level or None
self.sp_level = sp_level or None
Expand Down Expand Up @@ -489,8 +495,10 @@
restart_dict['compute_thermo'] = self.compute_thermo
if self.compute_transport:
restart_dict['compute_transport'] = self.compute_transport
if self.conformer_level is not None and str(self.conformer_level).split()[0] != default_levels_of_theory['conformer']:
restart_dict['conformer_level'] = self.conformer_level.as_dict()
if self.conformer_opt_level is not None:
restart_dict['conformer_opt_level'] = self.conformer_opt_level.as_dict()
if self.conformer_sp_level is not None:
restart_dict['conformer_sp_level'] = self.conformer_sp_level.as_dict()

Check warning on line 501 in arc/main.py

View check run for this annotation

Codecov / codecov/patch

arc/main.py#L501

Added line #L501 was not covered by tests
if self.dont_gen_confs:
restart_dict['dont_gen_confs'] = self.dont_gen_confs
if self.ts_adapters is not None:
Expand Down Expand Up @@ -608,7 +616,8 @@
species_list=self.species,
rxn_list=self.reactions,
composite_method=self.composite_method,
conformer_level=self.conformer_level,
conformer_opt_level=self.conformer_opt_level,
conformer_sp_level=self.conformer_sp_level,
opt_level=self.opt_level,
freq_level=self.freq_level,
sp_level=self.sp_level,
Expand Down Expand Up @@ -689,7 +698,7 @@
txt = ''
txt += f'ARC v{self.__version__}\n'
txt += f'ARC project {self.project}\n\nLevels of theory used:\n\n'
txt += f'Conformers: {self.conformer_level}\n'
txt += f'Conformers: {self.conformer_opt_level}\n'

Check warning on line 701 in arc/main.py

View check run for this annotation

Codecov / codecov/patch

arc/main.py#L701

Added line #L701 was not covered by tests
txt += f'TS guesses: {self.ts_guess_level}\n'
if self.composite_method is not None:
txt += f'Composite method: {self.composite_method} {fine_txt}\n'
Expand Down Expand Up @@ -975,13 +984,17 @@

logger.info('\n\nUsing the following levels of theory:\n')

if self.conformer_level is None:
self.conformer_level = default_levels_of_theory['conformer']
if self.conformer_opt_level is None:
self.conformer_opt_level = default_levels_of_theory['conformer']
default_flag = ' (default)'
else:
default_flag = ''
self.conformer_level = Level(repr=self.conformer_level)
logger.info(f'Conformers:{default_flag} {self.conformer_level}')
self.conformer_opt_level = Level(repr=self.conformer_opt_level)
logger.info(f'Conformers opt:{default_flag} {self.conformer_opt_level}')

if self.conformer_sp_level is not None:
self.conformer_sp_level = Level(repr=self.conformer_sp_level)
logger.info(f'Conformers sp: {self.conformer_sp_level}')

Check warning on line 997 in arc/main.py

View check run for this annotation

Codecov / codecov/patch

arc/main.py#L996-L997

Added lines #L996 - L997 were not covered by tests

if self.reactions or any([spc.is_ts for spc in self.species]):
if not self.ts_guess_level:
Expand Down
4 changes: 2 additions & 2 deletions arc/main_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ def test_as_dict(self):
'method': 'ccsd(t)-f12',
'method_type': 'wavefunction',
'software': 'molpro'},
'conformer_level': {'basis': 'def2svp',
'conformer_opt_level': {'basis': 'def2svp',
'compatible_ess': ['gaussian', 'terachem'],
'method': 'wb97xd',
'method_type': 'dft',
Expand Down Expand Up @@ -152,7 +152,7 @@ def test_as_dict(self):
def test_from_dict(self):
"""Test the from_dict() method of ARC"""
restart_dict = {'composite_method': '',
'conformer_level': 'b97-d3/6-311+g(d,p)',
'conformer_opt_level': 'b97-d3/6-311+g(d,p)',
'freq_level': 'wb97x-d3/6-311+g(d,p)',
'freq_scale_factor': 0.96,
'opt_level': 'wb97x-d3/6-311+g(d,p)',
Expand Down
6 changes: 5 additions & 1 deletion arc/plotter.py
Original file line number Diff line number Diff line change
Expand Up @@ -901,6 +901,7 @@
im_freqs: Optional[List[List[float]]] = None,
log_content: bool = False,
before_optimization: bool = True,
conf_sp: Optional[bool] = False,
):
"""
Save the conformers before or after optimization.
Expand Down Expand Up @@ -936,7 +937,10 @@
content += f'Conformers for {label}, computed using a force field:\n\n'
else:
level_of_theory = level_of_theory.simple() if isinstance(level_of_theory, Level) else level_of_theory
content += f'Conformers for {label}, optimized at the {level_of_theory} level:\n\n'
if not conf_sp:
content += f'Conformers for {label}, optimized at the {level_of_theory} level:\n\n'
else:
content += f'Conformers for {label}, sp at the {level_of_theory} level:\n\n'

Check warning on line 943 in arc/plotter.py

View check run for this annotation

Codecov / codecov/patch

arc/plotter.py#L943

Added line #L943 was not covered by tests
for i, xyz in enumerate(xyzs):
content += f'conformer {i}:\n'
if xyz is not None:
Expand Down
4 changes: 2 additions & 2 deletions arc/reaction_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1928,7 +1928,7 @@ def test_load_ts_xyz_user_guess_from_files(self):
Scheduler(project=arc_object.project,
species_list=arc_object.species,
rxn_list=arc_object.reactions,
conformer_level=arc_object.conformer_level,
conformer_opt_level=arc_object.conformer_opt_level,
opt_level=arc_object.opt_level,
freq_level=arc_object.freq_level,
sp_level=arc_object.sp_level,
Expand All @@ -1950,7 +1950,7 @@ def test_load_ts_xyz_user_guess_from_files(self):
Scheduler(project=arc_object.project,
species_list=arc_object.species,
rxn_list=arc_object.reactions,
conformer_level=arc_object.conformer_level,
conformer_opt_level=arc_object.conformer_opt_level,
opt_level=arc_object.opt_level,
freq_level=arc_object.freq_level,
sp_level=arc_object.sp_level,
Expand Down
Loading
Loading