Example #1
0
 def process_qchem_multirun(dir_name, input_files, output_files):
     """
     Process a QChem run which is known to include multiple calculations
     in a single input/output pair.
     """
     if len(input_files) != 1:
         raise ValueError(
             "ERROR: The drone can only process a directory containing a single input/output pair when each include multiple calculations."
         )
     else:
         for key in input_files:
             to_return = []
             qchem_input_file = os.path.join(dir_name, input_files.get(key))
             qchem_output_file = os.path.join(dir_name,
                                              output_files.get(key))
             multi_out = QCOutput.multiple_outputs_from_file(
                 QCOutput, qchem_output_file, keep_sub_files=False)
             multi_in = QCInput.from_multi_jobs_file(qchem_input_file)
             for ii, out in enumerate(multi_out):
                 d = out.data
                 d["input"] = {}
                 d["input"]["molecule"] = multi_in[ii].molecule
                 d["input"]["rem"] = multi_in[ii].rem
                 d["input"]["opt"] = multi_in[ii].opt
                 d["input"]["pcm"] = multi_in[ii].pcm
                 d["input"]["solvent"] = multi_in[ii].solvent
                 d["task"] = {"type": key, "name": "calc" + str(ii)}
                 to_return.append(d)
         return to_return
Example #2
0
def run_QChem(label,
              encode=None,
              rem=None,
              pcm=None,
              solvent=None,
              more_info=None,
              self_correct=True):
    inname = label + '.inp'
    outname = label + '.out'
    logname = label + '.log'
    command = 'qchem'
    handlers = [QChemErrorHandler(input_file=inname, output_file=outname)]
    """If no encoding provided, assume this is the first Firework in workflow and that input file is already written.
    'label' is the name of the file without the extension (e.g. .inp, .out). otherwise, take encoding, 
    form new QCInput and write input file, then run.
    """
    if encode != None:
        qcin = encode_to_QCInput(encode=encode,
                                 rem=rem,
                                 pcm=pcm,
                                 solvent=solvent)
        qcin.write_file(inname)

    if self_correct:
        jobs = [
            QCJob(input_file=inname,
                  output_file=outname,
                  qchem_command=command,
                  max_cores=multiprocessing.cpu_count(),
                  qclog_file=logname)
        ]
        c = Custodian(handlers, jobs, max_errors=10)
        c.run()
    else:
        job = QCJob(input_file=inname,
                    output_file=outname,
                    qchem_command=command,
                    max_cores=multiprocessing.cpu_count(),
                    qclog_file=logname)
        job.setup()
        p = job.run()
        p.wait()
        """
        qclog = open(logname, "w")
        current_command = ['qchem', '-nt', '20',inname]
        print(current_command)
        subprocess.run(current_command, stdout=qclog, shell=True)
        """

    try:
        output = [QCOutput(filename=outname)]
    except:
        output = QCOutput.multiple_outputs_from_file(QCOutput, filename)
    return QCOutput_to_encode(output, more_info=more_info)
Example #3
0
 def generate_multi_job_dict():
     """
     Used to generate test dictionary for multiple jobs.
     """
     multi_job_dict = {}
     for file in multi_job_out_names:
         outputs = QCOutput.multiple_outputs_from_file(
             QCOutput, os.path.join(test_dir, file), keep_sub_files=False)
         data = []
         for sub_output in outputs:
             data.append(sub_output.data)
         multi_job_dict[file] = data
     dumpfn(multi_job_dict, "multi_job.json")
Example #4
0
 def generate_multi_job_dict():
     """
     Used to generate test dictionary for multiple jobs.
     """
     multi_job_dict = {}
     for file in multi_job_out_names:
         outputs = QCOutput.multiple_outputs_from_file(
             QCOutput, os.path.join(test_dir, file), keep_sub_files=False)
         data = []
         for sub_output in outputs:
             data.append(sub_output.data)
         multi_job_dict[file] = data
     dumpfn(multi_job_dict, "multi_job.json")
Example #5
0
    def test_all(self):
        single_outs = dict()
        for file in single_job_out_names:
            single_outs[file] = QCOutput(os.path.join(test_dir, file)).data

        multi_outs = dict()
        for file in multi_job_out_names:
            multi_outs[file] = QCOutput.multiple_outputs_from_file(
                QCOutput, os.path.join(test_dir, file), keep_sub_files=False)

        for key in property_list:
            print('Testing ', key)
            self._test_property(key, single_outs, multi_outs)
Example #6
0
    def test_all(self):
        single_outs = dict()
        for file in single_job_out_names:
            single_outs[file] = QCOutput(os.path.join(test_dir, file)).data

        multi_outs = dict()
        for file in multi_job_out_names:
            multi_outs[file] = QCOutput.multiple_outputs_from_file(QCOutput,
                                                                   os.path.join(test_dir, file),
                                                                   keep_sub_files=False)

        for key in property_list:
            print('Testing ', key)
            self._test_property(key, single_outs, multi_outs)
Example #7
0
    def test_all(self):
        self.maxDiff = None
        single_outs = {}
        for file in single_job_out_names:
            single_outs[file] = QCOutput(os.path.join(PymatgenTest.TEST_FILES_DIR, "molecules", file)).data

        multi_outs = {}
        for file in multi_job_out_names:
            multi_outs[file] = QCOutput.multiple_outputs_from_file(
                QCOutput, os.path.join(PymatgenTest.TEST_FILES_DIR, "molecules", file), keep_sub_files=False
            )

        for key in property_list:
            print("Testing ", key)
            self._test_property(key, single_outs, multi_outs)
Example #8
0
 def _test_property(self, key):
     for file in single_job_out_names:
         try:
             self.assertEqual(QCOutput(os.path.join(test_dir, file)).data.get(
                 key), single_job_dict[file].get(key))
         except ValueError:
             self.assertArrayEqual(QCOutput(os.path.join(test_dir, file)).data.get(
                 key), single_job_dict[file].get(key))
     for file in multi_job_out_names:
         outputs = QCOutput.multiple_outputs_from_file(
             QCOutput, os.path.join(test_dir, file), keep_sub_files=False)
         for ii, sub_output in enumerate(outputs):
             try:
                 self.assertEqual(sub_output.data.get(
                     key), multi_job_dict[file][ii].get(key))
             except ValueError:
                 self.assertArrayEqual(sub_output.data.get(
                     key), multi_job_dict[file][ii].get(key))
Example #9
0
 def _test_property(self, key):
     for file in single_job_out_names:
         try:
             self.assertEqual(
                 QCOutput(os.path.join(test_dir, file)).data.get(key),
                 single_job_dict[file].get(key))
         except ValueError:
             self.assertArrayEqual(
                 QCOutput(os.path.join(test_dir, file)).data.get(key),
                 single_job_dict[file].get(key))
     for file in multi_job_out_names:
         outputs = QCOutput.multiple_outputs_from_file(QCOutput,
                                                       os.path.join(
                                                           test_dir, file),
                                                       keep_sub_files=False)
         for ii, sub_output in enumerate(outputs):
             try:
                 self.assertEqual(sub_output.data.get(key),
                                  multi_job_dict[file][ii].get(key))
             except ValueError:
                 self.assertArrayEqual(sub_output.data.get(key),
                                       multi_job_dict[file][ii].get(key))