IODA Bundle
odc_c_binding.f90
Go to the documentation of this file.
1 ! (C) Copyright 1996-2012 ECMWF.
2 !
3 ! This software is licensed under the terms of the Apache Licence Version 2.0
4 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5 ! In applying this licence, ECMWF does not waive the privileges and immunities
6 ! granted to it by virtue of its status as an intergovernmental organisation nor
7 ! does it submit to any jurisdiction.
8 !
9 
10 !------------------------------------------------------------------------------
11 ! ECMWF
12 !------------------------------------------------------------------------------
13 !
14 ! MODULE: odc_c_binding
15 !
16 !> @author Anne Fouilloux, ECMWF
17 !
18 ! DESCRIPTION:
19 !> Provides Fortran bindings for ODB API
20 !
21 ! REVISION HISTORY:
22 ! DD Mmm YYYY - Initial Version
23 ! TODO_dd_mmm_yyyy - TODO_describe_appropriate_changes - TODO_name
24 !------------------------------------------------------------------------------
25 
27  use iso_c_binding
28  use, intrinsic :: iso_c_binding
29  implicit none
30  integer, parameter :: odb_ignore=0
31  integer, parameter :: odb_integer=1
32  integer, parameter :: odb_real=2
33  integer, parameter :: odb_string=3
34  integer, parameter :: odb_bitfield=4
35  integer, parameter :: odb_double=5
36 interface
37 
38 !> Initialize ODB API. This function must be called before any other function from the ODB API.
39  subroutine odb_start() bind(C, name = "odb_start")
40  end subroutine
41 
42 !> Counts number of rows in an ODB file.
43 !>
44 !> @param[in] filename name of the file
45 !> @return number of rows on file
46  function odb_count(filename) bind(C, name="odb_count")
47  use, intrinsic :: iso_c_binding
48  character(kind=C_CHAR),dimension(*) :: filename
49  real(kind=c_double) :: odb_count
50  end function odb_count
51 
52  function odb_select_new(config, err) bind(C, name = "odb_select_create")
53  use, intrinsic :: iso_c_binding
54  character(kind=C_CHAR),dimension(*) :: config
55  integer(kind=C_INT) :: err
56  type(c_ptr) :: odb_select_new
57  end function odb_select_new
58 
59  function odb_select_delete(odb) bind(C, name = "odb_select_destroy")
60  use, intrinsic :: iso_c_binding
61  type(c_ptr),VALUE :: odb
62  integer(kind=C_INT) :: odb_select_delete
63  end function odb_select_delete
64 
65  function odb_read_new(config, err) bind(C, name = "odb_read_create")
66  use, intrinsic :: iso_c_binding
67  character(kind=C_CHAR),dimension(*) :: config
68  integer(kind=C_INT) :: err
69  type(c_ptr) :: odb_read_new
70  end function odb_read_new
71 
72  function odb_read_delete(odb) bind(C, name = "odb_read_destroy")
73  use, intrinsic :: iso_c_binding
74  type(c_ptr),VALUE :: odb
75  integer(kind=C_INT) :: odb_read_delete
76  end function odb_read_delete
77 
78 !> Create new read iterator.
79  function odb_read_iterator_new(odb, filename, err) bind(C, name="odb_create_read_iterator")
80  use, intrinsic :: iso_c_binding
81  type(c_ptr), VALUE :: odb
82  character(kind=C_CHAR),dimension(*) :: filename
83  integer(kind=C_INT) :: err
84  type(c_ptr) :: odb_read_iterator_new
85  end function odb_read_iterator_new
86 
87  function odb_read_iterator_delete(odb_iterator) bind(C, name="odb_read_iterator_destroy")
88  use, intrinsic :: iso_c_binding
89  type(c_ptr), VALUE :: odb_iterator
90  integer(kind=C_INT) :: odb_read_iterator_delete
91  end function odb_read_iterator_delete
92 
93  function odb_read_get_no_of_columns(odb_iterator, ncols) bind(C, name="odb_read_iterator_get_no_of_columns")
94  use, intrinsic :: iso_c_binding
95  type(c_ptr),VALUE :: odb_iterator
96  integer(kind=C_INT) :: ncols
97  integer(kind=C_INT) :: odb_read_get_no_of_columns ! return an error code
98  end function odb_read_get_no_of_columns
99 
100  function odb_read_get_column_type(odb_iterator, n, type) bind(C, name="odb_read_iterator_get_column_type")
101  use, intrinsic :: iso_c_binding
102  type(c_ptr), VALUE :: odb_iterator
103  integer(kind=C_INT),VALUE :: n
104  integer(kind=C_INT) :: type
105  integer(kind=C_INT) :: odb_read_get_column_type
106  end function odb_read_get_column_type
107 
108  function odb_read_get_column_name(odb_iterator, n, colname, nchar) bind(C, name="odb_read_iterator_get_column_name")
109  use, intrinsic :: iso_c_binding
110  type(c_ptr), VALUE :: odb_iterator
111  integer(kind=C_INT), VALUE :: n
112  integer(kind=C_INT) :: nchar
113  type(c_ptr) :: colname
114  integer(kind=C_INT) :: odb_read_get_column_name
115  end function odb_read_get_column_name
116 
117  function odb_read_get_bitfield(odb_iterator, n, bitfield_names, bitfield_sizes, bitfield_names_size, bitfield_sizes_size) &
118  bind(C, name="odb_read_iterator_get_bitfield")
119  use, intrinsic :: iso_c_binding
120  type(c_ptr), VALUE :: odb_iterator
121  integer(kind=C_INT), VALUE :: n
122  type(c_ptr) :: bitfield_names
123  type(c_ptr) :: bitfield_sizes
124  integer(kind=C_INT) :: bitfield_names_size
125  integer(kind=C_INT) :: bitfield_sizes_size
126  integer(kind=C_INT) :: odb_read_get_bitfield
127  end function odb_read_get_bitfield
128 
129  function odb_read_get_next_row(odb_iterator, count, data, new_dataset) bind(C, name="odb_read_iterator_get_next_row")
130  use, intrinsic :: iso_c_binding
131  type(c_ptr), VALUE :: odb_iterator
132  integer(kind=C_INT), VALUE :: count
133  integer(kind=C_INT) :: new_dataset
134  real(kind=c_double),dimension(*) :: data
135  integer(kind=C_INT) :: odb_read_get_next_row
136  end function odb_read_get_next_row
137 
138 ! odb_read_iterator_get_missing_value(oda_read_iterator_ptr ri, int index, double* value)
139  function odb_read_get_missing_value(odb_iterator, n, v) &
140  bind(C, name="odb_read_iterator_get_missing_value")
141  use, intrinsic :: iso_c_binding
142  type(c_ptr), VALUE :: odb_iterator
143  integer(kind=C_INT),VALUE :: n
144  real(kind=c_double) :: v
145  integer(kind=C_INT) :: odb_read_get_missing_value
146  end function odb_read_get_missing_value
147 
148  function odb_read_get_row_buffer_size_doubles(odb_iterator, sz) &
149  result(cerr) &
150  bind(C, name="odb_read_iterator_get_row_buffer_size_doubles")
151  use, intrinsic :: iso_c_binding
152  type(c_ptr), value :: odb_iterator
153  integer(kind=c_int) :: sz
154  integer(kind=c_int) :: cerr
155  end function
156 
157  function odb_read_get_column_offset_internal(odb_iterator, n, offset) &
158  result(cerr) &
159  bind(C, name="odb_read_iterator_get_column_offset")
160  use, intrinsic :: iso_c_binding
161  type(c_ptr), value :: odb_iterator
162  integer(kind=c_int), value :: n
163  integer(kind=c_int) :: offset
164  integer(kind=c_int) :: cerr
165  end function
166 
167  function odb_read_get_column_size_doubles(odb_iterator, n, sz) &
168  result(cerr) &
169  bind(C, name="odb_read_iterator_get_column_size_doubles")
170  use, intrinsic :: iso_c_binding
171  type(c_ptr), value :: odb_iterator
172  integer(kind=c_int), value :: n
173  integer(kind=c_int) :: sz
174  integer(kind=c_int) :: cerr
175  end function
176 
177 
178 ! SELECT ITERATOR
179  function odb_select_iterator_new(odb, sql, err) bind(C, name="odb_create_select_iterator")
180  use, intrinsic :: iso_c_binding
181  type(c_ptr), VALUE :: odb
182  character(kind=C_CHAR),dimension(*) :: sql
183  integer(kind=C_INT) :: err
184  type(c_ptr) :: odb_select_iterator_new
185  end function odb_select_iterator_new
186 
187  function odb_select_iterator_new_from_file(odb, sql, filename, err) bind(C, name="odb_create_select_iterator_from_file")
188  use, intrinsic :: iso_c_binding
189  type(c_ptr), VALUE :: odb
190  character(kind=C_CHAR),dimension(*) :: sql, filename
191  integer(kind=C_INT) :: err
192  type(c_ptr) :: odb_select_iterator_new_from_file
194 
195  function odb_select_iterator_delete(odb_iterator) bind(C, name="odb_select_iterator_destroy")
196  use, intrinsic :: iso_c_binding
197  type(c_ptr), VALUE :: odb_iterator
198  integer(kind=C_INT) :: odb_select_iterator_delete
199  end function odb_select_iterator_delete
200 
201  function odb_select_get_no_of_columns(odb_iterator, ncols) bind(C, name="odb_select_iterator_get_no_of_columns")
202  use, intrinsic :: iso_c_binding
203  type(c_ptr),VALUE :: odb_iterator
204  integer(kind=C_INT) :: ncols
205  integer(kind=C_INT) :: odb_select_get_no_of_columns ! return an error code
206  end function odb_select_get_no_of_columns
207 
208  function odb_select_get_row_buffer_size_doubles(odb_iterator, sz) &
209  result(cerr) &
210  bind(C, name="odb_select_iterator_get_row_buffer_size_doubles")
211  use, intrinsic :: iso_c_binding
212  type(c_ptr), value :: odb_iterator
213  integer(kind=c_int) :: sz
214  integer(kind=c_int) :: cerr
215  end function
216 
217  function odb_select_get_column_offset_internal(odb_iterator, n, offset) &
218  result(cerr) &
219  bind(C, name="odb_select_iterator_get_column_offset")
220  use, intrinsic :: iso_c_binding
221  type(c_ptr), value :: odb_iterator
222  integer(kind=c_int), value :: n
223  integer(kind=c_int) :: offset
224  integer(kind=c_int) :: cerr
225  end function
226 
227  function odb_select_get_column_size_doubles(odb_iterator, n, sz) &
228  result(cerr) &
229  bind(C, name="odb_select_iterator_get_column_size_doubles")
230  use, intrinsic :: iso_c_binding
231  type(c_ptr), value :: odb_iterator
232  integer(kind=c_int), value :: n
233  integer(kind=c_int) :: sz
234  integer(kind=c_int) :: cerr
235  end function
236 
237  function odb_select_get_column_type(odb_iterator, n, type) bind(C, name="odb_select_iterator_get_column_type")
238  use, intrinsic :: iso_c_binding
239  type(c_ptr), VALUE :: odb_iterator
240  integer(kind=C_INT),VALUE :: n
241  integer(kind=C_INT) :: type
242  integer(kind=C_INT) :: odb_select_get_column_type
243  end function odb_select_get_column_type
244 
245  function odb_select_get_column_name(odb_iterator, n, colname, nchar) bind(C, name="odb_select_iterator_get_column_name")
246  use, intrinsic :: iso_c_binding
247  type(c_ptr), VALUE :: odb_iterator
248  integer(kind=C_INT), VALUE :: n
249  type(c_ptr) :: colname
250  integer(kind=C_INT) :: nchar
251  integer(kind=C_INT) :: odb_select_get_column_name
252  end function odb_select_get_column_name
253 
254  function odb_select_get_bitfield(odb_iterator, n, bitfield_names, bitfield_sizes, bitfield_names_size, bitfield_sizes_size) &
255  bind(C, name="odb_select_iterator_get_bitfield")
256  use, intrinsic :: iso_c_binding
257  type(c_ptr), VALUE :: odb_iterator
258  integer(kind=C_INT), VALUE :: n
259  type(c_ptr) :: bitfield_names
260  type(c_ptr) :: bitfield_sizes
261  integer(kind=C_INT) :: bitfield_names_size
262  integer(kind=C_INT) :: bitfield_sizes_size
263  integer(kind=C_INT) :: odb_select_get_bitfield
264  end function odb_select_get_bitfield
265 
266  function odb_select_get_next_row(odb_iterator, count, data, new_dataset) bind(C, name="odb_select_iterator_get_next_row")
267  use, intrinsic :: iso_c_binding
268  type(c_ptr), VALUE :: odb_iterator
269  integer(kind=C_INT), VALUE :: count
270  integer(kind=C_INT) :: new_dataset
271  real(kind=c_double),dimension(*) :: data
272  integer(kind=C_INT) :: odb_select_get_next_row
273  end function odb_select_get_next_row
274 
275 ! WRITE
276  function odb_write_new(config, err) bind(C, name = "odb_writer_create")
277  use, intrinsic :: iso_c_binding
278  character(kind=C_CHAR),dimension(*) :: config
279  integer(kind=C_INT) :: err
280  type(c_ptr) :: odb_write_new
281  end function odb_write_new
282 
283  function odb_write_delete(odb) bind(C, name = "odb_writer_destroy")
284  use, intrinsic :: iso_c_binding
285  type(c_ptr),VALUE :: odb
286  integer(kind=C_INT) :: odb_write_delete
287  end function odb_write_delete
288 
289 ! WRITE iterator
290  function odb_write_iterator_new(odb, filename, err) bind(C, name="odb_create_write_iterator")
291  use, intrinsic :: iso_c_binding
292  type(c_ptr), VALUE :: odb
293  character(kind=C_CHAR),dimension(*) :: filename
294  integer(kind=C_INT) :: err
295  type(c_ptr) :: odb_write_iterator_new
296  end function odb_write_iterator_new
297 
298  function odb_append_iterator_new(odb, filename, err) bind(C, name="odb_create_append_iterator")
299  use, intrinsic :: iso_c_binding
300  type(c_ptr), VALUE :: odb
301  character(kind=C_CHAR),dimension(*) :: filename
302  integer(kind=C_INT) :: err
303  type(c_ptr) :: odb_append_iterator_new
304  end function odb_append_iterator_new
305 
306  function odb_write_iterator_delete(odb_iterator) bind(C, name="odb_write_iterator_destroy")
307  use, intrinsic :: iso_c_binding
308  type(c_ptr), VALUE :: odb_iterator
309  integer(kind=C_INT) :: odb_write_iterator_delete
310  end function odb_write_iterator_delete
311 
312  function odb_write_set_no_of_columns(odb_iterator, ncols) bind(C, name="odb_write_iterator_set_no_of_columns")
313  use, intrinsic :: iso_c_binding
314  type(c_ptr),VALUE :: odb_iterator
315  integer(kind=C_INT), VALUE :: ncols
316  integer(kind=C_INT) :: odb_write_set_no_of_columns ! return an error code
317  end function odb_write_set_no_of_columns
318 
319  function odb_write_set_column(odb_iterator, n, type, colname) bind(C, name="odb_write_iterator_set_column")
320  use, intrinsic :: iso_c_binding
321  type(c_ptr), VALUE :: odb_iterator
322  integer(kind=C_INT),VALUE :: n
323  integer(kind=C_INT),VALUE :: type
324  character(kind=C_CHAR),dimension(*) :: colname
325  integer(kind=C_INT) :: odb_write_set_column
326  end function odb_write_set_column
327 
328  function odb_write_set_bitfield(odb_iterator, n, type, colname, bitfield_names, bitfield_sizes) &
329  bind(C, name="odb_write_iterator_set_bitfield")
330  use, intrinsic :: iso_c_binding
331  type(c_ptr), VALUE :: odb_iterator
332  integer(kind=C_INT),VALUE :: n
333  integer(kind=C_INT),VALUE :: type
334  character(kind=C_CHAR),dimension(*) :: colname
335  character(kind=C_CHAR),dimension(*) :: bitfield_names, bitfield_sizes
336  integer(kind=C_INT) :: odb_write_set_bitfield
337  end function odb_write_set_bitfield
338 
339  function odb_write_set_missing_value(odb_iterator, n, v) bind(C, name="odb_write_iterator_set_missing_value")
340  use, intrinsic :: iso_c_binding
341  type(c_ptr), VALUE :: odb_iterator
342  integer(kind=C_INT),VALUE :: n
343  real(kind=c_double),VALUE :: v
344  integer(kind=C_INT) :: odb_write_set_missing_value
345  end function odb_write_set_missing_value
346 
347  function odb_write_set_column_size_doubles(odb_iterator, n, sz) &
348  result(cerr) &
349  bind(C, name="odb_write_iterator_set_column_size_doubles")
350  use, intrinsic :: iso_c_binding
351  type(c_ptr), value :: odb_iterator
352  integer(kind=c_int), value :: n
353  integer(kind=c_int), value :: sz
354  integer(kind=c_int) :: cerr
355  end function
356 
357  function odb_write_get_row_buffer_size_doubles(odb_iterator, sz) &
358  result(cerr) &
359  bind(C, name="odb_write_iterator_get_row_buffer_size_doubles")
360  use, intrinsic :: iso_c_binding
361  type(c_ptr), value :: odb_iterator
362  integer(kind=c_int) :: sz
363  integer(kind=c_int) :: cerr
364  end function
365 
366  function odb_write_get_column_offset_internal(odb_iterator, n, offset) &
367  result(cerr) &
368  bind(C, name="odb_write_iterator_get_column_offset")
369  use, intrinsic :: iso_c_binding
370  type(c_ptr), value :: odb_iterator
371  integer(kind=c_int), value :: n
372  integer(kind=c_int) :: offset
373  integer(kind=c_int) :: cerr
374  end function
375 
376  function odb_write_set_next_row(odb_iterator, data, count) bind(C, name="odb_write_iterator_set_next_row")
377  use, intrinsic :: iso_c_binding
378  type(c_ptr), VALUE :: odb_iterator
379  integer(kind=C_INT), VALUE :: count
380  real(kind=c_double),dimension(*) :: data
381  integer(kind=C_INT) :: odb_write_set_next_row
382  end function odb_write_set_next_row
383 
384  function odb_write_header(odb_iterator) bind(C, name="odb_write_iterator_write_header")
385  use, intrinsic :: iso_c_binding
386  type(c_ptr), VALUE :: odb_iterator
387  integer(kind=C_INT) :: odb_write_header
388  end function odb_write_header
389 
390 end interface
391 
392 contains
393 
394  function odb_read_get_column_offset(odb_iterator, n, offset) result(cerr)
395  ! Map between C (0-index) and Fortran (1-index) offsets
396  use, intrinsic :: iso_c_binding
397  type(c_ptr), value :: odb_iterator
398  integer(kind=c_int), value :: n
399  integer(kind=c_int) :: offset
400  integer(kind=c_int) :: cerr
401  cerr = odb_read_get_column_offset_internal(odb_iterator, n, offset)
402  offset = offset + 1
403  end function
404 
405  function odb_select_get_column_offset(odb_iterator, n, offset) result(cerr)
406  ! Map between C (0-index) and Fortran (1-index) offsets
407  use, intrinsic :: iso_c_binding
408  type(c_ptr), value :: odb_iterator
409  integer(kind=c_int), value :: n
410  integer(kind=c_int) :: offset
411  integer(kind=c_int) :: cerr
412  cerr = odb_select_get_column_offset_internal(odb_iterator, n, offset)
413  offset = offset + 1
414  end function
415 
416  function odb_write_get_column_offset(odb_iterator, n, offset) result(cerr)
417  ! Map between C (0-index) and Fortran (1-index) offsets
418  use, intrinsic :: iso_c_binding
419  type(c_ptr), value :: odb_iterator
420  integer(kind=c_int), value :: n
421  integer(kind=c_int) :: offset
422  integer(kind=c_int) :: cerr
423  cerr = odb_write_get_column_offset_internal(odb_iterator, n, offset)
424  offset = offset + 1
425  end function
426 
427 end module odc_c_binding
static void count(void *counter, const double *data, size_t n)
Definition: UnitTests.cc:531
Counts number of rows in an ODB file.
Initialize ODB API. This function must be called before any other function from the ODB API.
Provides Fortran bindings for ODB API.
integer, parameter odb_ignore
integer, parameter odb_integer
integer, parameter odb_bitfield
integer, parameter odb_double
integer(kind=c_int) function odb_read_get_column_offset(odb_iterator, n, offset)
integer(kind=c_int) function odb_write_get_column_offset(odb_iterator, n, offset)
integer, parameter odb_real
integer, parameter odb_string
integer(kind=c_int) function odb_select_get_column_offset(odb_iterator, n, offset)