This project is enhancing the SUNDIALS (SUite of Nonlinear and DIfferential/ALgebraic equation Solvers) library, which integrates differential systems in time using state-of-the-art adaptive time step technologies for use on exascale systems. A key advance is incorporating a multivector capability to allow SUNDIALS to better leverage solvers from other packages, support multirate simulations, and better make use of on-node data structure optimizations. This work enhances SUNDIALS APIs and testing practices, expanding the flexibility of packages to support operations on collections of separate vectors enabling more complex communication types and solvers with increased arithmetic intensity and to ease incorporation of additional capabilities and data structures.
In preparation for exascale, this ECP project will focus on several enhancements to SUNDIALS APIs and testing practices. Currently SUNDIALS treats an entire problem “solution” one vector at a time. This strategy limits some applications in use of SUNDIALS integrators and solvers within multiphysics contexts, where it may be more natural to store the solution in multiple separate data structures. Through a multivector API we will expand the flexibility of SUNDIALS packages to support operations on collections of separate vectors enabling more complex communication types and solvers with increased arithmetic intensity. SUNDIALS utilizes abstract linear solver interfaces to leverage scalable external or application-specific linear solvers. These interfaces are slightly different for each SUNDIALS package and require knowledge of SUNDIALS’ internal memory structures. To ease incorporation of external linear solvers we will revise the existing interfaces to have a cleaner API. The nonlinear solvers used to compute each integrator step or stage solution are not encapsulated, and each package contains a separate implementation specific to its needs. This project also includes encapsulation of the nonlinear solver interfaces. We will also include new fused kernels in the vector API for efficiency on GPUs.