3.1. Introduction
CVODE is part of a software family called SUNDIALS: SUite of Nonlinear and DIfferential/ALgebraic equation Solvers [81]. This suite consists of CVODE, ARKODE, KINSOL, and IDA, and variants of these with sensitivity analysis capabilities.
3.1.1. Historical Background
Fortran solvers for ODE initial value problems are widespread and heavily used. Two solvers that have been written at LLNL in the past are VODE [24] and VODPK [30]. VODE is a general purpose solver that includes methods for both stiff and nonstiff systems, and in the stiff case uses direct methods (full or banded) for the solution of the linear systems that arise at each implicit step. Externally, VODE is very similar to the well known solver LSODE [113]. VODPK is a variant of VODE that uses a preconditioned Krylov (iterative) method, namely GMRES, for the solution of the linear systems. VODPK is a powerful tool for large stiff systems because it combines established methods for stiff integration, nonlinear iteration, and Krylov (linear) iteration with a problem-specific treatment of the dominant source of stiffness, in the form of the user-supplied preconditioner matrix [25]. The capabilities of both VODE and VODPK have been combined in the C-language package CVODE [41].
At present, CVODE may utilize a variety of Krylov methods provided in SUNDIALS that can be used in conjunction with Newton iteration: these include the GMRES (Generalized Minimal RESidual) [122], FGMRES (Flexible Generalized Minimum RESidual) [121], Bi-CGStab (Bi-Conjugate Gradient Stabilized) [157], TFQMR (Transpose-Free Quasi-Minimal Residual) [64], and PCG (Preconditioned Conjugate Gradient) [76] linear iterative methods. As Krylov methods, these require almost no matrix storage for solving the Newton equations as compared to direct methods. However, the algorithms allow for a user-supplied preconditioner matrix, and for most problems preconditioning is essential for an efficient solution. For very large stiff ODE systems, the Krylov methods are preferable over direct linear solver methods, and are often the only feasible choice. Among the Krylov methods in SUNDIALS, we recommend GMRES as the best overall choice. However, users are encouraged to compare all options, especially if encountering convergence failures with GMRES. Bi-CGStab and TFQMR have an advantage in storage requirements, in that the number of workspace vectors they require is fixed, while that number for GMRES depends on the desired Krylov subspace size. FGMRES has an advantage in that it is designed to support preconditioners that vary between iterations (e.g. iterative methods). PCG exhibits rapid convergence and minimal workspace vectors, but only works for symmetric linear systems.
In the process of translating the VODE and VODPK algorithms into C, the overall CVODE organization has been changed considerably. One key feature of the CVODE organization is that the linear system solvers comprise a layer of code modules that is separated from the integration algorithm, allowing for easy modification and expansion of the linear solver array. A second key feature is a separate module devoted to vector operations; this facilitated the extension to multiprosessor environments with minimal impacts on the rest of the solver, resulting in PVODE [33], the parallel variant of CVODE.
Around 2002, the functionality of CVODE and PVODE were combined
into one single code, simply called CVODE. Development of this
version of CVODE was concurrent with a redesign of the vector
operations module across the SUNDIALS suite. The key feature of the
N_Vector module is that it is written in terms of abstract vector
operations with the actual vector kernels attached by a particular
implementation (such as serial or parallel) of N_Vector. This allows
writing the SUNDIALS solvers in a manner independent of the actual
N_Vector implementation (which can be user-supplied), as well as
allowing more than one N_Vector module linked into an executable
file. SUNDIALS (and thus CVODE) is supplied with a wide range of different
N_Vector implementations, including: serial, MPI-parallel, both OpenMP and
Pthreads thread-parallel N_Vector implementations, a Hypre parallel
implementation, a PETSc implementation, and various GPU-enabled
implementations.
3.1.2. Changes to SUNDIALS in release 7.7.0
New Features and Enhancements
The default number of stages for the SSP Runge-Kutta methods
ARKODE_LSRK_SSP_S_2 and ARKODE_LSRK_SSP_S_3 in
LSRKStep were changed from 10 and 9, respectively, to their minimum allowable
values of 2 and 4. Users may revert to the previous values by calling
LSRKStepSetNumSSPStages().
Added the optional function ARKodeInit() to ARKODE to enable data
allocation before the first call to ARKodeEvolve() (but after all other
optional input routines have been called), to support users who measure memory
usage before beginning a simulation.
Added the function ARKodeGetStageIndex() that returns the index of the
stage currently being processed, and the total number of stages in the method,
for users who wish to compute auxiliary quantities in their IVP right-hand side
functions during some stages and not others (e.g., in all but the first or last
stage).
Added the functions ARKodeGetLastTime() and ARKodeGetLastState()
to return the last successful time and state achieved by ARKODE, respectively.
ARKODE now allows users to supply functions that will be called before each
internal time step attempt (ARKodeSetPreStepFn()), after each successful
time step (ARKodeSetPostStepFn()), before right-hand side routines are
called on an updated state (ARKodeSetPreRhsFn()), and/or once each
internal step/stage is computed (ARKodeSetPostprocessStepFn()/
ARKodeSetPostprocessStageFn()). These are considered advanced
functions, as they should treat the state vector as read-only, otherwise all
theoretical guarantees of solution accuracy and stability will be lost. As a
result of these new functions, the values of multiple ARKODE return codes (e.g.,
ARK_INTERP_FAIL) have been updated; users who key off of the named constants
will not be affected, but users who rely on the values themselves should update
their codes accordingly.
Note to users utilizing the previously undocumented
ARKodeSetPostprocessStepFn() function, the supplied function is now
called on the newly computed state vector for all step attempts not just
successful steps. To obtain the previous behavior of only calling a function on
successful steps, switch to using ARKodeSetPostStepFn().
Added SUNLogger_Set{Error,Warning,Info,Debug}File functions to allow setting
logger output streams with a FILE*.
Updated the Kokkos N_Vector to support Kokkos 5.x versions.
Bug Fixes
Fixed a CMake bug where the SuperLU_MT interface would not be built and
installed without setting the SUPERLUMT_WORKS option to TRUE.
Fixed the embedded coefficients for the ARKODE_TSITOURAS_7_4_5 Butcher
table.
Fixed a bug in LSRKStep where an incorrect state vector could be passed to a
user-supplied dominant eigenvalue function on the first step unless the output
vector passed to ARKodeEvolve() contained the initial condition and when
an eigenvalue estimate is requested on the first step in a subsequent call to
ARKodeEvolve() unless the output vector passed contained the most
recently returned solution.
Fixed a potential bug in LSRKStep’s ARKODE_LSRK_SSP_S_3 method,
where a real number was used instead of an integer, potentially resulting in a
rounding error.
Fixed a bug in MRIStep for estimating the first “slow” time step in an adaptive multirate calculation.
Fixed a bug in MRIStep when using a custom inner integrator that relies on the
input state being the initial condition for the fast integration rather than
retaining the result from the last inner integration or most recent reset call
and the output vector passed to ARKodeEvolve() does not contain the
initial condition on the first call or the last returned solution on subsequent
calls.
Added a missing call to SUNNonlinSolSetup() in MRIStep when using an
IMEX-MRI-SR method.
Fixed a bug in the ARKODE discrete adjoint checkpointing where an incorrect
state would be stored on the first step if the output vector passed to
ARKodeEvolve() did not contain the initial condition on the first call.
Removed extraneous copy of output vector when using ARKODE in ARK_ONE_STEP
mode.
Removed an extraneous copy of the output vector in each step with SplittingStep.
Fixed a bug in logging output from ARKODE, where for some time stepping modules, the current “time” output in the logger was incorrect.
Fixed a bug where passing an empty string to
SUNLogger_Set{Error,Warning,Info,Debug}Filename did not disable the
corresponding logging stream Issue #844.
Deprecation Notices
The CVodeSetMonitorFn and CVodeSetMonitorFrequency functions have been
deprecated and will be removed in the next major release.
Several CMake options have been deprecated in favor of namespaced versions
prefixed with SUNDIALS_ to avoid naming collisions in applications that
include SUNDIALS directly within their CMake builds. Additionally, a consistent
naming convention (SUNDIALS_ENABLE) is now used for all boolean options. The
table below lists the old CMake option names and the new replacements.
Old Option |
New Option |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Following the updated CMake options, the macros listed below have been deprecated and replaced with versions that align with the new CMake options.
Old Macro |
New Macro |
|
|
|
|
|
|
For changes in prior versions of SUNDIALS see §18.
3.1.3. Reading this User Guide
This user guide is a combination of general usage instructions. Specific example programs are provided as a separate document. We expect that some readers will want to concentrate on the general instructions, while others will refer mostly to the examples, and the organization is intended to accommodate both styles.
There are different possible levels of usage of CVODE. The most casual user, with a small IVP problem only, can get by with reading §3.2.1, then §3.4 through §3.4.3.9 only, and looking at examples in [83].
In a different direction, a more expert user with an IVP problem may
want to (a) use a package preconditioner
(§3.4.5), (b) supply his/her own Jacobian
or preconditioner routines
(§3.4.4.6), (c) do multiple runs of
problems of the same size (§3.4.3.13), (d)
supply a new N_Vector module (§8), (e)
supply new SUNLinearSolver and/or SUNMatrix modules
(§9 and §10),
or even (f) supply new SUNNonlinearSolver modules
(§11).
The structure of this document is as follows:
In §3.2, we give short descriptions of the numerical methods implemented by CVODE for the solution of initial value problems for systems of ODEs, and continue with short descriptions of preconditioning (§3.2.3), stability limit detection (§3.2.4), and rootfinding (§3.2.5).
The following chapter describes the software organization of the CVODE solver (§3.3).
§3.4 is the main usage document for CVODE for C applications. It includes a complete description of the user interface for the integration of ODE initial value problems.
In §20, we describe the use of CVODE with Fortran applications.
§8 gives a brief overview of the generic
N_Vectormodule shared among the various components of SUNDIALS, and details on theN_Vectorimplementations provided with SUNDIALS.§9 gives a brief overview of the generic
SUNMatrixmodule shared among the various components of SUNDIALS, and details on theSUNMatriximplementations provided with SUNDIALS: a dense implementation (§9.9), a banded implementation (§9.12) and a sparse implementation (§9.14).§10 gives a brief overview of the generic
SUNLinearSolvermodule shared among the various components of SUNDIALS. This chapter contains details on theSUNLinearSolverimplementations provided with SUNDIALS. The chapter also contains details on theSUNLinearSolverimplementations provided with SUNDIALS that interface with external linear solver libraries.§11 describes the
SUNNonlinearSolverAPI and nonlinear solver implementations shared among the various components of SUNDIALS.Finally, in the appendices, we provide detailed instructions for the installation of CVODE, within the structure of SUNDIALS (§1.1), as well as a list of all the constants used for input to and output from CVODE functions (§3.5).
Finally, the reader should be aware of the following notational
conventions in this user guide: program listings and identifiers (such
as CVodeInit()) within textual explanations are hyperlinked
to their definitions directly; fields
in C structures (such as content) appear in italics; and packages
or modules, such as CVLS, are written in all capitals.
3.1.4. SUNDIALS License and Notices
All SUNDIALS packages are released open source, under the BSD 3-Clause license for more details see the LICENSE and NOTICE files provided with all SUNDIALS packages.
3.1.5. Acknowledgments
We wish to acknowledge the contributions to previous versions of the CVODE and PVODE codes and their user guides by Scott D. Cohen [40] and George D. Byrne [32].