struct
  type int_array = (int64, int64_elt, c_layout) Array1.t
  type elt_array = (float, float64_elt, c_layout) Array2.t
  type mblk_struct
  let mblk_struct : mblk_struct structure typ = structure "gsl_block_struct"
    let msize = field mblk_struct "size" int64_t
    let mdata = field mblk_struct "data" (ptr double)
  let () = seal mblk_struct
  
  type vec_struct
  let vec_struct : vec_struct structure typ = structure "gsl_vector"
    let vsize  = field vec_struct "size" int64_t
    let stride = field vec_struct "stride" int64_t
    let vdata  = field vec_struct "data" (ptr double)
    let vblock = field vec_struct "block" (ptr mblk_struct)
    let vowner = field vec_struct "owner" int64_t
  let () = seal vec_struct
  
  type mat_struct
  let mat_struct : mat_struct structure typ = structure "gsl_matrix"
    let size1 = field mat_struct "size1" int64_t
    let size2 = field mat_struct "size2" int64_t
    let tda   = field mat_struct "tda" int64_t
    let data  = field mat_struct "data" (ptr double)
    let block = field mat_struct "block" (ptr mblk_struct)
    let owner = field mat_struct "owner" int64_t
  let () = seal mat_struct
  
  type vec_record = {
    mutable vsize  : int;            
    mutable stride : int;            
    mutable vdata  : elt_array;      
    mutable vptr   : vec_struct Ctypes_static.structure Ctypes_static.ptr;
    
  }
end