SUNDIALS: SUite of Nonlinear and DIfferential/ALgebraic Equation Solvers

ARKode is a solver library that provides adaptive-step time integration of the initial value problem for systems of stiff, nonstiff, and multi-rate systems of ordinary differential equations (ODEs) given in linearly implicit form M y’ = fE(t,y) + fI(t,y), where M is a given nonsingular matrix (possibly time dependent).

The right-hand side function is partitioned into two components–fE(t,y), containing the “slow” time scale components to be integrated explicitly, and fI(t,y), containing the “fast” time scale components to be integrated implicitly.

The methods used in ARKode are adaptive-step additive Runge Kutta methods, defined by combining two complementary Runge-Kutta methods–one explicit (ERK) and the other diagonally implicit (DIRK). Only the components in fI(t,y) must be solved implicitly, allowing for splittings tuned for use with optimal implicit solvers.

ARKode is packaged with a wide array of built-in methods, including adaptive explicit methods of orders 2-6, adaptive implicit methods of orders 2-5, and adaptive implicit-explicit (IMEX) methods of orders 3-5.

The implicit nonlinear systems within implicit integrators are solved approximately at each integration step using a modified Newton method, an Inexact Newton method, or an accelerated fixed-point solver. For the Newton-based methods and the serial or threaded NVECTOR modules in SUNDIALS, ARKode provides both direct (dense, band, or sparse) and preconditioned Krylov iterative (GMRES, BiCGStab, TFQMR, FGMRES, PCG) linear solvers. When used with one of the distributed parallel NVECTOR modules, including PETSc and hypre vectors, or a user-provided vector data structure, only the Krylov solvers are available, although a user may supply their own linear solver for any data structures if desired.  For the serial vector structure, there is a banded preconditioner module called ARKBANDPRE for use with the Krylov solvers, while for the distributed memory parallel structure there is a preconditioner module called ARKBBDPRE which provides a band-block-diagonal preconditioner.

For use with Fortran applications, a set of Fortran/C interface routines, called FARKode, is also supplied. These are written in C, but assume that the user calling program and all user-supplied routines are in Fortran.

See Software page for download and documentation.


arkode release history

