6 use,
intrinsic :: iso_fortran_env
9 integer(8),
parameter ::
col1_data(7) = [1, 2, 3, 4, 5, 6, 7]
10 integer(8),
parameter ::
col2_data(7) = [0, 0, 0, 0, 0, 0, 0]
11 integer(8),
parameter ::
col3_data(7) = [73, 73, 73, 73, 73, 73, 73]
12 real(8),
parameter ::
col4_data(7) = [1.432, 1.432, 1.432, 1.432, 1.432, 1.432, 1.432]
13 integer(8),
parameter ::
col5_data(7) = [-17, -7, -7, 999999, 1, 4, 4]
14 character(16),
parameter ::
col6_data(7) = [character(16) ::
"aoeu",
"aoeu",
"abcdefghijkl",
"None",
"boo",
"squiggle",
"a"]
15 character(8),
parameter ::
col7_data(7) = [character(8) ::
"abcd",
"abcd",
"abcd",
"abcd",
"abcd",
"abcd",
"abcd"]
16 real(8),
parameter ::
col8_data(7) = [2.345, 2.345, 2.345, 2.345, 2.345, 2.345, 2.345]
17 real(8),
parameter ::
col9_data(7) = [999.99, 888.88, 777.77, 666.66, 999999.0, 444.44, 333.33]
18 real(8),
parameter ::
col10_data(7) = [999.99, 888.88, 777.77, 666.66, 999999.0, 444.44, 333.33]
19 integer(8),
parameter ::
col11_data(7) = [1, 999999, 3, 4, 5, 999999, 8]
20 integer(8),
parameter ::
col12_data(7) = [-512, 999999, 3, 7623, -22000, 999999, 7]
21 integer(8),
parameter ::
col13_data(7) = [-1234567, 8765432, 999999, 22, 2222222, -81222323, 999999]
22 integer(8),
parameter ::
col14_data(7) = [999999, 999999, 999999, 999999, 999999, 999999, 999999]
31 integer,
intent(in) :: err
32 character(*),
intent(in) :: msg
33 logical,
intent(inout) :: success
36 write(error_unit, *)
'Failed API call: ', msg
43 real(8),
intent(in) :: data(:, :)
45 character(16) :: str16
47 logical,
intent(inout) :: success
49 if (
size(
data, 1) /= 7 .or.
size(
data, 2) /= 15)
then
50 write(error_unit, *)
'did not get data shape [7, 15]'
55 write(error_unit, *)
'Col 1 differs: ',
col1_data,
' vs ',
data(:, 1)
60 write(error_unit, *)
'Col 2 differs: ',
col2_data,
' vs ',
data(:, 2)
65 write(error_unit, *)
'Col 3 differs: ',
col3_data,
' vs ',
data(:, 3)
69 if (any(abs(
col4_data -
data(:, 4)) > 1.0e-10))
then
70 write(error_unit, *)
'Col 4 differs: ',
col4_data,
' vs ',
data(:, 4)
75 write(error_unit, *)
'Col 5 differs: ',
col5_data,
' vs ',
data(:, 5)
80 if (trim(
col6_data(row)) /= trim(transfer(
data(row, 6:7), str16)))
then
81 write(error_unit, *)
'Col 6 differs: ', trim(
col6_data(row)),
' vs ', &
82 transfer(
data(row, 6:7), str16)
86 if (trim(
col7_data(row)) /= trim(transfer(
data(row, 8), str8)))
then
87 write(error_unit, *)
'Col 7 differs: ', trim(
col6_data(row)),
' vs ', &
88 transfer(
data(row, 8), str8)
93 if (any(abs(
col8_data -
data(:, 9)) > 1.0e-10))
then
94 write(error_unit, *)
'Col 8 differs: ',
col8_data,
' vs ',
data(:, 9)
98 if (any(abs(
col9_data -
data(:, 10)) > 1.0e-10))
then
99 write(error_unit, *)
'Col 9 differs: ',
col9_data,
' vs ',
data(:, 10)
103 if (any(abs(
col10_data -
data(:, 11)) > 1.0e-10))
then
104 write(error_unit, *)
'Col 10 differs: ',
col10_data,
' vs ',
data(:, 11)
109 write(error_unit, *)
'Col 11 differs: ',
col11_data,
' vs ',
data(:, 12)
114 write(error_unit, *)
'Col 12 differs: ',
col12_data,
' vs ',
data(:, 13)
119 write(error_unit, *)
'Col 13 differs: ',
col13_data,
' vs ',
data(:, 14)
124 write(error_unit, *)
'Col 14 differs: ',
col14_data,
' vs ',
data(:, 15)
130 real(8) :: data(7, 15)
139 data(row, 6:7) = transfer(
col6_data(row), 1.0_8, 2)
140 data(row, 8) = transfer(
col7_data(row), 1.0_8)
153 logical,
intent(inout) :: success
155 call check_call(encoder%initialise(),
"initialise encoder", success)
172 call check_call(encoder%column_set_data_size(6, element_size_doubles=2),
"column attrs", success)
174 call check_call(encoder%column_add_bitfield(11,
"bf1", 3),
"add bitfield 1", success)
175 call check_call(encoder%column_add_bitfield(11,
"bf2", 2),
"add bitfield 2", success)
176 call check_call(encoder%column_add_bitfield(11,
"bf3", 1),
"add bitfield 3", success)
181 real(8) :: data(7, 15)
182 integer :: outunit, iter
183 integer(8) :: bytes_written
185 character(*),
parameter :: test_filename =
'f90_test_encode_column.odb'
197 open(newunit=outunit, file=test_filename, access=
'stream', form=
'unformatted')
200 call check_call(encoder%set_data(data),
"set encoder data", success)
201 call check_call(encoder%encode(outunit, bytes_written),
"do encode", success)
205 call check_call(encoder%free(),
"free encoder", success)
213 real(8) :: data(15, 7)
214 integer :: row, outunit, iter
215 integer(8) :: bytes_written
217 character(*),
parameter :: test_filename =
'f90_test_encode_row.odb'
229 open(newunit=outunit, file=test_filename, access=
'stream', form=
'unformatted')
232 call check_call(encoder%set_data(
data, column_major=.false.),
"set encoder data", success)
233 call check_call(encoder%encode(outunit, bytes_written),
"do encode", success)
237 call check_call(encoder%free(),
"free encoder", success)
245 integer,
intent(in) :: col, type
246 character(*),
intent(in) :: name
247 logical,
intent(inout) :: success
249 character(:),
allocatable :: column_name, nm
250 integer :: ncols, column_type, element_size, element_size_doubles, bitfield_count
251 integer :: sz, off, i
252 integer :: expected_count, expected_sz
254 character(3) :: expected_bf_names(3) = [
'bf1',
'bf2',
'bf3']
255 integer :: expected_bf_sizes(3) = [3, 2, 1]
256 integer :: expected_bf_offsets(3) = [0, 3, 5]
258 call check_call(frame%column_count(ncols),
"column count", success)
259 if (ncols /= 14)
then
260 write(error_unit, *)
'Unexpected column count. got ', ncols,
', expected 14'
264 call check_call(frame%column_attributes(col, &
267 element_size=element_size, &
268 element_size_doubles=element_size_doubles, &
269 bitfield_count=bitfield_count),
"column attrs", success)
271 if (column_name /= name)
then
272 write(error_unit,
'(a,i2,4a)')
'Unexpected column name for column ', col, &
273 '. Got ', column_name,
', expected ', name
277 if (column_type /= type)
then
278 write(error_unit,
'(3(a,i2))')
'Unexpected column type for column ', col, &
279 '. Got ', column_name,
', expected ', name
289 if (element_size_doubles /= expected_sz)
then
290 write(error_unit,
'(3(a,i2))')
'Unexpected column element size for column ', col, &
291 '. Got ', element_size_doubles,
', expected ', expected_sz
295 if (element_size /= 8*expected_sz)
then
296 write(error_unit,
'(3(a,i2))')
'Unexpected column element size for column ', col, &
297 '. Got ', element_size,
', expected ', 8*expected_sz
307 if (bitfield_count /= expected_count)
then
308 write(error_unit,
'(3(a,i2))')
'Unexpected column bitfield_count for column ', col, &
309 '. Got ', bitfield_count,
', expected ', expected_count
315 call check_call(frame%bitfield_attributes(11, i, name=nm, offset=off, size=sz),
'bitfield attrs', success)
317 if (sz /= expected_bf_sizes(i))
then
318 write(error_unit,
'(3(a,i2))')
'Unexpected bitfield size for field ', i, &
319 '. Got ', sz,
', expected ', expected_bf_sizes(i)
323 if (off /= expected_bf_offsets(i))
then
324 write(error_unit,
'(3(a,i2))')
'Unexpected bitfield offset for field ', i, &
325 '. Got ', off,
', expected ', expected_bf_offsets(i)
329 if (nm /= expected_bf_names(i))
then
330 write(error_unit,
'(a,i2,4a)')
'Unexpected bitfield name for field ', i, &
331 '. Got ', nm,
', expected ', expected_bf_names(i)
341 character(*),
intent(in) :: path
342 logical,
intent(inout) :: success
347 real(8),
pointer :: data(:,:)
348 logical :: column_major
352 call check_call(reader%open_path(path),
"open " // path, success)
353 call check_call(frame%initialise(reader),
"initialise frame", success)
359 call check_call(frame%next(),
"get first frame", success)
378 call check_call(decoder%initialise(),
"initialise decoder", success)
379 call check_call(decoder%defaults_from_frame(frame),
"defaults from frame", success)
380 call check_call(decoder%decode(frame, nrows),
"decode", success)
381 call check_call(decoder%data(
data, column_major),
"get data", success)
383 if (.not. column_major)
then
384 write(error_unit, *)
'expected column major'
389 call check_call(decoder%free(),
"free decoder", success)
397 write(error_unit, *)
'expected iteration complete'
403 call check_call(frame%free(),
"free frame", success)
404 call check_call(reader%close(),
"free frame", success)
438 if (.not. success) stop -1
int odc_set_missing_integer(long missing_integer)
const char * odc_error_string(int err)
int odc_set_missing_double(double missing_double)
subroutine check_call(err, msg, success)
real(8), dimension(7), parameter col4_data
subroutine initialise_encoder(encoder, success)
character(8), dimension(7), parameter col7_data
real(8) function, dimension(7, 15) construct_data_column_major()
integer(8), dimension(7), parameter col11_data
subroutine check_encoded_odb(path, success)
subroutine check_decoded_column_major(data, success)
integer(8), dimension(7), parameter col3_data
integer(8), dimension(7), parameter col12_data
logical function test_encode_row_major()
subroutine check_frame_column(frame, col, name, type, success)
real(8), dimension(7), parameter col10_data
integer(8), dimension(7), parameter col14_data
real(8), dimension(7), parameter col9_data
integer(8), dimension(7), parameter col2_data
real(8), dimension(7), parameter col8_data
integer(8), dimension(7), parameter col5_data
character(16), dimension(7), parameter col6_data
integer(8), dimension(7), parameter col1_data
logical function test_encode_column_major()
integer(8), dimension(7), parameter col13_data
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_double
integer(c_int), parameter, public odc_bitfield
integer(c_int), parameter, public odc_integer
integer, parameter, public odc_success