sig
  type parallel_bsession =
      (Nvector_parallel.data, Nvector_parallel.kind) Cvodes.Adjoint.bsession
  type parallel_preconditioner =
      (Nvector_parallel.data, Nvector_parallel.kind)
      Cvodes.Adjoint.Spils.preconditioner
  type bandwidths =
    Cvode_bbd.bandwidths = {
    mudq : int;
    mldq : int;
    mukeep : int;
    mlkeep : int;
  }
  type local_fn =
      Nvector_parallel.data Cvodes.Adjoint.brhsfn_args ->
      Nvector_parallel.data -> unit
  type comm_fn = Nvector_parallel.data Cvodes.Adjoint.brhsfn_args -> unit
  val prec_left :
    ?dqrely:float ->
    Cvodes_bbd.bandwidths ->
    ?comm:Cvodes_bbd.comm_fn ->
    Cvodes_bbd.local_fn -> Cvodes_bbd.parallel_preconditioner
  val prec_right :
    ?dqrely:float ->
    Cvodes_bbd.bandwidths ->
    ?comm:Cvodes_bbd.comm_fn ->
    Cvodes_bbd.local_fn -> Cvodes_bbd.parallel_preconditioner
  val prec_both :
    ?dqrely:float ->
    Cvodes_bbd.bandwidths ->
    ?comm:Cvodes_bbd.comm_fn ->
    Cvodes_bbd.local_fn -> Cvodes_bbd.parallel_preconditioner
  val reinit :
    Cvodes_bbd.parallel_bsession -> ?dqrely:float -> int -> int -> unit
  val get_work_space : Cvodes_bbd.parallel_bsession -> int * int
  val get_num_gfn_evals : Cvodes_bbd.parallel_bsession -> int
end