  This paper describes the design and implementation of a comprehensive OCaml
interface to the Sundials library of numeric solvers for ordinary differential
equations, differential algebraic equations, and non-linear equations. The
interface provides a convenient and memory-safe alternative to using Sundials
directly from C and facilitates application development by integrating with
higher-level language features, like garbage-collected memory management,
algebraic data types, and exceptions. Our benchmark results suggest that the
interface overhead is acceptable: the standard examples are rarely twice as
slow in OCaml than in C, and often less than 50% slower. The challenges in
interfacing with Sundials are to efficiently and safely share data structures
between OCaml and C, to support multiple implementations of vector operations
and linear solvers through a common interface, and to manage calls and error
signalling to and from OCaml. We explain how we overcame these difficulties
using a combination of standard techniques such as phantom types and
polymorphic variants, and carefully crafted data representations.
