sig
  type gramschmidt_type =
    Sundials_LinearSolver_impl.Iterative.gramschmidt_type =
      ModifiedGS
    | ClassicalGS
  val spbcgs :
    ?context:Sundials.Context.t ->
    ?maxl:int ->
    ('d, 'k) Nvector.t ->
    ('m, 'd, 'k, [ `Iter | `Spbcgs ]) Sundials_LinearSolver.t
  val spfgmr :
    ?context:Sundials.Context.t ->
    ?maxl:int ->
    ?max_restarts:int ->
    ?gs_type:gramschmidt_type ->
    ('d, 'k) Nvector.t ->
    ('m, 'd, 'k, [ `Iter | `Spfgmr ]) Sundials_LinearSolver.t
  val spgmr :
    ?context:Sundials.Context.t ->
    ?maxl:int ->
    ?max_restarts:int ->
    ?gs_type:gramschmidt_type ->
    ('d, 'k) Nvector.t ->
    ('m, 'd, 'k, [ `Iter | `Spgmr ]) Sundials_LinearSolver.t
  val sptfqmr :
    ?context:Sundials.Context.t ->
    ?maxl:int ->
    ('d, 'k) Nvector.t ->
    ('m, 'd, 'k, [ `Iter | `Sptfqmr ]) Sundials_LinearSolver.t
  val pcg :
    ?context:Sundials.Context.t ->
    ?maxl:int ->
    ('d, 'k) Nvector.t ->
    ('m, 'd, 'k, [ `Iter | `Pcg ]) Sundials_LinearSolver.t
  module Algorithms :
    sig
      val qr_fact :
        int -> Sundials.RealArray2.t -> Sundials.RealArray.t -> bool -> unit
      val qr_sol :
        int ->
        Sundials.RealArray2.t ->
        Sundials.RealArray.t -> Sundials.RealArray.t -> unit
      val modified_gs :
        ('d, 'k) Nvector.t array ->
        Sundials.RealArray2.t -> int -> int -> float
      val classical_gs :
        ('d, 'k) Nvector.t array ->
        Sundials.RealArray2.t ->
        int ->
        int -> Sundials.RealArray.t -> ('d, 'k) Nvector.t array -> float
    end
  val set_maxl :
    ('m, 'd, 'k, [< `Iter | `Pcg | `Spbcgs | `Sptfqmr ])
    Sundials_LinearSolver.t -> int -> unit
  val set_gs_type :
    ('m, 'd, 'k, [< `Iter | `Spfgmr | `Spgmr ]) Sundials_LinearSolver.t ->
    gramschmidt_type -> unit
  val set_max_restarts :
    ('m, 'd, 'k, [< `Iter | `Spfgmr | `Spgmr ]) Sundials_LinearSolver.t ->
    int -> unit
  type preconditioning_type =
    Sundials_LinearSolver_impl.Iterative.preconditioning_type =
      PrecNone
    | PrecLeft
    | PrecRight
    | PrecBoth
  val set_prec_type :
    ('m, 'd, 'k, [> `Iter ]) Sundials_LinearSolver.t ->
    preconditioning_type -> unit
  val set_info_file :
    ('m, 'd, 'k, [> `Iter ]) Sundials_LinearSolver.t ->
    ?print_level:bool -> Sundials.Logfile.t -> unit
  val set_print_level :
    ('m, 'd, 'k, [> `Iter ]) Sundials_LinearSolver.t -> bool -> unit
  type 'data solve_arg = { uscale : 'data; fscale : 'data; }
  type 'd prec_solve_fn =
      (unit, 'd) Kinsol.jacobian_arg ->
      'Kinsol.Spils.solve_arg -> '-> unit
  type 'd prec_setup_fn =
      (unit, 'd) Kinsol.jacobian_arg -> 'Kinsol.Spils.solve_arg -> unit
  type ('d, 'k) preconditioner =
      ('d, 'k) Kinsol_impl.SpilsTypes.preconditioner
  val prec_none : ('d, 'k) Kinsol.Spils.preconditioner
  val prec_right :
    ?setup:'Kinsol.Spils.prec_setup_fn ->
    'Kinsol.Spils.prec_solve_fn -> ('d, 'k) Kinsol.Spils.preconditioner
  type 'data jac_times_vec_fn = 'data -> 'data -> 'data -> bool -> bool
  val solver :
    ('m, 'd, 'k, [> `Iter ]) Sundials.LinearSolver.t ->
    ?jac_times_vec:'Kinsol.Spils.jac_times_vec_fn ->
    ?jac_times_sys:'Kinsol.sysfn ->
    ('d, 'k) Kinsol.Spils.preconditioner -> ('d, 'k) Kinsol.linear_solver
  val get_work_space : ('d, 'k) Kinsol.session -> int * int
  val get_num_lin_iters : ('d, 'k) Kinsol.session -> int
  val get_num_lin_conv_fails : ('d, 'k) Kinsol.session -> int
  val get_num_prec_evals : ('d, 'k) Kinsol.session -> int
  val get_num_prec_solves : ('d, 'k) Kinsol.session -> int
  val get_num_jtimes_evals : ('d, 'k) Kinsol.session -> int
  val get_num_lin_func_evals : ('d, 'k) Kinsol.session -> int
  val set_preconditioner :
    ('d, 'k) Kinsol.session ->
    ?setup:'Kinsol.Spils.prec_setup_fn ->
    'Kinsol.Spils.prec_solve_fn -> unit
  val set_jac_times :
    ('d, 'k) Kinsol.session -> 'Kinsol.Spils.jac_times_vec_fn -> unit
  val clear_jac_times : ('d, 'k) Kinsol.session -> unit
end