- 1.1 Introduction
- 1.1.1 A Walk Through a Computational Catalyst Design Process: Methanation
- 1.2 Starting from the Electronic Structure
- 1.2.1 Density Functional Theory
- 1.2.2 The d-Band Model
- 1.3 Identifying the Right Descriptor Set
- 1.3.1 Scaling Relations for Surface Intermediates
- 1.3.2 Scaling Relations for Transition States: The Brønsted–Evans–Polanyi Relationship
- 1.4 The Sabatier Principle and the Volcano Curve
- 1.4.1 Sabatier Analysis
- 1.5 Sabatier Analysis in Practice
- 1.5.1 First Example: Ammonia Synthesis
- 1.5.2 Second Example: CO Oxidation
- 1.6 Notes on Microkinetic Modeling
- 1.6.1 Numerical Solution Strategies
- 1.6.2 Entropy and Enthalpy Corrections
- 1.6.3 Microkinetic Model Analysis
- 1.7 CO Oxidation Catalyst Screening
- 1.7.1 Numerical Microkinetic Model
- 1.7.2 Degree of Rate and Catalyst Control
- 1.7.3 Two-dimensional CO Oxidation Volcano
- 1.7.4 Effect of Lateral Interactions
- 1.8 Conclusions
- Appendix
- References
Chapter 1: Computational Catalyst Screening
-
Published:20 Dec 2024
-
Special Collection: 2024 eBook CollectionSeries: Catalysis Series
L. C. Grabow, in Computational Catalysis, ed. A. Asthagiri and M. Janik, Royal Society of Chemistry, 2nd edn, 2024, vol. 48, ch. 1, pp. 1-59.
Download citation file:
Computational screening of heterogeneous catalysts based on reactivity descriptors is a very powerful method for rapid identification of promising novel catalyst candidates. This chapter outlines the overall procedure based on examples from the literature and provides step-by-step instructions with solved numerical problems for NH3 synthesis and CO oxidation on transition metal surfaces. The theoretical foundations of the screening approach, including the d-band model, linear scaling relations, Sabatier analysis, basic microkinetic modeling and the analysis of such models, are explained at the level necessary for a novice to perform an independent screening study for other transition metal catalyzed reactions. More experienced readers may find the references for suggested additional reading and resources useful.
1.1 Introduction
Brute-force attacks are known in cryptography as (typically illegal) attempts to hack into encrypted data by systematically trying all possible key combinations of letters, digits and special characters until the correct access key or password has been found. Although a brute-force attack is guaranteed to be successful, its application is limited to very small problems because of the time required to generate and test all possible key combinations. For example, a standard 128-bit encryption key has 2128 possible permutations. If we simply assume that a typical central processing unit (CPU) can generate 109 bit flips per second (approximately 1 GHz), then the total time that is required to test all possible permutations is 2128/109 which equals 3.4 × 1029 seconds or 1022 years! For obvious reasons a brute-force attack is probably going to fail for this problem and a more targeted strategy is needed.
The above example illustrates the shortcomings of a brute-force attack, but a variation of it is still one of the most widely used strategies for the development of heterogeneous catalysts in practice. By using a combinatorial chemistry approach with completely automated, high-throughput experimentation equipment, it is possible to synthesize and test enormous libraries of catalysts for their catalytic activity for a specific reaction. A good example is the search for advanced water–gas shift catalysts, in which Yaccato et al. synthesized over 50 000 catalysts and tested them in more than 250 000 experiments for low, medium and high temperature water–gas shift conditions.1 Their effort led to a proprietary noble metal catalyst that can reduce the reactor volume by an order of magnitude without increasing the reactor cost. Although this trial-and-error approach almost always leads to an acceptable catalyst, the search space is restricted by the amount of time and resources available and many, possibly far better, candidates can be missed. The quickly evolving alternative to experimental high-throughput catalyst testing is computational catalyst screening. This approach relies on the fact that the catalyst activity for many catalytic reactions is usually determined by a small number of descriptors, which can be calculated from first-principles density functional theory (DFT) simulations and stored in a database. Populating this database with features or properties from data is the most time-consuming step in this process, but the resulting database has to be generated only once and its content may be used to engineer features that describe catalytic activity trends for other reactions. With a comprehensive database in place, it becomes a very easy task to screen thousands of database records in a short amount of time to identify catalyst candidates that possess descriptor values within the optimal range for a given reaction. Although the computational screening process can still be interpreted as a brute-force attack, the complexity of the problem has been greatly reduced. Hence, the number of materials that can be screened computationally increases drastically when compared with the experimental approach. The list of catalysts that fall into the desired range of descriptor values may be narrowed down further by using cost, stability, environmental friendliness, or any other applicable criteria.2,3 The remaining materials can then be synthesized and experimentally tested under realistic reaction conditions. In general, not all computationally screened candidates will be good catalysts, but good catalysts will usually be included in the candidate list.
Somorjai and Li have recently reviewed the major advances in modern surface science that only became possible through the successful symbiosis of theory and surface-sensitive experimental techniques.4 The recent literature also contains several examples where a descriptor-based approach, both theoretically and experimentally, has led to the discovery of new catalytic materials. The following list should not be understood as an exhaustive review, but is meant to serve as inspiration to the reader and to demonstrate the wide applicability of this method. Early on, Besenbacher et al. discovered graphite resistant Ni–Au alloy catalysts for steam reforming,5 Jacobsen et al. found an active Co–Mo alloy for ammonia synthesis by interpolation in the periodic table,6 and Toulhoat and Raybaud showed that the metal–sulfur bond strength can correctly predict trends in hydro-desulfurization activity on metal–sulfide catalysts.7 These initial successes were followed by other prominent examples that include CO-tolerant fuel cell anodes,8,9 Cu–Ag alloys as selective ethylene epoxidation catalysts,10 near-surface alloys for hydrogen activation11 and evolution,2,12 Ru–Pt core–shell particles for preferential CO oxidation,13 Ni–Zn alloys for the selective hydrogenation of acetylene,14 Sc and Y modified Pt and Pd electrodes15 and mixed-metal Pt monolayer catalysts16 for electrochemical oxygen reduction, and the rediscovery of Pt as the most active and selective catalyst for the production of hydrogen cyanide.17,18
1.1.1 A Walk Through a Computational Catalyst Design Process: Methanation
The most comprehensive example of a success story in computational catalyst design comes from the group of Jens Nørskov, who pioneered the descriptor-based design approach and applied it to numerous reactions.19,20 In several publications his group has studied the methanation reaction (CO + 2H2 → CH4 + H2O), starting from a detailed electronic structure analysis and leading to the development of a patented technical methanation catalyst based on a Fe–Ni alloy.21–25 In the beginning of any descriptor-based design study the first question that must be answered is: “What is the most suitable reactivity descriptor for the reaction?” This question is typically answered by thoroughly studying the underlying reaction mechanism and identifying the rate-limiting step and most abundant surface intermediates. However, intuition can sometimes replace a detailed mechanistic study and a descriptor can be found through an educated guess. In the case of the methanation reaction, CO dissociation is the most critical step in the reaction mechanism. For weakly interacting metal catalysts, the dissociation is rate limiting, whereas for strongly interacting catalysts, the surface is poisoned by adsorbed C and O atoms. This leads to the volcano curve shown in Figure 1.1(a), which shows the experimentally measured methanation activity as a function of the calculated CO dissociation energy. The top of the volcano corresponds to the maximum methanation activity and indicates the optimal value of the CO dissociation energy, which is the activity descriptor in this case. The next step in the catalyst design process is to screen a database of CO dissociation energies and search for catalysts with CO dissociation energies near the optimum. This screening may be combined with a cost estimation of the resulting material and can further be linked to a stability test. Figure 1.1(b) and (c) show Pareto plots of binary transition metal alloys for which the CO dissociation energy was estimated through a simple interpolation scheme owing to the lack of an existing database. The most active catalysts, characterized by CO dissociation energies close to the optimum, lie to the left of the graph and are connected with a solid line indicating the Pareto-optimal set. The Pareto-optimal set of Figure 1.1(b) contains the cheapest catalysts for a given value of CO dissociation energies and, similarly, Figure 1.1(c) can be used to screen for alloy stability. Only alloys with a negative alloy formation energy are stable and their stability increases as the alloy formation energy becomes more negative. Upon careful inspection, it is apparent that FeNi3 is not only contained in both sets, but it is also located at the “knee” of the activity Pareto-optimal set, which indicates that neighboring solutions are worse with respect to either activity or cost. Clearly, FeNi3 is a very promising catalyst candidate for the methanation reaction. This catalyst identification step concludes the theoretical design process and experimental verification of the theoretical prediction is necessary. Experimentally obtained methanation rates of Fe–Ni alloys as a function of Ni content are displayed in Figure 1.1(d) and clearly show that the computationally predicted FeNi3 alloy is significantly more active than the alternatives. As an outcome of this tour de force in computational catalyst design, a process based on Fe–Ni alloys has been patented for the hydrogenation of carbon oxides.24
Computational design of a technical methanation catalyst. (a) A characteristic volcano curve is obtained when the experimentally determined methanation activity is plotted as a function of the CO dissociation energy. (b) and (c) Pareto-optimal bimetallic catalysts in terms of cost and stability. Ediss(optimal) refers to the optimal CO dissociation energy corresponding to the maximum of the activity volcano in panel (a). (d) Measured methanation activity of binary Fe–Ni alloys at T = 548 K, 2% CO in 1 bar H2 as a function of Ni content. (a), (b) and (d) Reproduced from ref. 15 with permission from Springer Nature, Copyright 2009. (c) Reproduced from ref. 25 with permission from IOP Publishing, Copyright 2009.
Computational design of a technical methanation catalyst. (a) A characteristic volcano curve is obtained when the experimentally determined methanation activity is plotted as a function of the CO dissociation energy. (b) and (c) Pareto-optimal bimetallic catalysts in terms of cost and stability. Ediss(optimal) refers to the optimal CO dissociation energy corresponding to the maximum of the activity volcano in panel (a). (d) Measured methanation activity of binary Fe–Ni alloys at T = 548 K, 2% CO in 1 bar H2 as a function of Ni content. (a), (b) and (d) Reproduced from ref. 15 with permission from Springer Nature, Copyright 2009. (c) Reproduced from ref. 25 with permission from IOP Publishing, Copyright 2009.
In the remainder of this chapter, the background information that leads to the identification of appropriate catalyst descriptors (e.g. the d-band model, scaling relationships) is reviewed and the basic strategy for successful catalyst screening using various levels of detail (e.g. Sabatier rate vs. microkinetic model) is outlined. A step-by-step illustration of the method will be given using ammonia synthesis and CO oxidation as examples. The interested reader is encouraged to work through the examples independently at their own pace.
1.2 Starting from the Electronic Structure
1.2.1 Density Functional Theory
Computational catalyst screening would not be possible without the existence of a theory that enables calculation of the chemical properties of the catalyst and the reaction of interest. Fortunately, in the mid 1960s Hohenberg, Kohn and Sham published two seminal papers formulating two theorems, which led to the development of density functional theory (DFT).26,27 The contributions of Walter Kohn to the development of this theory were later honored in 1998 with the Nobel Prize in Chemistry. DFT is nowadays widely used in many different areas of science and engineering, including computational chemistry, catalysis, materials science, physics, and geology. The two theorems can be summarized as:
-
Theorem 1. The ground state properties of a many-electron system are uniquely determined by the electron density.
-
Theorem 2. The total energy of a system has a minimum for the ground state electron density.
An obvious extension to the LDA is the generalized gradient approximation (GGA), which depends not only on the local density but on the density gradient. Because the gradient correction can be implemented into a GGA functional in many different ways, there exist a variety of different GGA flavors. The most widely used GGA functionals are the Perdew–Wang 91 (PW91)28,29 and the Perdew–Burke–Ernzerhof (PBE)30 functional. Both GGA functionals have good accuracy for a wider range of problems than the LDA because they contain more physical information; however, they are not necessarily always better. The PBE functional was later revised by Hammer, Hansen and Nørskov [revised PBE (RPBE)], to improve the accuracy of chemisorption energies of atoms and small molecules on transition metal surfaces.31 These GGA functionals are very good general-purpose functionals and may be used as a starting point for computational catalyst design. However, the GGA still fails for problems such as the accurate prediction of band gaps in semiconductors, systems where van der Waals interactions are dominant, or for electronic structure calculations in materials with strongly correlated electrons, where self-interaction errors can be encountered. Several improvements to the GGA have been suggested [e.g. DFT + on-site Coulomb interactions (DFT + U), dispersion corrected DFT (DFT-D), meta-GGA, hybrid-GGA], but many of these functionals are problem specific or contain adjustable parameters that need to be fitted for each system. This empirical nature, along with the increased computational effort, renders these functionals generally unsuitable for computational catalyst screening. Work to improve XC functionals further is ongoing in the community, and in the next few years faster computers and new functionals will have a positive effect on the quality of DFT calculations.
Although DFT calculations are at the heart of computational catalysis, it is not strictly necessary to perform the calculations for every catalyst design project. DFT calculations for many reactions have already been published and efforts are undertaken to make these data easily available to the whole catalysis community, even on mobile devices. Yes, there is an app for that!32 However, even a non-DFT expert should understand the basic principles that underlie the theoretical results, before using them in a research project. For those readers that have a deeper interest in DFT and want to perform their own calculations, the tutorial-style book Density Functional Theory – A Practical Introduction by David S. Sholl and Janice A. Steckel is a highly recommended starting point.33
1.2.2 The d-Band Model
Computational catalyst screening relies on the prediction of correct trends across different catalysts rather than the prediction of quantitative rates and selectivities for each catalyst. Understanding the origin of the observed trends in terms of the underlying electronic structure can therefore be very helpful during the screening process. For transition metal surfaces, trends in reactivity can be very well described and understood in terms of the d-band model (Figure 1.2) developed by Hammer and Nørskov.34,35
Schematic density of states (DOS) illustration of the d-band model. The interaction of an adsorbate state with a transition metal can be thought of as a two-step process. The interaction with the broad s-band leads to a broadening and downshift of the adsorbate states. The adsorbate states split into bonding and anti-bonding states upon interaction with the narrow transition metal d-band. Anti-bonding states that are above the Fermi level remain empty and do not weaken the chemisorption. Reproduced from ref. 20 with permission from National Academy of Sciences; and original content of figure reproduced from ref. 71 with permission from Springer Nature, Copyright 2005.
Schematic density of states (DOS) illustration of the d-band model. The interaction of an adsorbate state with a transition metal can be thought of as a two-step process. The interaction with the broad s-band leads to a broadening and downshift of the adsorbate states. The adsorbate states split into bonding and anti-bonding states upon interaction with the narrow transition metal d-band. Anti-bonding states that are above the Fermi level remain empty and do not weaken the chemisorption. Reproduced from ref. 20 with permission from National Academy of Sciences; and original content of figure reproduced from ref. 71 with permission from Springer Nature, Copyright 2005.
A schematic drawing of the bonding structure in a hydrogen molecule is likely to have been presented in chemistry classes. Upon bond formation, the two atomic orbitals form two new molecular orbitals, and they can be classified as a bonding and an anti-bonding orbital. In the case of a hydrogen molecule, two electrons can distribute into these orbitals and since each orbital can accommodate up to two electrons, naturally both electrons occupy the lower-lying bonding orbital. The energy that is gained by stabilizing the electrons in this process is the bond energy.
1.3 Identifying the Right Descriptor Set
If you have ever played the party game “Taboo” you have experienced how hard it can be to describe a target word or object without using the five most closely related words listed on the card. On the other hand, if you were allowed to mention only the five forbidden words, your teammates would probably guess the target word immediately. Think of these five taboo words as the descriptors that we need to guess the performance of our catalyst. Choosing the right descriptors is the key to a successful descriptor-based catalyst design study and it needs to be done carefully.
The ideal set of descriptors needs to fulfill two conflicting requirements. First and foremost, the descriptor set has to be large enough to enable predictions that are sufficiently accurate to serve the purpose of the study. For simple reactions, a single descriptor may be sufficient to describe qualitatively the activity trends across different catalyst materials. However, product selectivity, for example, is often more sensitive to the input parameters and may require additional descriptors. If quantitative results are desired, then the number of required descriptors quickly approaches the total number of enthalpy and entropy parameters in a reaction network, which defeats the purpose of reducing the complexity of the problem by introducing the concept of descriptors. In fact, reducing the complexity is the second most important requirement that the descriptors must meet. The set of descriptors should be as small as needed to capture catalytic trends and enable fast and efficient screening for new catalyst materials.
There is no strict rule for the “correct” choice of descriptors; in fact, for most cases there is more than one set of descriptors and all of them may be equally viable. A descriptor can be any measurable intrinsic quantity of the catalyst (e.g. the d-band center), but most often descriptors are binding energies of key intermediates inferred from the detailed knowledge of the dominant reaction mechanism and the kinetically relevant steps. This information can be obtained from mechanistic studies using DFT in combination with kinetic measurements and modeling. Alternatively, the existence of scaling relations for surface intermediates and transition states can guide the descriptor selection process. These scaling relations have their physical roots in the d-band model and are discussed next.
1.3.1 Scaling Relations for Surface Intermediates
The binding energy of an adsorbed molecule is determined by the number and strength of the chemical bonds that it forms with the surface. To a first approximation these bonds can be considered to form independently of each other and it can be assumed that the bond strength only depends on the two types of atoms involved in the bond formation. In this simple picture, it would be sufficient to know through which atoms a molecule binds to the catalyst surface in order to predict its adsorption energy. Indeed, it has been shown that the adsorption energies of adsorbates within a family of similar adsorbates can be predicted using this simple idea. The resulting linear scaling relationships can be used to predict unknown adsorption energies from the adsorption energies of related surface species.37,38 The accuracy of linear scaling relations is generally adequate to predict catalytic trends correctly, but the average errors (0.2–0.3 eV) are too large for quantitative predictions. However, in the context of computational screening, in which the relative order of different transition metal catalysts is the sole subject of interest, these errors are acceptable.
1.3.1.1 Hydrogen-containing Molecules
Linear scaling relationships on close-packed terraces (black), step sites (red) and the FCC(100) surface (blue) of hydrogen-containing molecules of the type AHx with A = C, N, O, S. Reproduced from ref. 37 with permission from American Physical Society, Copyright 2007.
Linear scaling relationships on close-packed terraces (black), step sites (red) and the FCC(100) surface (blue) of hydrogen-containing molecules of the type AHx with A = C, N, O, S. Reproduced from ref. 37 with permission from American Physical Society, Copyright 2007.
The first observation is that the slope of the scaling relation does not depend on the surface geometry and is constant for any given adsorbate. This is best seen in the case of the OH adsorption energy, ΔEOH, which scales with a slope of approximately 1/2 with respect to the adsorption energy of oxygen, ΔEO, on all three different surfaces. The same generalization applies to all the other adsorbates and can easily be rationalized using the simple binding picture, where the adsorption energy depends on the number and the type of bonds a molecule forms with the surface. For example, carbon has four valence electrons and likes to form four C–H bonds. If these H atoms are removed in a stepwise fashion, the unsatisfied carbon valencies start to interact with the catalyst surface and form C–M bonds (‘M’ denotes a metal atom on the catalyst surface) as depicted in Figure 1.4. When moving from one metal to another the C–M bond strength changes and the simple bond order method can be used to estimate how this change affects the adsorption energy of the CHx species.
1.3.1.2 Extension to More Complex Surface Intermediates
Linear scaling relations for complex adsorbates. (a) Parity plot of CHx–NHy adsorption energies predicted from scaling and the DFT reference calculations. (b) Linear scaling of C2H4 and C2H6 with methyl (CH3). Reproduced from ref. 14 with permission from AAAS, Copyright 2008.
Linear scaling relations for complex adsorbates. (a) Parity plot of CHx–NHy adsorption energies predicted from scaling and the DFT reference calculations. (b) Linear scaling of C2H4 and C2H6 with methyl (CH3). Reproduced from ref. 14 with permission from AAAS, Copyright 2008.
Even without deriving scaling relations on paper as done for CHx–NHy, it is possible to simply try different scaling relations and evaluate them on the basis of their mean absolute error and/or R2 value. Figure 1.5(b) shows a very good scaling relation for C2H2 and C2H4 with methyl (CH3), and many more such examples exist. Hence, if access to an adsorption energy database for many different surface species is available, it is possible to bypass the bond order conservation idea and just rely on statistical tools. Using this approach, it should be possible to derive a suitable descriptor for any adsorbate, but the physics behind the relationship may not be obvious.
1.3.2 Scaling Relations for Transition States: The Brønsted–Evans–Polanyi Relationship
Transition states are often considered special because they have a very short lifetime. In terms of their adsorption properties, however, they are not different from any other surface species and obey the same physical principles. It is therefore not surprising that scaling laws for transition states exist in the same way as they do for other surface intermediates. The truly remarkable aspect is that transition state scaling for a large number of reactions is nearly universal and can be described by a single linear relationship!43–45 However, before continuing the discussion of transition state scaling it is important to clarify several technical terms.
Transition state scaling (TSS) is often used interchangeably with the term Brønsted–Evans–Polanyi or BEP relationship.46,47 Although both terms refer to the same concept, there is a distinction between them. Transition state scaling refers to a relation between the transition state energy ETS and the energy of either the initial state (EIS) or final state (EFS) of a reaction. The transition state energy, ETS, is not equal to the activation barrier Ea of a reaction, but it can be used to calculate Ea = ETS − EIS. A BEP relation, on the other hand, is a relation between the activation energy Ea and the heat of a reaction ΔE, which is defined as ΔE = EFS − EIS. All energy quantities are indicated on a schematic potential energy surface (PES) in Figure 1.6.
A schematic potential energy surface for an arbitrary surface reaction. The nomenclature is Eref = reference energy chosen to be zero, EIS = initial state energy, ETS = transition state energy, EFS = final state energy, Ea = activation energy barrier, ΔE = energy change of the reaction.
A schematic potential energy surface for an arbitrary surface reaction. The nomenclature is Eref = reference energy chosen to be zero, EIS = initial state energy, ETS = transition state energy, EFS = final state energy, Ea = activation energy barrier, ΔE = energy change of the reaction.
A direct comparison between a TSS relation and a BEP relation for an exhaustive data set of (de)hydrogenation reactions over transition metals is shown in Figure 1.7.45 Since all reactions were formulated as dissociation reactions, Ediss was used to denote the final state energy EFS; and ΔEdiss represents the energy change of the surface reaction, ΔE. Although identical raw data have been used to generate the plots, the transition state scaling in Figure 1.7(a) appears to be much better than the BEP relation in Figure 1.7(b). This initial impression is somewhat deceptive and a comparison of the mean absolute error (MAE) of the two plots indicates that the quality, in terms of absolute errors, of both relations is almost identical. The difference lies in the different energy scales used on the x- and y-axes of the plots, and the BEP graph can be loosely interpreted as a zoomed-in version of the transition state scaling graph.
Transition state scaling (a) and BEP relation (b) for (de-)hydrogenation reactions. Reproduced from ref. 45 with permission from the Royal Society of Chemistry.
Transition state scaling (a) and BEP relation (b) for (de-)hydrogenation reactions. Reproduced from ref. 45 with permission from the Royal Society of Chemistry.
(a) Universal TSS relation for C–C, C–O, C–N, N–O, N–N, and O–O dissociation reactions. Reproduced from ref. 44 with permission from Springer Nature, Copyright 2011. (b) Deviations from the “universal” TSS behavior are observed when the nature of the transition state switches between initial and final states alike. Reproduced from ref. 50 with permission from AIP Publishing, Copyright 2011.
(a) Universal TSS relation for C–C, C–O, C–N, N–O, N–N, and O–O dissociation reactions. Reproduced from ref. 44 with permission from Springer Nature, Copyright 2011. (b) Deviations from the “universal” TSS behavior are observed when the nature of the transition state switches between initial and final states alike. Reproduced from ref. 50 with permission from AIP Publishing, Copyright 2011.
At this point it should be stressed that linear TSS and BEP relations exist for many reactions on a large range of catalyst surfaces, but they are not as “universal” as they have been introduced. Even for simple di-atomic dissociation reactions (N2, NO, O2) on metal-substituted La-perovskites a significant deviation from the universal TSS–BEP line has been observed. The deviation can clearly be seen in Figure 1.8(b) as the plot moves to more reactive surfaces (more negative ΔEdiss) and can be explained by a continuous change from a late transition state (final state like) to an early transition state on more reactive surfaces. The same phenomenon can be seen on highly reactive metallic surfaces, but all transition metals that are typically used as catalysts fall into the linear region of the TSS–BEP line and the relation holds quite well in this range. Nevertheless, care must be taken to choose the appropriate TSS and/or BEP relation for each reaction and even more attention must be paid when these relations are used to extrapolate beyond the parameter range for which they were obtained.
In summary, scaling and BEP relations are very versatile, broadly applicable, and allow for a significant reduction of the number of energetic parameters to a small set of catalytic descriptors. Given the typical error bars of these relations the results are not meant to be taken quantitatively, but if the scaling and BEP relations are carefully chosen and correctly applied, then catalytic activity and selectivity trends over a broad range of materials can be obtained very well.
1.4 The Sabatier Principle and the Volcano Curve
For most things in life, there is an optimal concentration, amount or frequency in which they should occur; catalysis is no exception. The Nobel Prize-winning French chemist Paul Sabatier qualitatively described the adsorption properties of the optimal catalyst for a reaction as not too weak, such that the reactants don’t bind, and not too strong, which would lead to surface poisoning.51 This statement is known today as the Sabatier principle of catalysis. The principle is easily visualized in volcano-shaped curves that show the catalytic activity as a function of a catalytic descriptor. An example of such a volcano curve was already introduced in Figure 1.1(a) and a schematic representation is shown in Figure 1.9. The top of the volcano corresponds to the highest activity and the descriptor value that is “just right”. Finding the optimal value of the descriptor(s) is the central and by far the most critical point in any computational catalyst screening study. Once the optimal value is known, it requires only a simple database search to screen for materials with the desired property. The other features of the volcano, including the activity at the volcano peak and the slopes at which the activity decreases along both sides of the maximum, are of secondary importance. Since the focus is primarily on the descriptor value at the volcano peak, plus or minus a few tenths of an eV, it is not always necessary to develop a full-blown microkinetic model. Instead, a shortcut method, the Sabatier analysis, can be used to predict upper bounds for the reaction rate. Sabatier analyses have been very successfully used to identify catalytic trends for CO oxidation and NO decomposition.52,53 As shown in Figure 1.9, the Sabatier rate reproduces the shape of the volcano curve obtained from a microkinetic model well enough to provide an estimate of the optimal descriptor value, and it is significantly easier and faster to implement.
Comparison of the volcano curves obtained from a Sabatier analysis and full microkinetic models at different approaches to equilibrium γ. Reproduced from ref. 21 with permission from Elsevier, Copyright 2004.
Comparison of the volcano curves obtained from a Sabatier analysis and full microkinetic models at different approaches to equilibrium γ. Reproduced from ref. 21 with permission from Elsevier, Copyright 2004.
1.4.1 Sabatier Analysis
The Sabatier analysis for surface reactions was first introduced by Bligaard et al.21 and uses a Sabatier rate that is obtained by following this fairly simple recipe:
-
Write the rate expressions for all reaction steps in the forward direction as a function of the approach to equilibrium , where Ki is the equilibrium constant for step i, an is the activity of species n, and νn is the corresponding stoichiometric coefficient.
-
For each reaction step in the model, assume optimal surface coverages for the forward reaction.
-
From the overall approach to equilibrium, calculate the approach to equilibrium of step i under the assumption that all other steps are quasi-equilibrated.
-
Use TSS and/or BEP relations to calculate the forward rate constants ki and the rate. This rate represents an upper bound on the actual rate of step i and will be denoted as .
-
The Sabatier rate is the slowest rate of all maximum rates in the mechanism: .
The procedure can be illustrated using a generic reaction mechanism with two steps as an example. The two reaction steps are a dissociation step, step (1), and a reactive desorption step, step (2):
For the sake of completeness, the Sabatier–Gibbs analysis is also briefly mentioned here, although it is not particularly useful for general problems. The Sabatier–Gibbs analysis can only be applied to serial reaction mechanisms that are very simple, and it improves on the unrealistic assumption of optimal surface coverages for each step used in the Sabatier analysis. A stricter bound on the coverages can be imposed by considering thermodynamic limits in terms of the approach to equilibrium, but the procedure is somewhat cumbersome and in general it is better to use a microkinetic model if the simple Sabatier analysis fails. For additional information the reader is referred to ref. 52 and 54.
1.5 Sabatier Analysis in Practice
1.5.1 First Example: Ammonia Synthesis
Potential energy surface for ammonia synthesis on terrace (dashed line) and stepped (unbroken line) sites on Ru. Reproduced from ref. 56 with the permission from AAAS, Copyright 2005.
Potential energy surface for ammonia synthesis on terrace (dashed line) and stepped (unbroken line) sites on Ru. Reproduced from ref. 56 with the permission from AAAS, Copyright 2005.
Upon inspection of the PES for NH3 synthesis the mechanism can be simplified to two main reaction steps, the dissociative adsorption of N2 followed by its hydrogenation to NH3. An extremely simplified reaction mechanism can therefore be written as
This mechanism neglects a number of elementary steps and does not include the possibility of adsorbed H atoms or NHx species, but it is sufficient to illustrate the Sabatier principle. A catalyst that associates strongly with N will easily dissociate N2, but the desorption step will be very difficult (note that in the desorption step only the energy of N* is affected by the catalyst because H2 and NH3 are gas phase species). In contrast, a catalyst interacting weakly with N allows for easy desorption, but the barrier for N2 dissociation will be large. Hence, there is an optimal binding energy of N*, EN, at which the dissociative adsorption of N2 and NH3 desorption are optimized simultaneously. The objective now is to find an estimate of EN, by performing a Sabatier analysis for typical NH3 synthesis conditions.
The last piece of missing information comprises the entropy changes between initial and transition states, which are needed to calculate the pre-exponential factors. The entropy values of adsorbed species and transition states depend only weakly on the transition metal surface. Therefore, it may be assumed that the entropy is independent of the catalyst. For a rough approximation, it can be further assumed that an adsorbed species or transition state has lost all degrees of freedom (it is completely locked in place on the surface), and its entropy is therefore zero. The gas-phase entropies of N2 and H2 at standard state are S°(N2) = 192.77 J mol−1 K−1 and S°(H2) 130.68 J mol−1 K−1, respectively, and the entropy changes between the initial states and the transition state can be estimated as and . For the first step it is assumed that N2 loses all its gas-phase entropy upon entering the transition state and in the second step, the entropy loss of one H2 gas-phase molecule is considered when it reacts with N* on the surface. Why was the entropy loss of only one H2 molecule considered and not 3/2H2 as the stoichiometric coefficient in the lumped equation would indicate? Well, the fact that step (2) is a lumped step and not an elementary reaction step makes it almost impossible to guess the correct entropy change, but it is known that it is a sequence of hydrogen adsorption and hydrogenation steps and for each H2 molecule adsorbing onto the surface −130.68 J mol−1 K−1 of entropy are lost. When mechanisms with lumped reaction steps are analyzed, problems with estimating energy barriers and entropy changes will frequently occur, so it is highly recommended to formulate mechanisms that are comprised of only elementary reaction steps. Still, for this case, from eqn (1.33) and the entropy assumptions outlined above, the pre-exponential factors are calculated as v1 = 1.20 × 103 s−1 and v2 = 2.10 × 106 s−1.
At this point the reader may want to open their favorite math and graphing software (Excel would suffice), enter eqn (1.30)–(1.32), (1.34), and (1.36), and calculate the maximum N2 dissociation rate and maximum desorption rate as a function of ΔE1 = ΔEN and plot the results. The graph should look like the one given in Figure 1.11. The optimal catalyst for ammonia synthesis is found for a descriptor value of ΔEN of approximately −0.95 eV and has a predicted turn over frequency (TOF) of 8.7 s−1. It is usually a lucky coincidence if the estimated TOF is close to an experimentally measured value in such a crude Sabatier analysis, but the location of the maximum with respect to the descriptor value in the volcano curve is typically reproduced within acceptable error bars. With a target value for the catalytic descriptor, it is possible to finally proceed to the last step of the example problem and screen for the best catalyst. For this purpose, the “database” of dissociative chemisorption energies, ΔEN, of several transition metals listed in Table 1.1 is examined. It is found that well-known NH3 synthesis catalysts Fe and Ru are closest to the optimal value of −0.95 eV. Considering the number of assumptions and simplifications that were required to perform the Sabatier analysis, it seems surprising that the two most active catalysts for ammonia synthesis were correctly identified. This certainly emphasizes the strength and robustness of the method. The analysis is helped by the fact that ΔEN spans a range from ca. −4 to +6 eV and neighboring transition metals are often separated by 0.5 eV or more.
Excerpt of the periodic table with dissociative chemisorption energies of N2 (ΔEN) given in eV. Reproduced from ref. 21 with permission from Elsevier, Copyright 2004.
Cr | Mn | Fe | Co | Ni | Cu |
— | — | −1.27 | −0.38 | −0.10 | 2.88 |
Mo | Tc | Ru | Rh | Pd | Ag |
−2.76 | — | −0.84 | −0.70 | 1.78 | 5.86 |
W | Re | Os | Ir | Pt | Au |
−4.33 | — | — | −0.59 | 1.37 | 5.89 |
Cr | Mn | Fe | Co | Ni | Cu |
— | — | −1.27 | −0.38 | −0.10 | 2.88 |
Mo | Tc | Ru | Rh | Pd | Ag |
−2.76 | — | −0.84 | −0.70 | 1.78 | 5.86 |
W | Re | Os | Ir | Pt | Au |
−4.33 | — | — | −0.59 | 1.37 | 5.89 |
In summary, this example of computational screening for an NH3 synthesis catalyst has demonstrated how BEP relations are applied to reduce the number of parameters to a single descriptor, ΔEN, and how to perform a Sabatier analysis. As a result, the Sabatier volcano shown in Figure 1.12 was obtained from which two suitable catalysts for the reaction can be identified (Fe and Ru). The example also introduced approximations that can be applied to obtain a simple estimate for surface entropies, which will be improved on in Section 1.6.2.
Sabatier volcano for NH3 synthesis with the positions of transition metals labeled on the graph.
Sabatier volcano for NH3 synthesis with the positions of transition metals labeled on the graph.
1.5.2 Second Example: CO Oxidation
A slice through the CO oxidation volcano at T = 600 K for a constant value of ΔECO = −1.20 eV.
A slice through the CO oxidation volcano at T = 600 K for a constant value of ΔECO = −1.20 eV.
1.6 Notes on Microkinetic Modeling
Although the Sabatier analysis can be applied to reaction mechanisms with any number of elementary steps and even mechanisms with parallel reaction pathways, it is an approximation. More accurate computational screening for complex reaction mechanisms can be performed by implementing a full microkinetic model, which contains information about the dominant reaction mechanism and simultaneously predicts the activity, selectivity and surface coverages. As input to this microkinetic model only the catalytic descriptors are needed and all the missing energy information must be estimated from BEP and scaling relations, or assumed. But before continuing with more advanced computational screening examples, it is necessary to introduce some very basic concepts needed for the development of microkinetic models in the context of computational catalyst screening. Gokhale et al.,57 Stoltze and Nørskov,58 and the standard reference The Microkinetics of Heterogeneous Catalysis by Dumesic et al.59 provide useful information for microkinetic modeling.
With eqn (1.52) and (1.53) there are four equations for the four unknown coverages , and θ*, and the system of nonlinear algebraic equations may be solved numerically. With currently available CPU speeds numerical solutions to microkinetic models for catalyst screening studies are generally preferred because they avoid the need to make any additional assumptions regarding the mechanism.
1.6.1 Numerical Solution Strategies
Most people will say that solving a microkinetic model numerically is easy and does not require any special solution strategies: one can simply use a standard ODE solver or root-finding method. This may be the case for microkinetic models that are parameterized for a working catalyst and predict reasonable reaction rates, but when a computational screening study is being performed the objective is to explore a large parameter space for the descriptors, which also includes unusual parameter combinations. Specifically, at the edges far away from the volcano maximum, the rate constants in the microkinetic model span many orders of magnitude (40–50 orders is not unusual) and numerical solvers will not always converge for such extremely stiff systems of ODEs. Although there is no general procedure to tackle this problem there are some guidelines.
In a computational screening study, the rate and equilibrium constants calculated using scaling and BEP relations are functions of the chosen descriptors. A volcano plot could be constructed by systematically sweeping through the parameter space for the descriptors. Root-finding methods can quickly solve the steady-state equations, but the rate equations in microkinetic models are highly non-linear and convergence is only achieved when good initial guesses are provided. Hence, it is a good idea to use the solution of the microkinetic model for one descriptor set as the initial guess for the neighboring descriptor set. A possible solution path on a grid of two descriptors is suggested in Figure 1.14. Provided that the grid points in the descriptor space are close to each other, the solutions should be sufficiently similar to obtain converged results.
Suggested looping technique for the exploration of a two-dimensional descriptor space.
Suggested looping technique for the exploration of a two-dimensional descriptor space.
An alternative approach is to integrate the system of ODEs, which is computationally much more intensive, but does not depend as strongly on the initial guesses, as long as they make physical sense, i.e. no negative coverages or violation of the site balance. In order to find a steady-state solution the ODEs need to be integrated over a sufficient amount of time to ensure that steady-state has been reached. It is a good practice to verify steady-state convergence by plotting the transient behavior of the surface coverages and ensuring that they do not continue to change over time.
Another important aspect to consider is the stiffness of the ODE system, a characteristic caused by the large differences in rate constants. Most ODE solvers, even those specialized for stiff systems, will fail in those cases. If the simpler root-finding strategy also fails, it is possible to reduce the stiffness of the ODE system by artificially slowing down some of the very fast, quasi-equilibrated, reaction steps. But be cautious! If these steps are slowed down too much, they may become kinetically relevant and affect the overall rate or the reaction mechanism. This strategy is not recommended for ordinary problems, but may be attempted with the appropriate care if everything else fails.
1.6.2 Entropy and Enthalpy Corrections
In the previous examples only electronic energy changes were considered and the entropy was approximated as all or nothing. In essence, it was assumed that gas-phase species have 100% of their standard state entropy and surface species possess no entropy at all. These assumptions can certainly be improved on, and in order to construct thermodynamically consistent microkinetic models this is not just optional, but absolutely necessary. Entropy and enthalpy corrections for surface species can be calculated using statistical thermodynamics from knowledge of the vibrational frequencies, and the translational and rotational degrees of freedom (DOF). In contrast to gas-phase molecules, adsorbates cannot freely rotate and move across the surface, but the translational and rotational DOF are frustrated within the potential energy well imposed by the surface. In the harmonic limit the frustrated translational and rotational DOF can conveniently be described as vibrational modes, which in turn means that any surface adsorbate will have 3N vibrational DOFs that are all treated equally.
1.6.3 Microkinetic Model Analysis
Microkinetic models can provide much more information than “just” surface coverages and reaction rates of individual steps. It is always a good idea to perform a sensitivity analysis on the model input parameters, to obtain additional valuable information. First, more attention should to be paid to parameters to which the model shows a high sensitivity, and these parameters need to be carefully measured or calculated. Non-sensitive parameters, on the other hand, may be roughly estimated or even guessed. Second, the sensitivity of a microkinetic model towards certain parameters can be interpreted as a measure of the degree to which a step is rate controlling (degree of rate control). This information can provide direction for useful catalyst modifications which could optimize performance (degree of catalyst control).
1.6.3.1 Degree of Rate Control
Illustration of the generalized degree of rate control XRC and degree of catalyst control XCC (dashed PES) for CH4 steam reforming. XRC(CH4-TS) = 0.8, XRC(C) = −0.26, XCC(C) = 0.11. Reproduced from ref. 65 with permission from AAAS, Copyright 2009.
Illustration of the generalized degree of rate control XRC and degree of catalyst control XCC (dashed PES) for CH4 steam reforming. XRC(CH4-TS) = 0.8, XRC(C) = −0.26, XCC(C) = 0.11. Reproduced from ref. 65 with permission from AAAS, Copyright 2009.
1.6.3.2 Degree of Catalyst Control
The difference between XRC and XCC is shown graphically in Figure 1.15 for the sensitivity towards the binding energy of carbon, ΔEC. Carbon adsorbs quite strongly and is located in a well of the PES, which explains the negative value (−0.26) for XRC(C). Decreasing the depth of the well would smooth out the PES and increase the reaction rate. However, decreasing the stability of C* will also affect the stability of CH*, CH2*, CH3* surface intermediates and the associated transition states between them through scaling and BEP relations (dashed line in Figure 1.15). In particular, the transition state energy of CH4 activation will shift up in energy. The large value of XRC(CH4-TS) = 0.8 indicates that CH4 activation is a rate-determining step and increasing the barrier will have a large negative effect on the overall reaction rate. The overall effect of changing the descriptor ΔEC on the PES is given by Xcc(C) = 0.11, indicating that a catalyst with stronger ΔEC will have higher activity. The explanation is that the increased poisoning effect of C* is more than compensated for by lowering the barrier for the CH4 activation step.
The degrees of rate and catalyst control both have their merits and do not conflict with each other. Determining which to use is dependent on the problem at hand. XRC should be used to analyze the reaction mechanism and understand the importance of individual steps and adsorbates, whereas XCC should be used to guide catalyst design.
1.7 CO Oxidation Catalyst Screening
A preliminary Sabatier analysis of the CO oxidation reaction was performed in Section 1.5.2, and an analytical solution derived under the assumption that the adsorption of CO and O2 are quasi-equilibrated in Section 1.6. Now a numerical solution to the complete microkinetic model as a function of the descriptors ΔECO and ΔEO will be formulated. The reaction mechanism will be analyzed in terms of rate and catalyst control, and at the end of this section, the effect of high surface coverages on the volcano curve will also be briefly addressed.
1.7.1 Numerical Microkinetic Model
Microkinetic models are typically custom-made and can be written in any programming or scripting language that the reader is most familiar with. It is recommended to choose a simulation environment that already provides lots of the functionality needed to solve the model, i.e. a fast ODE solver for stiff problems, a root-finder, and n-dimensional curve fitting routines, if parameter optimization is also required. Here Python is used, which is an object-oriented scripting language with good performance, and it is freely available for all popular operating systems (Windows, MacOS, Linux; http://python.org). The Python syntax should be self-explanatory as long as you are aware that comments are declared with ‘#’ and that list and array indices start with ‘0’, not with ‘1’. Readers who are interested in additional information are referred to the online tutorial available for Python newbies (http://docs.python.org/tutorial). Besides the standard Python interpreter, the NumPy (http://numpy.scipy.org), SciPy (http://www.scipy.org), mpmath (http://code.google.com/p/mpmath), and matplotlib (http://matplotlib.sourceforge.net) modules are also needed as extensions. These modules provide a variety of math routines and plotting functions, very similar to the Matlab environment. All examples here have been tested with Python 2.6, but other versions of Python should work as well. A complete Python script reproducing all results of this section can be found in the Appendix.
1.7.1.1 Constants and Conditions
It is a good idea to define the reaction conditions and useful physical constants globally at the beginning of the code, so that they are available to all functions. This is also the place to import additional modules, such as numpy.
import numpy as np
# Reaction conditions
T | = | 600 | # | K |
PCO | = | 0.33 | # | bar |
PO2 | = | 0.67 | # | bar |
PCO2 | = | 1 | # | bar |
# Physical constants and conversion factors
J2eV | = | 6.24150974E18 | # | eV/J |
Na | = | 6.0221415E23 | # | mol−1 |
h | = | 6.626068E-34 * J2eV | # | in eV*s |
kb | = | 1.3806503E-23 * J2eV | # | in eV/K |
kbT | = | kb * T | # | in eV |
1.7.1.2 From Descriptors to Rate Constants
The next important step is to implement the scaling and BEP relations together with any assumptions regarding entropies of transition states and surface states in order to obtain the necessary rate constants. Since this procedure will be needed multiple times for each combination of descriptors, it is defined as a function.
def get_rate_constants(EO,ECO):
# This function applies scaling and BEP to determine all rate constants
# depending on the two descriptors, EO and ECO, provided as input.
# Gas phase energies referenced to CO and O2
ECOg | = | EO2g = 0 | ||
ECO2g | = | −3.627 | # | in eV calculated from DFT |
# Scaling for EO2
EO2 | = | 0.89 * EO + 0.17 | # | eq. (1.42) |
# Gas phase entropies converted to eV/K
SCOg | = | 197.66 * J2eV/Na | # | eV/K |
SO2g | = | 205.0 * J2eV/Na | ||
SCO2g | = | 213.74 * J2eV/Na |
# Surface entropies are assumed to be zero
SCO = SO2 = SO = 0
# Reaction energies
dE | = | np.zeros(4) | # | array initialization |
dE [0] | = | ECO − ECOg | ||
dE [1] | = | EO2 − EO2g | ||
dE [2] | = | 2*EO − EO2 | ||
dE [3] | = | ECO2g − ECO − EO |
# Entropy changes
dS | = | np.zeros(4) | # | array initialization |
dS [0] | = | SCO − SCOg | ||
dS [1] | = | SO2 − SO2g | ||
dS [2] | = | 2*SO − SO2 | ||
dS [3] | = | SCO2g − SCO − SO |
# Activation energy barriers from BEP
Ea | = | np.zeros(4) | # | array initialization |
Ea [2] | = | 0.5 * EO + 1.39 | # | eq. (1.43) |
Ea [3] | = | −0.3 * (EO + ECO) + 0.02 | # | eq. (1.44) |
# Entropy changes to the transition state
STS | = | np.zeros(4) | # | array initialization |
STS [0] | = | −0.25*SCOg | # | loss of CO entropy assumed |
STS [1] | = | −0.25*SO2g | # | loss of O2 entropy assumed |
STS [2] | = | 0 | # | surface reaction |
STS [3] | = | 0 | # | surface reaction |
# Calculate equilibrium and rate constants
K | = | [0]*4 | # | equilibrium constants |
kf | = | [0]*4 | # | forward rate constants |
kr | = | [0]*4 | # | reverse rate constants |
for i in range(4):
dG | = | dE [i] − T*dS [i] |
K [i] | = | np.exp(−dG/kbT) |
# Enforce Ea > 0, and Ea > dE, independent of what the descriptors are
Ea [i] | = | max([0,dE [i],Ea [i]]) | ||
kf [i] | = | kbT/h * np.exp(STS [i]/kb) * np.exp(−Ea [i]/kbT) | ||
kr [i] | = | kf [i]/K [i] | # | enforce thermodynamic consistency |
return (kf,kr)
In this function the scaling/BEP relations, eqn (1.42)–(1.44) have been used, and it has been arbitrarily assumed that CO and O2 lose 25% of their gas-phase entropy when entering the transition state for adsorption. Using collision theory for the adsorption rate constants66 of these two steps is a more elegant alternative and the reader is encouraged to see how it affects the result of the model. There are two more noteworthy points. First, the model ensures that the activation barriers, Ea,i, are all positive, even for descriptor pairs that would otherwise predict negative values for Ea,i. Second, thermodynamic consistency is enforced throughout the model by calculating the reverse rate constants from the equilibrium constants for each step.
1.7.1.3 Rate Equations
This step is simple. Rate equations for the individual steps are needed. The rates depend on the coverages, θi, and the rate constants. All parameters are passed as an array to the function that returns the rates.
def get_rates(theta,kf,kr):
# returns the rates depending on the current coverages theta
# Extract elements of theta and assign them
# to more meaningful variables
tCO | = | theta [0] | # | theta of CO |
tO2 | = | theta [1] | # | theta of O2 |
tO | = | theta [2] | # | theta of O |
tstar | = | 1.0 − tCO − tO2 − tO | # | site balance for tstar |
# Calculate the rates: eqn (1.45)–(1.48)
rate | = | [0]*4 | # | array with 4 zeros |
rate [0] | = | kf [0] * PCO * tstar − kr [0] * tCO | ||
rate [1] | = | kf [1] * PO2 * tstar − kr [1] * tO2 | ||
rate [2] | = | kf [2] * tO2 * tstar − kr [2] * tO * tO | ||
rate [3] | = | kf[3] * tCO * tO − kr [3] * PCO2 * tstar * tstar |
return rate
1.7.1.4 System of ODEs vs. Steady-state Equations
As discussed in Section 1.6.1 the microkinetic model may be solved as a system of ODEs or non-linear algebraic equations using the steady-state assumption. It turns out that, regardless of which approach is used, the function that must be passed to an ODE solver or numerical root-finding method is the same! Here, the more general case of the ODE system is chosen. Note that the previously defined function was named get_rates().
def get_odes(theta,t,kf,kr):
# returns the system of ODEs d(theta)/dt, calculated at the current value of theta (and time t)
rate | = | get_rates(theta,kf,kr) | # | calculate the current rates |
# Time derivatives of theta
dt | = | [0] * 3 | ||
dt [0] | = | rate [0] − rate [3] | # | d(tCO)/dt |
dt [1] | = | rate [1] − rate [2] | # | d(tO2)/dt |
dt [2] | = | 2 * rate [2] − rate [3] | # | d(tO).dt |
return dt
1.7.1.5 Solving the Model
All that is left at this point is to set the values of the descriptors and solve the model. For single point calculations using only one descriptor set, it is preferable to use an ODE solver and use a completely empty surface as the initial guess for the coverages. The integration time required to reach steady-state depends on the problem and can vary from 1 × 103 to 1 × 108 seconds, or sometimes longer. Some might wonder why a reaction could possibly take 1 × 108 seconds, or greater than 3 years, to equilibrate, but keep in mind that the goal is to scan a wide descriptor range, which will result in some very small rate constants. For this example, the Pt values for the descriptors and the odeint ODE solver provided by scipy were used. Note that the default tolerance and step size had to be tweaked in order for odeint to work for this stiff problem. For more complex problems the reader is advised to identify a better performing solver optimized for stiff systems of ODEs.
# Solve the model for Pt with EO = −1.25, ECO = −1.22
ECO | = | −1.22 | # | CO oxidation descriptors |
EO | = | −1.25 | ||
(kf,kr) | = | get_rate_constants (EO,ECO) | # | get the rate constants for the given descriptors |
# Use scipy’s odeint to solve the system of ODEs from scipy.integrate import odeint
# As initial guess we assume an empty surface theta0 = (0., 0., 0.)
# Integrate the ODEs for 1E6 sec (enough to reach steady-state)
theta | = | odeint(get_odes, | # | system of ODEs |
theta0, | # | initial guess | ||
[0,1E6], | # | time span | ||
args = (kf,kr), | # | additional arguments to get_odes() | ||
h0 = 1E-36, | # | initial time step | ||
mxstep = 90000, | # | maximum number of steps | ||
rtol = 1E-12, | # | relative tolerance | ||
atol = 1E-15) | # | absolute tolerance |
print_output(EO,ECO,theta [−1, :])
In the last line the helper function print_output (given below, but in the actual Python script it needs to be defined before it is called) is called with the descriptor values and the final coverages. The variable theta is a (t × c) matrix with the coverages c for each time step t. Usually, only the last row is of interest, conveniently accessed by using ‘−1’ as an index, but the time evolution is available as well for transient studies or verification that steady-state has been reached.
def print_output(EO,ECO,theta):
# Prints the solution of the model
(kf,kr) | = | get_rate_constants(EO,ECO) |
rates | = | get_rates(theta,kf,kr) |
print "For the descriptors EO =", EO, "and ECO =", ECO,"the result is:"
for r,rate in enumerate(rates):
print "Step", r,": rate =", rate,", kf = ", kf [r], ", kr = ", kr [r]
print "The coverages for CO*, O2*, and O* are:"
for t in theta:
print t
As a result of this exercise, the steady-state coverages on Pt of θCO = 0.215 ML, θO2 = 8.4 × 10−4, and θO = 5.6 × 10−3 and a steady-state CO2 formation rate of 6.16 × 103 s−1 are found.
1.7.2 Degree of Rate and Catalyst Control
Now that it is possible to predict a reaction rate for a single catalyst, only a few lines of extra code are needed to calculate the degree of rate control and the degree of catalyst control. However, the microkinetic model needs to be solved repeatedly for different parameters and it is more convenient if first a function, solve_ode, is written that takes the rate constants as input and returns the solution of the model. This function may look like this.
def solve_ode(kf, kr, theta0=(0.,0.,0.)):
# Solve the system of ODEs using scipy.integrate.odeint
# Assumes an empty surface as initial guess if nothing else is provided
from scipy.integrate import odeint
# Integrate the ODEs for 1E6 sec (enough to reach steady-state)
theta | = | odeint(get_odes, | # | system of ODEs |
theta0, | # | initial guess | ||
[0,1E6], | # | time span | ||
args = (kf,kr), | # | arguments to get_odes() | ||
h0 = 1E-36, | # | initial time step | ||
mxstep = 90000, | # | maximum number of steps | ||
rtol = 1E-12, | # | relative tolerance | ||
atol = 1E-15) | # | absolute tolerance |
return theta [−1,:]
The degree of rate control, XRC, is then calculated by repeatedly calling solve_ode with rate constants that are systematically changed for each step.
As input to calculate_Xrc the unaltered rate constants and the corresponding rate are provided.
def calculate_Xrc(r0,kf0,kr0):
# Calculates Xrc by systematically changing the
# rate constants of each step by 10% around the reference value
delta = 0.1 | # | change of 10% |
Xrc_rates = np.zeros(4) | # | array for storing rates |
for s in range(4): | # | loop over all steps |
# initialize rate constants with reference values
kf | = | kf0 [:] |
kr | = | kr0 [:] |
kf [s] | = | (1 + delta) * kf0 [s] |
kr [s] | = | (1 + delta) * kr0 [s] |
theta = | solve_ode(kf,kr) | # | Solve with the modified k’s | |
rates = | get_rates(theta, kf, kr) | # | Get the new rates | |
Xrc_rates [s] | = | rates [3] | # | Save the rate of CO2 production |
# And calculate Xrc for all steps
Xrc = (Xrc_rates-r0)/(delta*r0)
return Xrc
In the example for CO oxidation on Pt with ΔEO = −1.25 eV and ΔECO = −1.22 eV the degrees of rate control for steps (1) and (2) are zero (these steps are quasi-equilibrated), step (3) is almost exclusively rate-controlling with XRC,3 = 0.99, and step (4) has an XRC,4 = 0.01. In this example , which is expected for a serial reaction mechanism.
Next, the degree of catalyst control Xcc is calculated by varying the values of ΔEO and ΔECO by 0.05 eV. This step size should generally work well except in close proximity to the volcano peak, where smaller step sizes are preferable. Rather than providing the rate constants directly, the original values of ΔEO and ΔECO are passed to the function calculate_Xcc and the corresponding rate constants are calculated on the fly.
def calculate_Xcc(r0,EO0,ECO0):
# Calculate Xcc by varying EO and ECO around their
# reference values by 0.05 eV
delta | = | 0.05 | # | change of 0.05 eV |
Xcc_rates | = | np.zeros(2) | # | array for storing rates |
# Start by modifying EO0
(kf,kr) = get rate constants(EO0 + delta,ECO0)
theta = solve ode(kf,kr) | # | Solve with the modified k’s |
rates = get_rates(theta,kf,kr) | # | Get the new rates |
Xcc_rates [0] = rates [3] | # | Save the rate of CO2 production |
# Repeat for ECO0
(kf,kr) = get rate constants(EO0,ECO0 + delta)
theta = solve ode(kf,kr) | # | Solve with the modified k’s |
rates = get_rates(theta,kf,kr) | # | Get the new rates |
Xcc_rates [1] = rates [3] | # | Save the rate of CO2 production |
Xcc = (np.log(Xcc_rates)–np.log(r0))/(–delta/kbT)
return Xcc
If this analysis is performed for CO oxidation on Pt, it yields Xcc(ΔEO) = 1.38 and Xcc(ΔECO) = −0.28, which indicates that by stabilizing O* and destabilizing CO* the reaction rate can be increased. Indeed, on the two-dimensional volcano plot in Figure 1.16 it can clearly be seen that the maximum is located to the left of Pt in the direction of stronger O* binding. The resolution of the volcano plot is however not sufficient to judge whether stronger or weaker CO* binding would increase the activity. It appears as though ΔECO for Pt is already near to its optimal value.
CO oxidation activity, log10(TOF), as a function of the two catalytic descriptors ΔEO and ΔECO. (a) Numerical solution. (b) Analytical solution derived in Section 1.7, using eqn (1.54)–(1.58). The positions of the closed-packed surfaces of Pt, Pd, Cu, and Rh are indicated.
CO oxidation activity, log10(TOF), as a function of the two catalytic descriptors ΔEO and ΔECO. (a) Numerical solution. (b) Analytical solution derived in Section 1.7, using eqn (1.54)–(1.58). The positions of the closed-packed surfaces of Pt, Pd, Cu, and Rh are indicated.
1.7.3 Two-dimensional CO Oxidation Volcano
After this thorough analysis of the microkinetic model results around a single point (Pt), the only remaining task is to calculate the CO oxidation rate over a larger descriptor range and visualize the results as a two-dimensional volcano plot as shown in Figure 1.16. As a comparison to the numerical solution in Figure 1.16(a), the analytical solution from Section 1.6 [eqn (1.54)–(1.58)] is given in Figure 1.16(b). If it is recalled that the only assumption that was made in the derivation of the analytical solution was that the CO and O2 adsorption steps are quasi-equilibrated and that the numerically calculated degree of rate control of both steps was zero, it is not surprising that the plots are in perfect agreement.
Figure 1.16 can ideally be generated by simply looping over the entire parameter range, but in practice that will often result in convergence errors due to numerical precision problems with the largely varying rate constants in certain regions of the parameter space. For faster results it is also desirable to use a root-finding method (e.g. mpmath.findroot), which requires good initial guesses for convergence. Here, the alternating looping technique visualized in Figure 1.14 was used, and the solution of the previous grid point served as an initial guess for the next one. However, even this approach is not failure proof and a sanity check (e.g. are all coverages between 0 and 1?) of the solutions in each grid point must be performed before moving on to the next grid point. If the solution is not physical, then to a slower, but more stable, solver must be used in order to generate a new solution and then it may be possible to continue again with the fast root-finding method. An example of how this may be implemented is provided below.
# Generate the data for 2D volcano plots
# and save it in a matrix
gridpoints = 20
num_data = np.zeros([gridpoints,gridpoints])
# Generate the initial guess for the first point
(kf,kr) | = | get_rate_constants(−2.5,−2.5) |
theta0 | = | solve_ode(kf,kr) |
# Start the scan through the parameter space
# Alternate directions for alternating columns
EO_range0 | = | np.linspace(−2.5,0.0,gridpoints) |
ECO_range0 | = | np.linspace(−2.5,0.0,gridpoints) |
for i, EO in enumerate(EO_range0):
if i%2: | # | true if odd |
ECO_range = ECO_range0.copy()[::−1] | # | [::−1] |
reverses the list
j_range = range(gridpoints)[::−1]
else:
ECO_range = ECO_range0.copy()
j_range = range(gridpoints)
for j,ECO in enumerate(ECO_range):
(kf, kr) = get_rate_constants(EO,ECO)
theta = solve_findroot(kf,kr,theta0)
# Check if solution is physical
if (theta > 1.0).any() or (theta < 0.0).any():
# Generate a new initial guess using odeint and solve again
theta0 = solve_ode(kf,kr)
theta = solve_findroot(kf,kr,theta0)
rates = get_rates(theta,kf,kr)
# Store the solutions
num_data [j_range [j],i] = rates [3]
# Store the numerical solution as initial guess
# for the next grid point
theta0 = theta.copy()
The numerical rate data collected in num_data can then be plotted using the contourf function from matplotlib. The full example code for solving the microkinetic model including the generation of the two-dimensional volcano graph can be found in the appendix.
1.7.4 Effect of Lateral Interactions
Throughout this chapter it has been assumed that binding energies and activation energy barriers are constant, but at higher surface coverages these quantities can be strongly influenced by adsorbate–adsorbate interactions. An accurate description of these interactions, specifically when they induce local ordering and lead to island formation or other characteristic patterns, would require the use of kinetic Monte Carlo (kMC) simulations. Since computational catalyst screening is largely based on the use of rather approximate scaling and BEP relations with mean absolute errors of approximately 0.2 eV, the use of highly sophisticated kMC methods does not seem appropriate. Adsorbate–adsorbate interactions can also be described within the mean-field approximation, which is less detailed but suitable for inclusion in microkinetic models.48,67 In the simplest case of interacting atomic adsorbates the lateral interactions have been understood in terms of d-band structure changes, which, in turn, allows for the prediction of these interactions.68 Just as lateral interactions alter the binding energy of adsorbates, they also affect the stability of transition states and thereby change the activation energy barriers for surface reactions. William Schneider’s group has studied this phenomenon in great detail by calculating coverage-dependent activation barriers for NO oxidation, which were later coupled with first principles-based cluster expansions for improved accuracy.69,70 Current efforts to systematically improve the description of lateral interactions in microkinetic models are slowly closing the gap between the mean-field approximation and spatially resolved kMC simulations.67
It is well known that adsorbate–adsorbate interactions can significantly change the surface energetics and overall catalytic activity, but the pressing question in computational catalyst screening is: Do lateral interactions alter the predicted reactivity trends? This question has been answered for the CO oxidation reaction and the short answer is ‘No’. The long answer can be found in ref. 49 and is briefly summarized here. Taking repulsive O–O, CO–CO and CO–O interactions directly into account for adsorbates and indirectly for activation barriers through BEP relations, a coverage-dependent microkinetic model for CO oxidation can be constructed and used for screening purposes. Because the lateral interactions vary across catalysts and no correlation between the interactions and the activity descriptors ΔEO and ΔECO could be identified, the volcano in Figure 1.17(a) was calculated using the assumption that the interaction energies for Pt(111) are constant for the whole range of descriptors. The result is that in the low coverage regime there is no difference between coverage corrected and uncorrected volcanoes, and at high coverage the effect of surface poisoning is reduced by the destabilization of surface species. The reduced poisoning effect leads to a higher activity and a broadening of the volcano peak, as clearly seen in Figure 1.17(a), but the position of the peak and the relative order of metals remain constant [not shown here, but a contour plot with finer resolution around the peak is given as Figure 3(c) of ref. 49]. Using catalyst-independent lateral interaction energies is instructive for showing the effect of lateral interactions on the shape of the volcano curve, but the preferred visualization technique is to indicate the shift of the metal positions from their low coverage descriptor values to their high coverage values on the uncorrected volcano plot. The result of this technique is shown in Figure 1.17(b). The corrected metal positions all fall onto the line that indicates the transition from the high to the low coverage regime. As long as surface oxide formation can be excluded, it is possible to think of these strongly adsorbing catalysts as operating at their saturation coverage under reaction conditions. The effective (or coverage adjusted) descriptor values can then be evaluated at the corresponding surface coverage and used to indicate the coverage-corrected position. While the long answer is fundamentally interesting, the important take-home message is that lateral interactions usually do not alter the position of the volcano peak nor change the relative order of the activity of metal catalysts.
The effect of adsorbate–adsorbate interactions on the CO oxidation volcano. (a) Adsorbate interactions characteristic for Pt were included in the generation of the volcano plot. (b) The “standard” activity volcano is shown, but the positions of the metals have been corrected to account for the effect of surface coverage. Reproduced from ref. 49 with permission from Springer Nature, Copyright 2010.
The effect of adsorbate–adsorbate interactions on the CO oxidation volcano. (a) Adsorbate interactions characteristic for Pt were included in the generation of the volcano plot. (b) The “standard” activity volcano is shown, but the positions of the metals have been corrected to account for the effect of surface coverage. Reproduced from ref. 49 with permission from Springer Nature, Copyright 2010.
1.8 Conclusions
This chapter has provided a tutorial style overview of the rapidly emerging field of computational catalyst screening and the reader should feel adequately informed and prepared to attempt a catalyst screening project on their own. Although the field is still developing, it has already reached such a high level of complexity that several topics could only be mentioned in passing and references for further study have had to be provided. The descriptor-based approach relies heavily on assumptions and simplifications, but its success is well founded in the numerous examples of new catalyst discoveries in recent years. It is this success that emphasizes the applicability, strength, and robustness of the method for the search for novel and improved heterogeneous catalysts.
This chapter is concluded by stating that computational catalyst screening works in some sense just like a professional dating or matchmaking service. How so? Well, a client (= reaction) who is seeking the help of a professional matchmaker (= us) in order to find their perfect partner (= catalyst) will first have to go through an in-depth interview. During the interview, the matchmaker thoroughly analyzes the client’s character and personal situation and describes them with certain adjectives (= descriptors), such as attractive (= affinity to adsorbate ‘X’), financially stable (= low cost material), emotionally stable (=poisoning resistant), desire to get married (= long-term stability), and so on. Once the matchmaker has developed a full profile of the client, they will enter that information into a database and run a search algorithm that systematically screens a database for potential partners. The screening process will yield a list of, perhaps 10, matches that all have a certain compatibility index (= deviation from the optimal descriptor value), and on the following dates (= experimental testing) the client will need to find out whether the love of their life (= optimal catalyst) was amongst the identified candidates. The matchmaker’s key to success is the creation of an accurate client profile (= identification of the right descriptors), the quality of the matching algorithm (= scaling, BEP, and kinetic model) and the size of the client (= catalyst material) database.
As you can see, there are quite a few parallels between professional matchmaking services and computational catalyst screening. The next time you find yourself in a situation where you need to explain to a non-expert what you do for a living, try starting with: “I am a professional matchmaker and my clients are slow chemical reactions…”!
Appendix
Python Code for the numerical solution of the microkinetic model for CO oxidation and the generation of a two-dimensional volcano plot.
# !/usr/bin/env python
import numpy as np
# Reaction conditions
T | = | 600 | # | K |
PCO | = | 0.33 | # | bar |
PO2 | = | 0.67 | # | bar |
PCO2 | = | 1 | # | bar |
# Physical constants and conversion factors
J2eV | = | 6.24150974E18 | # | eV/J |
Na | = | 6.0221415E23 | # | mol−1 |
h | = | 6.626068E-34 * J2eV | # | in eV*s |
kb | = | 1.3806503E-23 * J2eV | # | in eV/K |
kbT | = | kb*T | # | in eV |
def get_rate_constants(EO,ECO):
# This function applies scaling and BEP to determine all rate constants
# depending the two descriptors EO, ECO provided as input.
# Gas phase energies with reference to CO and O2
ECOg | = | EO2g = 0 | ||
ECO2g | = | −3.627 | # | in eV calculated from DFT |
# Scaling for EO2
EO2 = 0.89 * EO + 0.17 # eq. (1.42)
# Gas phase entropies converted to eV/K
SCOg | = | 197.66 * J2eV/Na | # | eV/K |
SO2g | = | 205.0 * J2eV/Na | ||
SCO2g | = | 213.74 * J2eV/Na |
# Surface entropies are assumed to be zero
SCO = SO2 = SO = 0
# Reaction energies
dE | = | np.zeros(4) | # | array initialization |
dE [0] | = | ECO − ECOg | ||
dE [1] | = | EO2 − EO2g | ||
dE [2] | = | 2*EO − EO2 | ||
dE [3] | = | ECO2g − ECO − EO |
# Entropy changes
dS | = | np.zeros(4) | # | array initialization |
dS [0] | = | SCO − SCOg | ||
dS [1] | = | SO2 − SO2g | ||
dS [2] | = | 2*SO − SO2 | ||
dS [3] | = | SCO2g − SCO − SO |
# Activation energy barriers from BEP
Ea | = | np.zeros(4) | # | array initialization |
Ea [2] | = | 0.5*EO + 1.39 | # | eq. (1.43) |
Ea [3] | = | −0.3*(EO + ECO) + 0.02 | # | eq. (1.44) |
# Entropy changes to the transition state
STS | = | np.zeros(4) | # | array initialization |
STS [0] | = | −0.25*SCOg | # | loss of CO entropy assumed |
STS [1] | = | −0.25*SO2g | # | loss of O2 entropy assumed |
STS [2] | = | 0 | # | surface reaction |
STS [3] | = | 0 | # | surface reaction |
# Calculate equilibrium and rate constants
K | = | [0]*4 | # | equilibrium constants |
kf | = | [0]*4 | # | forward rate constants |
kr | = | [0] *4 | # | reverse rate constants |
for i in range(4):
dG = dE [i] − T*dS [i]
K [i] = np.exp(–dG/kbT)
# enforce Ea > 0, and Ea > dE
# independent of what the descriptors are
Ea [i] | = | max([0,dE [i], Ea [i]]) |
kf [i] | = | kbT/h * np.exp(STS [i]/kb) * np.exp (−Ea [i]/kbT) |
kr [i] | = | kf [i]/K [i] # enforce thermodynamic consistency |
return (kf,kr)
def get_rates(theta,kf,kr):
# returns the rates depending on the current coverages theta
# Extract elements of theta and assign them
# to more meaningful variables
tCO | = | theta [0] | # | theta of CO |
tO2 | = | theta [1] | # | theta of O2 |
tO | = | theta [2] | # | theta of O |
tstar | = | 1.0 − tCO − tO2 − tO | # | site balance for tstar |
# Calculate the rates: eqns (1.45)–(1.48)
rate | = | [0]*4 | # array with 4 zeros | |
rate [0] | = | kf [0] * PCO * tstar − kr [0] * tCO | ||
rate [1] | = | kf [1] * PO2 * tstar − kr [1] * tO2 | ||
rate [2] | = | kf [2] * tO2 * tstar − kr [2] * tO * tO | ||
rate [3] | = | kf [3] * tCO * tO − kr [3] * PCO2 * tstar * tstar |
return rate
def get_odes(theta,t,kf,kr):
# returns the system of ODEs d(theta)/dt
# calculated at the current value of theta (and time t, not used)
rate = get_rates(theta,kf,kr) # calculate the current rates
# Time derivatives of theta
dt | = | [0]*3 | ||
dt [0] | = | rate [0] − rate [3] | # | d(tCO)/dt |
dt [1] | = | rate [1] − rate [2] | # | d(tO2)/dt |
dt [2] | = | 2 * rate [2] − rate [3] | # | d(tO)/dt |
return dt
def print_output(EO,ECO,theta):
# Prints the solution of the model
(kf,kr) | = | get_rate_constants(EO,ECO) |
rates | = | get_rates(theta,kf,kr) |
print "For the descriptors EO =",EO,"and ECO =",
ECO,"the result is:"
for r,rate in enumerate(rates):
print "Step",r,": rate =",rate,", kf =",kf [r],", kr=",kr [r]
print "The coverages for CO*, O2*, and O* are:"
for t in theta:
print t
def solve_ode(kf,kr,theta0=(0.,0.,0.)):
# Solve the system of ODEs using scipy.integrate.odeint
# Assumes an empty surface as initial guess if nothing else is provided
from scipy.integrate import odeint
# Integrate the ODEs for 1E6 sec (enough to reach steady-state)
theta | = | odeint(get odes, | # | system of ODEs |
theta0, | # | initial guess | ||
[0,1E6], | # | time span | ||
args = (kf,kr), | # | arguments to get odes() | ||
h0 = 1E-36, | # | initial time step | ||
mxstep = 90000, | # | maximum number of steps | ||
rtol = 1E-12, | # | relative tolerance | ||
atol = 1E-15) | # | absolute tolerance |
return theta [−1,:]
def solve_findroot(kf,kr,theta0):
# Use mpmath’s findroot to solve the model
from mpmath import mp, findroot
mp.dps = 25
mp.pretty = True
def get_findroot_eqns(*args):
return get_odes(args,0,kf,kr)
theta = findroot(get_findroot_eqns, tuple(theta0), multidimensional=True)
return np.array(theta)
def solve_analytically(kf,kr):
# Using the analytical solution from section 7, eq. (48)–(52)
# The equation for W was rewritten to avoid numerical precision errors
x3 | = | kf [2] * kf [1]/kr [1] * PO2 |
y3 | = | kr [2] |
x4 | = | kf [3] * kf [0]/kr [0] * PCO |
y4 | = | kr [3] * PCO2 |
numerator = 8*y3*(2*x3 + y4)
denominator = x4**2
if (numerator < 1.0e-4*denominator):
W = (x4/(4*y3))*(0.5*(numerator/denominator))
else:
W = (x4/(4*y3))*(−1 + np.sqrt(1 + numerator/denominator))
tstar = 1./(1 + W + kf [0]/kr [0] * PCO + kf [1]/kr [1] * PO2)
tco | = | kf [0]/kr [0] * PCO * tstar |
tO2 | = | kf [1]/kr [1] * PO2 * tstar |
tO | = | W * tstar |
return (tCO,tO2,tO)
def calculate_Xrc(r0,kf0,kr0):
# Calculates Xrc by systematically changing the
# rate constants of each step by 10% around the reference value
delta = 0.1 | # | changeof10% |
Xrc_rates = np.zeros(4) | # | array for storing rates |
for s in range(4): | # | loop over all steps |
# initialize rate constants with reference values
kf | = | kf0 [:] |
kr | = | kr0 [:] |
kf [s] | = | (1 + delta) * kf0 [s] |
kr [s] | = | (1 + delta) * kr0 [s] |
# Solve the ODEs with the modified k’s
theta = solve_ode(kf,kr) | ||
rates = get_rates (theta,kf,kr) | # | Get the new rates |
Xrc_rates [s] = rates [3] | # | Save the rate of CO2 production |
# And calculate Xrc for all steps
Xrc = (Xrc_rates-r0)/(delta*r0)
return Xrc
def calculate_Xcc(r0,EO0,ECO0):
# Calculate Xcc by varying EO and ECO around their
# reference values by 0.05 eV
delta = 0.05 | change of 0.05 eV |
Xcc_rates = np.zeros(2) | array for modified rates |
# Start by modifying EO0
(kf,kr) = get_rate_constants(EO0 + delta,ECO0) | ||
theta = solve_ode(kf,kr) | # | Solve with the modified k’s |
rates = get_rates(theta,kf,kr) | # | Get the new rates |
Xcc_rates [0] = rates [3] | # | Save the rate of CO2 production |
# Repeat for ECO0
(kf,kr) = get_rate_constants(EO0,ECO0 + delta) | ||
theta = solve ode(kf,kr) | # | Solve with the modified k’s |
rates = get_rates(theta,kf,kr) | # | Get the new rates |
Xcc_rates [1] = rates [3] | # | Save the rate of CO2 production |
Xcc = (np.log(Xcc_rates)-np.log(r0))/(−delta/kbT) |
return Xcc
# Solve the model for Pt with EO = ECO = −1.22
ECO | = | −1.22 | # | CO oxidation descriptors |
EO | = | −1.25 |
(kf0,kr0) = get_rate_constants (EO,ECO) | # | get the rate constants for the given descriptor |
theta0 = solve_ode(kf0,kr0) | # | Solve the model for the reference values |
print_output(EO,ECO,theta0) | # | Print the output |
# Sensitivity Analysis
rates = get_rates(theta0,kf0,kr0)
r0 = rates [3] | # | CO2 production rate as reference |
Xrc = calculate_Xrc(r0,kf0,kr0) | # | Call the Xrc function |
print "\nThe Degrees of Rate control are:"
print Xrc
Xcc = calculate_Xcc(r0,EO,ECO) # Call the Xcc function print "\nThe Degrees of Catalyst control for EO and ECO are:"
print Xcc
print "\nStarting to generate 2D data…"
# Generate the data for 2D volcano plots
# and save it in a matrix
# numerical, analytical at the same time gridpoints = 20
num_data | = | np.zeros([gridpoints,gridpoints]) |
ana_data | = | np.zeros([gridpoints,gridpoints]) |
# Generate the initial guess for the first point
(kf,kr) | = | get_rate_constants(−2.5,−2.5) |
theta0 | = | solve_ode(kf,kr) |
# Start the scan through the parameter space
# Alternate directions for alternating columns
EO_range0 | = | np.linspace(−2.5,0.0,gridpoints) |
ECO_range0 | = | np.linspace(−2.5,0.0,gridpoints) |
for i,EO in enumerate(EO_range0):
if i%2: | # | true if odd |
ECO_range = ECO_range0.copy()[::−1] | # | reverses the list |
j_range = range(gridpoints)[::−1] |
else:
ECO_range = ECO_range0.copy()
j_range = range(gridpoints)
for j,ECO in enumerate(ECO_range):
(kf,kr) = get_rate_constants(EO,ECO)
theta = solve_findroot(kf,kr,theta0)
# Check if solution is physical
if (theta > 1.0).any() or (theta o 0.0).any():
# Generate a new initial guess using odeint and solve again
theta0 = solve_ode(kf,kr)
theta = solve_findroot(kf,kr,theta0)
rates = get_rates(theta,kf,kr)
# Store the solutions
num_data [j_range [j],i] = rates [3] # the numerical solution
theta_ana = solve_analytically(kf,kr)
ana_data [j_range [j],i] = get_rates(theta_ana, kf,kr)[3]
# Store the numerical solution as
initial guess for the next grid point
theta0 = theta.copy()
# Generate a 2D volcano plot using matplotlib
from matplotlib.pyplot import *
for d,data in enumerate([num_data, ana_data]):
figure()
levels = np.linspace(−30,6,19)
graph = contourf(EO_range0,ECO_range0,np.log10(data), levels,cmap = cm.jet)
xlabel(r’$\Delta$E$_O$/eV’)
ylabel(r’$\Delta$E$_{CO}$/eV’)
colorbar()
scatter([−1.67,−1.25,−1.30,−2.25],
[−0.34,−1.22,−1.37,−1.58],color = ‘k’)
dx = 0.04
dy = 0.04
text(−1.67 + dx,−0.34 + dy,’Cu’)
text(−1.25 + dx,−1.22 + dy,’Pt’)
text(−1.30 + dx,−1.37,’Pd’)
text(−2.25 + dx,−1.58 + dy,’Rh’)
axis([−2.5,0.,−2.5,0.])
savefig(’COox_Volcano_’+str(d)+’.png’)
Acknowledgements
The author would like to thank Dr Hakan Demir for his input and proofreading the chapter.