sig
  module type ARRAY_NVECTOR =
    sig
      type data
      type kind = Nvector_custom.kind
      type t = Nvector_array.ARRAY_NVECTOR.data Nvector_custom.t
      val array_nvec_ops :
        Nvector_array.ARRAY_NVECTOR.data Nvector_custom.nvector_ops
      val make :
        ?context:Sundials.Context.t ->
        int -> float -> Nvector_array.ARRAY_NVECTOR.t
      val wrap :
        ?context:Sundials.Context.t ->
        ?with_fused_ops:bool ->
        Nvector_array.ARRAY_NVECTOR.data -> Nvector_array.ARRAY_NVECTOR.t
      val unwrap :
        Nvector_array.ARRAY_NVECTOR.t -> Nvector_array.ARRAY_NVECTOR.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 ->
        Nvector_array.ARRAY_NVECTOR.t -> unit
      module Any :
        sig
          type Nvector.gdata += Arr of Nvector_array.ARRAY_NVECTOR.data
          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 ->
            Nvector_array.ARRAY_NVECTOR.data -> Nvector.any
        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
    end
  module type ArrayOps =
    sig
      type data
      val get : Nvector_array.ArrayOps.data -> int -> float
      val set : Nvector_array.ArrayOps.data -> int -> float -> unit
      val fill : Nvector_array.ArrayOps.data -> float -> unit
      val make : int -> float -> Nvector_array.ArrayOps.data
      val clone : Nvector_array.ArrayOps.data -> Nvector_array.ArrayOps.data
      val length : Nvector_array.ArrayOps.data -> int
    end
  module Make :
    functor (A : ArrayOps->
      sig
        type data = A.data
        type kind = Nvector_custom.kind
        type t = data Nvector_custom.t
        val array_nvec_ops : data Nvector_custom.nvector_ops
        val make : ?context:Sundials.Context.t -> int -> float -> t
        val wrap :
          ?context:Sundials.Context.t -> ?with_fused_ops:bool -> data -> t
        val unwrap : t -> 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 -> t -> unit
        module Any :
          sig
            type Nvector.gdata += Arr of data
            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 ->
              data -> Nvector.any
          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
      end
  type data = float array
  type kind = Nvector_custom.kind
  type t = data Nvector_custom.t
  val array_nvec_ops : data Nvector_custom.nvector_ops
  val make : ?context:Sundials.Context.t -> int -> float -> t
  val wrap : ?context:Sundials.Context.t -> ?with_fused_ops:bool -> data -> t
  val unwrap : t -> 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 -> t -> unit
  module Any :
    sig
      type Nvector.gdata += Arr of data
      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 -> data -> Nvector.any
    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
end