A Python package and database, developed by the Vlachos Research Group at the University of Delaware implements the F\ irst-P\ rinciples S\ emi-E\ mpirical (FPSE) G\ roup A\ dditivity
(GA) method for estimating thermodynamic properties of molecules. First introduced by Benson et al. for gas molecules and
was later extended by Kua et al. to species adsorbed on catalytic surfaces. GA relies on graph theory defining each molecule
as a collection of groups and their frequency of occurrence. The values of GA groups are determined from DFT-calculated
thermodynamic properties of a (training) set of molecules by linear regression to minimize the difference of thermodynamic
properties of molecules predicted by the GA from those estimated via DFT. This package implements four group additivity
schemes in six databases (See below) and will convert a molecule entered as a S\ implified M\ olecular-I\ nput
L\ ine-E\ ntry S\ ystem (SMILES
_) providing the constituent groups, their frequency of occurrence, and estimated
thermodynamic properties for that molecule. pgradd also provides a general GA framework for implementing a custom group additivity scheme from your ab initio\ data and regression to groups.
.. image:: https://github.com/VlachosGroup/PythonGroupAdditivity/blob/master/docs/pGrAdd_RGB_github.png :target: https://vlachosgroup.github.io/PythonGroupAdditivity/ :align: center
pmutt
_ (GRWSurface2018) Deprecated: Use(PtSurface2023)pmutt
_ (GRWAqueous2018)G.R. Wittreich, D.G. Vlachos, Python Group Additivity (pGrAdd) software for estimating species thermochemical properties Comput. Phys. Commun. 273 (2022) 108277 https://doi.org/10.1016/j.cpc.2021.108277
pmutt
_ >= 1.3.2rdkit
_ >= 2018.03.4.0numpy
_ >= 1.21.5pyyaml
_ >= 6.0scipy
_ >= 1.9.3Install using pip::
pip install --user pgradd
Run the unit tests. Navigate to the tests\ directory, input the command shown below, and look for an OK\ response. (Note:\ The number of tests/time may change with subsequent versions)::
python -m unittest
Ran 40 tests in 7.849s
OK
Look at examples below
This project is licensed under the MIT License - see the LICENSE
_ file for details.
If you have a suggestion or find a bug, please post to our Issues page
_ with
the |enhancement_label| or |bug_label| tag respectively.
Finally, if you would like to add to the body of code, please:
pull request
_.If you are having issues, please post to our Issues page
_ with the help wanted
or question
tag. We
will do our best to assist.
Benson's Gas Group Additivity Example::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('BensonGA')
descriptors = lib.GetDescriptors('C1CO1')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_HoRT(298.15))
Out:
defaultdict(int, {'C(C)(H)2(O)': 2, 'O(C)2': 1, 'Oxirane': 1})
-21.09467743150278
Salciccioli et al. J. Phys. Chem. C, 2012, 116 (2), pp 1873-1886 Example::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('SalciccioliGA2012')
descriptors = lib.GetDescriptors('C([Pt])C[Pt]')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_H(298.15, units='kcal/mol'))
Out:
defaultdict(<class 'int'>, {'C(C)(H)2(Pt)': 2, 'surface-ring strain': 0.217})
-11.307743997749277
Gu et al. J. Phys. Chem. C, 2017, 121 pp 21510–21519 Example::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('GuSolventGA2017Aq')
descriptors = lib.GetDescriptors('C(=O)([Pt])O')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_HoRT(500))
Out:
defaultdict(<class 'int'>, {'CO(O)(Pt)+O(CO)(H)': 1.0})
-109.86212002776878
Wittreich Surface Example::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('GRWSurface2018')
descriptors = lib.GetDescriptors('[Pt]C([Pt])C([Pt])([Pt])C=O')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_HoRT(750), '[Dimensionless]')
print(thermochem.get_H(750, 'kcal/mol'), '[kcal/mol]')
Out:
defaultdict(<class 'int'>, {'C(C)(H)(Pt)2': 1, 'C(C)(CO)(Pt)2': 1, 'CO(C)(H)': 1,
'CPt2CPt2': 1, 'CCPt2': 1, 'surface-ring strain': 0.392})
-13.423119203382337 [Dimensionless]
-20.005853103142883 [kcal/mol]
Wittreich Solvated Surface Example::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('GRWAqueous2018')
descriptors = lib.GetDescriptors('C(=O)([Pt])O')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_HoRT(500), '[Dimensionless]')
print(thermochem.get_H(500, 'kJ/mol'), '[kJ/mol]')
Out:
defaultdict(<class 'int'>, {'CO(O)(Pt)+O(CO)(H)': 1.0})
-107.57909464133714 [Dimensionless]
-447.23102885789655 [kJ/mol]
Xie Ru(0001) Surface Example 1::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('XieGA2022')
descriptors = lib.GetDescriptors('[Ru]C([Ru])C([Ru])([Ru])C')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_HoRT(500), '[Dimensionless]')
print(thermochem.get_H(500, 'kJ/mol'), '[kJ/mol]')
Out:
defaultdict(<class 'int'>, {'C(C)(H)(Ru)2': 1, 'C(C)2(Ru)2': 1, 'C(C)(H)3': 1, 'CRu2CRu2': 1})
-35.040312149773726 [Dimensionless]
-145.6706333743726 [kJ/mol]
Xie Ru(0001) Surface Example 2::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('XieGA2022')
descriptors = lib.GetDescriptors('CCC')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_HoRT(500), '[Dimensionless]')
print(thermochem.get_H(500, 'kJ/mol'), '[kJ/mol]')
Out:
defaultdict(<class 'int'>, {'C(C)(H)3': 2, 'C(C)2(H)2': 1})
-41.49969417868688 [Dimensionless]
-172.52376948049303 [kJ/mol]
Free Energy of Formation by including Entropy of the Elements::
In:
from pgradd.GroupAdd.Library import GroupLibrary
import pgradd.ThermoChem
lib = GroupLibrary.Load('BensonGA')
descriptors = lib.GetDescriptors('CCCCCC')
print(descriptors)
thermochem = lib.Estimate(descriptors,'thermochem')
print(thermochem.get_GoRT(T=298.15, S_elements=True), '[Dimensionless]')
print(thermochem.get_G(T=298.15, units='kJ/mol', S_elements=True), '[kJ/mol]')
Out:
defaultdict(<class 'int'>, {'C(C)(H)3': 2, 'C(C)2(H)2': 4})
-3.1192349163716244 [Dimensionless]
-7.732446702038452 [kJ/mol]
.. |bug_label| image:: https://raw.githubusercontent.com/VlachosGroup/pMuTT/master/docs/source/images/labels/bug_small.png :height: 20 :target: https://github.com/VlachosGroup/PythonGroupAdditivity/issues?utf8=%E2%9C%93&q=label%3Abug
.. |enhancement_label| image:: https://raw.githubusercontent.com/VlachosGroup/pMuTT/master/docs/source/images/labels/enhancement_small.png :height: 20 :target: https://github.com/VlachosGroup/PythonGroupAdditivity/issues?utf8=%E2%9C%93&q=label%3Aenhancement
.. scipy
: https://www.scipy.org/
.. rdkit
: https://www.rdkit.org/
.. numpy
: http://www.numpy.org/
.. pyyaml
: https://pyyaml.org/
.. _SMILES
: https://en.wikipedia.org/wiki/Simplified_molecular-input_line-entry_system
.. pmutt
: https://github.com/VlachosGroup/pMuTT
.. LICENSE
: https://github.com/VlachosGroup/VlachosGroupAdditivity/blob/master/LICENSE.md
.. Issues page
: https://github.com/VlachosGroup/VlachosGroupAdditivity/issues
.. pull request
: https://github.com/VlachosGroup/VlachosGroupAdditivity/pulls