def test_save_scratch(self): with patch("moltherm.compute.jobs.os.putenv") as putenv_patch: with patch("moltherm.compute.jobs.shutil.copy") as copy_patch: myjob = QCJob(qchem_command="qchem -slurm", max_cores=32, scratch_dir=os.getcwd(), save_scratch=True, save_name="freq_scratch") self.assertEqual(myjob.current_command, [ "qchem", "-slurm", "-save", "-nt", "32", "mol.qin", "mol.qout", "freq_scratch" ]) myjob.setup() self.assertEqual(copy_patch.call_args_list[0][0][0], "mol.qin") self.assertEqual(copy_patch.call_args_list[0][0][1], "mol.qin.orig") self.assertEqual(putenv_patch.call_args_list[0][0][0], "QCSCRATCH") self.assertEqual(putenv_patch.call_args_list[0][0][1], os.getcwd()) self.assertEqual(putenv_patch.call_args_list[1][0][0], "QCTHREADS") self.assertEqual(putenv_patch.call_args_list[1][0][1], "32") self.assertEqual(putenv_patch.call_args_list[2][0][0], "OMP_NUM_THREADS") self.assertEqual(putenv_patch.call_args_list[2][0][1], "32")
def test_not_defaults(self): with patch("moltherm.compute.jobs.os.putenv") as putenv_patch: myjob = QCJob(qchem_command="qchem -slurm", multimode="mpi", input_file="different.qin", output_file="not_default.qout", max_cores=12, scratch_dir="/not/default/scratch/", backup=False) self.assertEqual(myjob.current_command, [ "qchem", "-slurm", "-np", "12", "different.qin", "not_default.qout" ]) myjob.setup() self.assertEqual(putenv_patch.call_args_list[0][0][0], "QCSCRATCH") self.assertEqual(putenv_patch.call_args_list[0][0][1], "/not/default/scratch/")
def test_defaults(self): with patch("moltherm.compute.jobs.os.putenv") as putenv_patch: with patch("moltherm.compute.jobs.shutil.copy") as copy_patch: myjob = QCJob(qchem_command="qchem", max_cores=32) self.assertEqual(myjob.current_command, ["qchem", "-nt", "32", "mol.qin", "mol.qout"]) myjob.setup() self.assertEqual(copy_patch.call_args_list[0][0][0], "mol.qin") self.assertEqual(copy_patch.call_args_list[0][0][1], "mol.qin.orig") self.assertEqual(putenv_patch.call_args_list[0][0][0], "QCSCRATCH") self.assertEqual(putenv_patch.call_args_list[0][0][1], "/dev/shm/qcscratch/") self.assertEqual(putenv_patch.call_args_list[1][0][0], "QCTHREADS") self.assertEqual(putenv_patch.call_args_list[1][0][1], "32") self.assertEqual(putenv_patch.call_args_list[2][0][0], "OMP_NUM_THREADS") self.assertEqual(putenv_patch.call_args_list[2][0][1], "32")
def test_OptFF(self): self.maxDiff = None myjob = QCJob.opt_with_frequency_flattener(qchem_command="qchem", max_cores=32, input_file="test.qin", output_file="test.qout", sp_params=self.sp_params) expected_next = QCJob(qchem_command="qchem", max_cores=32, multimode="openmp", input_file="test.qin", output_file="test.qout", suffix=".opt_0", backup=True).as_dict() self.assertEqual(next(myjob).as_dict(), expected_next) expected_next = QCJob(qchem_command="qchem", max_cores=32, multimode="openmp", input_file="test.qin", output_file="test.qout", suffix=".freq_0", backup=False).as_dict() self.assertEqual(next(myjob).as_dict(), expected_next) self.assertEqual( QCInput.from_file(join( test_dir, "standard/rct_1_471171.in.freq_0")).as_dict(), QCInput.from_file(join(scr_dir, "test.qin")).as_dict()) expected_next = QCJob(qchem_command="qchem", max_cores=32, multimode="openmp", input_file="test.qin", output_file="test.qout", suffix=".sp", backup=True).as_dict() self.assertEqual(next(myjob).as_dict(), expected_next) self.assertEqual( QCInput.from_file(join(test_dir, "standard/rct_1_471171.in.sp")).as_dict(), QCInput.from_file(join(scr_dir, "test.qin")).as_dict()) self.assertRaises(StopIteration, myjob.__next__)
def test_RunQChemCustodian_using_fw_spec_not_defaults(self): with patch("moltherm.compute.fireworks.Custodian") as custodian_patch: firetask = RunQChemCustodian( qchem_cmd=">>qchem_cmd<<", multimode=">>multimode<<", input_file=os.path.join(module_dir, "..", "..", "test_files", "co_qc.in"), output_file="this_is_a_test.qout", max_cores=4, qclog_file="this_is_a_test.qclog", suffix="bad_idea", save_scratch=True, save_name="no_idea", max_errors=137, gzipped_output=False, handler_group="no_handler", scratch_dir=">>scratch_dir<<", ) firetask.run_task( fw_spec={ "_fw_env": { "qchem_cmd": "qchem -slurm", "scratch_dir": "/this/is/a/test", "max_cores": 32, "multimode": "mpi" } }) custodian_patch.assert_called_once() self.assertEqual(custodian_patch.call_args[0][0], []) self.assertEqual( custodian_patch.call_args[0][1][0].as_dict(), QCJob(qchem_command="qchem -slurm", multimode=">>multimode<<", input_file=os.path.join(module_dir, "..", "..", "test_files", "co_qc.in"), output_file="this_is_a_test.qout", max_cores=4, qclog_file="this_is_a_test.qclog", suffix="bad_idea", save_scratch=True, save_name="no_idea", scratch_dir="/this/is/a/test").as_dict()) self.assertEqual(custodian_patch.call_args[1], { "max_errors": 137, "gzipped_output": False })
def test_RunQChemCustodian_using_fw_spec_defaults(self): with patch("moltherm.compute.fireworks.Custodian") as custodian_patch: firetask = RunQChemCustodian(qchem_cmd=">>qchem_cmd<<", scratch_dir=">>scratch_dir<<", input_file=os.path.join( module_dir, "..", "..", "test_files", "co_qc.in"), max_cores=">>max_cores<<", multimode=">>multimode<<") firetask.run_task( fw_spec={ "_fw_env": { "qchem_cmd": "qchem -slurm", "scratch_dir": "/this/is/a/test", "max_cores": 32, "multimode": "openmp" } }) custodian_patch.assert_called_once() self.assertEqual( custodian_patch.call_args[0][0][0].as_dict(), QChemErrorHandler(input_file=os.path.join( module_dir, "..", "..", "test_files", "co_qc.in"), output_file="mol.qout").as_dict()) self.assertEqual( custodian_patch.call_args[0][1][0].as_dict(), QCJob(qchem_command="qchem -slurm", max_cores=">>max_cores<<", multimode=">>multimode<<", input_file=os.path.join(module_dir, "..", "..", "test_files", "co_qc.in"), output_file="mol.qout", scratch_dir="/this/is/a/test").as_dict()) self.assertEqual(custodian_patch.call_args[1], { "max_errors": 5, "gzipped_output": True })
def test_RunQChemCustodian_basic_defaults(self): with patch("moltherm.compute.fireworks.Custodian") as custodian_patch: firetask = RunQChemCustodian(qchem_cmd="qchem", input_file=os.path.join( files_dir, "qchem", "co_qc.in"), max_cores=32) firetask.run_task(fw_spec={}) custodian_patch.assert_called_once() self.assertEqual( custodian_patch.call_args[0][0][0].as_dict(), QChemErrorHandler(input_file=os.path.join( files_dir, "qchem", "co_qc.in"), output_file="mol.qout").as_dict()) self.assertEqual( custodian_patch.call_args[0][1][0].as_dict(), QCJob(qchem_command="qchem", max_cores=32, multimode="openmp", input_file=os.path.join(files_dir, "qchem", "co_qc.in"), output_file="mol.qout").as_dict()) self.assertEqual(custodian_patch.call_args[1], { "max_errors": 5, "gzipped_output": True })
def run_task(self, fw_spec): # initialize variables qchem_cmd = env_chk(self["qchem_cmd"], fw_spec) multimode = self.get("multimode", "openmp") input_file = self.get("input_file", "mol.qin") output_file = self.get("output_file", "mol.qout") max_cores = self.get("max_cores", 32) qclog_file = self.get("qclog_file", "mol.qclog") suffix = self.get("suffix", "") scratch_dir = env_chk(self.get("scratch_dir"), fw_spec) if scratch_dir == None: scratch_dir = "/dev/shm/qcscratch/" save_scratch = self.get("save_scratch", False) save_name = self.get("save_name", "default_save_name") max_errors = self.get("max_errors", 5) max_iterations = self.get("max_iterations", 10) max_molecule_perturb_scale = self.get("max_molecule_perturb_scale", 0.3) job_type = self.get("job_type", "normal") gzipped_output = self.get("gzipped_output", True) sp_params = self.get("sp_params", None) handler_groups = { "default": [ QChemErrorHandler(input_file=input_file, output_file=output_file) ], "no_handler": [] } # construct jobs if job_type == "normal": jobs = [ QCJob(qchem_command=qchem_cmd, multimode=multimode, input_file=input_file, output_file=output_file, max_cores=max_cores, qclog_file=qclog_file, suffix=suffix, scratch_dir=scratch_dir, save_scratch=save_scratch, save_name=save_name) ] elif job_type == "opt_with_frequency_flattener": jobs = QCJob.opt_with_frequency_flattener( qchem_command=qchem_cmd, multimode=multimode, input_file=input_file, output_file=output_file, qclog_file=qclog_file, sp_params=sp_params, max_iterations=max_iterations, max_molecule_perturb_scale=max_molecule_perturb_scale, scratch_dir=scratch_dir, save_scratch=save_scratch, save_name=save_name, max_cores=max_cores) elif job_type == "ts_with_frequency_flattener": jobs = QCJob.ts_with_frequency_flattener( qchem_command=qchem_cmd, multimode=multimode, input_file=input_file, output_file=output_file, qclog_file=qclog_file, ts_guess_method="fsm", max_iterations=max_iterations, max_molecule_perturb_scale=max_molecule_perturb_scale, scratch_dir=scratch_dir, save_scratch=save_scratch, save_name=save_name, max_cores=max_cores) else: raise ValueError("Unsupported job type: {}".format(job_type)) # construct handlers handlers = handler_groups[self.get("handler_group", "default")] c = Custodian(handlers, jobs, max_errors=max_errors, gzipped_output=gzipped_output) c.run()