What’s new in v2.0.0?

  • New features and/or enhancements
    • New linear solver API and interfaces for all SUNDIALS packages and linear solvers.  The goal of the redesign of these interfaces was to provide more encapsulation and ease in interfacing custom linear solvers and interoperability with linear solver libraries.
      • Added generic SUNMATRIX module with three provided implementations: dense, banded, and sparse.  These implementations replicate previous SUNDIALS Dls and Sls matrix structures in a single object-oriented API.
      • Added example problems demonstrating use of generic SUNMATRIX modules.
      • Added generic SUNLINEARSOLVER module with eleven provided implementations: dense, banded, LAPACK dense, LAPACK band, KLU, SuperLU_MT, SPGMR, SPBCGS, SPTFQMR, SPFGMR, and PCG.  These implementations replicate previous SUNDIALS generic linear solvers in a single object-oriented API.
      • Added example problems demonstrating use of generic SUNLINEARSOLVER modules.
      • Expanded package-provided direct linear solver (Dls) interfaces and scaled, preconditioned, iterative linear solver (Spils) interfaces to utilize generic SUNMATRIX and SUNLINEARSOLVER objects.
      • Removed package-specific, linear solver-specific, solver modules (e.g. CVDENSE, KINBAND, IDAKLU, ARKSPGMR) since their functionality is entirely replicated by the generic Dls/Spils interfaces and SUNLINEARSOLVER/SUNMATRIX modules.  The exception is CVDIAG, a diagonal approximate Jacobian solver available to CVODE and CVODES.
      • Converted all SUNDIALS example problems to utilize new generic SUNMATRIX and SUNLINEARSOLVER objects, along with updated Dls and Spils linear solver interfaces.
      • Added Spils interface routines to ARKode, CVODE, CVODES, IDA and IDAS to allow specification of a user-provided “JTSetup” routine. This change supports users who wish to set up data structures for the user-provided Jacobian-times-vector (“JTimes”) routine, and where the cost of one JTSetup setup per Newton iteration can be amortized between multiple JTimes calls.
    • Two new NVECTOR modules added: for CUDA and RAJA support for GPU systems.  These vectors are supplied to provide very basic support for running on GPU architectures.  Users are advised that these vectors both move all data to the GPU device upon construction, and speedup will only be realized if the user also conducts the right-hand-side function evaluation on the device. In addition, these vectors assume the problem fits on one GPU. For further information about RAJA, users are referred to the web site,
    • Addition of sunindextype option for 32- or 64-bit integer data index types within all SUNDIALS structures.
      • Sunindextype can be int64_t or int32_t or long long int and int depending on machine support for portable types.
      • The Fortran interfaces continue to use long_int for indices, except for their sparse matrix interface that now uses the new sunindextype.
      • Includes interfaces to PETSc, hypre, SuperLU_MT, and KLU with either 64-bit or 32-bit capabilities depending how the user configures SUNDIALS.
    • Temporary vectors were removed from preconditioner setup and solve routines for all packages.  It is assumed that all necessary data for user-provided preconditioner operations will be allocated and stored in user-provided data structures.
    • The file include/sundials_fconfig.h was added.  This file contains SUNDIALS type information for use in Fortran programs. 
    • Added support for many xSDK-compliant build system keys.
      • The xSDK is a movement in scientific software to provide a foundation for the rapid and efficient production of high-quality, sustainable extreme-scale scientific applications. 
      • More information can be found at
    • Added functions SUNDIALSGetVersion and SUNDIALSGetVersionNumber to
      get SUNDIALS release version information at runtime.

    • To avoid potential namespace conflicts, the macros defining booleantype values TRUE and FALSE have been changed to SUNTRUE and SUNFALSE respectively.

    • In build system:
      • Added separate BLAS_ENABLE and BLAS_LIBRARIES CMake variables.
      • Additional error checking during CMake configuration.
      • Fixed minor CMake bugs.
      • Renamed CMake options to enable/disable examples for greater clarity and added option to enable/disable Fortran 77 examples:
        • Changed F90_ENABLE to EXAMPLES_ENABLE_F90.
        • Added EXAMPLES_ENABLE_F77 option.
    • Added comments to arkode_butcher.c regarding which methods should have coefficients accurate enough for use in quad precision.
    • Corrections and additions to all User Guides.
  • Bug fixes
    • Fixed a bug in arkode_butcher.c in use of RCONST.
    • Fixed a bug in in the arkInitialSetup utility routine in the order of operations when setting up and using mass matrices to ensure the mass matrix vector product is set up before the “msetup” routine is called.
    • Fixed ARKode printf-related compiler warnings when building SUNDIALS with extended precision.

What’s new in v1.1.0?

  • New features and/or enhancements
    • Two new NVECTOR modules added: for Hypre ParVector and PETSc.
    • In vector API, added new required function, N_VGetVectorID.
    • Upgrades to sparse solver interfaces; now support CSR matrix type with KLU solver.
    • Example codes were changed from using NV_DATA macro to using N_VGetArrayPointer_* when using the native vectors shipped with SUNDIALS.
    • Implicit predictor algorithms were updated: methods 2 and 3 were improved, a new predictor approach was added, and the default choice was modified.
    • Revised handling of integer codes for specifying built-in Butcher tables: a global numbering system is still used, but methods now have #defined names to simplify the user interface.
    • Maximum number of Butcher table stages was increased from 8 to 15 to accommodate very high order methods, and an 8th-order adaptive ERK method was added.
    • Added support for the explicit and implicit methods in an additive Runge-Kutta method to utilize different stage times, solution and embedding coefficients, to support new SSP-ARK methods.
    • Extended FARKODE interface to include a routine to set scalar/array-valued residual tolerances, to support Fortran applications with non-identity mass-matrices.
    • Updated to return integers from linear solver and preconditioner ‘free’ functions.
  •  Bug fixes
    • Fix in initialization of linear solver performance counters.
    • Method and embedding for Billington and TRBDF2 explicit Runge-Kutta methods were swapped.
    • Fix for user specification of absolute tolerance array along with vector Resize() functionality.
    • Fix for user-supplied Butcher tables without embeddings (if fixed time steps or manual adaptivity are employed).
    • Multiple documentation updates.
    • Added missing ARKSpilsGetNumMtimesEvals() function.

What’s new in v1.0.0?

  • Initial release