<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" article-type="research-article">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Atmosphere</journal-id>
<journal-title>Atmosphere</journal-title>
<issn pub-type="epub">2073-4433</issn>
<publisher>
<publisher-name>Molecular Diversity Preservation International (MDPI)</publisher-name></publisher></journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.3390/atmos2030510</article-id>
<article-id pub-id-type="publisher-id">atmosphere-02-00510</article-id>
<article-categories>
<subj-group>
<subject>Article</subject></subj-group></article-categories>
<title-group>
<article-title>Chemical Mechanism Solvers in Air Quality Models <xref rid="fn1-atmosphere-02-00510" ref-type="fn"><sup>‡</sup></xref></article-title></title-group>
<contrib-group>
<contrib contrib-type="author">
<name><surname>Zhang</surname><given-names>Hong</given-names></name><xref ref-type="aff" rid="af1-atmosphere-02-00510"><sup>1</sup></xref></contrib>
<contrib contrib-type="author">
<name><surname>Linford</surname><given-names>John C.</given-names></name><xref ref-type="aff" rid="af2-atmosphere-02-00510"><sup>2</sup></xref></contrib>
<contrib contrib-type="author">
<name><surname>Sandu</surname><given-names>Adrian</given-names></name><xref ref-type="aff" rid="af1-atmosphere-02-00510"><sup>1</sup></xref><xref ref-type="corresp" rid="c1-atmosphere-02-00510"><sup>*</sup></xref></contrib>
<contrib contrib-type="author">
<name><surname>Sander</surname><given-names>Rolf</given-names></name><xref ref-type="aff" rid="af3-atmosphere-02-00510"><sup>3</sup></xref></contrib></contrib-group>
<aff id="af1-atmosphere-02-00510">
<label>1</label> Computational Science Laboratory, Department of Computer Science, Virginia Polytechnic Institute and State University, Blacksburg, VA 24061-0106, USA; E-Mail: <email>zhang@vt.edu</email></aff>
<aff id="af2-atmosphere-02-00510">
<label>2</label> Northrop Grumman Electronic Systems. 7323 Aviation Blvd., Linthicum, MD 21240, USA; E-Mail: <email>john.c.linford@gmail.com</email></aff>
<aff id="af3-atmosphere-02-00510">
<label>3</label> Air Chemistry Department, Max-Planck Institute of Chemistry, P.O. Box 3060, Mainz 55020, Germany; E-Mail: <email>rolf.sander@mpic.de</email></aff>
<author-notes>
<corresp id="c1-atmosphere-02-00510">
<label>*</label>Author to whom correspondence should be addressed; E-Mail: <email>sandu@cs.vt.edu</email>; Tel.: +1-540-231-2193; Fax: +1-540-231-9218.</corresp></author-notes>
<pub-date pub-type="collection">
<year>2011</year></pub-date>
<pub-date pub-type="epub">
<day>13</day>
<month>09</month>
<year>2011</year></pub-date>
<volume>2</volume>
<issue>3</issue>
<fpage>510</fpage>
<lpage>532</lpage>
<history>
<date date-type="received">
<day>18</day>
<month>07</month>
<year>2011</year></date>
<date date-type="rev-recd">
<day>22</day>
<month>08</month>
<year>2011</year></date>
<date date-type="accepted">
<day>31</day>
<month>08</month>
<year>2011</year></date></history>
<permissions>
<copyright-statement>© 2011 by the authors; licensee MDPI, Basel, Switzerland.</copyright-statement>
<copyright-year>2011</copyright-year>
<license>
<p>This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution license (http://creativecommons.org/licenses/by/3.0/).</p></license></permissions>
<abstract>
<p>The solution of chemical kinetics is one of the most computationally intensive tasks in atmospheric chemical transport simulations. Due to the stiff nature of the system, implicit time stepping algorithms which repeatedly solve linear systems of equations are necessary. This paper reviews the issues and challenges associated with the construction of efficient chemical solvers, discusses several families of algorithms, presents strategies for increasing computational efficiency, and gives insight into implementing chemical solvers on accelerated computer architectures.</p></abstract>
<kwd-group>
<kwd>chemical mechanisms</kwd>
<kwd>stiff solvers</kwd>
<kwd>sparsity</kwd>
<kwd>KPP</kwd>
<kwd>parallelism</kwd>
<kwd>accelerator architectures</kwd>
<kwd>KPPA</kwd></kwd-group></article-meta></front>
<body>
<sec sec-type="intro">
<label>1.</label>
<title>Introduction</title>
<p>Chemical transport models solve the mass balance equations:
<disp-formula id="FD1">
<label>(1)</label>
<mml:math id="mm1" display="block">
<mml:semantics id="sm1">
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>t</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mo>∇</mml:mo>
<mml:mo>⋅</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi>u</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mrow>
<mml:mtext>advection</mml:mtext></mml:mrow></mml:munder>
<mml:mo>+</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mo>∇</mml:mo>
<mml:mo>⋅</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mover accent="true">
<mml:mi>K</mml:mi>
<mml:mo stretchy="true">¯</mml:mo></mml:mover>
<mml:mo stretchy="true">¯</mml:mo></mml:mover>
<mml:mo>∇</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mrow>
<mml:mtext>turbulent diffiusion</mml:mtext></mml:mrow></mml:munder>
<mml:mo>+</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mrow>
<mml:mtext>chemical kinetics</mml:mtext></mml:mrow></mml:munder>
<mml:mo>+</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>p</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>r</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mrow>
<mml:mtext>other processes</mml:mtext></mml:mrow></mml:munder></mml:mrow></mml:semantics></mml:math></disp-formula>subject to appropriate initial and boundary conditions. The wind field vector <italic>ū</italic> and the turbulent diffusion tensor <italic>K̯</italic> are typically computed off-line by a numerical weather prediction model, and are constrained by observations through off-line data assimilation. The vector field <italic>y</italic> of chemical tracer concentrations evolves in time under the simultaneous action of advection, diffusion, chemical kinetics, and other processes such as emission, deposition, aerosol thermodynamics, interphase mass transfer, <italic>etc.</italic></p>
<p>The mass balance partial differential <xref rid="FD1" ref-type="disp-formula">Equation (1)</xref> is usually discretized via an operator split approach [<xref ref-type="bibr" rid="b1-atmosphere-02-00510">1</xref>]: during each time interval [<italic>T</italic>,<italic>T</italic> + Δ<italic>T</italic><sup>splitting</sup>] individual processes in <xref rid="FD1" ref-type="disp-formula">Equation (1)</xref> are solved in succession. Here Δ<italic>T</italic><sup>splitting</sup> denotes the model time split step size and should be discriminated against an integration step size, denoted by <italic>h</italic> in this paper, used by a chemical integrator. The integrator may take several steps of length <italic>h</italic> within each Δ<italic>T</italic><sup>splitting</sup>. This leads to a sequence of simpler problems involving advection and diffusion, chemistry, <italic>etc.</italic> The solution of the chemical kinetic process leads to a system of ordinary differential equations in each grid cell of the model:
<disp-formula id="FD2">
<label>(2)</label>
<mml:math id="mm2" display="block">
<mml:semantics id="sm2">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mi>y</mml:mi>
<mml:mo>′</mml:mo></mml:msup>
<mml:mo>=</mml:mo>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:mi>P</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>+</mml:mo>
<mml:mi>D</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>T</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi mathvariant="normal">Δ</mml:mi>
<mml:msup>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>splitting</mml:mtext></mml:mrow></mml:msup>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>y</mml:mi>
<mml:mo>∈</mml:mo>
<mml:msup>
<mml:mi>ℝ</mml:mi>
<mml:mi>d</mml:mi></mml:msup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>The equivalent form of the ODE function splits the reactions that influence each species into production terms <italic>P</italic>(<italic>t, y</italic>) ∈ ℝ<italic><sup>d</sup></italic> and destruction terms <italic>D</italic>(<italic>t</italic>, <italic>y</italic>) <italic>y</italic>, with <italic>D</italic>(<italic>t</italic>, <italic>y</italic>) ∈ ℝ<italic><sup>d</sup></italic><sup>×</sup><italic><sup>d</sup></italic> a diagonal matrix.</p>
<p>The solution of chemical kinetics <xref rid="FD2" ref-type="disp-formula">Equations (2)</xref> is computationally intensive, and typically accounts for 50%–95% of the total CPU time needed to solve the mass balance <xref rid="FD1" ref-type="disp-formula">Equations (1)</xref>. Special time integration methods are needed to efficiently solve <xref rid="FD2" ref-type="disp-formula">Equation (2)</xref>. In the classical review paper [<xref ref-type="bibr" rid="b2-atmosphere-02-00510">2</xref>] a number of concerns are listed for the time integration of chemical kinetic models. We revisit them in light of the experience accumulated over the past decade. The requirements and challenges for the numerical solvers of chemistry are summarized in <xref ref-type="table" rid="t1-atmosphere-02-00510">Table 1</xref>.</p>
<sec>
<title>Accuracy considerations</title>
<p>The overall accuracy of a chemical transport simulation, roughly defined as the difference between the model output and the real chemical concentration fields, is the result of nonlinear interactions between errors coming from different sources:</p>
<list list-type="bullet">
<list-item>
<p><italic>Data errors</italic>. Different data sources provide inputs to chemical transport calculations, and errors in this data impact the accuracy of the results. Data errors are associated with the accuracy and resolution of: the meteorological fields that drive the model, the rate coefficients, the emission inventory estimates, and the initial conditions and of boundary conditions (in regional simulations).</p></list-item>
<list-item>
<p><italic>Modeling errors</italic>. The model provides an imperfect representation of the physical and chemical processes in the atmosphere. Modeling errors are associated with the level of complexity of the physical modules (e.g., representation by governing equations <italic>versus</italic> representation by subgrid parameterizations) and the accuracy of the various model parameters (such as deposition velocities).</p></list-item>
<list-item>
<p><italic>Numerical errors</italic>. A numerical process approximates the solution of the governing equations within a certain accuracy level. Error due to operator splitting is important, though difficult to quantify. Errors are also contributed by the individual processes solvers, e.g., the finite spatial and temporal grid resolutions impact the accuracy with which the transport equations are resolved.</p></list-item></list>
<p>The overall simulation accuracy can be considerably improved by <italic>data assimilation</italic> [<xref ref-type="bibr" rid="b3-atmosphere-02-00510">3</xref>,<xref ref-type="bibr" rid="b4-atmosphere-02-00510">4</xref>]. Thus, the overall simulation error also depends on the amount of information carried by external measurements, and by the quality of the data assimilation system used [<xref ref-type="bibr" rid="b5-atmosphere-02-00510">5</xref>–<xref ref-type="bibr" rid="b14-atmosphere-02-00510">14</xref>].</p>
<p>Data and and modeling errors are difficult to quantify. A desirable level of overall numerical accuracy is on the order of 1%; the overall simulation accuracy can be assessed aposteriori by comparing model results and measurements. The size of the numerical errors should be at least one or two orders of magnitude below the overall target.</p>
<p>The chemical kinetic mechanism is just one subsystem of a large chemical transport simulation. Data errors are associated with the initial conditions. Model errors are associated with the level of detail of the chemical mechanism, and with the accuracy of reaction rate coefficient values. Numerical errors are associated with the particular numerical integration algorithm employed and with the length of the time steps used.</p>
<p>The target level of relative accuracy (relative error tolerance) is 0.1%, <italic>i.e.</italic>, about 3 accurate digits. (Better accuracy is of course possible, but may demand longer compute times without improving the overall simulation accuracy.) The final solution accuracy is determined by the order of accuracy of the numerical algorithm, and by the sequence of step sizes (the temporal grid). Though both the time step and the order can be adjusted dynamically to achieve the desired accuracy, the most common error control mechanism is adjusting the step size.</p>
<p>Due to operator splitting [<xref ref-type="bibr" rid="b1-atmosphere-02-00510">1</xref>], at the beginning of each integration interval the chemical system goes through a transient phase. Step sizes need to be small to resolve the transient, and need to quickly increase size after that. Therefore, numerical methods of choice are able to quickly adjust time steps (a property of one-step integration algorithms). A robust step size adaptivity mechanism is also needed. As pointed out in [<xref ref-type="bibr" rid="b2-atmosphere-02-00510">2</xref>], solvers targeting large relative error levels are likely to work outside the asymptotic error regime for which they have been designed.</p></sec>
<sec>
<title>Stiffness and stability considerations</title>
<p>Different chemical species participating in atmospheric chemical kinetics have widely different life times. Specifically, different species evolve on different time scales, from milliseconds (e.g., for radicals such as OH) to years (e.g., for CH<sub>4</sub>). The resulting system of ordinary differential equations is <italic>stiff</italic> [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>], and special care needs to be exercised in the choice of the numerical integration scheme.</p>
<p>Due to numerical stability considerations, explicit time integration methods cannot use time steps that are much larger than the fastest time scale in the system. Roughly speaking, the current solution is influenced by the approximation error made during the previous step, multiplied by the ratio of the step size over the fastest dynamic time scale. If this ratio is large the errors accumulate extremely quickly and the solution becomes unusable (numerical instability).</p>
<p>The time stepping methods used to solve atmospheric chemical kinetics should be unconditionally stable, <italic>i.e.</italic>, stable for any choice of the step size. A desirable property is L-stability [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>], which implies that the scheme is stable for any eigenvalues of the Jacobian (any dynamics) and any step size, and that very high frequencies and very fast transients are completely damped out. General methods with this stability properties are necessarily implicit. Thus, at each step the solution is obtained by solving a nonlinear system of equations.</p></sec>
<sec>
<title>Preservation of special solution properties</title>
<p>The solution of a chemical kinetic system has several intrinsic properties. The total mass and total electric charge are preserved during the system evolution, and the concentrations remain positive at all times. It is desirable that the numerical solution preserves such properties as well [<xref ref-type="bibr" rid="b16-atmosphere-02-00510">16</xref>].</p>
<p>The total mass and the total charge are linear invariants of the system, <italic>i.e.</italic>, they can be written as 
<inline-formula>
<mml:math id="mm3" display="inline">
<mml:semantics id="sm3">
<mml:mrow>
<mml:mi>M</mml:mi>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>d</mml:mi></mml:msubsup>
<mml:mrow>
<mml:msub>
<mml:mi>m</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mrow></mml:semantics></mml:math></inline-formula> and 
<inline-formula>
<mml:math id="mm4" display="inline">
<mml:semantics id="sm4">
<mml:mrow>
<mml:mi>Q</mml:mi>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>d</mml:mi></mml:msubsup>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mrow></mml:semantics></mml:math></inline-formula> where <italic>d</italic> is the number of chemical species. Most of the general purpose time integration algorithms (Runge Kutta, linear multistep, and extrapolation methods) preserve linear invariants within roundoff error. Thus mass and charge preservation are almost automatic.</p>
<p>The preservation of positivity is more difficult to achieve. Methods that preserve positivity unconditionally (for any step size) are at most of order one [<xref ref-type="bibr" rid="b17-atmosphere-02-00510">17</xref>]. For a typical integration method (implicit or explicit) the preservation of positivity restricts the time step to a small multiple of the fastest dynamic time scale; the step restriction due to positivity is as severe as that due to numerical stability for explicit methods. A simple solution to preserve positivity is clipping, where small negative concentrations are set to zero at each solution step. Clipping has the disadvantage that it consistently adds artificial mass to the system. (The total mass is no longer preserved within the roundoff error, but only within the truncation error). A more involved approach is positive projection [<xref ref-type="bibr" rid="b18-atmosphere-02-00510">18</xref>] where the solution is computed at each step, and if some concentrations are negative, a projection onto the non-negative simplex is performed such as to conserve mass, and to preserve the accuracy of the original solution. Positive projection overcomes the order one barrier [<xref ref-type="bibr" rid="b17-atmosphere-02-00510">17</xref>], but can add a significant computational overhead if the projection algorithm is called many times. A computationally lighter approach is offered by methods that favor positivity [<xref ref-type="bibr" rid="b19-atmosphere-02-00510">19</xref>].</p>
<p>Note that the preservation of positivity is important only in those situations where negative concentrations render the ODE dynamics unstable. For many chemical mechanisms used in practice, small negative concentrations do not result in instability [<xref ref-type="bibr" rid="b18-atmosphere-02-00510">18</xref>], thus the enforcement of positivity <italic>during integration</italic> is not a necessity and the small negative values can be removed in a post-processing stage.</p></sec>
<sec>
<title>Computational efficiency considerations</title>
<p>Since the solution of chemical kinetics takes up an important fraction of the total compute cycles in a chemical transport simulation, special care needs to be paid to computational efficiency Roughly speaking, an efficient computation achieves the target accuracy in the shortest CPU time possible. The total compute time depends on the number of time steps used to cover the interval [<italic>T</italic>, <italic>T</italic> + Δ<italic>T</italic><sup>splitting</sup>], and on the CPU time spent in each of these steps.</p>
<p>We have seen that the solution of stiff chemistry requires implicit time integration algorithms. Most of the computational effort per step is spent in solving the system of nonlinear equations. In a Newton-Raphson approach, the LU factorization of the Jacobian is computed once, and is reused for all iterations; most of the computational effort is spent on performing the LU factorization and the repeated substitutions. The following ideas have proved successful in reducing the computational effort per step:</p>
<list list-type="bullet">
<list-item>
<p>Avoid solving coupled nonlinear systems by the use of approximate implicit algorithms [<xref ref-type="bibr" rid="b20-atmosphere-02-00510">20</xref>];</p></list-item>
<list-item>
<p>Use sparse linear algebra techniques [<xref ref-type="bibr" rid="b21-atmosphere-02-00510">21</xref>,<xref ref-type="bibr" rid="b22-atmosphere-02-00510">22</xref>];</p></list-item>
<list-item>
<p>Reduce the number of forward and backward substitutions by using iteration-free (linearly-implicit) time stepping algorithms [<xref ref-type="bibr" rid="b23-atmosphere-02-00510">23</xref>,<xref ref-type="bibr" rid="b24-atmosphere-02-00510">24</xref>].</p></list-item></list>
<p>The reduction in the number of necessary time steps requires a good mechanism for time step adaptivity [<xref ref-type="bibr" rid="b25-atmosphere-02-00510">25</xref>]. Such a mechanism should provide a sufficiently conservative error estimation to avoid a large number of step rejections, yet should be aggressive enough to quickly increase the time step after the transient and cover [<italic>T</italic>, <italic>T</italic> + Δ<italic>T</italic><sup>splitting</sup>] in a small number of steps.</p>
<p>A considerable increase in efficiency is possible based on the important observation that chemical systems <xref rid="FD2" ref-type="disp-formula">Equation (2)</xref> need to be solved independently in each grid cell. Thus the overall chemistry computation is embarrassingly parallel [<xref ref-type="bibr" rid="b26-atmosphere-02-00510">26</xref>], with as many independent tasks as there are grid cells in the spatial discretization. A direct parallel computation can be built via domain decomposition, where the computational grid is split into tiles, and each tile is mapped onto a different processor. Each processor solves chemistry in all gridpoints belonging to its associated tile [<xref ref-type="bibr" rid="b27-atmosphere-02-00510">27</xref>–<xref ref-type="bibr" rid="b31-atmosphere-02-00510">31</xref>]. An early approach to exploit parallelism was through vectorization [<xref ref-type="bibr" rid="b21-atmosphere-02-00510">21</xref>], where each instruction line of the chemical solver acts repeatedly on different data items associated with different cells. This idea has found renewed interest due to modern accelerator architectures such as the Cell Broadband Engine and general purpose graphical processing units (GPGPUs) [<xref ref-type="bibr" rid="b32-atmosphere-02-00510">32</xref>–<xref ref-type="bibr" rid="b35-atmosphere-02-00510">35</xref>].</p></sec></sec>
<sec sec-type="methods">
<label>2.</label>
<title>Stiff Integration Methods</title>
<p>Some early techniques for dealing with stiffness of chemical ODE systems in the atmospheric chemistry include analytical techniques [<xref ref-type="bibr" rid="b36-atmosphere-02-00510">36</xref>,<xref ref-type="bibr" rid="b37-atmosphere-02-00510">37</xref>], iterative backward differentiation schemes [<xref ref-type="bibr" rid="b38-atmosphere-02-00510">38</xref>,<xref ref-type="bibr" rid="b39-atmosphere-02-00510">39</xref>], family chemistry scheme [<xref ref-type="bibr" rid="b40-atmosphere-02-00510">40</xref>] and many others. In this section, we look in detail at several contemporary solution techniques and methods and discuss their efficient implementation.</p>
<p>The Kinetic PreProcessor (KPP) [<xref ref-type="bibr" rid="b25-atmosphere-02-00510">25</xref>,<xref ref-type="bibr" rid="b41-atmosphere-02-00510">41</xref>–<xref ref-type="bibr" rid="b45-atmosphere-02-00510">45</xref>] provides a comprehensive suite of stiff numerical integrators has been widely used. The KPP library contains several stiff solvers. Efficient implementations exploit the sparsity structure of the chemical system. The flexible KPP framework allows to easily incorporate additional solvers. To date, KPP has been successfully integrated with major models including CMAQ [<xref ref-type="bibr" rid="b46-atmosphere-02-00510">46</xref>], GEOS-Chem [<xref ref-type="bibr" rid="b47-atmosphere-02-00510">47</xref>], STEM [<xref ref-type="bibr" rid="b48-atmosphere-02-00510">48</xref>], ECHAM5/MESSy [<xref ref-type="bibr" rid="b49-atmosphere-02-00510">49</xref>], and WRF-Chem [<xref ref-type="bibr" rid="b50-atmosphere-02-00510">50</xref>] and provides users with good combination of accuracy and efficiency. We will discuss several popular families of stiff integration methods and will present their KPP implementation.</p>
<sec>
<label>2.1.</label>
<title>QSSA</title>
<p>The QSSA method [<xref ref-type="bibr" rid="b51-atmosphere-02-00510">51</xref>] is of historical significance since it was one of the earliest numerical schemes used to treat chemistry in air quality simulations. QSSA uses an approximate implicitness and avoids the solution of nonlinear systems completely.</p>
<p>Starting with the production-destruction form of the chemical kinetic ODE <xref rid="FD2" ref-type="disp-formula">Equation (2)</xref>, one keeps the arguments of <italic>P</italic> and <italic>D</italic> fixed at the current time step <italic>t<sub>n</sub></italic>. The resulting approximate ODE is linear
<disp-formula id="FD3">
<mml:math id="mm5" display="block">
<mml:semantics id="sm5">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mi>y</mml:mi>
<mml:mo>′</mml:mo></mml:msup>
<mml:mo>=</mml:mo>
<mml:mi>P</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>+</mml:mo>
<mml:mi>D</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>≤</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>≤</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>y<sub>n</sub></italic> is the numerical solution that approximates <italic>y</italic>(<italic>t<sub>n</sub></italic>) and <italic>h</italic> is the chemical integration step size (typically smaller than the operator splitting time step Δ<italic>T</italic><sup>splitting</sup> in <xref rid="FD2" ref-type="disp-formula">Equation 2</xref>). This linear system can be solved analytically:
<disp-formula id="FD4">
<label>(3)</label>
<mml:math id="mm6" display="block">
<mml:semantics id="sm6">
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>D</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:msup>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">I</mml:mtext>
<mml:mtext>d</mml:mtext></mml:msub>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>D</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:msup>
<mml:mo stretchy="false">)</mml:mo>
<mml:msup>
<mml:mi>D</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mi>P</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula>where <bold>I</bold><italic><sub>d</sub></italic> ∈ ℝ<italic><sup>d</sup></italic><sup>×</sup><italic><sup>d</sup></italic> is the identity matrix. Owing to the diagonal structure of <italic>D</italic>(<italic>t<sub>n</sub></italic><sub>+1</sub>, <italic>y<sub>n</sub></italic><sub>+1</sub>), the QSSA formula <xref rid="FD4" ref-type="disp-formula">Equation (3)</xref> is solved component by component, <italic>i.e.</italic>, it involves only scalar operations. QSSA can be interpreted as the exponentially fitted Euler method [<xref ref-type="bibr" rid="b52-atmosphere-02-00510">52</xref>], with the Jacobian <bold>J</bold>(<italic>t</italic>, <italic>y</italic>) = <italic>f<sub>y</sub></italic>(<italic>t</italic>, <italic>y</italic>) approximated by the diagonal destruction matrix <italic>D</italic>(<italic>t</italic>, <italic>y</italic>).</p>
<p>A careful analysis of the QSSA method has revealed that it is of first order, and improved QSSA methods remain of first order under stiffness [<xref ref-type="bibr" rid="b20-atmosphere-02-00510">20</xref>]. QSSA provides positive solutions, but it does not preserve the linear invariants of the system (<italic>i.e.</italic>, total mass and charge). Since the calculations are done component by component, the QSSA implicitness does not account for fast interactions happening among multiple species. QSSA is stable when the eigenvectors associated with the stiffest eigenvalues are close to unit vectors. When this is not the case, QSSA requires considerable reductions of the step size for stability. KPP offers implementations of several versions of the QSSA method.</p></sec>
<sec>
<label>2.2.</label>
<title>BDF Methods</title>
<p>Backward differentiation formulas (BDF) have become famous under the name “Gear” methods for solving chemical kinetic problems. BDF are linear multistep methods with excellent stability properties for the integration of stiff systems [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]. BDF methods have been applied extensively in chemical transport modeling. An important instance is the celebrated SMVGEAR (sparse matrix vectorized Gear [<xref ref-type="bibr" rid="b21-atmosphere-02-00510">21</xref>]) code. Examples of representative air pollution models using SMVGEAR or SMVGEAR II code include CMAQ, GEOS-CHEM and GATOR-GCMO [<xref ref-type="bibr" rid="b40-atmosphere-02-00510">40</xref>]. High quality, general purpose implementations of BDF methods are provided by the codes LSODE (Livermore Solver for ODEs, [<xref ref-type="bibr" rid="b53-atmosphere-02-00510">53</xref>]), VODE (Variable coefficient ODE solver [<xref ref-type="bibr" rid="b54-atmosphere-02-00510">54</xref>]), and Sundials (suite of nonlinear and differential/algebraic equation solvers [<xref ref-type="bibr" rid="b55-atmosphere-02-00510">55</xref>]). The closely related algorithms NDF (numerical differentiation formulas) are implemented by the ode15 s stiff ODE solver in Matlab.</p>
<p>The <italic>k</italic>-step BDF method reads [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]
<disp-formula id="FD5">
<label>(4)</label>
<mml:math id="mm7" display="block">
<mml:semantics id="sm7">
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn></mml:mrow>
<mml:mi>k</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>α</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>−</mml:mo>
<mml:mi>i</mml:mi></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mi>h</mml:mi>
<mml:mspace width="0.2em"/>
<mml:mi>β</mml:mi>
<mml:mspace width="0.2em"/>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>where the coefficients <italic>α<sub>i</sub></italic> and <italic>β</italic> are particular to the method and ensure that the order of consistency is <italic>k</italic>. The order <italic>k</italic> varies between one and five; higher order BDF formulas are unusable due to their lack of stability.</p>
<p>Practical implementations of BDF formulas are able to adapt both the time step and the order to achieve maximum efficiency For easily adjusting the step size it is convenient to represent the past history by the Nordsieck array [<xref ref-type="bibr" rid="b56-atmosphere-02-00510">56</xref>], as is done in LSODE
<disp-formula id="FD6">
<label>(5)</label>
<mml:math id="mm8" display="block">
<mml:semantics id="sm8">
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>h</mml:mi>
<mml:msub>
<mml:mover accent="true">
<mml:mi>y</mml:mi>
<mml:mo>˙</mml:mo></mml:mover>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>,</mml:mo>
<mml:msup>
<mml:mi>h</mml:mi>
<mml:mi>k</mml:mi></mml:msup>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>/</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>!</mml:mo></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>∈</mml:mo>
<mml:msup>
<mml:mi>ℝ</mml:mi>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mo>×</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:semantics></mml:math></disp-formula>where, instead of storing <italic>y<sub>n</sub></italic><sub>+1−</sub><italic><sub>k</sub></italic>,…, <italic>y<sub>n</sub></italic>, one stores the derivatives of the solution at the current time. (The solution reconstruction is based on a Taylor polynomial approximation, rather than on a polynomial interpolant.) A step size change from <italic>h</italic> to <italic>rh</italic> is accommodated through a simple rescaling of the entries of <italic>z<sub>n</sub></italic> by powers of <italic>r</italic>.</p>
<p>The nonlinear system <xref rid="FD5" ref-type="disp-formula">Equation (4)</xref>—in Nordsieck formulation—is solved for <italic>y<sub>n</sub></italic><sub>+1</sub> by a Newton-Raphson iterative approach. The starting point provided by the <italic>k</italic><sup>th</sup> order “predictor” approximation of <italic>z<sub>n</sub></italic> is given by
<disp-formula id="FD7">
<label>(6)</label>
<mml:math id="mm9" display="block">
<mml:semantics id="sm9">
<mml:mrow>
<mml:msubsup>
<mml:mi>z</mml:mi>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mi>A</mml:mi></mml:mrow></mml:semantics></mml:math></disp-formula>where the transformation matrix <italic>A</italic> is a lower-triangular Pascal matrix [<xref ref-type="bibr" rid="b56-atmosphere-02-00510">56</xref>]. The product <italic>z<sub>n</sub></italic><sub>−1</sub> <italic>A</italic> can be carried out by repeated additions to reduce the considerable computational effort. To save memory, <italic>A</italic> need not be stored and Darshana overwrites <italic>z<sub>n−</sub></italic><sub>1</sub> directly.</p>
<p>The Newton-Raphson iterations proceed as follows
<disp-formula id="FD8">
<label>(7)</label>
<mml:math id="mm10" display="block">
<mml:semantics id="sm10">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:mi>g</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>−</mml:mo>
<mml:mi>h</mml:mi>
<mml:msubsup>
<mml:mover accent="true">
<mml:mi>y</mml:mi>
<mml:mo>˙</mml:mo></mml:mover>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msubsup>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mtext>P</mml:mtext>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:mi>g</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>M</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>ℓ</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>ℓ</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>ℓ<sub>i</sub></italic> are appropriate coefficients. Note that the first column of <italic>z<sub>n</sub></italic><sub>+1</sub> is the ODE solution <italic>y<sub>n</sub></italic><sub>+1</sub>. The “prediction” matrix is <bold>P</bold> = <bold>I</bold> <italic>− h β</italic> <bold>J</bold>(<italic>t<sub>n</sub></italic>, <italic>y<sub>n</sub></italic>). In order to reduce the number of LU factorizations, the step size and the Jacobian can be held constant for multiple steps, in which case <bold>P</bold> = <bold>I</bold> − <italic>h<sub>n−j</sub> β</italic> <bold>J</bold>(<italic>t<sub>n−j</sub></italic>, <italic>y<sub>n−j</sub></italic>) with <italic>j</italic> &gt; 0.</p>
<p>After the iterations converge, the local truncation error is estimated by
<disp-formula id="FD9">
<label>(8)</label>
<mml:math id="mm11" display="block">
<mml:semantics id="sm11">
<mml:mrow>
<mml:msub>
<mml:mi>d</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>!</mml:mo>
<mml:msub>
<mml:mi>ℓ</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:mfrac>
<mml:msubsup>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>M</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:semantics></mml:math></disp-formula>For step size control one defines a scaled norm of the local truncation error
<disp-formula id="FD10">
<label>(9)</label>
<mml:math id="mm12" display="block">
<mml:semantics id="sm12">
<mml:mrow>
<mml:mtext mathvariant="italic">Err</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>‖</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>d</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo>‖</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mi>d</mml:mi></mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>d</mml:mi></mml:munderover>
<mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>d</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mtext>RelTol</mml:mtext>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo>⋅</mml:mo>
<mml:mo>max</mml:mo>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>n</mml:mi></mml:mrow></mml:msub></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>n</mml:mi></mml:mrow></mml:msub></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow></mml:mrow>
<mml:mo>}</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext>AbsTol</mml:mtext>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:msqrt></mml:mrow></mml:semantics></mml:math></disp-formula>where RelTol and AbsTol are user-supplied vectors of relative and absolute error tolerances that describe the target accuracy level. For a 3D chemical transport model it is necessary to use vector, rather than scalar, absolute tolerances. Moreover, the concentrations of different species vary considerably across grid points; for example, the pressure change with altitude leads to orders of magnitude differences in the number of molecules per cubic centimeter. As a result, constant absolute error tolerances are not appropriate in three dimensional simulations [<xref ref-type="bibr" rid="b57-atmosphere-02-00510">57</xref>]. Absolute tolerance vectors should account for different concentration levels of different species within the same grid point, and should vary with location to capture the geographic and altitude variation of concentrations.</p>
<p>If ‖<italic>d<sub>n</sub></italic><sub>+1</sub>‖ ≤ <italic>φ</italic><sub>safe</sub> the solution <italic>y<sub>n</sub></italic> is accepted, otherwise it is rejected for being insufficiently accurate. The safety factor has a value slightly smaller than one, typically <italic>φ</italic><sub>safe</sub> = 0.9. In both situations a change in stepsize and/or order is considered in order to maximize computational efficiency.</p>
<p>Note that VODE uses a variable-coefficient implementation (fixed-leading coefficient form) instead of the fixed-step-interpolate methods in LSODE. The fixed-leading coefficient form shows better performance on many, though not all, stiff problems. KPP offers interfaces to both LSODE and VODE modified to use the optimized sparse linear algebra routines generated by KPP.</p></sec>
<sec>
<label>2.3.</label>
<title>Implicit Runge Kutta Methods</title>
<p>A general s-stage implicit Runge-Kutta method reads [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]
<disp-formula id="FD11">
<label>(10)</label>
<mml:math id="mm13" display="block">
<mml:semantics id="sm13">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>s</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>,</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>s</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>s</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>b</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd/></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>where the coefficients <italic>a<sub>ij</sub></italic>, <italic>b<sub>i</sub></italic> and <italic>c<sub>i</sub></italic> define the method and are are chosen such that the desired accuracy and stability properties are obtained. To reduce the influence of round-off errors, implementations use the variable transformation <italic>z<sub>i</sub></italic> = <italic>k<sub>i</sub></italic> − <italic>y<sub>n</sub></italic> [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>] in <xref rid="FD11" ref-type="disp-formula">Equation (10)</xref> to obtain the equivalent form
<disp-formula id="FD12">
<label>(11)</label>
<mml:math id="mm14" display="block">
<mml:semantics id="sm14">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi>h</mml:mi>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>s</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>s</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>s</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>d</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd/></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>The nonlinear system <xref rid="FD12" ref-type="disp-formula">Equation (11)</xref> is solved at each step to obtain <italic>z</italic><sub>1</sub>,…, <italic>z<sub>s</sub></italic>. For general, fully implicit Runge-Kutta methods this system is of dimension <italic>ds</italic> × <italic>ds</italic> [<xref ref-type="bibr" rid="b41-atmosphere-02-00510">41</xref>]
<disp-formula id="FD13">
<label>(12)</label>
<mml:math id="mm15" display="block">
<mml:semantics id="sm15">
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>⋮</mml:mo></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>A</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">I</mml:mtext>
<mml:mtext>d</mml:mtext></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>⋅</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>⋮</mml:mo></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>s</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>s</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>A</italic> = (<italic>a<sub>ij</sub></italic>) is the matrix of method coefficients, and ⊗ is the matrix Kronecker product. The Kronecker product of <bold>P</bold> ∈ ℝ<italic><sup>m</sup></italic><sup>×</sup><italic><sup>m</sup></italic> and <bold>Q</bold> ∈ ℝ<italic><sup>n</sup></italic><sup>×</sup><italic><sup>n</sup></italic> is the following <italic>mn</italic> × <italic>mn</italic> matrix
<disp-formula id="FD14">
<label>(13)</label>
<mml:math id="mm16" display="block">
<mml:semantics id="sm16">
<mml:mrow>
<mml:mtext>P</mml:mtext>
<mml:mo>⊗</mml:mo>
<mml:mtext>Q</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>11</mml:mn></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>12</mml:mn></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mo>⋯</mml:mo></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mi>n</mml:mi></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>21</mml:mn></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>22</mml:mn></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mo>⋯</mml:mo></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>n</mml:mi></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>⋮</mml:mo></mml:mtd>
<mml:mtd>
<mml:mo>⋮</mml:mo></mml:mtd>
<mml:mtd>
<mml:mo>⋱</mml:mo></mml:mtd>
<mml:mtd>
<mml:mo>⋮</mml:mo></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mn>2</mml:mn></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mo>⋯</mml:mo></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mi>n</mml:mi></mml:mrow></mml:msub>
<mml:mi>Q</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>Using the compact notation
<disp-formula id="FD15">
<label>(14)</label>
<mml:math id="mm17" display="block">
<mml:semantics id="sm17">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>Z</mml:mi>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>⋮</mml:mo></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>F</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>Z</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mo>⋮</mml:mo></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>s</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>the nonlinear system <xref rid="FD13" ref-type="disp-formula">Equation (12)</xref> can be written as
<disp-formula id="FD16">
<label>(15)</label>
<mml:math id="mm18" display="block">
<mml:semantics id="sm18">
<mml:mrow>
<mml:mi>Z</mml:mi>
<mml:mo>=</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>A</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">I</mml:mtext>
<mml:mi>d</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>⋅</mml:mo>
<mml:mi>F</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>Z</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula>The system <xref rid="FD16" ref-type="disp-formula">Equation (15)</xref> is solved by simplified Newton-Raphson iterations [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>] of the form
<disp-formula id="FD17">
<label>(16)</label>
<mml:math id="mm19" display="block">
<mml:semantics id="sm19">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">I</mml:mtext>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>s</mml:mi></mml:mrow></mml:msub>
<mml:mo>−</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>A</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mtext mathvariant="bold">J</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo stretchy="false">]</mml:mo>
<mml:mi mathvariant="normal">Δ</mml:mi>
<mml:msup>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msup>
<mml:mo>−</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>A</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">I</mml:mtext>
<mml:mi>d</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mi>F</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msup>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msup>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msup>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msup>
<mml:mo>−</mml:mo>
<mml:mi mathvariant="normal">Δ</mml:mi>
<mml:msup>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msup>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>M</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>Note that the Jacobian is only evaluated at the beginning of the current time step. Following [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>], a transformation of the system <xref rid="FD17" ref-type="disp-formula">Equation (16)</xref> to complex form replaces the costly <italic>ds</italic>-dimensional real LU decomposition by several <italic>d</italic>-dimensional LU decompositions of real and complex matrices.</p>
<p>A Singly Diagonally-Implicit Runge-Kutta (SDIRK) method is a special case of the fully implicit Runge-Kutta method with coefficients satisfying <italic>a<sub>ij</sub></italic> = 0 for <italic>j</italic> &gt; <italic>i</italic> and <italic>a<sub>ii</sub></italic> = <italic>γ</italic> for all <italic>i</italic>. In contrast to the fully implicit Runge-Kutta method, the nonlinear system <xref rid="FD13" ref-type="disp-formula">Equation (12)</xref> naturally decouples into a sequence of <italic>d</italic>-dimensional real systems [<xref ref-type="bibr" rid="b41-atmosphere-02-00510">41</xref>] of the form
<disp-formula id="FD18">
<label>(17)</label>
<mml:math id="mm20" display="block">
<mml:semantics id="sm20">
<mml:mrow>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:mi>h</mml:mi>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mspace width="0.2em"/>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>γ</mml:mi>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>Each stage <italic>i</italic> solves for the vector <italic>z<sub>i</sub></italic> by simplified Newton-Raphson iterations
<disp-formula id="FD19">
<label>(18)</label>
<mml:math id="mm21" display="block">
<mml:semantics id="sm21">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">I</mml:mtext>
<mml:mi>d</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>γ</mml:mi>
<mml:mtext mathvariant="bold">J</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo stretchy="false">]</mml:mo>
<mml:mi mathvariant="normal">Δ</mml:mi>
<mml:msubsup>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:mi>h</mml:mi>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:mi>a</mml:mi>
<mml:msub>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msup>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:mi mathvariant="normal">Δ</mml:mi>
<mml:msubsup>
<mml:mi>z</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:msubsup>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>M</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>The Jacobian matrix is only evaluated at the beginning of the time step. The LU factorization of <bold>I</bold><italic><sub>d</sub></italic> − <italic>h γ</italic> <bold>J</bold>(<italic>t<sub>n</sub></italic>, <italic>y<sub>n</sub></italic>) is shared for all iterations <italic>m</italic> and for all stages <italic>i</italic>, so that only one LU decomposition is performed in each time step.</p>
<p>An estimator of the local truncation error is obtained with the help of the embedded formula
<disp-formula id="FD20">
<label>(19)</label>
<mml:math id="mm22" display="block">
<mml:semantics id="sm22">
<mml:mrow>
<mml:msub>
<mml:mover accent="true">
<mml:mi>y</mml:mi>
<mml:mo>^</mml:mo></mml:mover>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>s</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mover accent="true">
<mml:mi>b</mml:mi>
<mml:mo>^</mml:mo></mml:mover>
<mml:mi>i</mml:mi></mml:msub>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>This formula provides an alternative numerical solution <italic>ŷ<sub>n</sub></italic><sub>+1</sub> using the already computed increment vectors <italic>k<sub>i</sub></italic>, but different weights <italic>b̂<sub>i</sub></italic>. The coefficients are usually chosen such that the order of consistency of <italic>ŷ<sub>n</sub></italic><sub>+1</sub> is one less than that of <italic>y<sub>n</sub></italic><sub>+1</sub>. The difference vector <italic>d<sub>n</sub></italic><sub>+1</sub> = <italic>ŷ<sub>n</sub></italic><sub>+1</sub> − <italic>y<sub>n</sub></italic><sub>+1</sub> provides the local error estimator. As pointed out in [<xref ref-type="bibr" rid="b41-atmosphere-02-00510">41</xref>], such estimators work well with SDIRK methods, but they are more difficult to construct for fully implicit Runge-Kutta methods since additional stages are needed.</p>
<p>The step adjustment strategy uses <xref rid="FD10" ref-type="disp-formula">Equation (9)</xref> to compute the error norm <italic>Err</italic> = ‖<italic>d<sub>n</sub></italic><sub>+1</sub>‖ based on the user specified relative and absolute tolerances. The step is accepted if <italic>Err</italic> ≤ <italic>φ<sub>s</sub></italic><sub>af</sub><italic><sub>e</sub></italic>, and rejected otherwise. A rejected step is repeated with a smaller step size. The safety factor has a value slightly smaller than one, typically <italic>φ</italic><sub>safe</sub> = 0.9.</p>
<p>The new step size is estimated by the asymptotic formula
<disp-formula id="FD21">
<label>(20)</label>
<mml:math id="mm23" display="block">
<mml:semantics id="sm23">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>η</mml:mi>
<mml:mo>=</mml:mo>
<mml:mo>min</mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>ϕ</mml:mi>
<mml:mrow>
<mml:mo>max</mml:mo></mml:mrow></mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>max</mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>ϕ</mml:mi>
<mml:mrow>
<mml:mo>min</mml:mo></mml:mrow></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>ϕ</mml:mi>
<mml:mrow>
<mml:mtext>safe</mml:mtext></mml:mrow></mml:msub>
<mml:mo>⋅</mml:mo>
<mml:mi>E</mml:mi>
<mml:mi>r</mml:mi>
<mml:msup>
<mml:mi>r</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>/</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi>p</mml:mi>
<mml:mo>^</mml:mo></mml:mover>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:msup></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext>h</mml:mtext>
<mml:mrow>
<mml:mtext>new</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>h</mml:mi>
<mml:mrow>
<mml:mtext>old</mml:mtext></mml:mrow></mml:msub>
<mml:mo>⋅</mml:mo>
<mml:mi>η</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>φ</italic><sub>max</sub> is an upper bound, and <italic>φ</italic><sub>min</sub> a lower bound on the step change factor. Typical values are <italic>φ</italic><sub>max</sub> = 10, <italic>φ</italic><sub>min</sub> = 0.1, and <italic>φ</italic><sub>safe</sub> = 0.9. If the step size has been recently rejected, the allowed increase factor is further limited (e.g., <italic>φ</italic><sub>max</sub> = 1 following a rejection). Furthermore, the step size is constrained such that <italic>h<sub>min</sub></italic> ≤ <italic>h</italic> ≤ <italic>h<sub>max</sub></italic>, and the starting step size is specified <italic>h</italic> = <italic>h<sub>start</sub></italic>. Numerical experiments in [<xref ref-type="bibr" rid="b41-atmosphere-02-00510">41</xref>–<xref ref-type="bibr" rid="b43-atmosphere-02-00510">43</xref>] demonstrate that this step size control strategy works well for a wide range of atmospheric chemical kinetic problems.</p>
<p>Several Runge Kutta methods are available in the KPP numerical library. The fully implicit schemes implemented are the 3-stage Radau-IIa, Radau-Ia, Lobatto-IIIc, and Gauss methods [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]. The SDIRK schemes involve Sdirk-4a and Sdirk-4b (5 stages, order 4, L-stable), Sdirk3a (3 stages, order 2, stiffly accurate), and Sdirk2a and Sdirk-2b (2 stages, order 2, stiffly accurate).</p></sec>
<sec>
<label>2.4.</label>
<title>Rosenbrock Methods</title>
<p>Rosenbrock methods are competitive with other stiff solvers for low to modest accuracy, and therefore are attractive for atmospheric chemistry applications [<xref ref-type="bibr" rid="b23-atmosphere-02-00510">23</xref>]. Rosenbrock methods can be considered as linearly-implicit versions of Runge Kutta methods. To avoid nonlinear systems, the Jacobian is used directly in the integration formula [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>,<xref ref-type="bibr" rid="b58-atmosphere-02-00510">58</xref>] and each stage requires the solution of a linear system. For example, the backward (fully implicit) Euler method solves at each step the nonlinear system
<disp-formula id="FD22">
<mml:math id="mm24" display="block">
<mml:semantics id="sm24">
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:mspace width="0.2em"/>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula>to obtain <italic>y<sub>n</sub></italic><sub>+1</sub>. The linearly implicit Euler method solves a linear system to obtain an increment vector <italic>k</italic>, which is then used to update the solution
<disp-formula id="FD23">
<label>(21)</label>
<mml:math id="mm25" display="block">
<mml:semantics id="sm25">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi>h</mml:mi>
<mml:mspace width="0.2em"/>
<mml:mi>f</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:mtext mathvariant="bold">J</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>⋅</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>k</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>This algorithm corresponds to a single Newton iteration solving the backward Euler equation. Note that the system Jacobian matrix <bold>J</bold> appears explicitly in the discretization scheme.</p>
<p>A general <italic>s</italic>-stage Rosenbrock method Rosenbrock [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>,<xref ref-type="bibr" rid="b58-atmosphere-02-00510">58</xref>] computes the next step solution as follows:
<disp-formula id="FD24">
<label>(22)</label>
<mml:math id="mm26" display="block">
<mml:semantics id="sm26">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi>h</mml:mi>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>α</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>α</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>γ</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msup>
<mml:mi>h</mml:mi>
<mml:mn>2</mml:mn></mml:msup>
<mml:msub>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:mtext mathvariant="bold">J</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>⋅</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>i</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>γ</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>s</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>b</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>where the coefficients <italic>b<sub>i</sub></italic>, <italic>α<sub>ij</sub></italic> and <italic>γ<sub>ij</sub></italic> define particular methods and are chosen such as to obtain the desired accuracy and stability properties [<xref ref-type="bibr" rid="b22-atmosphere-02-00510">22</xref>]. We have that <italic>α<sub>ij</sub></italic> = 0 for <italic>j</italic> ≥ <italic>i</italic>, <italic>γ<sub>ij</sub></italic> = 0 for <italic>j</italic> ≥ <italic>i</italic> + 1, and
<disp-formula id="FD25">
<mml:math id="mm27" display="block">
<mml:semantics id="sm27">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>α</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>α</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mo>,</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>γ</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>i</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>γ</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>The term <italic>f<sub>t</sub></italic> represents the partial derivative of the ODE function with respect to time, and is equal to zero in the case of autonomous systems.</p>
<p>For implementation purposes, it is advantageous to choose all the diagonal coefficients equal to each other, <italic>γ<sub>ii</sub></italic> = <italic>γ</italic> for all stages <italic>i</italic> = 1,…, <italic>s</italic>, and to avoid Jacobian-vector products by changing <xref rid="FD24" ref-type="disp-formula">Equation (22)</xref> to the mathematically equivalent formulation [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]
<disp-formula id="FD26">
<label>(23)</label>
<mml:math id="mm28" display="block">
<mml:semantics id="sm28">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mrow>
<mml:mi>h</mml:mi>
<mml:mi>γ</mml:mi></mml:mrow></mml:mfrac>
<mml:mtext mathvariant="bold">I</mml:mtext>
<mml:mo>−</mml:mo>
<mml:mtext mathvariant="bold">J</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>⋅</mml:mo>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>α</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mi>h</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow>
<mml:mi>h</mml:mi></mml:mfrac>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:msub>
<mml:mi>γ</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msub>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>s</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>m</mml:mi>
<mml:mi>j</mml:mi></mml:msub>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>where
<disp-formula id="FD27">
<mml:math id="mm29" display="block">
<mml:semantics id="sm29">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi mathvariant="normal">Γ</mml:mi>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>γ</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>s</mml:mi></mml:mrow></mml:msub>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>s</mml:mi></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>α</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>s</mml:mi></mml:mrow></mml:msub>
<mml:mo>⋅</mml:mo>
<mml:msup>
<mml:mi mathvariant="normal">Γ</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>m</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>s</mml:mi></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>b</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>s</mml:mi></mml:mrow></mml:msub>
<mml:mo>⋅</mml:mo>
<mml:msup>
<mml:mi mathvariant="normal">Γ</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>Note that <xref rid="FD26" ref-type="disp-formula">Equation (23)</xref> avoids not only the matrix-vector multiplications, but also the <italic>n</italic><sup>2</sup> multiplications for constructing the matrix-scalar product <italic>hγ</italic><bold>J</bold>. The computational cost per step for the Rosenbrock method <xref rid="FD26" ref-type="disp-formula">Equation (23)</xref> is that of one real <italic>d</italic> × <italic>d</italic> LU factorization, <italic>s</italic> forward and backward substitutions, and one Jacobian plus <italic>s</italic> function evaluations. This cost is similar to that of one BDF step using <italic>M</italic> = <italic>s</italic> simplified Newton iterations <xref rid="FD8" ref-type="disp-formula">Equation (7)</xref> and no Jacobian factorization re-use.</p>
<p>The local error estimator for Rosenbrock methods is based on an embedded formula for error estimation, similar to <xref rid="FD20" ref-type="disp-formula">Equation (19)</xref>. The step is accepted if the error norm <xref rid="FD10" ref-type="disp-formula">Equation (9)</xref> is below <italic>φ</italic><sub>safe</sub> = 0.9, and rejected otherwise. The next time step size is calculated by <xref rid="FD21" ref-type="disp-formula">Equation (20)</xref>.</p>
<p>An important sub-class are the Rosenbrock-W methods, which allow the use of any approximation <bold>J̃</bold> instead of the complete Jacobian <bold>J</bold> in <xref rid="FD26" ref-type="disp-formula">Equation (23)</xref> without losing their order of accuracy. Rosenbrock-W methods may result in considerable computational savings by replacing the Jacobian with a sparser approximation, with a tensor product of smaller matrices, <italic>etc.</italic></p>
<p>Careful benchmarks of stiff solvers [<xref ref-type="bibr" rid="b23-atmosphere-02-00510">23</xref>,<xref ref-type="bibr" rid="b24-atmosphere-02-00510">24</xref>,<xref ref-type="bibr" rid="b42-atmosphere-02-00510">42</xref>,<xref ref-type="bibr" rid="b59-atmosphere-02-00510">59</xref>] indicate that Rosenbrock methods are the most efficient for the low to medium accuracy range required in chemical transport applications.</p>
<p>Several Rosenbrock methods are available in the KPP numerical library. They are Rodas (the 6-stage method based on a stiffly accurate pair of order 4(3) [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]), Ros4 (based on a 4 stage, L-stable, embedded pair of order 4(3) [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]), Rodas3 (a 4-stage, stiffly accurate, embedded pair of order 3(2) [<xref ref-type="bibr" rid="b23-atmosphere-02-00510">23</xref>]), Ros3 (a 3-stage, L-stable pair of order 3(2) [<xref ref-type="bibr" rid="b23-atmosphere-02-00510">23</xref>]), and Ros2a and Ros2b (2-stage stiffly accurate pairs of order 2(1) [<xref ref-type="bibr" rid="b23-atmosphere-02-00510">23</xref>]). In addition, the method Rang3 is a Rosenbrock-W scheme of order 3 with 5 stages.</p></sec>
<sec>
<label>2.5.</label>
<title>Extrapolation Methods</title>
<p>This family of methods constructs numerical solutions by applying Richardson extrapolation to a sequence of low order approximations, each made with a different step size [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>]. The extrapolation approach can be used to construct methods of arbitrarily high order. Extrapolation methods are very effective for high accuracy calculations.</p>
<p>Consider a sequence of step sizes <italic>τ</italic><sub>1</sub>, <italic>τ</italic><sub>2</sub>, <italic>τ</italic><sub>3</sub>, … defined by by <italic>τ<sub>j</sub></italic> = <italic>h/j</italic>. Further, consider the linearly implicit Euler method <xref rid="FD23" ref-type="disp-formula">Equation (21)</xref> as the “base” numerical method for solving the system <xref rid="FD2" ref-type="disp-formula">Equation (2)</xref>. Denote by
<disp-formula id="FD28">
<label>(24)</label>
<mml:math id="mm30" display="block">
<mml:semantics id="sm30">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>:</mml:mo>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mi>τ</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mi>n</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>h</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>p</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>the numerical approximation of <italic>y</italic>(<italic>t<sub>n</sub></italic><sub>+1</sub>) obtained as follows. Start from <italic>y<sub>n</sub></italic>, and march over the interval [<italic>t<sub>n</sub></italic>, <italic>t<sub>n</sub></italic><sub>+1</sub>] using <italic>j</italic> steps of <xref rid="FD23" ref-type="disp-formula">Equation (21)</xref>, each with a step size <italic>τ<sub>j</sub></italic>. All steps use the Jacobian <bold>J</bold>(<italic>t<sub>n</sub></italic>, <italic>y<sub>n</sub></italic>), and therefore share the same LU decomposition. The <italic>global error</italic> of the linearly implicit Euler method has an asymptotic expansion of the form
<disp-formula id="FD29">
<label>(25)</label>
<mml:math id="mm31" display="block">
<mml:semantics id="sm31">
<mml:mrow>
<mml:mi>y</mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>h</mml:mi></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:msup>
<mml:mi>τ</mml:mi>
<mml:mn>1</mml:mn></mml:msup>
<mml:mo>+</mml:mo>
<mml:mo>⋯</mml:mo>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:msup>
<mml:mi>τ</mml:mi>
<mml:mi>N</mml:mi></mml:msup>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>E</mml:mi>
<mml:mi>τ</mml:mi></mml:msub>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:msup>
<mml:mi>τ</mml:mi>
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>e<sub>i</sub></italic>(<italic>t<sub>n</sub></italic><sub>+1</sub>) are errors that do not depend on <italic>τ</italic>, and <italic>E<sub>τ</sub></italic> is bounded for <italic>t<sub>n</sub> ≤ t ≤ t<sub>n</sub></italic><sub>+1</sub>. (For very stiff problems a different, perturbed expansion of the global error holds [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>], but this does not change the fundamental idea of this discussion). Using the <italic>M</italic> approximations <xref rid="FD28" ref-type="disp-formula">Equation (24)</xref> obtained with different <italic>h<sub>j</sub></italic>'s, the error terms in the global error asymptotic expansion <xref rid="FD29" ref-type="disp-formula">Equation (25)</xref> can be eliminated by recursive Richardson extrapolation [<xref ref-type="bibr" rid="b60-atmosphere-02-00510">60</xref>] to build new approximations:
<disp-formula id="FD30">
<label>(26)</label>
<mml:math id="mm32" display="block">
<mml:semantics id="sm32">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mi>j</mml:mi>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi></mml:mrow></mml:msub>
<mml:mo>−</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi></mml:mrow></mml:msub>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>p</mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&lt;</mml:mo>
<mml:mi>j</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula>The numerical scheme <xref rid="FD28" ref-type="disp-formula">Equations (24)</xref>–<xref rid="FD30" ref-type="disp-formula">(26)</xref> is called the <italic>extrapolation method</italic>, and it builds an entire family of approximations. Each scheme <italic>T<sub>j,k</sub></italic><sub>+1</sub> is of order <italic>k</italic>, since extrapolation eliminates the terms <italic>e</italic>1,…, <italic>e<sub>k</sub></italic> from the global error expansion <xref rid="FD29" ref-type="disp-formula">Equation (25)</xref>. We remark that extrapolation provides a sequence of lower-order embedded method, which can be used for step size and order control.</p>
<p>The KPP numerical library offers an interface to the SEULEX code [<xref ref-type="bibr" rid="b15-atmosphere-02-00510">15</xref>] modified to use the optimized sparse linear algebra routines generated by KPP.</p></sec></sec>
<sec>
<label>3.</label>
<title>Improving Computational Efficiency</title>
<p>In this section we discuss two approaches to improve the computational efficiency of the chemical kinetic solvers in air quality models. The first approach is the use of sparse linear algebra, and the second is harnessing the power of modern accelerator architectures.</p>
<sec>
<label>3.1.</label>
<title>Sparse Linear Algebra</title>
<p>In a chemical kinetic solver, most of the computational effort is spent in solving the linear systems associated with the implicit time integration algorithms. For all methods discussed here the matrix of coefficients is of the form <bold>I</bold> − <italic>h γ</italic> <bold>J</bold>, and inherits the sparsity structure of the Jacobian.</p>
<p>In a typical chemical mechanism, the pattern of chemical interactions leads to a Jacobian that has the majority of entries equal to zero. <xref ref-type="fig" rid="f1-atmosphere-02-00510">Figure 1</xref> displays the sparsity structure of the Jacobian of the MECCA chemical mechanism, used in the numerical experiments presented in Section 5. This Jacobian has 2655 nonzero entries, <italic>i.e.</italic>, 5.6% of its total number of elements.</p>
<p>Linear algebra algorithms can take advantage of this to avoid unnecessary operations and greatly reduce CPU time. Since the sparsity structure depends only on the chemical network (and not on the values of concentrations or rate coefficients) it can be computed offline [<xref ref-type="bibr" rid="b22-atmosphere-02-00510">22</xref>,<xref ref-type="bibr" rid="b61-atmosphere-02-00510">61</xref>]. This approach has been taken by SMVGEAR [<xref ref-type="bibr" rid="b21-atmosphere-02-00510">21</xref>] and by the Kinetic PreProcessor KPP [<xref ref-type="bibr" rid="b25-atmosphere-02-00510">25</xref>]. KPP prepares highly efficient routines for sparse LU decomposition and substitution that are specific to the particular sparsity of the simulated chemical mechanism [<xref ref-type="bibr" rid="b24-atmosphere-02-00510">24</xref>]. All stiff numerical methods implemented in the KPP library make use of these routines.</p></sec>
<sec>
<label>3.2.</label>
<title>Acceleration Aspects</title>
<p>Recent developments inmulti-core chipset architectures canbe leveraged to reduce chemical simulation runtime. In general, good performance is achieved by using every tier of heterogeneous parallelism available to the model. Chemical kinetics are embarrassingly parallel between grid cells, so there is abundant data parallelism (DLP). Within the solver itself, the ODE system is coupled so that, while there is still some data parallelism available in lower-level linear algebra operations, parallelization is limited largely to the instruction level (ILP). (Some specific chemical mechanisms are only partially coupled and can be separated into a small number of sub-components, but such inter-module decomposition is rare.) Thus, a three-tier parallelization is possible: ILP on each core, DLP using single-instruction-multiple-data (SIMD) features of a single core, and DLP across multiple cores (using multi-threading) or nodes (using MPI). The coarsest tier of MPI and OpenMP parallelism is typically supplied by the atmospheric model.</p>
<p>This section presents parallelization strategies for Rosenbrock integration in one-cell-per-thread, N-cells-per-thread, and 4/2-cells-per-thread decompositions. For performance benchmarks of parallelized Rosenbrock solvers, see [<xref ref-type="bibr" rid="b32-atmosphere-02-00510">32</xref>–<xref ref-type="bibr" rid="b34-atmosphere-02-00510">34</xref>,<xref ref-type="bibr" rid="b62-atmosphere-02-00510">62</xref>].</p>
<sec>
<title>One-cell-per-thread (multi-threaded CPUs)</title>
<p>Although not an “accelerated” architecture, multi-threaded CPUs are common, inexpensive, and a mature target platform. Modest performance improvements are achievable by parallelizing the Rosenbrock integrator via OpenMP. Since the chemistry at each grid cell is independent, the outermost iteration over grid cells is thread-parallel dimension; that is, a one-cell-per-thread decomposition. Within the integrator itself, the inseparable Jacobian matrix prohibits direct parallelization, though SIMD instructions may be introduced by the compiler for a small intra-integrator performance improvement. The principal disadvantage of this architecture is a relatively low peak performance.</p></sec>
<sec>
<title>N-cells-per-thread (NVIDIA CUDA)</title>
<p>A CUDA implementation takes advantage of the high degree of parallelism and independence between cells in the simulation. The outermost loops of the solver are kept on the CPU and the GPU is used to accelerate the innermost computational kernels. Time loops, Runge-Kutta loops, and error control branch-back logic are executed on the CPU. LU decomposition and solve, the ODE function evaluation, Jacobi matrix operations, and BLAS operations, are coded and invoked as separate kernels on the GPU. All data for the solver is resident on the GPU and arrays are stored with cell-index stride-one so that adjacent threads access adjacent words in memory to coalesce access to the chemical data across threads. Under this paradigm, parallelism occurs within the solver across grid cells, rather than external to the solver and across grid cells as on a multi-core CPU. Although each GPU thread still processes only one cell, the exact mapping of threads to grid cells is handled by the GPU hardware, effectively achieving an N-cells-per-thread decomposition, where N is the total number of grid cells in the simulation.</p>
<p>This implementation is easy to debug and profile since the GPU code is spread over many small kernels with control returning frequently to the CPU. Additionally, resource bottlenecks such as register pressure and shared-memory usage are limited to only those affected kernels. Performance critical parameters such as the size of thread blocks and shared-memory allocation can be adjusted and tuned separately, kernel-by-kernel, without subjecting the entire solver to worst-case limits. One disadvantage is that all N grid cells are forced to use the minimum time step and iterate the maximum number of times, even though only a few cells will typically require that many iterations to converge. The overhead of these additional iterations can be mitigated by storing the per-cell time, time step length, and error in a vector and using vector masks to “turn off” cells that have converged. The solver still performs the maximum number of iterations, but thread-blocks assigned to cells that have converged do little or no work and relinquish the GPU cores quickly.</p>
<p>A CUDA implementation is straight-forward to program, but may prove difficult to optimize. CUDA's automatic thread management and familiar programming environment make solver implementations simple to conceive and implement. However, a deep understanding of the underlying architecture is required to achieve good performance. For example, memory access coalescing is one of the most powerful features of the GPU architecture, yet CUDA neither hinders nor promotes program designs that leverage coalescing. The principal limitation on performance is the size of the on-chip shared memory and register file, which prevent large-footprint applications from running sufficient numbers of threads to expose parallelism and hide latency to the device memory. In general, GPU implementations of the Rosenbrock solver are faster than multi-core CPU implementations, but by less than a factor of two. From a power consumption standpoint, this makes them less efficient than multi-core CPUs in this arena.</p></sec>
<sec>
<title>4/2-cells-per-thread (Cell Broadband Engine Architecture)</title>
<p>The heterogeneous Cell Broadband Engine Architecture can achieve exceptionally high levels of performance for the Rosenbrock integrator, yet its complexity and uniqueness make it difficult to program. As a heterogeneous architecture, a homogeneous one-cell-per-thread decomposition across all cores will not achieve maximum performance. A master-worker approach resulting in multiple grid cells processed per thread is more appropriate.</p>
<p>The Power Processing Element (PPE), with full access to main memory, is the master. It prepares the model data for processing by the Synergistic Processing Elements (SPEs) by padding and aligning data to comply with architectural restrictions. The Rosenbrock solver tends to be computation-bound, so the PPU has ample time to maintain a buffer of aligned data. The SPEs implement a 128-bit SIMD instruction set architecture. Hence, every cycle operates on 128-bit vectors of either four single precision or two double precision floating point numbers. The data of two or four grid cells, depending on floating point precision, are packaged together by the PPE into a single padded, aligned, and buffered payload for processing by the SPEs (a so-called “vector cell”). This achieves a four-cells-per-thread (two-cells-per-thread in double precision) decomposition.</p>
<p>A small change is required in the Rosenbrock integrator design to operate on a vector cell. Typically, the integrator iteratively refines the Newton step size <italic>h</italic> until the error norm is within acceptable limits. This will cause an intra-vector divergence if different vector elements accept different step sizes. However, it is numerically sound to continue to reduce <italic>h</italic> even after an acceptable step size is found. The vector cell integrator reduces the step size until the error for every vector element is within tolerance. Conventional architectures would require additional computation under this scheme, but because all operations in the SPE are SIMD this actually recovers lost flops. This enhancement doubles (quadruples for single precision) the SPE's throughput with no measurable overhead. Rosenbrock integrators on the Cell Broadband Engine Architecture tend to be about eight times faster than multi-core implementations on contemporary 8-core CPUs, and have regularly achieve speedups of 20-40× when compared to state-of-the-art Fortran implementations.</p></sec></sec></sec>
<sec>
<label>4.</label>
<title>The Kinetic PreProcessor: KPP and KPPA</title>
<p>Writing chemical kinetics code is often tedious and error-prone work. The Kinetic PreProcessor (KPP) [<xref ref-type="bibr" rid="b25-atmosphere-02-00510">25</xref>,<xref ref-type="bibr" rid="b41-atmosphere-02-00510">41</xref>–<xref ref-type="bibr" rid="b45-atmosphere-02-00510">45</xref>] is a general analysis tool that enables the rapidly generation of correct and efficient chemical kinetics code. The strength of KPP compared with other chemical processing tools such as SMVGEAR [<xref ref-type="bibr" rid="b21-atmosphere-02-00510">21</xref>] lies in the integration of very efficient numerical analysis routines with its ability to automatically generate FORTRAN or C code that computes the time-evolution of chemical species from a specification of the chemical mechanism in KPP-Language (presented in detail in [<xref ref-type="bibr" rid="b25-atmosphere-02-00510">25</xref>]). It also generates the Jacobian in either sparse or full format, as well as other objects needed by different numerical integration schemes. KPP provides a rich selection of numerical integration schemes including VODE, LSODES, RODAS, ROS4, SDIRK, SEULEX, QSSA, EXQSSA, RADAU5, RODAS3 and ROS3. The framework can be easily used as an accurate benchmarking platform for evaluating new integrators.</p>
<sec>
<label>4.1.</label>
<title>The Kinetic PreProcessor: Accelerated (KPPA)</title>
<p>KPP makes it possible to rapidly generate correct and efficient chemical kinetics solvers on scalar architectures, but these generated codes cannot be easily ported to multi-core accelerated or heterogeneous architectures. KPPA (the Kinetics PreProcessor: Accelerated) [<xref ref-type="bibr" rid="b32-atmosphere-02-00510">32</xref>], is the next generation KPP tool that achieves significantly reduced time-to-solution for chemical kinetics kernels on both traditional and emerging architectures. In addition to the basic KPP functionality, KPPA generates OpenMP code with SSE or Alitivec for traditional CPUs, CUDA code for NVIDIA GPUs, and optimized C codes for the Cell Broadband Engine Architecture (CBEA), in either double or single precision. KPPA-generated mechanisms leverage platform-specific multi-layered heterogeneous parallelism to achieve strong scalability. Compared to state-of-the-art serial implementations, speedups of 20×–40× are regularly observed in KPPA-generated code.</p>
<p>KPPA combines a general analysis tool for chemical kinetics with a code generation system for scalar, homogeneous multi-core, and heterogeneous multi-core architectures. It is written in object-oriented C++ with a clearly-defined upgrade path to support future multi-core architectures as they emerge. KPPA has all the functionality of KPP 2.1 and maintains backwards compatibility with KPP. Many atmospheric models, including WRF-Chem and STEM, support a number of chemical kinetics solvers that are automatically generated at compile time by KPP. Reusing these analysis techniques in KPPA insures its accuracy and applicability.</p>
<p>KPPA's code generation component accommodates a two-dimensional design space of programming language/target architecture combinations superseding the one-dimensional design space of KPP (<xref ref-type="table" rid="t2-atmosphere-02-00510">Table 2</xref>). Given the model description from the analytical component and a description of the target architecture, the code generation component produces a time-stepping integrator, the ODE function and ODE Jacobian of the system, and other quantities required to interface with an atmospheric model.</p>
<p>KPPA's key feature is its ability to generate fully-unrolled, platform-specific sparse matrix/matrix and matrix/vector operations that achieve very high levels of efficiency. As KPPA parses it's input, language independent expression trees describing sparse matrix/matrix or matrix/vector operations are constructed in memory. For example, the aggregate ODE function of the chemical mechanism is calculated by multiplying the left-side stoichiometric matrix by the concentration vector, and then adding the result to elements of the stoichiometric matrix. KPPA performs these operations symbolically at code generation time, using the matrix formed by the analytical component and a symbolic vector, which will be calculated at run-time. The result is an expression tree of language-independent arithmetic operations and assignments, equivalent to a rolled-loop sparse matrix/vector operation, but in completely unrolled form.</p>
<p>KPPA uses its knowledge of the target architecture to generate highly-efficient code from the expression tree. Vector types are preferred when available, branches are avoided on all architectures, and parts of the function can be rolled into a tight loop if KPPA determines that on-chip memory is a premium. An analysis of four KPPA-generated ODE functions and ODE Jacobians targeting the CBEA showed that, on average, both SPU pipelines remain full for over 80% of the function implementation. Pipeline stalls account for less than 1% of the cycles required to calculate the function. For example, in the SAPRCNOV mechanism on CBEA, there are only 20 stalls in the 2989 cycles required by the ODE function (0.66%), and only 24 stalls in the 5490 cycles required for the ODE Jacobian (0.43%). Code of this caliber typically requires meticulous hand-optimization, but KPPA is able to generate this code automatically in seconds. See [<xref ref-type="bibr" rid="b32-atmosphere-02-00510">32</xref>] for further performance analysis of KPPA.</p></sec></sec>
<sec sec-type="results">
<label>5.</label>
<title>Numerical Results</title>
<p>For the numerical results we use the CAABA box model with MECCA chemistry [<xref ref-type="bibr" rid="b63-atmosphere-02-00510">63</xref>]. A mechanism suitable for calculating marine boundary layer chemistry containing 223 species and 560 reactions in the gas phase and in aerosol particles was selected. In addition to the basic atmospheric chemistry of ozone, methane, HO<sub>x</sub> and NO<sub>x</sub>, halogen (Cl, Br, I) and sulfur chemistry are also considered. The full mechanism including rate coefficients can be found in the supplement.</p>
<p>A reference solution y<sup>ref</sup> has been computed with the Radau-5A numerical method implemented in the KPP Runge Kutta suite, with the tight tolerances RelTol = 10<sup>−10</sup> and AbsTol = 10<sup>2</sup> molecules/cm<sup>3</sup>. The accuracy of each numerical solution is measured by its RMS error, defined as
<disp-formula id="FD31">
<label>(27)</label>
<mml:math id="mm33" display="block">
<mml:semantics id="sm33">
<mml:mrow>
<mml:mtext>RMS</mml:mtext>
<mml:mo>=</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>d</mml:mi></mml:msubsup>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mtext>ref</mml:mtext></mml:mrow></mml:msubsup></mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mtext>ref</mml:mtext></mml:mrow></mml:msubsup></mml:mrow></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow>
<mml:mn>2</mml:mn></mml:msup>
<mml:mo>⋅</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mtext>ref</mml:mtext></mml:mrow></mml:msubsup>
<mml:mo>≥</mml:mo>
<mml:mtext>threshold</mml:mtext>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>d</mml:mi></mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mi>y</mml:mi>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mtext>ref</mml:mtext></mml:mrow></mml:msubsup>
<mml:mo>≥</mml:mo>
<mml:mtext>threshold</mml:mtext>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mfrac></mml:mrow></mml:msqrt></mml:mrow></mml:semantics></mml:math></disp-formula>The threshold value is 100 molecules/cm<sup>3</sup>. The logical expression Darshana takes a value equal to one if the reference concentration of the <italic>i</italic>-th species is above the threshold, and takes the value zero otherwise. Thus only those species for which concentrations are sufficiently large contribute to the error metric <xref rid="FD31" ref-type="disp-formula">Equation (27)</xref>.</p>
<p>The work-precision diagrams for several numerical integrators are shown in <xref ref-type="fig" rid="f2-atmosphere-02-00510">Figure 2</xref>. The RMS errors <xref rid="FD31" ref-type="disp-formula">Equation (27)</xref> of different solutions at the final time are plotted against the CPU effort needed to obtain them. Each curve corresponds to a different method. Several relative tolerances in the range RelTol ∈ [10<sup>−6</sup>, 10<sup>−1</sup>] have been used to generate different points on each curve.</p></sec>
<sec sec-type="conclusions">
<label>6.</label>
<title>Conclusions</title>
<p>One of the most computationally demanding tasks in atmospheric chemical transport simulations is the solution of chemical kinetic processes. Special considerations need to be taken into account when designing chemistry time integration algorithms. Unconditionally stable methods are needed due to the stiff nature of the equations; such algorithms perform expensive solves of (non)linear systems of equations at each stage. The accuracy requirements are relatively low, with relative errors of 0.1%, but compute times must be low as well. This is achieved with algorithms that quickly adjust time step size, and efficient step size control mechanisms. A challenge comes from the fact that error estimators based on asymptotic formulas may not work well in the low accuracy regime. Closed chemical systems preserve mass and charge, and the concentrations remain positive. It is desirable to have numerical solvers that also preserve this properties. Conservation is easy to achieve, but positivity requires more involved computations.</p>
<p>Several families of solvers that are suitable for atmospheric chemical kinetics were discussed: QSSA, BDF, implicit Runge-Kutta, Rosenbrock, and Extrapolation. Special implementations of general purpose methods have taken the place of special integrators (e.g., QSSA) during the last decade. Among them the Rosenbrock methods have become popular due to their efficiency at moderate accuracy requirements.</p>
<p>A major goal when implementing a chemical solver is efficiency, since many copies of the chemical mechanism (one per grid cell) need to be solved at each operator split cycle. Careful exploitation of the Jacobian structure and the use of efficient sparse linear algebra operations are key to obtaining efficiency. The ideal parallelism between the chemical tasks in different grid cells can be exploited either by domain decomposition, or by vectorization. The latter approach has found renewed interest in the context of of modern heterogeneous multicore (accelerator) architectures.</p>
<p>All the numerical methods discussed in this paper are implemented in the KPP numerical library [<xref ref-type="bibr" rid="b64-atmosphere-02-00510">64</xref>] and can be easily employed in applications. KPP prepares efficient sparse linear algebra routines that are specific to the structure of the system at hand. KPPA [<xref ref-type="bibr" rid="b65-atmosphere-02-00510">65</xref>] is able to automatically generate code for accelerator architectures such as the IBM Cell Broadband Engine Architecture and general purpose graphical units.</p>
<p>With the increase in complexity of gas phase chemical mechanisms, and the frequent inclusion of aqueous and heterogeneous phase chemistry in three dimensional simulations, the importance of efficient and robust solvers for atmospheric chemistry models is expected to continue to increase in future.</p></sec>
<sec sec-type="supplementary-material">
<title>Supplementary Material</title>
<supplementary-material id="SD1" content-type="local-data">
<media mimetype="application" mime-subtype="pdf" xlink:href="atmosphere-02-00510-s001.pdf"/></supplementary-material></sec></body>
<back>
<sec sec-type="display-objects">
<title>Figures and Tables</title>
<fig id="f1-atmosphere-02-00510" position="float">
<label>Figure 1.</label>
<caption>
<p>Sparsity of the Jacobian of the MECCA chemical mechanism used in Section 5.</p></caption>
<graphic xlink:href="atmosphere-02-00510f1.gif"/></fig>
<fig id="f2-atmosphere-02-00510" position="float">
<label>Figure 2.</label>
<caption>
<p>Work precision diagrams for stiff integration methods applied to the MECCA chemical mechanism.</p></caption>
<graphic xlink:href="atmosphere-02-00510f2.gif"/></fig>
<table-wrap id="t1-atmosphere-02-00510" position="float">
<label>Table 1.</label>
<caption>
<p>Requirements and challenges for the numerical solution of atmospheric chemical kinetics.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th align="left" valign="top"><bold>Consideration</bold></th>
<th align="left" valign="top"><bold>Requirements</bold></th>
<th align="left" valign="top"><bold>Challenges</bold></th></tr></thead>
<tbody>
<tr>
<td align="left" valign="top">Accuracy</td>
<td align="left" valign="top">Relative error under 0.1%</td>
<td align="left" valign="top">Quickly adjust step size; estimate error outside asymptotic regime</td></tr>
<tr>
<td align="left" valign="top">Stiffness</td>
<td align="left" valign="top">Unconditional stability</td>
<td align="left" valign="top">Solve nonlinear system of equations at each step</td></tr>
<tr>
<td align="left" valign="top">Special properties</td>
<td align="left" valign="top">Mass and charge balance; positive concentrations</td>
<td align="left" valign="top">Linear invariants easy to preserve; enforcing positivity requires special methods</td></tr>
<tr>
<td align="left" valign="top">Efficiency</td>
<td align="left" valign="top">Deliver target accuracy in the shortest possible CPU time</td>
<td align="left" valign="top">Repeated LU factorizations are expensive; step control should be aggressive, yet avoid many step rejections</td></tr></tbody></table></table-wrap>
<table-wrap id="t2-atmosphere-02-00510" position="float">
<label>Table 2.</label>
<caption>
<p>Language/architecture combinations supported by KPP and KPPA. <italic>κ</italic> denotes functionality found only in KPPA.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th align="left" valign="top"/>
<th align="center" valign="top"><bold>Serial</bold></th>
<th align="center" valign="top"><bold>OpenMP</bold></th>
<th align="center" valign="top"><bold>GPGPU</bold></th>
<th align="center" valign="top"><bold>CBEA</bold></th></tr></thead>
<tbody>
<tr>
<td align="right" valign="top"><bold>C</bold></td>
<td align="center" valign="top">KPP</td>
<td align="center" valign="top"><italic>k</italic></td>
<td align="center" valign="top"><italic>k</italic></td>
<td align="center" valign="top"><italic>k</italic></td></tr>
<tr>
<td align="right" valign="top"><bold>FORTRAN77</bold></td>
<td align="center" valign="top">KPP</td>
<td align="center" valign="top"><italic>k</italic></td>
<td align="center" valign="top"/>
<td align="center" valign="top"><italic>k</italic></td></tr>
<tr>
<td align="right" valign="top"><bold>Fortran 90</bold></td>
<td align="center" valign="top">KPP</td>
<td align="center" valign="top"><italic>k</italic></td>
<td align="center" valign="top"/>
<td align="center" valign="top"><italic>k</italic></td></tr>
<tr>
<td align="right" valign="top"><bold>MATLAB</bold></td>
<td align="center" valign="top">KPP</td>
<td align="center" valign="top"/>
<td align="center" valign="top"/>
<td align="center" valign="top"/></tr></tbody></table></table-wrap></sec>
<ack>
<p>This work has been supported in part by NSF through awards NSF OCI-0904397, NSF CCF-0916493, NSF DMS0915047, and by the United States Department of Defense High Performance Computing Modernization Program through an NDSEG fellowship.</p></ack>
<ref-list>
<title>References</title>
<ref id="b1-atmosphere-02-00510"><label>1.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Yanenko</surname><given-names>N.N.</given-names></name></person-group><source>The Method of Fractional Steps</source><publisher-name>Springer-Verlag</publisher-name><publisher-loc>Berlin, Heidelberg, Germany</publisher-loc><year>1971</year></citation></ref>
<ref id="b2-atmosphere-02-00510"><label>2.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Verwer</surname><given-names>J.</given-names></name><name><surname>Hunsdorfer</surname><given-names>W.</given-names></name><name><surname>Blom</surname><given-names>J.G.</given-names></name></person-group><source>Numerical Time Integration of Air Pollution Models</source><comment>Modeling, Analysis and Simulations report MAS-R9825</comment><publisher-name>CWI</publisher-name><publisher-loc>Amsterdam, The Netherlands</publisher-loc><month>October</month><year>1998</year></citation></ref>
<ref id="b3-atmosphere-02-00510"><label>3.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Daescu</surname><given-names>D.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name></person-group><article-title>Adjoint sensitivity analysis of regional air quality models</article-title><source>J. Comput. Phys.</source><year>2005</year><volume>204</volume><fpage>222</fpage><lpage>252</lpage><pub-id pub-id-type="doi">10.1016/j.jcp.2004.10.011</pub-id></citation></ref>
<ref id="b4-atmosphere-02-00510"><label>4.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Tang</surname><given-names>Y.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Hardesty</surname><given-names>M.</given-names></name><name><surname>Pilewskie</surname><given-names>P.</given-names></name><name><surname>Whitlow</surname><given-names>S.</given-names></name><name><surname>Browell</surname><given-names>E.</given-names></name><name><surname>Avery</surname><given-names>M.</given-names></name><name><surname>Thouret</surname><given-names>V.</given-names></name><etal/></person-group><article-title>Four dimensional data assimilation experiments with ICARTT (International Consortium for Atmospheric Transport and Transformation) ozone measurements</article-title><source>J. Geophys. Res.</source><year>2007</year><volume>112</volume><pub-id pub-id-type="doi">10.1029/2006JD007763.</pub-id></citation></ref>
<ref id="b5-atmosphere-02-00510"><label>5.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Constantinescu</surname><given-names>E.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Autoregressive models of background errors for chemical data assimilation</article-title><source>J. Geophys. Res.</source><year>2007</year><volume>112</volume><pub-id pub-id-type="doi">10.1029/2006JD008103.</pub-id></citation></ref>
<ref id="b6-atmosphere-02-00510"><label>6.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Zhang</surname><given-names>L.</given-names></name></person-group><article-title>Discrete second order adjoints in atmospheric chemical transport modeling</article-title><source>J. Comput. Phys.</source><year>2008</year><volume>227</volume><fpage>5949</fpage><lpage>5983</lpage><pub-id pub-id-type="doi">10.1016/j.jcp.2008.02.011</pub-id></citation></ref>
<ref id="b7-atmosphere-02-00510"><label>7.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Constantinescu</surname><given-names>E.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Assessment of ensemble-based chemical data assimilation in an idealized setting</article-title><source>Atmos. Environ.</source><year>2007</year><volume>41</volume><fpage>18</fpage><lpage>36</lpage><pub-id pub-id-type="doi">10.1016/j.atmosenv.2006.08.006</pub-id></citation></ref>
<ref id="b8-atmosphere-02-00510"><label>8.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Constantinescu</surname><given-names>E.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Ensemble-based chemical data assimilation. I: General approach</article-title><source>Q. J. R. Meteorol. Soc.</source><year>2007</year><volume>133</volume><fpage>1229</fpage><lpage>1243</lpage><pub-id pub-id-type="doi">10.1002/qj.76</pub-id></citation></ref>
<ref id="b9-atmosphere-02-00510"><label>9.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Constantinescu</surname><given-names>E.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Ensemble-based chemical data assimilation. II: Covariance localization</article-title><source>Q. J. R. Meteorol. Soc.</source><year>2007</year><volume>133</volume><fpage>1245</fpage><lpage>1256</lpage><pub-id pub-id-type="doi">10.1002/qj.77</pub-id></citation></ref>
<ref id="b10-atmosphere-02-00510"><label>10.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Constantinescu</surname><given-names>E.</given-names></name><name><surname>Daescu</surname><given-names>D.</given-names></name></person-group><article-title>Predicting air quality: Improvements through advanced methods to integrate models and measurements</article-title><source>J. Comput. Phys.</source><year>2008</year><volume>227</volume><fpage>3540</fpage><lpage>3571</lpage><pub-id pub-id-type="doi">10.1016/j.jcp.2007.02.024</pub-id></citation></ref>
<ref id="b11-atmosphere-02-00510"><label>11.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Zhang</surname><given-names>L.</given-names></name><name><surname>Constantinescu</surname><given-names>E.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Tang</surname><given-names>Y.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Byun</surname><given-names>D.</given-names></name><name><surname>Olaguer</surname><given-names>E.</given-names></name></person-group><article-title>An adjoint sensitivity analysis and 4D-Var data assimilation study of Texas air quality</article-title><source>Atmos. Environ.</source><year>2008</year><volume>42</volume><fpage>5787</fpage><lpage>5804</lpage><pub-id pub-id-type="doi">10.1016/j.atmosenv.2008.03.048</pub-id></citation></ref>
<ref id="b12-atmosphere-02-00510"><label>12.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Singh</surname><given-names>K.</given-names></name><name><surname>Eller</surname><given-names>P.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Henze</surname><given-names>D.</given-names></name><name><surname>Bowman</surname><given-names>K.</given-names></name><name><surname>Kopacz</surname><given-names>M.</given-names></name><name><surname>Lee</surname><given-names>M.</given-names></name></person-group><article-title>Towards the Construction of a Standard Adjoint GEOS-Chem Model</article-title><conf-name>Proceedings of the 2009 Spring Simulation Multiconference (SpringSim'09), High Performance Computing Symposium (HPCS-2009)</conf-name><conf-loc>San Diego, CA, USA</conf-loc><conf-date>22–27 March 2009</conf-date><person-group person-group-type="editor"><name><surname>Ribbens</surname><given-names>C.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Thacker</surname><given-names>W.</given-names></name></person-group><publisher-name>Society for Modeling and Simulation International (SCS)/ACM</publisher-name><publisher-loc>San Diego, CA, USA; New York, NY, USA</publisher-loc><year>2009</year><fpage>8</fpage></citation></ref>
<ref id="b13-atmosphere-02-00510"><label>13.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hakami</surname><given-names>A.</given-names></name><name><surname>Henze</surname><given-names>D.</given-names></name><name><surname>Seinfeld</surname><given-names>J.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name><name><surname>Tang</surname><given-names>Y.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name></person-group><article-title>Adjoint inverse modeling of black carbon during ACE-Asia</article-title><source>J. Geophys. Res.</source><year>2005</year><volume>110</volume><fpage>D14301</fpage><pub-id pub-id-type="doi">10.1029/2004JD005671</pub-id></citation></ref>
<ref id="b14-atmosphere-02-00510"><label>14.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hakami</surname><given-names>A.</given-names></name><name><surname>Henze</surname><given-names>D.</given-names></name><name><surname>Seinfeld</surname><given-names>J.</given-names></name><name><surname>Singh</surname><given-names>K.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Kim</surname><given-names>S.</given-names></name><name><surname>Byun</surname><given-names>D.</given-names></name><name><surname>Li</surname><given-names>Q.</given-names></name></person-group><article-title>The adjoint of CMAQ</article-title><source>Environ. Sci. Technol.</source><year>2007</year><volume>41</volume><fpage>7807</fpage><lpage>7817</lpage><pub-id pub-id-type="doi">10.1021/es070944p</pub-id><pub-id pub-id-type="pmid">18075092</pub-id></citation></ref>
<ref id="b15-atmosphere-02-00510"><label>15.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Hairer</surname><given-names>E.</given-names></name><name><surname>Norsett</surname><given-names>S.</given-names></name><name><surname>Wanner</surname><given-names>G.</given-names></name></person-group><source>Solving Ordinary Differential Equations II. Stiff and Differential-Algebraic Problems/E</source><edition>2nd ed.</edition><publisher-name>Springer-Verlag</publisher-name><publisher-loc>Berlin, Germany</publisher-loc><year>2002</year><volume>2</volume></citation></ref>
<ref id="b16-atmosphere-02-00510"><label>16.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Rosenbaum</surname><given-names>J.</given-names></name></person-group><article-title>Conservation properties of numerical integration methods for systems of ordinary differential equations</article-title><source>J. Comput. Phys.</source><year>1976</year><volume>20</volume><fpage>259</fpage><lpage>267</lpage><pub-id pub-id-type="doi">10.1016/0021-9991(76)90080-2</pub-id></citation></ref>
<ref id="b17-atmosphere-02-00510"><label>17.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Bolley</surname><given-names>C.</given-names></name><name><surname>Crouzeix</surname><given-names>M.</given-names></name></person-group><article-title>Conservation de la positivite lors de la discretization des problemes d'evolution parabolique</article-title><source>R.A.I.R.O. Numer. Anal.</source><year>1978</year><volume>12</volume><fpage>237</fpage><lpage>245</lpage></citation></ref>
<ref id="b18-atmosphere-02-00510"><label>18.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name></person-group><article-title>Positive numerical integration methods for chemical kinetic systems</article-title><source>J. Comput. Phys.</source><year>2001</year><volume>170</volume><fpage>1</fpage><lpage>14</lpage><pub-id pub-id-type="doi">10.1006/jcph.2001.6699</pub-id></citation></ref>
<ref id="b19-atmosphere-02-00510"><label>19.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name></person-group><article-title>Time-Stepping Methods that Favor Positivity for Atmospheric Chemistry Modeling</article-title><source>IMA Volume on Atmospheric Modeling</source><person-group person-group-type="editor"><name><surname>Chock</surname><given-names>D.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><publisher-name>Springer-Verlag</publisher-name><publisher-loc>Berlin, Germany</publisher-loc><year>2001</year><fpage>1</fpage><lpage>21</lpage></citation></ref>
<ref id="b20-atmosphere-02-00510"><label>20.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Jay</surname><given-names>L.O.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Potra</surname><given-names>F.A.</given-names></name><name><surname>Carmichael</surname><given-names>G.R.</given-names></name></person-group><article-title>Improved QSSA methods for atmospheric chemistry integration</article-title><source>SIAM J. Sci. Comp.</source><year>1997</year><volume>18</volume><fpage>182</fpage><lpage>202</lpage><pub-id pub-id-type="doi">10.1137/S1064827595283033</pub-id></citation></ref>
<ref id="b21-atmosphere-02-00510"><label>21.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Jacobson</surname><given-names>M.Z.</given-names></name><name><surname>Turco</surname><given-names>R.</given-names></name></person-group><article-title>SMVGEAR: A sparse-matrix, vectorized Gear code for atmospheric models</article-title><source>Atmos. Environ.</source><year>1994</year><volume>17</volume><fpage>273</fpage><lpage>284</lpage></citation></ref>
<ref id="b22-atmosphere-02-00510"><label>22.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Potra</surname><given-names>F.</given-names></name><name><surname>Damian-Iordache</surname><given-names>V.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Efficient implementation of fully implicit methods for atmospheric chemistry</article-title><source>J. Comput. Phys.</source><year>1996</year><volume>129</volume><fpage>101</fpage><lpage>110</lpage><pub-id pub-id-type="doi">10.1006/jcph.1996.0236</pub-id></citation></ref>
<ref id="b23-atmosphere-02-00510"><label>23.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Verwer</surname><given-names>J.</given-names></name><name><surname>Blom</surname><given-names>J.</given-names></name><name><surname>Spee</surname><given-names>E.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Potra</surname><given-names>F.</given-names></name></person-group><article-title>Benchmarking stiff ODE solvers for atmospheric chemistry problems. II: Rosenbrock methods</article-title><source>Atmos. Environ.</source><year>1997</year><volume>31</volume><fpage>3459</fpage><lpage>3472</lpage><pub-id pub-id-type="doi">10.1016/S1352-2310(97)83212-8</pub-id></citation></ref>
<ref id="b24-atmosphere-02-00510"><label>24.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Verwer</surname><given-names>J.</given-names></name><name><surname>van Loon</surname><given-names>M.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Potra</surname><given-names>F.</given-names></name><name><surname>Dabdub</surname><given-names>D.</given-names></name><name><surname>Seinfeld</surname><given-names>J.</given-names></name></person-group><article-title>Benchmarking stiff ODE solvers for atmospheric chemistry problems. I: Implicit <italic>versus</italic> explicit</article-title><source>Atmos. Environ.</source><year>1997</year><volume>31</volume><fpage>3151</fpage><lpage>3166</lpage><pub-id pub-id-type="doi">10.1016/S1352-2310(97)00059-9</pub-id></citation></ref>
<ref id="b25-atmosphere-02-00510"><label>25.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Damian</surname><given-names>V.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Damian</surname><given-names>M.</given-names></name><name><surname>Potra</surname><given-names>F.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>The Kinetic PreProcessor KPP—A software environment for solving chemical kinetics</article-title><source>Comput. Chem. Eng.</source><year>2002</year><volume>26</volume><fpage>1567</fpage><lpage>1579</lpage><pub-id pub-id-type="doi">10.1016/S0098-1354(02)00128-X</pub-id></citation></ref>
<ref id="b26-atmosphere-02-00510"><label>26.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Foster</surname><given-names>I.</given-names></name></person-group><source>Designing and Building Parallel Programs</source><publisher-name>Addison-Wesley</publisher-name><publisher-loc>Boston, MA, USA</publisher-loc><year>1995</year></citation></ref>
<ref id="b27-atmosphere-02-00510"><label>27.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Miehe</surname><given-names>P.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Tang</surname><given-names>Y.</given-names></name><name><surname>Daescu</surname><given-names>D.</given-names></name></person-group><article-title>A communication library for the parallelization of air quality models on structured grids</article-title><source>Atmos. Environ.</source><year>2002</year><volume>36</volume><fpage>3917</fpage><lpage>3930</lpage><pub-id pub-id-type="doi">10.1016/S1352-2310(02)00338-2</pub-id></citation></ref>
<ref id="b28-atmosphere-02-00510"><label>28.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Belwal</surname><given-names>C.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Constantinescu</surname><given-names>E.</given-names></name></person-group><article-title>Parallel Adaptive Simulations of Regional Air Quality</article-title><conf-name>Proceedings of the SIAM Conference on Parallel Processing PP04</conf-name><conf-loc>San Francisco, CA, USA</conf-loc><conf-date>28 February 2004</conf-date></citation></ref>
<ref id="b29-atmosphere-02-00510"><label>29.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Belwal</surname><given-names>C.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Constantinescu</surname><given-names>E.</given-names></name></person-group><source>Adaptive Resolution Modeling of Air Pollution.</source><conf-name>Proceedings of the ACM Symposium on Applied Computing (SAC-2004)</conf-name><conf-loc>Nicosia, Cyprus</conf-loc><conf-date>14–17 March 2004</conf-date><fpage>235</fpage><lpage>239</lpage></citation></ref>
<ref id="b30-atmosphere-02-00510"><label>30.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Daescu</surname><given-names>D.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Chai</surname><given-names>T.</given-names></name></person-group><article-title>Parallel Chemical Data Assimilation in Atmospheric Models</article-title><conf-name>Proceedings of the SIAM Conference on Parallel Processing PP04</conf-name><conf-loc>San Francisco, CA, USA</conf-loc><conf-date>25–27 February 2004</conf-date></citation></ref>
<ref id="b31-atmosphere-02-00510"><label>31.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Belwal</surname><given-names>C.</given-names></name><name><surname>Constantinescu</surname><given-names>E.</given-names></name></person-group><article-title>Parallel Adaptive Simulations of Regional Air Quality</article-title><conf-name>Proceedings of the SIAM Conference on Parallel Processing for Scientific Computing</conf-name><conf-loc>Seattle, WA, USA</conf-loc><conf-date>24–26 Fabruary 2004</conf-date></citation></ref>
<ref id="b32-atmosphere-02-00510"><label>32.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Linford</surname><given-names>J.C.</given-names></name><name><surname>Michalakes</surname><given-names>J.</given-names></name><name><surname>Vachharajani</surname><given-names>M.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name></person-group><article-title>Automatic generation of multicore chemical kernels</article-title><source>IEEE TPDS</source><year>2011</year><volume>22</volume><fpage>119</fpage><lpage>131</lpage></citation></ref>
<ref id="b33-atmosphere-02-00510"><label>33.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Linford</surname><given-names>J.C.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name></person-group><article-title>Scalable heterogeneous parallelism for atmospheric modeling and simulation</article-title><source>J. Supercomput.</source><year>2011</year><volume>56</volume><fpage>300</fpage><lpage>327</lpage><pub-id pub-id-type="doi">10.1007/s11227-010-0380-8</pub-id></citation></ref>
<ref id="b34-atmosphere-02-00510"><label>34.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Linford</surname><given-names>J.C.</given-names></name><name><surname>Michalakes</surname><given-names>J.</given-names></name><name><surname>Vachharijani</surname><given-names>M.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name></person-group><article-title>Multi-Core Acceleration of Chemical Kinetics for Modeling and Simulation</article-title><conf-name>Proceedings of the 2009 ACM/IEEE Conference on Supercomputing (SC'09)</conf-name><conf-loc>Portland, OR, USA</conf-loc><conf-date>November 2009</conf-date></citation></ref>
<ref id="b35-atmosphere-02-00510"><label>35.</label><citation citation-type="web"><person-group person-group-type="author"><name><surname>Jöckel</surname><given-names>P.</given-names></name><name><surname>Kerkweg</surname><given-names>A.</given-names></name><name><surname>Pozzer</surname><given-names>A.</given-names></name><name><surname>Sander</surname><given-names>R.</given-names></name><name><surname>Tost</surname><given-names>H.</given-names></name><name><surname>Riede</surname><given-names>H.</given-names></name><name><surname>Baumgaertner</surname><given-names>A.</given-names></name><name><surname>Gromov</surname><given-names>S.</given-names></name><name><surname>Kern</surname><given-names>B.</given-names></name></person-group><article-title>Development cycle 2 of the Modular Earth Submodel System (MESSy2)</article-title><source>Geosci. Model Dev.</source><year>2010</year><volume>3</volume><fpage>717</fpage><lpage>752</lpage><comment>Available online: <ext-link xlink:href="http://www.geosci-model-dev.net/3/717" ext-link-type="uri">http://www.geosci-model-dev.net/3/717</ext-link> (accessed on 2 September 2011)</comment></citation></ref>
<ref id="b36-atmosphere-02-00510"><label>36.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Chapman</surname><given-names>S.</given-names></name></person-group><article-title>On ozone and atomic oxygen in the upper atmosphere</article-title><source>Phil. Mag.</source><year>1930</year><volume>10</volume><fpage>369</fpage><lpage>383</lpage></citation></ref>
<ref id="b37-atmosphere-02-00510"><label>37.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Bates</surname><given-names>D.R.</given-names></name><name><surname>Nicolet</surname><given-names>M.</given-names></name></person-group><article-title>The photochemistry of atmospheric water vapor</article-title><source>J. Geophys. Res.</source><year>1950</year><volume>55</volume><fpage>301</fpage><lpage>327</lpage><pub-id pub-id-type="doi">10.1029/JZ055i003p00301</pub-id></citation></ref>
<ref id="b38-atmosphere-02-00510"><label>38.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hunt</surname><given-names>B.G.</given-names></name></person-group><article-title>Photochemistry of ozone in a moist atmosphere</article-title><source>J. Geophys. Res.</source><year>1966</year><volume>71</volume><fpage>1385</fpage><lpage>1398</lpage><pub-id pub-id-type="doi">10.1029/JZ071i005p01385</pub-id></citation></ref>
<ref id="b39-atmosphere-02-00510"><label>39.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Shimazaki</surname><given-names>T.</given-names></name><name><surname>Laird</surname><given-names>A.R.</given-names></name></person-group><article-title>A model calculation of the diurnal variation in minor neutral constituents in the mesosphere and lower thermosphere including transport effects</article-title><source>J. Geophys. Res.</source><year>1970</year><volume>75</volume><fpage>3221</fpage><pub-id pub-id-type="doi">10.1029/JA075i016p03221</pub-id></citation></ref>
<ref id="b40-atmosphere-02-00510"><label>40.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Turco</surname><given-names>R.P.</given-names></name><name><surname>Whitten</surname><given-names>R.C.</given-names></name></person-group><article-title>A comparison of several computational techniques for solving some common aeronomic problems</article-title><source>J. Geophys. Res.</source><year>1974</year><volume>79</volume><fpage>3179</fpage><lpage>3185</lpage><pub-id pub-id-type="doi">10.1029/JA079i022p03179</pub-id></citation></ref>
<ref id="b41-atmosphere-02-00510"><label>41.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Miehe</surname><given-names>P.</given-names></name></person-group><article-title>Forward, tangent linear, and adjoint Runge Kutta methods in KPP-2.2 for efficient chemical kinetic simulations</article-title><source>Int. J. Comp. Math.</source><year>2010</year><volume>87</volume><fpage>2458</fpage><lpage>2479</lpage><pub-id pub-id-type="doi">10.1080/00207160802676562</pub-id></citation></ref>
<ref id="b42-atmosphere-02-00510"><label>42.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Eller</surname><given-names>P.</given-names></name><name><surname>Singh</surname><given-names>K.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Bowman</surname><given-names>K.</given-names></name><name><surname>Henze</surname><given-names>D.</given-names></name><name><surname>Lee</surname><given-names>M.</given-names></name></person-group><article-title>Implementation and evaluation of an array of chemical solvers in a global chemical transport model</article-title><source>Geophys. Model Dev.</source><year>2009</year><volume>2</volume><fpage>1</fpage><lpage>7</lpage><pub-id pub-id-type="doi">10.5194/gmd-2-1-2009</pub-id></citation></ref>
<ref id="b43-atmosphere-02-00510"><label>43.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Sander</surname><given-names>R.</given-names></name></person-group><article-title>Modeling chemical kinetic systems in Fortran90 and Matlab with KPP-2.1</article-title><source>Atmos. Chem. Phys.</source><year>2006</year><volume>6</volume><fpage>187</fpage><lpage>195</lpage><pub-id pub-id-type="doi">10.5194/acp-6-187-2006</pub-id></citation></ref>
<ref id="b44-atmosphere-02-00510"><label>44.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Daescu</surname><given-names>D.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Direct and adjoint sensitivity analysis of chemical kinetic systems with KPP: II—Numerical validation and applications</article-title><source>Atmos. Environ.</source><year>2003</year><volume>37</volume><fpage>5097</fpage><lpage>5114</lpage><pub-id pub-id-type="doi">10.1016/j.atmosenv.2003.08.020</pub-id></citation></ref>
<ref id="b45-atmosphere-02-00510"><label>45.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Daescu</surname><given-names>D.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Direct and adjoint sensitivity analysis of chemical kinetic systems with KPP: I —Theory and software tools</article-title><source>Atmos. Environ.</source><year>2003</year><volume>37</volume><fpage>5083</fpage><lpage>5096</lpage><pub-id pub-id-type="doi">10.1016/j.atmosenv.2003.08.019</pub-id></citation></ref>
<ref id="b46-atmosphere-02-00510"><label>46.</label><citation citation-type="web"><person-group person-group-type="author"><collab>Community Multiscale Air Quality (CMAQ) modeling system</collab></person-group><comment>Available online: <ext-link xlink:href="http://www.cmaq-model.org" ext-link-type="uri">http://www.cmaq-model.org</ext-link> (accessed on 5 May 2011)</comment></citation></ref>
<ref id="b47-atmosphere-02-00510"><label>47.</label><citation citation-type="web"><person-group person-group-type="author"><collab>Goddard Earth Observing System (GEOS)-Chem</collab></person-group><comment>Available online: <ext-link xlink:href="http://acmg.seas.harvard.edu/geos" ext-link-type="uri">http://acmg.seas.harvard.edu/geos</ext-link> (accessed on 5 May 2011)</comment></citation></ref>
<ref id="b48-atmosphere-02-00510"><label>48.</label><citation citation-type="web"><person-group person-group-type="author"><collab>Sulphur Transport Eulerian Model (STEM)</collab></person-group><comment>Available online: <ext-link xlink:href="http://cgrer.uiowa.edu/projects" ext-link-type="uri">http://cgrer.uiowa.edu/projects</ext-link> (accessed on 5 May 2011)</comment></citation></ref>
<ref id="b49-atmosphere-02-00510"><label>49.</label><citation citation-type="web"><person-group person-group-type="author"><collab>5th generation of European Centre Hamburg Model/Modular Earth Submodel System (ECHAM5/MESSy)</collab></person-group><comment>Available online: <ext-link xlink:href="http://www.messy-interface.org" ext-link-type="uri">http://www.messy-interface.org</ext-link> (accessed on 5 May 2011)</comment></citation></ref>
<ref id="b50-atmosphere-02-00510"><label>50.</label><citation citation-type="web"><person-group person-group-type="author"><collab>Weather Research and Forecasting model coupled with Chemistry (WRF-Chem)</collab></person-group><comment>Available online: <ext-link xlink:href="http://www.acd.ucar.edu/wrf-chem" ext-link-type="uri">http://www.acd.ucar.edu/wrf-chem</ext-link> (accessed on 5 May 2011)</comment></citation></ref>
<ref id="b51-atmosphere-02-00510"><label>51.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hesstvedt</surname><given-names>E.</given-names></name><name><surname>Hov</surname><given-names>O.</given-names></name><name><surname>Isaacsen</surname><given-names>I.</given-names></name></person-group><article-title>Quasi-steady-state-approximation in air pollution modelling: comparison of two numerical schemes for oxidant prediction</article-title><source>Int. J. Chem. Kinet.</source><year>1978</year><volume>10</volume><fpage>971</fpage><lpage>994</lpage><pub-id pub-id-type="doi">10.1002/kin.550100907</pub-id></citation></ref>
<ref id="b52-atmosphere-02-00510"><label>52.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hochbruck</surname><given-names>M.</given-names></name><name><surname>Lubich</surname><given-names>C.</given-names></name><name><surname>Selhofer</surname><given-names>H.</given-names></name></person-group><article-title>Exponential integrators for large systems of differential equations</article-title><source>SIAM J. Sci. Comput.</source><year>1998</year><volume>19</volume><fpage>1552</fpage><lpage>1574</lpage><pub-id pub-id-type="doi">10.1137/S1064827595295337</pub-id></citation></ref>
<ref id="b53-atmosphere-02-00510"><label>53.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Radhakrishnan</surname><given-names>K.</given-names></name><name><surname>Hindmarsh</surname><given-names>A.</given-names></name></person-group><source>Description and Use of LSODE, the Livermore Solver for Ordinary Differential Equations.</source><comment>Report UCRL-ID-113855</comment><publisher-name>Lawrence Livermore National Laboratory</publisher-name><publisher-loc>Livermore, CA, USA</publisher-loc><year>1993</year></citation></ref>
<ref id="b54-atmosphere-02-00510"><label>54.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Brown</surname><given-names>P.</given-names></name><name><surname>Byrne</surname><given-names>G.</given-names></name><name><surname>Hindmarsh</surname><given-names>A.</given-names></name></person-group><article-title>VODE: A variable step ODE solver</article-title><source>SIAM J. Sci. Stat. Comput.</source><year>1989</year><volume>10</volume><fpage>1038</fpage><lpage>1051</lpage><pub-id pub-id-type="doi">10.1137/0910062</pub-id></citation></ref>
<ref id="b55-atmosphere-02-00510"><label>55.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hindmarsh</surname><given-names>A.C.</given-names></name><name><surname>Brown</surname><given-names>P.N.</given-names></name><name><surname>Grant</surname><given-names>K.E.</given-names></name><name><surname>Lee</surname><given-names>S.L.</given-names></name><name><surname>Serban</surname><given-names>R.</given-names></name><name><surname>Shumaker</surname><given-names>D.E.</given-names></name><name><surname>Woodward</surname><given-names>C.S.</given-names></name></person-group><article-title>SUNDIALS: Suite of nonlinear and differential/algebraic equation solvers</article-title><source>ACM Trans. Math. Softw.</source><year>2005</year><volume>31</volume><fpage>363</fpage><lpage>396</lpage><pub-id pub-id-type="doi">10.1145/1089014.1089020</pub-id></citation></ref>
<ref id="b56-atmosphere-02-00510"><label>56.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Gear</surname><given-names>C.W.</given-names></name></person-group><source>Numerical Initial Value Problems in Ordinary Differential Equations</source><publisher-name>Prentice Hall PTR</publisher-name><publisher-loc>Upper Saddle River, NJ, USA</publisher-loc><year>1971</year></citation></ref>
<ref id="b57-atmosphere-02-00510"><label>57.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Jacobson</surname><given-names>M.Z.</given-names></name></person-group><article-title>Vecotr and scalar improvement of SMVGEAR II through absolute error tolerance control</article-title><source>Atmos. Environ.</source><year>1998</year><volume>32</volume><fpage>791</fpage><lpage>796</lpage><pub-id pub-id-type="doi">10.1016/S1352-2310(97)00315-4</pub-id></citation></ref>
<ref id="b58-atmosphere-02-00510"><label>58.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Rosenbrock</surname><given-names>H.H.</given-names></name></person-group><article-title>Some general implicit processes for the numerical solution of differential equations</article-title><source>Comput. J.</source><year>1963</year><volume>5</volume><fpage>329</fpage><lpage>330</lpage><pub-id pub-id-type="doi">10.1093/comjnl/5.4.329</pub-id></citation></ref>
<ref id="b59-atmosphere-02-00510"><label>59.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Carmichael</surname><given-names>G.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Potra</surname><given-names>F.</given-names></name><name><surname>Damian-Iordache</surname><given-names>V.</given-names></name><name><surname>Damian-Iordache</surname><given-names>M.</given-names></name></person-group><article-title>The current state and the future directions in air quality modeling</article-title><source>Syst. Anal. Model. Simul.</source><year>1996</year><volume>25</volume><fpage>75</fpage><lpage>105</lpage></citation></ref>
<ref id="b60-atmosphere-02-00510"><label>60.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Hairer</surname><given-names>E.</given-names></name><name><surname>Norsett</surname><given-names>S.</given-names></name><name><surname>Wanner</surname><given-names>G.</given-names></name></person-group><source>Solving Ordinary Differential Equations I. Nonstiff Problems</source><publisher-name>Springer-Verlag</publisher-name><publisher-loc>Berlin, Germany</publisher-loc><year>1993</year></citation></ref>
<ref id="b61-atmosphere-02-00510"><label>61.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Jay</surname><given-names>L.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Potra</surname><given-names>F.</given-names></name><name><surname>Carmichael</surname><given-names>G.</given-names></name></person-group><article-title>Efficient Numerical Integration for Atmospheric Chemistry</article-title><conf-name>Proceedings of the 3rd International Congress on Industrial and Applied Mathematics (ICIAM-1995);</conf-name><conf-loc>Hamburg, Germany</conf-loc><conf-date>3-7 July 1995</conf-date><person-group person-group-type="editor"><name><surname>Kreuzer</surname><given-names>E.</given-names></name><name><surname>Mahrenholtz</surname><given-names>O.</given-names></name></person-group><fpage>450</fpage><lpage>453</lpage></citation></ref>
<ref id="b62-atmosphere-02-00510"><label>62.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Linford</surname><given-names>J.C.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name></person-group><article-title>Chemical Kinetics on Multi-core SIMD Architectures</article-title><conf-name>Proceedings of the 9th Internation Conference on Computational Science—ICCS 2009</conf-name><conf-loc>Baton Rouge, LA, USA</conf-loc><conf-date>25-27 May 2009</conf-date><person-group person-group-type="editor"><name><surname>Allen</surname><given-names>G.</given-names></name><name><surname>Nabrzyski</surname><given-names>J.</given-names></name><name><surname>Seidel</surname><given-names>E.</given-names></name><name><surname>van Albada</surname><given-names>G.D.</given-names></name><name><surname>Dongarra</surname><given-names>J.</given-names></name><name><surname>Sloot</surname><given-names>P.M.</given-names></name></person-group><publisher-name>Springer</publisher-name><publisher-loc>Hoboken, NJ, USA</publisher-loc><year>2009</year><volume>5544</volume></citation></ref>
<ref id="b63-atmosphere-02-00510"><label>63.</label><citation citation-type="web"><person-group person-group-type="author"><name><surname>Sander</surname><given-names>R.</given-names></name><name><surname>Baumgaertner</surname><given-names>A.</given-names></name><name><surname>Gromov</surname><given-names>S.</given-names></name><name><surname>Harder</surname><given-names>H.</given-names></name><name><surname>Jöckel</surname><given-names>P.</given-names></name><name><surname>Kerkweg</surname><given-names>A.</given-names></name><name><surname>Kubistin</surname><given-names>D.</given-names></name><name><surname>Regelin</surname><given-names>E.</given-names></name><name><surname>Riede</surname><given-names>H.</given-names></name><name><surname>Sandu</surname><given-names>A.</given-names></name><name><surname>Taraborrelli</surname><given-names>D.</given-names></name><name><surname>Tost</surname><given-names>H.</given-names></name><name><surname>Xie</surname><given-names>Z.Q.</given-names></name></person-group><article-title>The atmospheric chemistry box model CAABA/MECCA-3.0</article-title><source>Geosci. Model Dev.</source><year>2011</year><volume>4</volume><fpage>373</fpage><lpage>380</lpage><comment>Available online: <ext-link xlink:href="http://www.geosci-model-dev.net/4/373" ext-link-type="uri">http://www.geosci-model-dev.net/4/373</ext-link> (accessed on 5 May 2011)</comment></citation></ref>
<ref id="b64-atmosphere-02-00510"><label>64.</label><citation citation-type="web"><person-group person-group-type="author"><collab>Kinetic PreProcessor (KPP)</collab></person-group><comment>Available online: <ext-link xlink:href="http://www.cs.vt.edu/∼asandu/Software/Kpp" ext-link-type="uri">http://www.cs.vt.edu/∼asandu/Software/Kpp</ext-link> (accessed on 5 May 2011)</comment></citation></ref>
<ref id="b65-atmosphere-02-00510"><label>65.</label><citation citation-type="web"><person-group person-group-type="author"><collab>Kinetic PreProcessor : Accelerated (KPPA)</collab></person-group><comment>Available online <ext-link xlink:href="http://code.google.com/p/kppa/" ext-link-type="uri">http://code.google.com/p/kppa/</ext-link> (accessed on 5 May 2011)</comment></citation></ref></ref-list>
<fn-group><fn id="fn1-atmosphere-02-00510">
<label>‡</label>
<p>The paper is dedicated to the memory of Dr. Daewon Byun, whose work remains a lasting legacy to the field of air quality modeling and simulation.</p></fn></fn-group></back></article>
