sig
  type data = Sundials.RealArray.t * int * Mpi.communicator
  type kind
  type t = (Nvector_parallel.data, Nvector_parallel.kind) Nvector.t
  type Nvector.gdata += Par of Nvector_parallel.data
  exception IncorrectGlobalSize
  val make :
    ?context:Sundials.Context.t ->
    ?with_fused_ops:bool ->
    int -> int -> Mpi.communicator -> float -> Nvector_parallel.t
  val clone : Nvector_parallel.t -> Nvector_parallel.t
  val wrap :
    ?context:Sundials.Context.t ->
    ?with_fused_ops:bool -> Nvector_parallel.data -> Nvector_parallel.t
  val unwrap : Nvector_parallel.t -> Nvector_parallel.data
  val pp : Stdlib.Format.formatter -> Nvector_parallel.t -> unit
  val local_array : Nvector_parallel.t -> Sundials.RealArray.t
  val local_length : Nvector_parallel.t -> int
  val global_length : Nvector_parallel.t -> int
  val communicator : Nvector_parallel.t -> Mpi.communicator
  val get_communicator : ('d, 'k) Nvector.t -> Mpi.communicator option
  val hide_communicator : Mpi.communicator -> Nvector_custom.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 ->
    ?with_scale_add_multi_vector_array:bool ->
    ?with_linear_combination_vector_array:bool ->
    ?with_dot_prod_multi_local:bool -> Nvector_parallel.t -> unit
  module MakeOps :
    functor
      (A : sig
             type local_data
             val get : Nvector_parallel.MakeOps.local_data -> int -> float
             val set :
               Nvector_parallel.MakeOps.local_data -> int -> float -> unit
             val fill : Nvector_parallel.MakeOps.local_data -> float -> unit
             val make : int -> float -> Nvector_parallel.MakeOps.local_data
             val clone :
               Nvector_parallel.MakeOps.local_data ->
               Nvector_parallel.MakeOps.local_data
             val length : Nvector_parallel.MakeOps.local_data -> int
           end)
      ->
      sig
        type t = A.local_data * int * Mpi.communicator
        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 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 make :
        ?context:Sundials.Context.t ->
        ?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 ->
        ?with_scale_add_multi_vector_array:bool ->
        ?with_linear_combination_vector_array:bool ->
        ?with_dot_prod_multi_local:bool ->
        int -> int -> Mpi.communicator -> float -> Nvector.any
      val wrap :
        ?context:Sundials.Context.t ->
        ?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 ->
        ?with_scale_add_multi_vector_array:bool ->
        ?with_linear_combination_vector_array:bool ->
        ?with_dot_prod_multi_local:bool ->
        Nvector_parallel.data -> Nvector.any
      val unwrap : Nvector.any -> Nvector_parallel.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 ->
        ?with_scale_add_multi_vector_array:bool ->
        ?with_linear_combination_vector_array:bool ->
        ?with_dot_prod_multi_local:bool -> Nvector.any -> unit
    end
end