4 use,
intrinsic :: iso_c_binding
9 integer(c_int),
public,
parameter ::
odc_real = 2
23 integer,
parameter ::
dp = selected_real_kind(15, 307)
27 type(c_ptr) :: impl = c_null_ptr
34 type(c_ptr) :: impl = c_null_ptr
47 type(c_ptr) :: impl = c_null_ptr
66 type(c_ptr) :: impl = c_null_ptr
67 real,
pointer,
dimension(:,:) :: data_array => null()
68 logical :: column_major = .true.
103 use,
intrinsic :: iso_c_binding
105 integer,
intent(in) :: error
106 integer(c_long),
intent(in) :: context
116 pure function strlen(str)
result(len)
bind(c)
117 use,
intrinsic :: iso_c_binding
119 type(c_ptr),
intent(in),
value :: str
120 integer(c_int) :: len
129 use,
intrinsic :: iso_c_binding
131 type(c_ptr),
intent(out) :: pstr
132 integer(c_int) :: err
136 use,
intrinsic :: iso_c_binding
138 type(c_ptr),
intent(out) :: pstr
139 integer(c_int) :: err
143 use,
intrinsic :: iso_c_binding
145 integer(c_int) :: err
149 use,
intrinsic :: iso_c_binding
151 integer(c_int),
intent(in),
value :: integer_behaviour
152 integer(c_int) :: err
156 use,
intrinsic :: iso_c_binding
158 type(c_funptr),
intent(in),
value :: handler
159 type(c_ptr),
intent(in),
value :: context
160 integer(c_int) :: err
164 use,
intrinsic :: iso_c_binding
166 logical(c_bool),
intent(in),
value :: halt
167 integer(c_int) :: err
171 use,
intrinsic :: iso_c_binding
173 integer(c_int),
intent(in),
value :: type
174 type(c_ptr),
intent(out) :: pstr
175 integer(c_int) :: err
179 use,
intrinsic :: iso_c_binding
181 integer(c_int),
intent(out) :: ntypes
182 integer(c_int) :: err
186 use,
intrinsic :: iso_c_binding
188 integer(c_int),
intent(in),
value :: err
189 type(c_ptr) :: error_string
193 use,
intrinsic :: iso_c_binding
195 integer(c_long),
intent(out) :: missing_integer
196 integer(c_int) :: err
200 use,
intrinsic :: iso_c_binding
202 real(c_double),
intent(out) :: missing_double
203 integer(c_int) :: err
207 use,
intrinsic :: iso_c_binding
209 integer(c_long),
intent(in),
value :: missing_integer
210 integer(c_int) :: err
214 use,
intrinsic :: iso_c_binding
216 real(c_double),
intent(in),
value :: missing_double
217 integer(c_int) :: err
223 use,
intrinsic :: iso_c_binding
225 type(c_ptr),
intent(in),
value :: path
226 type(c_ptr),
intent(out) :: reader
227 integer(c_int) :: err
231 use,
intrinsic :: iso_c_binding
233 type(c_ptr),
intent(in),
value :: reader
234 integer(c_int) :: err
240 use,
intrinsic :: iso_c_binding
242 type(c_ptr),
intent(out) :: frame
243 type(c_ptr),
intent(in),
value :: reader
244 integer(c_int) :: err
248 use,
intrinsic :: iso_c_binding
250 type(c_ptr),
intent(in),
value :: frame
251 integer(c_int) :: err
255 use,
intrinsic :: iso_c_binding
257 type(c_ptr),
intent(in),
value :: frame
258 integer(c_int) :: err
262 use,
intrinsic :: iso_c_binding
264 type(c_ptr),
intent(in),
value :: frame
265 integer(c_long),
intent(in),
value :: maximum_rows
266 integer(c_int) :: err
270 use,
intrinsic :: iso_c_binding
272 type(c_ptr),
intent(in),
value :: source_frame
273 type(c_ptr),
intent(out) :: copy
274 integer(c_int) :: err
278 use,
intrinsic :: iso_c_binding
280 type(c_ptr),
intent(in),
value :: frame
281 integer(c_long),
intent(out) ::
count
282 integer(c_int) :: err
286 use,
intrinsic :: iso_c_binding
288 type(c_ptr),
intent(in),
value :: frame
289 integer(c_int),
intent(out) ::
count
290 integer(c_int) :: err
295 use,
intrinsic :: iso_c_binding
297 type(c_ptr),
intent(in),
value :: frame
298 integer(c_int),
intent(in),
value :: col
299 type(c_ptr),
intent(out) :: name
300 integer(c_int),
intent(out) :: type
301 integer(c_int),
intent(out) :: element_size
302 integer(c_int),
intent(out) :: bitfield_count
303 integer(c_int) :: err
308 use,
intrinsic :: iso_c_binding
310 type(c_ptr),
intent(in),
value :: frame
311 integer(c_int),
intent(in),
value :: col
312 integer(c_int),
intent(in),
value :: field
313 type(c_ptr),
intent(out) :: name
314 integer(c_int),
intent(out) :: offset
315 integer(c_int),
intent(out) :: size
316 integer(c_int) :: err
322 use,
intrinsic :: iso_c_binding
324 type(c_ptr),
intent(out) :: decoder
325 integer(c_int) :: err
329 use,
intrinsic :: iso_c_binding
331 type(c_ptr),
intent(in),
value :: decoder
332 integer(c_int) :: err
336 use,
intrinsic :: iso_c_binding
338 type(c_ptr),
intent(in),
value :: decoder
339 type(c_ptr),
intent(in),
value :: frame
340 integer(c_int) :: err
344 use,
intrinsic :: iso_c_binding
346 type(c_ptr),
intent(in),
value :: decoder
347 logical(c_bool),
intent(in),
value :: columnmajor
348 integer(c_int) :: err
352 use,
intrinsic :: iso_c_binding
354 type(c_ptr),
intent(in),
value :: decoder
355 integer(c_long),
intent(in),
value :: row_count
356 integer(c_int) :: err
360 use,
intrinsic :: iso_c_binding
362 type(c_ptr),
intent(in),
value :: decoder
363 integer(c_long),
intent(out) :: row_count
364 integer(c_int) :: err
368 use,
intrinsic :: iso_c_binding
370 type(c_ptr),
intent(in),
value :: decoder
371 type(c_ptr),
intent(in),
value :: data
372 integer(c_long),
intent(in),
value :: width
373 integer(c_long),
intent(in),
value :: height
374 logical(c_bool),
intent(in),
value :: columnmajor
375 integer(c_int) :: err
379 use,
intrinsic :: iso_c_binding
381 type(c_ptr),
intent(in),
value :: decoder
382 type(c_ptr),
intent(out) :: data
383 integer(c_long),
intent(out) :: width
384 integer(c_long),
intent(out) :: height
385 logical(c_bool),
intent(out) :: columnmajor
386 integer(c_int) :: err
390 use,
intrinsic :: iso_c_binding
392 type(c_ptr),
intent(in),
value :: decoder
393 type(c_ptr),
intent(in),
value :: name
394 integer(c_int) :: err
398 use,
intrinsic :: iso_c_binding
400 type(c_ptr),
intent(in),
value :: decoder
401 integer(c_int),
intent(out) ::
count
402 integer(c_int) :: err
407 use,
intrinsic :: iso_c_binding
409 type(c_ptr),
intent(in),
value :: decoder
410 integer(c_int),
intent(in),
value :: col
411 integer(c_int),
intent(in),
value :: element_size
412 integer(c_int) :: err
417 use,
intrinsic :: iso_c_binding
419 type(c_ptr),
intent(in),
value :: decoder
420 integer(c_int),
intent(in),
value :: col
421 integer(c_int),
intent(in),
value :: element_size
422 integer(c_int),
intent(in),
value :: stride
423 type(c_ptr),
intent(in),
value :: data
424 integer(c_int) :: err
429 use,
intrinsic :: iso_c_binding
431 type(c_ptr),
intent(in),
value :: decoder
432 integer(c_int),
intent(in),
value :: col
433 integer(c_int),
intent(out) :: element_size
434 integer(c_int),
intent(out) :: stride
435 type(c_ptr),
intent(out) :: data
436 integer(c_int) :: err
441 function odc_decode(decoder, frame, rows_decoded)
result(err)
bind(c)
442 use,
intrinsic :: iso_c_binding
444 type(c_ptr),
intent(in),
value :: decoder
445 type(c_ptr),
intent(in),
value :: frame
446 integer(c_long),
intent(out) :: rows_decoded
447 integer(c_int) :: err
451 use,
intrinsic :: iso_c_binding
453 type(c_ptr),
intent(in),
value :: decoder
454 type(c_ptr),
intent(in),
value :: frame
455 integer(c_long),
intent(out) :: rows_decoded
456 integer(c_int),
intent(in),
value :: nthreads
457 integer(c_int) :: err
463 use,
intrinsic :: iso_c_binding
465 type(c_ptr),
intent(out) :: encoder
466 integer(c_int) :: err
470 use,
intrinsic :: iso_c_binding
472 type(c_ptr),
intent(in),
value :: encoder
473 integer(c_int) :: err
477 use,
intrinsic :: iso_c_binding
479 type(c_ptr),
intent(in),
value :: encoder
480 integer(c_long),
intent(in),
value :: row_count
481 integer(c_int) :: err
485 use,
intrinsic :: iso_c_binding
487 type(c_ptr),
intent(in),
value :: encoder
488 integer(c_long),
intent(in),
value :: rows_per_frame
489 integer(c_int) :: err
493 use,
intrinsic :: iso_c_binding
495 type(c_ptr),
intent(in),
value :: encoder
496 type(c_ptr),
intent(in),
value :: data
497 integer(c_long),
intent(in),
value :: width
498 integer(c_long),
intent(in),
value :: height
499 integer(c_int),
intent(in),
value :: columnmajorwidth
500 integer(c_int) :: err
504 use,
intrinsic :: iso_c_binding
506 type(c_ptr),
intent(in),
value :: encoder
507 type(c_ptr),
intent(in),
value :: name
508 integer(c_int),
intent(in),
value :: type
509 integer(c_int) :: err
514 use,
intrinsic :: iso_c_binding
516 type(c_ptr),
intent(in),
value :: encoder
517 integer(c_int),
intent(in),
value :: col
518 integer(c_int),
intent(in),
value :: element_size
519 integer(c_int) :: err
524 use,
intrinsic :: iso_c_binding
526 type(c_ptr),
intent(in),
value :: encoder
527 integer(c_int),
intent(in),
value :: col
528 integer(c_int),
intent(in),
value :: element_size
529 integer(c_int),
intent(in),
value :: stride
530 type(c_ptr),
intent(in),
value :: data
531 integer(c_int) :: err
536 use,
intrinsic :: iso_c_binding
538 type(c_ptr),
intent(in),
value :: encoder
539 integer(c_int),
intent(in),
value :: col
540 type(c_ptr),
intent(in),
value :: name
541 integer(c_int),
intent(in),
value :: nbits
542 integer(c_int) :: err
546 use,
intrinsic :: iso_c_binding
548 type(c_ptr),
intent(in),
value :: encoder
549 type(c_ptr),
intent(in),
value :: handle
550 type(c_funptr),
intent(in),
value :: stream_fn
551 integer(c_long),
intent(out) :: bytes_encoded
552 integer(c_int) :: err
568 type(c_ptr),
intent(in) :: cstr
569 character(:),
allocatable,
target :: fstr
570 character(c_char),
pointer :: tmp(:)
574 allocate(
character(length) :: fstr)
575 call c_f_pointer(cstr, tmp, [length])
576 fstr = transfer(tmp(1:length), fstr)
580 type(c_ptr),
intent(in),
value :: unused_context
581 integer(c_long),
intent(in),
value :: error
587 integer(c_long) :: context
595 character(:),
allocatable,
intent(out) :: version_str
596 type(c_ptr) :: tmp_str
603 character(:),
allocatable,
intent(out) :: git_sha1
604 type(c_ptr) :: tmp_str
611 integer(c_int),
intent(in) :: type
612 character(:),
allocatable,
intent(out) :: type_name
613 type(c_ptr) :: tmp_str
620 integer,
intent(in) :: err
621 character(:),
allocatable,
target :: error_string
629 character(*),
intent(in) :: path
631 character(:),
allocatable,
target :: nullified_path
632 nullified_path = trim(path) // c_null_char
640 reader%impl = c_null_ptr
660 class(
odc_frame),
intent(inout) :: new_frame
665 function frame_next(frame, aggregated, maximum_rows)
result(err)
667 logical,
intent(in),
optional :: aggregated
668 integer(c_long),
intent(in),
optional :: maximum_rows
671 integer(c_long) :: l_maximum_rows = -1
672 logical :: l_aggregated = .false.
674 if (
present(aggregated)) l_aggregated = aggregated
675 if (
present(maximum_rows))
then
676 l_maximum_rows = maximum_rows
677 if (.not.
present(aggregated)) l_aggregated = .true.
680 if (l_aggregated)
then
689 integer(c_long),
intent(out) :: nrows
696 integer(c_int),
intent(out) :: ncols
704 integer,
intent(in) :: col
707 character(:),
allocatable,
intent(out),
optional :: name
708 integer,
intent(out),
optional :: type
709 integer,
intent(out),
optional :: element_size
710 integer,
intent(out),
optional :: element_size_doubles
711 integer,
intent(out),
optional :: bitfield_count
713 type(c_ptr) :: name_tmp
714 integer(c_int) :: type_tmp
715 integer(c_int) :: element_size_tmp
716 integer(c_int) :: bitfield_count_tmp
719 element_size_tmp, bitfield_count_tmp)
723 if (
present(type))
type = type_tmp
724 if (
present(element_size)) element_size = element_size_tmp
725 if (
present(element_size_doubles)) element_size_doubles = element_size_tmp /
double_size
726 if (
present(bitfield_count)) bitfield_count = bitfield_count_tmp
734 integer,
intent(in) :: col
735 integer,
intent(in) :: field
738 character(:),
allocatable,
intent(out),
optional :: name
739 integer,
intent(out),
optional :: offset
740 integer,
intent(out),
optional :: size
742 type(c_ptr) :: name_tmp
743 integer(c_int) :: offset_tmp
744 integer(c_int) :: size_tmp
750 if (
present(offset)) offset = offset_tmp
751 if (
present(size))
size = size_tmp
760 logical,
intent(in),
optional :: column_major
762 logical(c_bool) :: l_column_major = .true.
763 if (
present(column_major)) l_column_major = column_major
785 integer(c_long),
intent(in) ::
count
792 integer(c_long),
intent(out) ::
count
799 real(
dp),
intent(inout),
target :: data(:,:)
800 logical,
intent(in),
optional :: column_major
801 integer(c_long) :: width, height
802 logical(c_bool) :: l_column_major = .true.
804 if (
present(column_major)) l_column_major = column_major
805 if (l_column_major)
then
807 height =
size(
data, 1)
810 height =
size(
data, 2)
817 real(
dp),
intent(inout),
pointer,
optional :: data(:,:)
818 logical,
intent(out),
optional :: column_major
822 integer(c_long) :: width, height
823 logical(c_bool) :: cmajor
828 if (
present(data))
then
830 call c_f_pointer(cdata,
data, [height, width /
double_size])
832 call c_f_pointer(cdata,
data, [width /
double_size, height])
835 if (
present(column_major)) column_major = cmajor
842 character(*),
intent(in) :: name
843 character(:),
allocatable,
target :: nullified_name
846 nullified_name = trim(name) // c_null_char
852 integer,
intent(out) ::
count
853 integer(c_int) :: count_tmp
862 integer,
intent(in) :: col
863 integer(c_int),
intent(in) :: element_size
872 integer,
intent(in) :: col
873 integer,
intent(in),
optional :: element_size
874 integer,
intent(in),
optional :: stride
875 type(c_ptr),
intent(in),
optional :: data
878 integer(c_int) :: l_element_size = 0
879 integer(c_int) :: l_stride = 0
880 type(c_ptr) :: l_data = c_null_ptr
881 if (
present(element_size)) l_element_size = element_size
882 if (
present(stride)) l_stride = stride
883 if (
present(data)) l_data =
data
891 integer,
intent(in) :: col
892 integer,
intent(out),
optional :: element_size
893 integer,
intent(out),
optional :: element_size_doubles
894 integer,
intent(out),
optional :: stride
895 type(c_ptr),
intent(out),
optional :: data
898 integer(c_int) :: l_element_size
899 integer(c_int) :: l_stride
900 type(c_ptr) :: l_data
905 if (
present(element_size)) element_size = l_element_size
906 if (
present(element_size_doubles)) element_size_doubles = l_element_size /
double_size
907 if (
present(stride)) stride = l_stride
908 if (
present(data))
data = l_data
915 integer(c_long),
intent(out) :: rows_decoded
916 integer,
intent(in),
optional :: nthreads
919 if (
present(nthreads))
then
922 err =
odc_decode(decoder%impl, frame%impl, rows_decoded)
942 integer(c_long),
intent(in) :: row_count
949 integer(c_long),
intent(in) :: rows_per_frame
956 real(
dp),
intent(in),
target :: data(:,:)
957 logical,
intent(in),
optional :: column_major
958 integer(c_long) :: width, height
959 integer(c_int) :: columnmajorwidth
961 logical(c_bool) :: l_column_major = .true.
963 if (
present(column_major)) l_column_major = column_major
964 if (l_column_major)
then
966 height =
size(
data, 1)
970 height =
size(
data, 2)
978 character(*),
intent(in) :: name
979 integer,
intent(in) :: type
981 character(:),
allocatable,
target :: nullified_name
982 nullified_name = trim(name) // c_null_char
989 integer,
intent(in) :: col
990 integer,
intent(in),
optional :: element_size
991 integer,
intent(in),
optional :: element_size_doubles
995 integer(c_int) :: l_element_size = 0
996 if (
present(element_size)) l_element_size = element_size
997 if (
present(element_size_doubles)) l_element_size = element_size_doubles *
double_size
1005 integer,
intent(in) :: col
1006 integer,
intent(in),
optional :: element_size
1007 integer,
intent(in),
optional :: element_size_doubles
1008 integer,
intent(in),
optional :: stride
1009 type(c_ptr),
intent(in),
optional :: data
1012 integer(c_int) :: l_element_size = 0
1013 integer(c_int) :: l_stride = 0
1014 type(c_ptr) :: l_data = c_null_ptr
1015 if (
present(element_size)) l_element_size = element_size
1016 if (
present(element_size_doubles)) l_element_size = element_size_doubles *
double_size
1017 if (
present(stride)) l_stride = stride
1018 if (
present(data)) l_data =
data
1026 integer,
intent(in) :: col
1027 character(*),
intent(in) :: name
1028 integer,
intent(in) :: nbits
1030 character(:),
allocatable,
target :: nullified_name
1031 nullified_name = trim(name) // c_null_char
1037 function write_fn(context, buffer, length)
result(written)
bind(c)
1038 type(c_ptr),
intent(in),
value :: context
1039 type(c_ptr),
intent(in),
value :: buffer
1040 integer(c_long),
intent(in),
value :: length
1041 integer(c_long) :: written
1042 integer,
pointer :: fortran_unit
1043 character(c_char),
pointer :: fortran_buffer(:)
1045 call c_f_pointer(context, fortran_unit)
1046 call c_f_pointer(buffer, fortran_buffer, [length])
1047 write(fortran_unit) fortran_buffer
1053 integer,
intent(in),
target :: outunit
1054 integer(c_long),
intent(out) :: bytes_written
static void count(void *counter, const double *data, size_t n)
int odc_vcs_version(const char **sha1)
int odc_column_type_name(int type, const char **type_name)
const char * odc_error_string(int err)
int odc_set_failure_handler(odc_failure_handler_t handler, void *context)
int odc_version(const char **version)
long(* write_fn)(void *handle, const void *buffer, long length)
integer function decoder_set_data_array(decoder, data, column_major)
integer function decoder_free(decoder)
integer function decoder_decode(decoder, frame, rows_decoded, nthreads)
integer(c_long), save failure_handler_context
integer(c_int), parameter, public odc_real
integer, parameter, public odc_error_unknown_exception
integer function encoder_set_data_array(encoder, data, column_major)
integer function frame_column_count(frame, ncols)
integer function encoder_initialise(encoder)
integer function frame_bitfield_attributes(frame, col, field, name, offset, size)
integer function frame_initialise(frame, reader)
integer function encoder_encode(encoder, outunit, bytes_written)
integer function decoder_column_count(decoder, count)
integer, parameter, public odc_iteration_complete
integer function reader_open_path(reader, path)
integer(c_int), parameter, public odc_string
integer(c_int), parameter, public odc_double
integer, parameter, public odc_error_general_exception
integer(c_int), parameter, public odc_bitfield
integer(c_int), parameter, public odc_ignore
integer function decoder_row_count(decoder, count)
integer function frame_copy(frame, new_frame)
integer function decoder_data_array(decoder, data, column_major)
integer function decoder_set_row_count(decoder, count)
integer function frame_row_count(frame, nrows)
subroutine failure_handler_wrapper(unused_context, error)
integer function decoder_defaults_from_frame(decoder, frame)
integer function frame_next(frame, aggregated, maximum_rows)
integer function decoder_column_set_data_array(decoder, col, element_size, stride, data)
integer, parameter double_size
integer(c_int), parameter, public odc_integer
integer function reader_close(reader)
integer function encoder_column_set_data_array(encoder, col, element_size, element_size_doubles, stride, data)
integer function encoder_column_set_data_size(encoder, col, element_size, element_size_doubles)
integer function encoder_set_row_count(encoder, row_count)
integer, parameter, public odc_success
integer function frame_free(frame)
integer function decoder_column_data_array(decoder, col, element_size, element_size_doubles, stride, data)
procedure(failure_handler_t), pointer, save failure_handler_fn
integer function encoder_free(encoder)
integer function encoder_add_column(encoder, name, type)
character(:) function, allocatable, target fortranise_cstr(cstr)
integer function frame_column_attributes(frame, col, name, type, element_size, element_size_doubles, bitfield_count)
integer function encoder_column_add_bitfield(encoder, col, name, nbits)
integer function decoder_column_set_data_size(decoder, col, element_size)
integer function encoder_set_rows_per_frame(encoder, rows_per_frame)
integer function decoder_add_column(decoder, name)
integer function decoder_initialise(decoder, column_major)