sig
  val dense :
    ?context:Sundials.Context.t ->
    ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
    'Sundials.Matrix.dense ->
    (Sundials.Matrix.Dense.t, 'a, [ `Dls ]) Sundials_LinearSolver.serial_t
  val lapack_dense :
    ?context:Sundials.Context.t ->
    ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
    'Sundials.Matrix.dense ->
    (Sundials.Matrix.Dense.t, 'a, [ `Dls ]) Sundials_LinearSolver.serial_t
  val band :
    ?context:Sundials.Context.t ->
    ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
    'Sundials.Matrix.band ->
    (Sundials.Matrix.Band.t, 'a, [ `Dls ]) Sundials_LinearSolver.serial_t
  val lapack_band :
    ?context:Sundials.Context.t ->
    ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
    'Sundials.Matrix.band ->
    (Sundials.Matrix.Band.t, 'a, [ `Dls ]) Sundials_LinearSolver.serial_t
  module Klu :
    sig
      type ordering =
        Sundials_LinearSolver_impl.Klu.ordering =
          Amd
        | ColAmd
        | Natural
      val make :
        ?context:Sundials.Context.t ->
        ?ordering:ordering ->
        ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
        ('s, 'a) Sundials.Matrix.sparse ->
        ('Sundials.Matrix.Sparse.t, 'a, [ `Dls | `Klu ])
        Sundials_LinearSolver.serial_t
      val reinit :
        ('Sundials.Matrix.Sparse.t, [> Nvector_serial.kind ] as 'a,
         [> `Klu ])
        Sundials_LinearSolver.serial_t ->
        ('s, 'a) Sundials.Matrix.sparse -> ?nnz:int -> unit -> unit
      val set_ordering :
        ('Sundials.Matrix.Sparse.t, [> Nvector_serial.kind ], [> `Klu ])
        Sundials_LinearSolver.serial_t -> ordering -> unit
    end
  val klu :
    ?context:Sundials.Context.t ->
    ?ordering:Klu.ordering ->
    ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
    ('s, 'a) Sundials.Matrix.sparse ->
    ('Sundials.Matrix.Sparse.t, 'a, [ `Dls | `Klu ])
    Sundials_LinearSolver.serial_t
  module Superlumt :
    sig
      type ordering =
        Sundials_LinearSolver_impl.Superlumt.ordering =
          Natural
        | MinDegreeProd
        | MinDegreeSum
        | ColAmd
      val make :
        ?context:Sundials.Context.t ->
        ?ordering:ordering ->
        nthreads:int ->
        ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
        ('s, 'a) Sundials.Matrix.sparse ->
        ('Sundials.Matrix.Sparse.t, 'a, [ `Dls | `Slu ])
        Sundials_LinearSolver.serial_t
      val set_ordering :
        ('Sundials.Matrix.Sparse.t, [> Nvector_serial.kind ], [> `Slu ])
        Sundials_LinearSolver.serial_t -> ordering -> unit
    end
  val superlumt :
    ?context:Sundials.Context.t ->
    ?ordering:Superlumt.ordering ->
    nthreads:int ->
    ([> Nvector_serial.kind ] as 'a) Nvector.serial ->
    ('s, 'a) Sundials.Matrix.sparse ->
    ('Sundials.Matrix.Sparse.t, 'a, [> `Dls | `Slu ])
    Sundials_LinearSolver.serial_t
  type 'm jac_fn =
      (Sundials.RealArray.t Kinsol.double, Sundials.RealArray.t)
      Kinsol.jacobian_arg -> '-> unit
  val solver :
    ?jac:'Kinsol.Dls.jac_fn ->
    ('m, Sundials.RealArray.t, [> Nvector_serial.kind ] as 'a, [> `Dls ])
    Sundials.LinearSolver.t -> 'Kinsol.serial_linear_solver
  val get_work_space :
    [> Nvector_serial.kind ] Kinsol.serial_session -> int * int
  val get_num_jac_evals :
    [> Nvector_serial.kind ] Kinsol.serial_session -> int
  val get_num_lin_func_evals :
    [> Nvector_serial.kind ] Kinsol.serial_session -> int
end