if i in Freq:
            Freq.remove(i)

## get the strucuter from the output file
struc = read(log_file,format='gaussian-out')

## get the ideal gas limit thermodynamic values
thermo = IdealGasThermo(vib_energies=Freq, potentialenergy=scf_energy_eV,
                        atoms=struc, geometry=shape,
                        symmetrynumber=symnum, spin=spin)

print "Ideal Gas Limit"

ZPE = thermo.get_ZPE_correction()
H = thermo.get_enthalpy(temperature=temp)
S = thermo.get_entropy(temperature=temp,pressure=pres)
G = thermo.get_gibbs_energy(temperature=temp,pressure=pres)

print " "
print "ZPE correction (ZPE) = ", ZPE, " eV"
print "Ethalpy (H) = ", H, " eV"
print "Entropy (S) = ", S, " eV/K"
print "Gibbs Energy (G) = ", G, " eV"

## get the harmonic limit thermodynamic values
thermo = HarmonicThermo(vib_energies=Freq, potentialenergy=scf_energy_eV)

print
print "Harmonic Approximation"

ZPE = thermo.get_ZPE_correction()
Exemplo n.º 2
0
class TestStatMech(unittest.TestCase):
    def setUp(self):
        unittest.TestCase.setUp(self)
        # Testing Ideal Gas Model
        CO2 = molecule('CO2')
        CO2_pMuTT_parameters = {
            'name': 'CO2',

            'trans_model': trans.IdealTrans,
            'n_degrees': 3,
            'molecular_weight': get_molecular_weight('CO2'),

            'rot_model': rot.RigidRotor,
            'rot_temperatures': rot.get_rot_temperatures_from_atoms(CO2,
                                                            geometry='linear'),
            'geometry': 'linear',
            'symmetrynumber': 2,

            'elec_model': elec.IdealElec,
            'potentialenergy': -22.994202,
            'spin': 0.,

            'vib_model': vib.HarmonicVib,
            'vib_wavenumbers': [3360., 954., 954., 1890.],
        }
        CO2_ase_parameters = {
            'atoms': CO2,
            'potentialenergy': -22.994202,
            'vib_energies': [c.wavenumber_to_energy(x)
                             for x in CO2_pMuTT_parameters['vib_wavenumbers']],
            'geometry': 'linear',
            'symmetrynumber': 2,
            'spin': 0.
        }
        self.CO2_pMuTT = StatMech(**CO2_pMuTT_parameters)
        self.CO2_ASE = IdealGasThermo(**CO2_ase_parameters)

        self.T0 = c.T0('K')  # K
        self.P0 = c.P0('Pa')
        self.V0 = c.V0('m3')

    def test_get_q(self):
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_q(T=self.T0, ignore_q_elec=True, V=self.V0),
                6.083051624373337e+25)

    def test_get_CvoR(self):
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_CvoR(T=self.T0, V=self.V0),
                2.9422622359004853)

    def test_get_Cv(self):
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_Cv(T=self.T0, V=self.V0, units='J/mol/K'),
                2.9422622359004853*c.R('J/mol/K'))

    def test_get_CpoR(self):
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_CpoR(T=self.T0, V=self.V0),
                3.9422622359004853)

    def test_get_Cp(self):
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_Cp(T=self.T0, V=self.V0, units='J/mol/K'),
                3.9422622359004853*c.R('J/mol/K'))

    def test_get_EoRT(self):
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_EoRT(T=self.T0),
                -894.97476277965)
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_EoRT(T=self.T0, include_ZPE=True),
                -877.703643641077)

    def test_get_E(self):
        np.testing.assert_almost_equal(
            self.CO2_pMuTT.get_E(T=self.T0, units='J/mol'),
            -894.97476277965*c.R('J/mol/K')*self.T0)
        np.testing.assert_almost_equal(
            self.CO2_pMuTT.get_E(T=self.T0, units='J/mol', include_ZPE=True),
            -877.703643641077*c.R('J/mol/K')*self.T0, decimal=2)

    def test_get_UoRT(self):
        np.testing.assert_almost_equal(
                self.CO2_pMuTT.get_UoRT(T=self.T0, V=self.V0),
                -875.1095022368354)

    def test_get_U(self):
        np.testing.assert_almost_equal(
            self.CO2_pMuTT.get_U(T=self.T0, V=self.V0, units='J/mol'),
            -875.1095022368354*c.R('J/mol/K')*self.T0)

    def test_get_HoRT(self):
        expected_HoRT_CO2 = \
            self.CO2_ASE.get_enthalpy(temperature=self.T0, verbose=False) \
            / c.R('eV/K')/self.T0
        calc_HoRT_CO2 = self.CO2_pMuTT.get_HoRT(T=self.T0)
        np.testing.assert_almost_equal(expected_HoRT_CO2, calc_HoRT_CO2)

    def test_get_H(self):
        expected_H_CO2 = \
            self.CO2_ASE.get_enthalpy(temperature=self.T0, verbose=False)
        calc_H_CO2 = self.CO2_pMuTT.get_H(T=self.T0, units='eV')
        np.testing.assert_almost_equal(expected_H_CO2, calc_H_CO2)

    def test_get_SoR(self):
        expected_SoR_CO2 = \
            self.CO2_ASE.get_entropy(temperature=self.T0, pressure=self.P0,
                                     verbose=False)/c.R('eV/K')
        calc_SoR_CO2 = self.CO2_pMuTT.get_SoR(T=self.T0, V=self.V0)
        np.testing.assert_almost_equal(expected_SoR_CO2, calc_SoR_CO2, 3)

    def test_get_S(self):
        expected_S_CO2 = \
            self.CO2_ASE.get_entropy(temperature=self.T0, pressure=self.P0,
                                     verbose=False)
        calc_S_CO2 = self.CO2_pMuTT.get_S(
                                          T=self.T0,
                                          V=self.V0,
                                          units='eV/K')
        np.testing.assert_almost_equal(expected_S_CO2, calc_S_CO2, 1)

    def test_get_FoRT(self):
        np.testing.assert_almost_equal(
            self.CO2_pMuTT.get_FoRT(T=self.T0, V=self.V0),
            -900.5899966269182)

    def test_get_F(self):
        np.testing.assert_almost_equal(
            self.CO2_pMuTT.get_F(T=self.T0, V=self.V0, units='J/mol'),
            -900.5899966269182*c.R('J/mol/K')*self.T0)

    def test_get_GoRT(self):
        expected_GoRT_CO2 = \
            self.CO2_ASE.get_gibbs_energy(temperature=self.T0,
                                          pressure=self.P0,
                                          verbose=False)/c.R('eV/K')/self.T0
        calc_GoRT_CO2 = self.CO2_pMuTT.get_GoRT(T=self.T0, V=self.V0)
        np.testing.assert_almost_equal(expected_GoRT_CO2, calc_GoRT_CO2, 3)

    def test_get_G(self):
        expected_G_CO2 = \
            self.CO2_ASE.get_gibbs_energy(temperature=self.T0,
                                          pressure=self.P0,
                                          verbose=False)
        calc_G_CO2 = self.CO2_pMuTT.get_G(
                                          T=self.T0,
                                          V=self.V0,
                                          units='eV')
        np.testing.assert_almost_equal(expected_G_CO2, calc_G_CO2, 5)
