Esempio n. 1
0
    def test_ess_factory(self):
        """Test identifying the electronic structure software from the log file"""
        gaussian_log_path1 = os.path.join(self.data_path, 'gaussian',
                                          'ethylene_G3.log')
        gaussian_log_path2 = os.path.join(self.data_path, 'gaussian',
                                          'oxygen.log')
        molpro_log_path1 = os.path.join(self.data_path, 'molpro',
                                        'HOSI_ccsd_t1.out')
        molpro_log_path2 = os.path.join(self.data_path, 'molpro',
                                        'molpro_mrci+q.out')
        orca_path_1 = os.path.join(self.data_path, 'orca',
                                   'Orca_dlpno_test.log')
        orca_path_2 = os.path.join(self.data_path, 'orca',
                                   'Orca_opt_freq_test.log')
        orca_path_3 = os.path.join(self.data_path, 'orca', 'Orca_TS_test.log')
        qchem_log_path1 = os.path.join(self.data_path, 'qchem', 'CH4_sp.out')
        qchem_log_path2 = os.path.join(self.data_path, 'qchem', 'co.out')
        terachem_log_path_1 = os.path.join(self.data_path, 'terachem',
                                           'ethane_minimize_output.out')
        terachem_log_path_2 = os.path.join(
            self.data_path, 'terachem', 'formaldehyde_sp_terachem_output.out')
        terachem_log_path_3 = os.path.join(
            self.data_path, 'terachem', 'formaldehyde_sp_terachem_results.dat')
        terachem_log_path_4 = os.path.join(self.data_path, 'terachem',
                                           'formaldehyde_coords.xyz')
        terachem_log_path_5 = os.path.join(self.data_path, 'terachem',
                                           'formaldehyde_output.geometry')
        non_ess_log_path = os.path.abspath(
            os.path.join(self.data_path, 'methoxy.py'))

        self.assertIsInstance(ess_factory(gaussian_log_path1), GaussianLog)
        self.assertIsInstance(ess_factory(gaussian_log_path2), GaussianLog)

        self.assertIsInstance(ess_factory(molpro_log_path1), MolproLog)
        self.assertIsInstance(ess_factory(molpro_log_path2), MolproLog)

        for orca_path in [orca_path_1, orca_path_2, orca_path_3]:
            self.assertIsInstance(ess_factory(orca_path), OrcaLog)

        self.assertIsInstance(ess_factory(qchem_log_path1), QChemLog)
        self.assertIsInstance(ess_factory(qchem_log_path2), QChemLog)

        for terachem_path in [
                terachem_log_path_1, terachem_log_path_2, terachem_log_path_3,
                terachem_log_path_4, terachem_log_path_5
        ]:
            self.assertIsInstance(ess_factory(terachem_path), TeraChemLog)

        with self.assertRaises(InputError):
            ess_factory(non_ess_log_path)
Esempio n. 2
0
    def setUp(cls):
        """A method that is run before each unit test in this class"""
        freqpath = os.path.join(RMG_PATH, 'arkane', 'data', 'TolueneFreq.log')
        rotpath = os.path.join(RMG_PATH, 'arkane', 'data', 'TolueneRot1.log')
        log = ess_factory(freqpath)

        conf, unscaled_freqs = log.load_conformer(symmetry=1, spin_multiplicity=1, optical_isomers=1, label='Toulene')
        coordinates, number, mass = log.load_geometry()
        conf.coordinates = (coordinates, "angstroms")
        conf.number = number
        conf.mass = (mass, "amu")

        hessian = log.load_force_constant_matrix()

        cls.hdnd = HinderedRotorClassicalND(pivots=[[3, 12]], tops=[[12, 13, 14, 15]], sigmas=[6.0],
                                            calc_path=rotpath, conformer=conf, F=hessian, semiclassical=True)
Esempio n. 3
0
    def read_scan(self):
        """
        Read quantum optimization job files at self.calc_path to determine
        vectors of angles (self.phi1s, self.phi2s), xyz coordinates (self.xyzs)
        energies (self.Es) and atom numbers (self.atnums) for each point
        """
        from arkane.common import symbol_by_number
        from arkane.ess.factory import ess_factory
        phi1s = []
        phi2s = []
        xyzs = []
        Es = []
        atnums = []
        for f in os.listdir(self.calc_path):
            if len(f.split('_')) != 4:
                continue
            s, name, phi1, phi2 = f.split('_')  # scangeom_r0_0.0_360.0.log
            phi2, identifier = '.'.join(
                phi2.split('.')[:-1]), phi2.split('.')[-1]
            if identifier != 'out':
                continue
            phi1s.append(float(phi1))
            phi2s.append(float(phi2.split(".")[0]))

            fpath = os.path.join(self.calc_path, f)
            lg = ess_factory(fpath)

            Es.append(lg.load_energy())
            xyz, atnums, _ = lg.load_geometry()
            xyzs.append(xyz)

        self.xyzs = xyzs
        self.phi1s = phi1s
        self.phi2s = phi2s
        self.Es = Es
        self.atnums = atnums
        self.element_names = [symbol_by_number[k] for k in self.atnums]
