sig
  type data = Nvector.any * Mpi.communicator
  type kind
  type t = (Nvector_mpiplusx.data, Nvector_mpiplusx.kind) Nvector.t
  type Nvector.gdata += MpiPlusX of Nvector_mpiplusx.data
  val wrap :
    ?context:Sundials.Context.t ->
    ?with_fused_ops:bool ->
    Mpi.communicator -> Nvector.any -> Nvector_mpiplusx.t
  val unwrap : Nvector_mpiplusx.t -> Nvector_mpiplusx.data
  val communicator : Nvector_mpiplusx.t -> Mpi.communicator
  val enable :
    ?with_fused_ops:bool ->
    ?with_linear_combination:bool ->
    ?with_scale_add_multi:bool ->
    ?with_dot_prod_multi:bool ->
    ?with_linear_sum_vector_array:bool ->
    ?with_scale_vector_array:bool ->
    ?with_const_vector_array:bool ->
    ?with_wrms_norm_vector_array:bool ->
    ?with_wrms_norm_mask_vector_array:bool -> Nvector_mpiplusx.t -> unit
  module Ops :
    sig
      type t = t
      val clone : t -> t
      val linearsum : float -> t -> float -> t -> t -> unit
      val const : float -> t -> unit
      val prod : t -> t -> t -> unit
      val div : t -> t -> t -> unit
      val scale : float -> t -> t -> unit
      val abs : t -> t -> unit
      val inv : t -> t -> unit
      val addconst : t -> float -> t -> unit
      val dotprod : t -> t -> float
      val maxnorm : t -> float
      val wrmsnorm : t -> t -> float
      val min : t -> float
      val compare : float -> t -> t -> unit
      val invtest : t -> t -> bool
      val wl2norm : t -> t -> float
      val l1norm : t -> float
      val wrmsnormmask : t -> t -> t -> float
      val constrmask : t -> t -> t -> bool
      val minquotient : t -> t -> float
      val space : t -> int * int
      val getlength : t -> int
      val print : ?logfile:Sundials.Logfile.t -> t -> unit
      val linearcombination : Sundials.RealArray.t -> t array -> t -> unit
      val scaleaddmulti :
        Sundials.RealArray.t -> t -> t array -> t array -> unit
      val dotprodmulti : t -> t array -> Sundials.RealArray.t -> unit
      val linearsumvectorarray :
        float -> t array -> float -> t array -> t array -> unit
      val scalevectorarray :
        Sundials.RealArray.t -> t array -> t array -> unit
      val constvectorarray : float -> t array -> unit
      val wrmsnormvectorarray :
        t array -> t array -> Sundials.RealArray.t -> unit
      val wrmsnormmaskvectorarray :
        t array -> t array -> t -> Sundials.RealArray.t -> unit
      val scaleaddmultivectorarray :
        Sundials.RealArray.t ->
        t array -> t array array -> t array array -> unit
      val linearcombinationvectorarray :
        Sundials.RealArray.t -> t array array -> t array -> unit
      module Local :
        sig
          val dotprod : t -> t -> float
          val maxnorm : t -> float
          val min : t -> float
          val l1norm : t -> float
          val invtest : t -> t -> bool
          val constrmask : t -> t -> t -> bool
          val minquotient : t -> t -> float
          val wsqrsum : t -> t -> float
          val wsqrsummask : t -> t -> t -> float
          val dotprodmulti : t -> t array -> Sundials.RealArray.t -> unit
          val dotprodmulti_allreduce : t -> Sundials.RealArray.t -> unit
        end
    end
  module DataOps :
    sig
      type t = data
      val clone : t -> t
      val linearsum : float -> t -> float -> t -> t -> unit
      val const : float -> t -> unit
      val prod : t -> t -> t -> unit
      val div : t -> t -> t -> unit
      val scale : float -> t -> t -> unit
      val abs : t -> t -> unit
      val inv : t -> t -> unit
      val addconst : t -> float -> t -> unit
      val dotprod : t -> t -> float
      val maxnorm : t -> float
      val wrmsnorm : t -> t -> float
      val min : t -> float
      val compare : float -> t -> t -> unit
      val invtest : t -> t -> bool
      val wl2norm : t -> t -> float
      val l1norm : t -> float
      val wrmsnormmask : t -> t -> t -> float
      val constrmask : t -> t -> t -> bool
      val minquotient : t -> t -> float
      val space : t -> int * int
      val getlength : t -> int
      val print : ?logfile:Sundials.Logfile.t -> t -> unit
      val linearcombination : Sundials.RealArray.t -> t array -> t -> unit
      val scaleaddmulti :
        Sundials.RealArray.t -> t -> t array -> t array -> unit
      val dotprodmulti : t -> t array -> Sundials.RealArray.t -> unit
      val linearsumvectorarray :
        float -> t array -> float -> t array -> t array -> unit
      val scalevectorarray :
        Sundials.RealArray.t -> t array -> t array -> unit
      val constvectorarray : float -> t array -> unit
      val wrmsnormvectorarray :
        t array -> t array -> Sundials.RealArray.t -> unit
      val wrmsnormmaskvectorarray :
        t array -> t array -> t -> Sundials.RealArray.t -> unit
      val scaleaddmultivectorarray :
        Sundials.RealArray.t ->
        t array -> t array array -> t array array -> unit
      val linearcombinationvectorarray :
        Sundials.RealArray.t -> t array array -> t array -> unit
      module Local :
        sig
          val dotprod : t -> t -> float
          val maxnorm : t -> float
          val min : t -> float
          val l1norm : t -> float
          val invtest : t -> t -> bool
          val constrmask : t -> t -> t -> bool
          val minquotient : t -> t -> float
          val wsqrsum : t -> t -> float
          val wsqrsummask : t -> t -> t -> float
          val dotprodmulti : t -> t array -> Sundials.RealArray.t -> unit
          val dotprodmulti_allreduce : t -> Sundials.RealArray.t -> unit
        end
    end
  module Any :
    sig
      val wrap :
        ?context:Sundials.Context.t ->
        ?with_fused_ops:bool ->
        Mpi.communicator -> Nvector.any -> Nvector.any
      val unwrap : Nvector.any -> Nvector_mpiplusx.data
      val enable :
        ?with_fused_ops:bool ->
        ?with_linear_combination:bool ->
        ?with_scale_add_multi:bool ->
        ?with_dot_prod_multi:bool ->
        ?with_linear_sum_vector_array:bool ->
        ?with_scale_vector_array:bool ->
        ?with_const_vector_array:bool ->
        ?with_wrms_norm_vector_array:bool ->
        ?with_wrms_norm_mask_vector_array:bool -> Nvector.any -> unit
    end
end