SUNDIALS: SUite of Nonlinear and DIfferential/ALgebraic Equation Solvers

CVODE is a solver for stiff and nonstiff ordinary differential equation (ODE) systems (initial value problem) given in explicit form y’ = f(t,y).

The methods used in CVODE are variable-order, variable-step multistep methods. For nonstiff problems, CVODE includes the Adams-Moulton formulas, with the order varying between 1 and 12. For stiff problems, CVODE includes the Backward Differentiation Formulas (BDFs) in so-called fixed-leading coefficient form, with order varying between 1 and 5. For either choice of formula, the resulting nonlinear system is solved (approximately) at each integration step. For this, CVODE offers the choice of either functional iteration, suitable only for nonstiff systems, and various versions of Newton iteration. In the cases of a direct linear solver (dense or banded), the Newton iteration is a Modified Newton iteration, in that the Jacobian is fixed (and usually out of date). When using a Krylov method as the linear solver, the iteration is an Inexact Newton iteration, using the current Jacobian (through matrix-free products), in which the linear residual is nonzero but controlled.

The implicit nonlinear systems within implicit integrators are solved approximately at each integration step using a modified Newton method, an Inexact Newton method, or fixed-point solver (functional iteration). For the Newton-based methods and the serial or threaded NVECTOR modules in SUNDIALS, CVODE provides both direct (dense, band, or sparse) and preconditioned Krylov iterative (GMRES, BiCGStab, TFQMR) 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 CVBANDPRE for use with the Krylov solvers, while for the distributed memory parallel structure there is a preconditioner module called CVBBDPRE which provides a band-block-diagonal preconditioner.

For use with Fortran applications, a set of Fortran/C interface routines, called FCVODE, 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.


cvode release history


What’s new in v2.9.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.
    • Added cvAdvDiff_bnd_omp.c example using OpenMP.
    • In FCVODE, added fcvRoberts_klu.f and fcvRoberts_sps.f fortran sparse direct solver examples.
    • Updated to return integers from linear solver and preconditioner ‘free’ functions.
  • Bug fixes
    • In FCVODE, fixed argument order bugs in FCVKLU and FCVSUPERLUMT linear solver interfaces.
    • Fixed memory leak in banded preconditioner interface.
    • Fixed some examples w.r.t. switch to new macro/function names SUNRexp etc.
    • Various minor fixes to installation-related files.
    • Corrected name N_VCloneEmptyVectorArray to N_VCloneVectorArrayEmpty in all documentation files.
    • In FCVODE, added missing Fortran interface routines so that users can supply the sparse Jacobian routine.
    • Minor corrections and additions to User Guide, including removal of references to specific NVECTOR names in usage skeletons.

What’s new in v2.8.0?

  • New features
    • Added interface to the sparse direct solver KLU.
    • Added interface to SuperLU_MT.
  • Bug fixes
    • Fixed minor bug in cvRootfind involving rootdir input.
    • Fixed line setting smu in CVLapackBand.
  • Changes to the FCVODE module
    • In optional input routines FCVSETIIN and FCVSETRIN, removed the optional fourth argument key_length.
    • Revised integer declarations in all examples so that those which must match a C type long int are declared INTEGER*8.
  • Changes related to the build system
    • Dropped support and documentation of the Autotools mode of installation.

What’s new in v2.7.0?

  • Bug fixes
    • logic in CVSetTqBDF changed to avoid a divide by zero.
    • linear solver memory set to zero after being created.
    • linear solver memory is freed on an error return.
  • Changes to user interface
    • Problem size and related integers (bandwidth parameters etc.) all have type long int, except for those in user calls specifying BLAS/LAPACK routines.

What’s new in v2.6.0?

  • New features
    • new linear solver module, based on Blas and Lapack for both dense and banded matrices.
    • option to specify which direction of zero-crossing is to be monitored while performing rootfinding.
  • Changes to user interface
    • reorganization of all linear solver modules into two families (besides the existing family of scaled preconditioned iterative linear solvers, the direct solvers, including the new Lapack-based ones, were also organized into a direct family).
    • maintaining a single pointer to user data, optionally specified through a Set-type function.
    • general streamlining of the preconditioner modules distributed with the solver.