Exemplo n.º 3
0
class TestStatMech(unittest.TestCase):
    def setUp(self):
        unittest.TestCase.setUp(self)
        # Testing Ideal Gas Model
        CO2 = molecule('CO2')
        CO2_PyMuTT_parameters = {
            'trans_model':
            trans.IdealTrans,
            'n_degrees':
            3,
            'molecular_weight':
            get_molecular_weight('CO2'),
            'rot_model':
            rot.RigidRotor,
            'rot_temperatures':
            rot.get_rot_temperatures_from_atoms(CO2, geometry='linear'),
            'geometry':
            'linear',
            'symmetrynumber':
            2,
            'elec_model':
            elec.IdealElec,
            'potentialenergy':
            -22.994202,
            'spin':
            0.,
            'vib_model':
            vib.HarmonicVib,
            'vib_wavenumbers': [3360., 954., 954., 1890.],
        }
        CO2_ase_parameters = {
            'atoms': CO2,
            'potentialenergy': -22.994202,
            'vib_energies': [c.wavenumber_to_energy(x) \
                for x in CO2_PyMuTT_parameters['vib_wavenumbers']],
            'geometry':'linear',
            'symmetrynumber': 2,
            'spin': 0.
        }
        self.CO2_PyMuTT = StatMech(**CO2_PyMuTT_parameters)
        self.CO2_ASE = IdealGasThermo(**CO2_ase_parameters)

        self.T0 = c.T0('K')  # K
        self.P0 = c.P0('Pa')
        self.V0 = c.V0('m3')

    def test_get_q(self):
        self.assertAlmostEqual(
            self.CO2_PyMuTT.get_q(T=self.T0, ignore_q_elec=True, V=self.V0),
            6.083051624373337e+25)

    def test_get_CvoR(self):
        self.assertAlmostEqual(self.CO2_PyMuTT.get_CvoR(T=self.T0, V=self.V0),
                               2.9422622359004853)

    def test_get_CpoR(self):
        self.assertAlmostEqual(self.CO2_PyMuTT.get_CpoR(T=self.T0, V=self.V0),
                               3.9422622359004853)

    def test_get_UoRT(self):
        self.assertAlmostEqual(self.CO2_PyMuTT.get_UoRT(T=self.T0, V=self.V0),
                               -875.1095022368354)

    def test_get_HoRT(self):
        expected_HoRT_CO2 = \
            self.CO2_ASE.get_enthalpy(temperature=self.T0, verbose=False) \
            /c.R('eV/K')/self.T0
        calc_HoRT_CO2 = self.CO2_PyMuTT.get_HoRT(T=self.T0)
        self.assertTrue(np.isclose(expected_HoRT_CO2, calc_HoRT_CO2))

    def test_get_SoR(self):
        expected_SoR_CO2 = \
            self.CO2_ASE.get_entropy(temperature=self.T0, pressure=self.P0,
                verbose=False)/c.R('eV/K')
        calc_SoR_CO2 = self.CO2_PyMuTT.get_SoR(T=self.T0, V=self.V0)
        self.assertTrue(np.isclose(expected_SoR_CO2, calc_SoR_CO2))

    def test_get_AoRT(self):
        self.assertAlmostEqual(self.CO2_PyMuTT.get_AoRT(T=self.T0, V=self.V0),
                               -900.5899966269182)

    def test_get_GoRT(self):
        expected_GoRT_CO2 = \
            self.CO2_ASE.get_gibbs_energy(temperature=self.T0, pressure=self.P0,
               verbose=False)/c.R('eV/K')/self.T0
        calc_GoRT_CO2 = self.CO2_PyMuTT.get_GoRT(T=self.T0, V=self.V0)
        self.assertTrue(np.isclose(expected_GoRT_CO2, calc_GoRT_CO2))