6 use,
intrinsic :: iso_fortran_env
12 integer,
intent(in) :: err
13 character(*),
intent(in) :: msg
14 logical,
intent(inout) :: success
17 write(error_unit, *)
'Failed API call: ', msg
30 integer(8) :: frame_count, row_count, tmp_8
35 call check_call(reader%open_path(
"../2000010106.odb"),
"open ODB", success)
36 call check_call(frame%initialise(reader),
"initialise frame", success)
44 call check_call(frame%row_count(tmp_8),
"row count", success)
46 frame_count = frame_count + 1
47 row_count = row_count + tmp_8
49 call check_call(frame%column_count(tmp_4),
"column count", success)
51 write(error_unit, *)
'Unexpected column count: ', tmp_4,
' /= 51'
60 if (frame_count /= 333)
then
61 write(error_unit, *)
'Unexpected frame count: ', frame_count,
' /= 333'
65 if (row_count /= 3321753)
then
66 write(error_unit, *)
'Unexpected row count: ', row_count,
' /= 3321753'
70 call check_call(reader%close(),
"close reader", success)
78 character(:),
allocatable :: column_name, field_name
79 integer :: ncols, col, column_type, field, field_size, expected_offset, field_offset
80 integer :: element_size, element_size_doubles, bitfield_count
83 character(23),
parameter :: example_column_names(*) = [ character(23) :: &
84 "expver@desc",
"andate@desc",
"antime@desc",
"seqno@hdr",
"obstype@hdr", &
85 "obschar@hdr",
"subtype@hdr",
"date@hdr",
"time@hdr",
"rdbflag@hdr", &
86 "status@hdr",
"event1@hdr",
"blacklist@hdr",
"sortbox@hdr",
"sitedep@hdr", &
87 "statid@hdr",
"ident@hdr",
"lat@hdr",
"lon@hdr",
"stalt@hdr", &
88 "modoro@hdr",
"trlat@hdr",
"trlon@hdr",
"instspec@hdr",
"event2@hdr", &
89 "anemoht@hdr",
"baroht@hdr",
"sensor@hdr",
"numlev@hdr",
"varno_presence@hdr", &
90 "varno@body",
"vertco_type@body",
"rdbflag@body",
"anflag@body",
"status@body", &
91 "event1@body",
"blacklist@body",
"entryno@body",
"press@body",
"press_rl@body", &
92 "obsvalue@body",
"aux1@body",
"event2@body",
"ppcode@body",
"level@body", &
93 "biascorr@body",
"final_obs_error@errstat",
"obs_error@errstat",
"repres_error@errstat", &
94 "pers_error@errstat",
"fg_error@errstat"]
96 integer,
parameter :: example_column_types(*) = [ &
108 character(14),
parameter :: column_10_bitfield_names(*) = [ character(14) :: &
109 "lat_humon",
"lat_qcsub",
"lat_override",
"lat_flag",
"lat_hqc_flag",
"lon_humon",
"lon_qcsub", &
110 "lon_override",
"lon_flag",
"lon_hqc_flag",
"date_humon",
"date_qcsub",
"date_override", &
111 "date_flag",
"date_hqc_flag",
"time_humon",
"time_qcsub",
"time_override",
"time_flag", &
112 "time_hqc_flag",
"stalt_humon",
"stalt_qcsub",
"stalt_override",
"stalt_flag",
"stalt_hqc_flag" &
115 integer,
parameter :: column_10_bitfield_sizes(*) = [ &
116 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1]
119 call check_call(reader%open_path(
"../2000010106.odb"),
"open reader", success)
120 call check_call(frame%initialise(reader),
"initialise frame", success)
122 call check_call(frame%next(),
"get the first frame", success)
124 call check_call(frame%column_count(ncols),
"column count", success)
125 if (ncols /= 51)
then
126 write(error_unit, *)
'Expected 51 columns'
133 call check_call(frame%column_attributes(col, &
136 element_size=element_size, &
137 element_size_doubles=element_size_doubles, &
138 bitfield_count=bitfield_count),
"column attrs", success)
140 if (column_name /= trim(example_column_names(col)))
then
141 write(error_unit,
'(3a,i2,3a)')
'Unexpected column name ', column_name, &
142 ' for column ', col,
' (expected ', trim(example_column_names(col)),
')'
146 if (column_type /= example_column_types(col))
then
147 write(error_unit,
'(a,i1,a,i2,a,i1,a)')
'Unexpected column type ', column_type, &
148 ' for column ', col,
' (expected ', example_column_types(col),
')'
152 if (element_size /= 8)
then
153 write(error_unit,
'(a,i1,a,i2,a)')
'Unexpected column data size ', element_size, &
154 ' for column ', col,
' (expected 8)'
158 if (element_size_doubles /= 1)
then
159 write(error_unit,
'(a,i1,a,i2,a)')
'Unexpected column doubles data size ', &
160 element_size_doubles,
' for column ', col,
' (expected 1)'
165 if (bitfield_count <= 0)
then
166 write(error_unit, *)
"Bitfields expected for bitfield column"
170 if (bitfield_count /= 0)
then
171 write(error_unit, *)
"Unexpected bitfields for non-bitfield column"
180 call check_call(frame%column_attributes(10, bitfield_count=bitfield_count),
"bitfield count", success)
181 if (bitfield_count /= 25)
then
182 write(error_unit, *)
"Expected 25 bitfield fields for column 10. Got ", bitfield_count
190 call check_call(frame%bitfield_attributes(10, field, &
192 offset=field_offset, &
193 size=field_size),
"bitfield attrs", success)
195 if (field_name /= trim(column_10_bitfield_names(field)))
then
196 write(error_unit,
'(3a,i2,3a)')
'Unexpected field name ', field_name,
' for field ', &
197 field,
' (expected ', trim(column_10_bitfield_names(field)),
')'
201 if (field_size /= column_10_bitfield_sizes(field))
then
202 write(error_unit,
'(a,i2,a,i2,a,i2,a)')
'Unexpected field size ', field_size, &
203 ' for field ', field,
' (expected ', column_10_bitfield_sizes(field),
')'
207 if (field_offset /= expected_offset)
then
208 write(error_unit,
'(a,i2,a,i2,a,i2,a)')
'Unexpected field offset ', field_offset, &
209 ' for field ', field,
' (expected ', expected_offset,
')'
213 expected_offset = expected_offset + field_size
216 call check_call(frame%free(),
"free frame", success)
217 call check_call(reader%close(),
"close reader", success)
222 real(8) :: array_data(:,:)
226 integer,
parameter :: expected_seqno(*) = [6106691, 6002945, 6003233, 6105819]
227 integer,
parameter :: expected_obschar(*) = [537918674, 135265490, 135265490, 537918674]
228 integer(8) :: missing_integer
229 real(8) :: missing_double
237 row = 1 + ((i-1) * 765)
240 if (trim(transfer(array_data(row, 1),
" ")) /=
"0018")
then
241 write(error_unit, *)
'unexpected expver in row ', row,
' (expected 0018, got ', &
242 transfer(array_data(row, 1),
" ") ,
')'
247 if (int(array_data(row, 4)) /= expected_seqno(i))
then
248 write(error_unit, *)
'Unexpected seqno value. row=', row,
", expected=", &
249 expected_seqno(i),
", got=", int(array_data(row, 4))
254 if (int(array_data(row, 6)) /= expected_obschar(i))
then
255 write(error_unit, *)
'Unexpected obschar value. row=', row,
", expected=", &
256 expected_obschar(i),
", got=", int(array_data(row, 6))
261 if (int(array_data(row, 14)) /= missing_integer)
then
262 write(error_unit, *)
'Expected value with set missing value. Got ', int(array_data(row, 14)),
', &
263 &expected ', missing_integer
268 if (array_data(row, 49) /= missing_double)
then
269 write(error_unit, *)
'Expected value with set missing value. Got ', array_data(row, 49),
', &
270 &expected ', missing_double
282 integer(8) :: nrows, nrows2
284 logical :: success, column_major
285 real(8),
pointer :: array_data(:,:)
288 call check_call(reader%open_path(
"../2000010106.odb"),
"open reader", success)
289 call check_call(frame%initialise(reader),
"initialise frame", success)
292 call check_call(frame%next(),
"get first frame", success)
293 call check_call(frame%next(),
"get second frame", success)
295 call check_call(decoder%initialise(),
"initialise decoder", success)
296 call check_call(decoder%defaults_from_frame(frame),
"decoder from frame", success)
297 call check_call(decoder%decode(frame, nrows),
"do decode", success)
299 if (nrows /= 10000)
then
300 write(error_unit, *)
'Unexpected number of rows decoded'
304 call check_call(decoder%row_count(nrows2),
"decoder row count", success)
305 if (nrows2 /= 10000)
then
306 write(error_unit, *)
'Got row count ', nrows,
' not 10000'
310 call check_call(decoder%column_count(ncols),
"decoder column count", success)
311 if (ncols /= 51)
then
312 write(error_unit, *)
'Got column count ', ncols,
' not 51'
316 call check_call(decoder%data(array_data, column_major),
"get decoded data", success)
318 if (any(shape(array_data) /= [10000, 51]))
then
319 write(error_unit, *)
'Unexpected data dimensions'
323 if (.not. column_major)
then
324 write(error_unit, *)
'Expected column major by default'
330 call check_call(decoder%free(),
"free decoder", success)
331 call check_call(reader%close(),
"free reader", success)
337 use,
intrinsic :: iso_c_binding
342 integer(8) :: rows_decoded, nrows
345 real(8),
target :: array_data(11000, 51)
348 call check_call(reader%open_path(
"../2000010106.odb"),
"open reader", success)
349 call check_call(frame%initialise(reader),
"initialise frame", success)
351 call check_call(frame%next(),
"get first frame", success)
353 call check_call(decoder%initialise(),
"initialise decoder", success)
354 call check_call(decoder%defaults_from_frame(frame),
"decoder frame defaults", success)
355 call check_call(decoder%set_data(array_data),
"set array data", success)
356 call check_call(decoder%decode(frame, rows_decoded),
"decode first frame", success)
358 if (rows_decoded /= 10000)
then
359 write(error_unit, *)
'Unexpected number of rows decoded'
363 call check_call(frame%next(),
"get second frame", success)
365 call check_call(decoder%decode(frame, rows_decoded),
"decode second frame", success)
367 if (rows_decoded /= 10000)
then
368 write(error_unit, *)
'Unexpected number of rows decoded'
372 call check_call(decoder%row_count(nrows),
"decoder row count", success)
373 if (nrows /= 11000)
then
374 write(error_unit, *)
'Got row count ', nrows,
' not 11000'
375 write(error_unit, *)
'Row count should be related to the size of the decode target, not the decode data'
379 call check_call(decoder%column_count(ncols),
"decoder column count", success)
380 if (ncols /= 51)
then
381 write(error_unit, *)
'Got column count ', ncols,
' not 51'
387 call check_call(decoder%free(),
"free decoder", success)
388 call check_call(reader%close(),
"close reader", success)
397 integer(8) :: rows_decoded, nrows
400 real(8),
pointer :: array_data(:,:)
403 call check_call(reader%open_path(
"../2000010106.odb"),
"open reader", success)
404 call check_call(frame%initialise(reader),
"initialise frame", success)
406 call check_call(frame%next(maximum_rows=99999_8),
"get first (aggregate) frame", success)
408 call check_call(decoder%initialise(),
"initialise decoder", success)
409 call check_call(decoder%defaults_from_frame(frame),
"decoder frame defaults", success)
410 call check_call(decoder%decode(frame, rows_decoded, nthreads=4),
"decode threaded", success)
412 if (rows_decoded /= 90000)
then
413 write(error_unit, *)
'Unexpected number of rows decoded'
417 call check_call(decoder%row_count(nrows),
"decoder row count", success)
418 if (nrows /= 90000)
then
419 write(error_unit, *)
'Got row count ', nrows,
' not 90000'
423 call check_call(decoder%column_count(ncols),
"decoder column count", success)
424 if (ncols /= 51)
then
425 write(error_unit, *)
'Got column count ', ncols,
' not 51'
429 call check_call(decoder%data(array_data),
"get array data", success)
431 if (any(shape(array_data) /= [90000, 51]))
then
432 write(error_unit, *)
'Unexpected data dimensions'
436 call check_call(decoder%free(),
"free decoder", success)
437 call check_call(reader%close(),
"close reader", success)
460 if (.not. success) stop -1
const char * odc_error_string(int err)
logical function test_column_details()
logical function test_decode_aggregate()
logical function check_frame_2_values(array_data)
logical function test_count_lines()
logical function test_decode_columns_allocate()
logical function test_decode_array_reuse()
integer(c_int), parameter, public odc_real
integer, parameter, public odc_iteration_complete
integer(c_int), parameter, public odc_string
integer(c_int), parameter, public odc_bitfield
integer(c_int), parameter, public odc_integer
integer, parameter, public odc_success
subroutine check_call(err, desc)