sig
  type 'a parallel_session =
      (Nvector_parallel.data, Nvector_parallel.kind, 'a) Arkode_impl.session
    constraint 'a = [< `ARKStep | `MRIStep ]
  type 'a parallel_preconditioner =
      (Nvector_parallel.data, Nvector_parallel.kind, 'a)
      Arkode.Spils.preconditioner
    constraint 'a = [< `ARKStep | `MRIStep ]
  type bandwidths =
    Arkode_impl.ArkodeBbdTypes.bandwidths = {
    mudq : int;
    mldq : int;
    mukeep : int;
    mlkeep : int;
  }
  type local_fn =
      float -> Nvector_parallel.data -> Nvector_parallel.data -> unit
  type comm_fn = float -> Nvector_parallel.data -> unit
  val prec_left :
    ?dqrely:float ->
    Arkode_bbd.bandwidths ->
    ?comm:Arkode_bbd.comm_fn ->
    Arkode_bbd.local_fn ->
    [< `ARKStep | `MRIStep ] Arkode_bbd.parallel_preconditioner
  val prec_right :
    ?dqrely:float ->
    Arkode_bbd.bandwidths ->
    ?comm:Arkode_bbd.comm_fn ->
    Arkode_bbd.local_fn ->
    [< `ARKStep | `MRIStep ] Arkode_bbd.parallel_preconditioner
  val prec_both :
    ?dqrely:float ->
    Arkode_bbd.bandwidths ->
    ?comm:Arkode_bbd.comm_fn ->
    Arkode_bbd.local_fn ->
    [< `ARKStep | `MRIStep ] Arkode_bbd.parallel_preconditioner
  val reinit :
    [< `ARKStep | `MRIStep ] Arkode_bbd.parallel_session ->
    ?dqrely:float -> int -> int -> unit
  val get_work_space :
    [< `ARKStep | `MRIStep ] Arkode_bbd.parallel_session -> int * int
  val get_num_gfn_evals :
    [< `ARKStep | `MRIStep ] Arkode_bbd.parallel_session -> int
end