Esempio n. 4
0
    def read_scan(self):
        """
        Read quantum optimization job files at self.calc_path to determine
        vectors of angles self.phis, xyz coordinates (self.xyzs)
        energies (self.Es) and atom numbers (self.atnums) for each point
        """
        from arkane.ess.factory import ess_factory
        if os.path.isdir(self.calc_path):
            massdict = {el.number: el.mass for el in element_list if el.isotope == -1}
            N = len(self.pivots)
            phis = []
            xyzs = []
            Es = []
            atnums = []
            for f in os.listdir(self.calc_path):
                name, identifier = '.'.join(f.split('.')[:-1]), f.split('.')[-1]
                if identifier != 'out':
                    continue
                outs = name.split('_')
                phivals = [float(x) for x in outs[-N:]]
                phivals = fill360s(phivals)

                fpath = os.path.join(self.calc_path, f)
                lg = ess_factory(fpath)
                E = lg.load_energy()
                xyz, atnum, _ = lg.load_geometry()

                for phival in phivals:
                    phis.append(np.array(phival))
                    Es.append(lg.load_energy())
                    xyzs.append(xyz)
                    if not self.atnums:
                        atnums.append(atnum)

            if atnums:
                self.atnums = atnums

            q = len(phis)
            for i in range(N):  # add the negative values to improve fit near 0.0
                for j in range(q):
                    phi = phis[j]
                    if np.isclose(phi[i], 360.0):
                        continue
                    nvec = deepcopy(phi)
                    nvec[i] -= 360.0
                    if any([np.array_equal(nvec, x) for x in phis]):
                        continue
                    phis.append(nvec)
                    Es.append(Es[j])
                    xyzs.append(xyzs[j])
                    atnums.append(atnums[j])

            self.xyzs = np.array(xyzs)

            self.Es = np.array(Es)
            self.E0 = self.Es.min()
            self.Es -= self.E0

            self.phis = np.array(phis)
            self.phis *= np.pi / 180.0

            inds = None
            if len(self.phis[0]) == 1:
                self.phis = np.array([phi[0] for phi in self.phis])
                inds = np.argsort(self.phis)

            self.confs = [
                Conformer(number=self.atnums, coordinates=(self.xyzs[k], "angstrom"),
                          mass=(np.array([massdict[x] for x in self.atnums]), "amu"))
                for k in range(len(self.xyzs))
            ]

            self.rootDs = np.array([
                np.prod([conf.get_internal_reduced_moment_of_inertia(self.pivots[k], self.tops[k], option=3)
                         for k in range(len(self.pivots))]) ** 0.5
                for conf in self.confs
            ])

            if inds is not None:
                self.rootDs = self.rootDs[inds]
                self.phis = self.phis[inds]
                self.Es = self.Es[inds]
                self.xyzs = self.xyzs[inds]
        elif os.path.isfile(self.calc_path):  # reading a 1-D scan file, assume internal reduced moment of inertia is constant
            N = len(self.pivots)
            lg = ess_factory(self.calc_path)
            self.Es, self.phis = lg.load_scan_energies()
            self.atnums = self.conformer.number
            rootD = self.conformer.get_internal_reduced_moment_of_inertia(self.pivots[0], self.tops[0]) ** 0.5
            self.rootDs = [rootD for i in range(len(self.Es))]

            phis = self.phis.tolist()

            for j, phi in enumerate(self.phis):  # add the negative values to improve fit near 0.0
                if phi != 2.0 * np.pi:
                    phis.append(phi - 2.0 * np.pi)

            phis = np.array(phis)
            inds = np.argsort(phis)
            self.phis = phis[inds]
            Es = self.Es.tolist()
            Es.extend(Es[1:])
            self.Es = np.array(Es)[inds]
            self.rootDs.extend(self.rootDs[1:])
            self.rootDs = np.array(self.rootDs)[inds].tolist()

        else:
            raise IOError("path {} is not a file or a directory".format(self.calc_path))