Example #1
0
 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")
Example #2
0
 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/")
Example #3
0
 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")
Example #4
0
 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__)
Example #5
0
 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
         })
Example #6
0
 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
         })
Example #7
0
 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
         })
Example #8
0
    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()