What’s new in v2.5.0?

  • Bug fixes
    • fixed bug in final stopping times to resolve potential conflicts when tout is close to tstop.
  • Changes related to the build system
    • rearranged the entire SUNDIALS source tree.
    • all exported header files are now installed in separate subdirectories of the installtion include directory.
    • header files are included now by specifying the relative path (e.g. #include <cvode/cvode.h>).

What’s new in v2.4.0?

  • New features
    • added CVSPBCG interface module to allow CVODE to interface with the shared SPBCG (scaled preconditioned Bi-CGSTAB) linear solver module.
    • added CVSPTFQMR interface module to allow CVODE to interface with the shared SPTFQMR (scaled preconditioned TFQMR) linear solver module.
    • added support for SPBCG and SPTFQMR to the CVBBDPRE and CVBANDPRE preconditioner modules.
    • added support for interpreting failures in user-supplied functions.
  • Changes to user interface
    • changed argument of CVodeFree, CVBandPrecFree, and CVBBDPrecFree to be the address of the respective memory block pointer, so that its NULL value is propagated back to the calling function.
    • added CVSPBCG module which defines appropriate CVSpbcg* functions to allow CVODE to interface with the shared SPBCG linear solver module.
    • added CVBBDSpbcg function to CVBBDPRE module and CVBPSpbcg function to CVBANDPRE module to support SPBCG linear solver module.
    • added CVBBDSptfqmr function to CVBBDPRE module and CVBPSptfqmr function to CVBANDPRE module to support SPTFQMR linear solver module.
    • changed function type names to accomodate all the Scaled Preconditioned Iterative Linear Solvers now available:
      CVSpgmrJactimesVecFn -> CVSpilsJacTimesVecFn
      CVSpgmrPrecSetupFn -> CVSpilsPrecSetupFn
      CVSpgmrPrecSolveFn -> CVSpilsPrecSolveFn
    • changed function types so that all user-supplied functions return an integer flag.
    • added option for user-supplied error handler function.
    • changed some names for CVBANDPRE and CVBBDPRE function outputs.
    • renamed all exported header files (except for cvode.h, all header files have the prefix cvode_).
    • changed naming scheme for CVODE examples.
  • Changes to the FCVODE module
    • added support for CVSPBCG/SPBCG (added FCV*SPBCG* functions).
    • added support for CVSPTFQMR/SPTFQMR (added FCV*SPTFQMR* functions).
    • optional inputs are now set using routines FCVSETIIN (integer inputs) and FCVSETRIN (real inputs) through pairs key-value. Optional outputs are still obtained from two arrays (IOUT and ROUT), owned by the user and passed as arguments to FCVMALLOC. Note that the argument OPTIN was removed from FCVMALLOC.
    • changed the prototypes of user-supplied functions so that they all return an error flag as their last argument.
    • the arguments OPTIN, IOPT, and ROPT were removed from FCVREINIT.
  • Changes related to the build system
    • updated configure script and Makefiles for Fortran examples to avoid C++ compiler errors (now use CC and MPICC to link only if necessary).
    • the main CVODE header file (cvode.h) is still exported to the install include directory. However, all other CVODE header files are exported into a cvode subdirectory of the install include directory.
    • the CVODE library now contains all shared object files (there is no separate libsundials_shared library any more).

What’s new in v2.3.0?

  • New features
    • added option for user-provided error weight computation function (of type CVEwtFn specified through CVodeSetEwtFn).
  • Changes to user interface
    • CVODE now stores tolerances through values rather than references (to resolve potential scoping issues).
    • CVODE now passes information back to the user through values rather than references (error weights, estimated local errors, root info).
    • CVodeMalloc, CVodeReInit, CVodeSetTolerances: added option itol=CV_WF to indicate user-supplied function for computing the error weights; reltol is now declared as realtype. Note that it is now illegal to call CVodeSetTolerances before CVodeMalloc. It is now legal to deallocate the absolute tolerance N_Vector right after its use.
    • CVodeGetErrorWeights: the user is now responsible for allocating space for the N_Vector in which error weights will be copied.
    • CVodeGetEstLocalErrors: the user is now responsible for allocating space for the N_Vector in which estimated local errors will be copied.
    • CVodeGetRootInfo: the user is now responsible for allocating space for the int array in which root information will be copied.
    • Passing a value of 0 for the maximum step size, the minimum step size, or for maxsteps results in the solver using the corresponding default value (infinity, 0, 500, respectively).
    • Several optional input functions were combined into a single one (CVodeRootInit and CvodeSetGdata, CVDenseSetJacFn and CVDenseSetJacData, CVBandSetJacFn and CVBandSetJacData, CVSpgmrSetPrecSolveFn and CVSpgmrSetPrecSetFn and CVSpgmrSetPrecData, CVSpgmrSetJacTimesVecFn and CVSpgmrSetJacData).
  • Changes to the FCVODE module
    • Added option for user-supplied error weight computation subroutine (FCVEWT). Use FCVEWTSET to indicate that FCVEWT is provided.
    • Due to the changes to the main solver, if FCVPSOL is provided then FCVPSET must also be defined, even if it is empty.

What’s new in v2.2.2?

  • Bug fixes
    • fixed bug in CVode function: Initial setting of tretlast = *tret = tn removed (correcting erroneous behavior at first call to the rootfinding function CVRcheck3).
    • Removed redundant setting of tretlast = *tret = tn at CLOSE_ROOTS return from CVode.
  • Changes to documentation
    • added section with numerical values of all input and output solver constants.
    • added more detailed notes on the type of absolute tolerances.
    • added more details on ownership of memory for the array returned by CVodeGetRootInfo.
  • Changes related to the build system
    • fixed autoconf-related bug to allow configuration with the PGI Fortran compiler.
    • modified to use customized detection of the Fortran name mangling scheme (autoconf’s AC_F77_WRAPPERS routine is problematic on some platforms).
    • added –with-mpi-flags as a configure option to allow user to specify MPI-specific flags.
    • updated Makefiles for Fortran examples to avoid C++ compiler errors (now use CC and MPICC to link).

What’s new in v2.2.1?

  • Changes related to the build system
    • changed order of compiler directives in header files to avoid compilation errors when using a C++ compiler.
    • changed method of generating sundials_config.h to avoid potential warnings of redefinition of preprocessor symbols.

What’s new in v2.2.0?

  • New features
    • added option to specify a value of the independent variable (time) past which the integration is never to proceed.
    • added root finding capabilities.
    • added option to disable all error messages.
  • Changes related to the NVECTOR module
    • removed machEnv, redefined table of vector operations (now contained in the N_Vector structure itself).
    • all CVODE functions create new N_Vector variables through cloning, using an N_Vector passed by the user as a template.
  • Changes to type names and CVODE constants
    • removed type ‘integertype’; instead use int or long int, as appropriate.
    • restructured the list of return values from the various CVODE functions.
    • changed all CVODE constants (inputs and return values) to have the prefix ‘CV_’ (e.g. CV_SUCCESS).
    • renamed various function types to have the prefix ‘CV’ (e.g. CVRhsFn).
  • Changes to optional input/ouput
    • added CVodeSet* and CVodeGet* functions for optional inputs/outputs, replacing the arrays iopt and ropt.
    • added new optional inputs (e.g. maximum number of Newton iterations, maximum number of convergence failures, etc).
    • the value of the last return flag from any function within a linear solver module can be obtained as an optional output (e.g. CVDenseGetLastFlag).
  • Changes to user-callable functions
    • added new function CVodeCreate which initializes the CVODE solver object and returns a pointer to the CVODE memory block.
    • removed N (problem size) from all functions except the initialization functions for the direct linear solvers (CVDense and CVBand).
    • shortened argument lists of most CVODE functions (the arguments that were dropped can now be specified through CVodeSet* functions).
    • removed reinitialization functions for band/dense/SPGMR linear solvers (same functionality can be obtained using CV*Set* functions).
    • in CVBBDPRE, added a new function, CVBBDSpgmr to initialize the SPGMR linear solver with the BBD preconditioner.
    • function names changed in CVBANDPRE and CVBBDPRE for uniformity.
  • Changes to user-supplied functions
    • removed N (probem dimension) from argument lists.
    • shortened argument lists for user dense/band/SPGMR Jacobian routines.
    • in CVSPGMR, shortened argument lists for user preconditioner functions.
  • Changes to the FCVODE module
    • revised to use underscore and precision flags at compile time (from configure).
    • reorganized FCVODE into fewer files.
    • added tstop, one-step, and STALD options, and interfaces to CVBANDPRE and rootfinding capabilities.
    • use CV*Set* and CV*Get* functions from CVODE (although the optional I/O is still communicated to the user of FCVODE through arrays IOPT and ROPT).
    • added new optional inputs and outputs (e.g.tstop, nlscoef, maxnef, maxcor, maxncf, etc.) and rearranged locations in IOPT and ROPT for uniformity.