18 h5aclose_f, h5acreate_f, h5aopen_f, h5aread_f, h5awrite_f, h5close_f, h5dclose_f, &
19 h5dcreate_f, h5dget_space_f, h5dopen_f, h5dread_f, h5dwrite_f, h5f_acc_rdonly_f, &
20 h5f_acc_trunc_f, h5fclose_f, h5fcreate_f, h5fopen_f, h5gclose_f, h5gcreate_f, h5gopen_f, &
21 h5open_f, h5s_scalar_f, h5sclose_f, h5screate_f, h5screate_simple_f, &
22 h5sget_simple_extent_npoints_f, h5t_c_s1, h5t_cset_utf8_f, h5t_enum_f, h5t_native_double, &
23 h5t_native_integer, h5t_str_nullpad_f, h5t_string, h5tclose_f, h5tcopy_f, h5tcreate_f, &
24 h5tenum_insert_f, h5tset_cset_f, h5tset_size_f, h5tset_strpad_f, hid_t, hsize_t, size_t
26 USE iso_c_binding,
ONLY: c_loc, &
29#include "./base/base_uses.f90"
33 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'hdf5_wrapper'
35 INTEGER,
PARAMETER,
PUBLIC :: hdf5_id = hid_t
48 IF (error < 0) cpabort(
'ERROR: failed to initialize HDF5 interface')
59 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 interface')
61 END SUBROUTINE h5close
68 SUBROUTINE h5fcreate(filename, file_id)
69 CHARACTER(LEN=*),
INTENT(IN) :: filename
70 INTEGER(KIND=hid_t),
INTENT(OUT) :: file_id
74 CALL h5fcreate_f(filename, h5f_acc_trunc_f, file_id, error)
75 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 file')
77 END SUBROUTINE h5fcreate
84 SUBROUTINE h5fopen(filename, file_id)
85 CHARACTER(LEN=*),
INTENT(IN) :: filename
86 INTEGER(KIND=hid_t),
INTENT(OUT) :: file_id
90 CALL h5fopen_f(trim(filename), h5f_acc_rdonly_f, file_id, error)
91 IF (error < 0) cpabort(
'ERROR: failed to open HDF5 file')
93 END SUBROUTINE h5fopen
99 SUBROUTINE h5fclose(file_id)
100 INTEGER(KIND=hid_t),
INTENT(IN) :: file_id
104 CALL h5fclose_f(file_id, error)
105 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 file')
107 END SUBROUTINE h5fclose
115 SUBROUTINE h5gcreate(loc_id, name, grp_id)
116 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
117 CHARACTER(LEN=*),
INTENT(IN) :: name
118 INTEGER(KIND=hid_t),
INTENT(OUT) :: grp_id
122 CALL h5gcreate_f(loc_id, name, grp_id, error)
123 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 group')
125 END SUBROUTINE h5gcreate
133 SUBROUTINE h5gopen(loc_id, name, grp_id)
134 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
135 CHARACTER(LEN=*),
INTENT(IN) :: name
136 INTEGER(KIND=hid_t),
INTENT(OUT) :: grp_id
140 CALL h5gopen_f(loc_id, name, grp_id, error)
141 IF (error < 0) cpabort(
'ERROR: failed to open HDF5 group')
143 END SUBROUTINE h5gopen
149 SUBROUTINE h5gclose(grp_id)
150 INTEGER(KIND=hid_t),
INTENT(IN) :: grp_id
154 CALL h5gclose_f(grp_id, error)
155 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 group')
157 END SUBROUTINE h5gclose
165 SUBROUTINE h5awrite_varlen_string(loc_id, attr_name, attr_data)
166 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
167 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
168 CHARACTER(LEN=*),
INTENT(IN),
TARGET :: attr_data
170 INTEGER :: error, output_unit
171 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
172 TYPE(c_ptr) :: buffer
173 TYPE(c_ptr),
TARGET :: in_between_ptr
176 CALL h5screate_f(h5s_scalar_f, space_id, error)
178 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
179 ' ERROR: failed to create HDF5 dataspace'
184 CALL h5tcopy_f(h5t_string, type_id, error)
185 CALL h5tset_cset_f(type_id, h5t_cset_utf8_f, error)
186 CALL h5tset_strpad_f(type_id, h5t_str_nullpad_f, error)
189 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
191 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
192 ' ERROR: failed to create HDF5 attribute'
198 in_between_ptr = c_loc(attr_data)
200 buffer = c_loc(in_between_ptr)
203 CALL h5awrite_f(attr_id, type_id, buffer, error)
205 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
206 ' ERROR: failed to write HDF5 attribute'
211 CALL h5aclose_f(attr_id, error)
213 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
214 ' ERROR: failed to close HDF5 attribute'
219 CALL h5sclose_f(space_id, error)
221 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
222 ' ERROR: failed to close HDF5 dataspace'
227 CALL h5tclose_f(type_id, error)
229 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
230 ' ERROR: failed to close HDF5 datatype'
234 END SUBROUTINE h5awrite_varlen_string
242 SUBROUTINE h5awrite_fixlen_string(loc_id, attr_name, attr_data)
243 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
244 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
245 CHARACTER(LEN=*),
INTENT(IN),
TARGET :: attr_data
247 INTEGER :: error, output_unit
248 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
249 TYPE(c_ptr) :: buffer
252 CALL h5screate_f(h5s_scalar_f, space_id, error)
254 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
255 ' ERROR: failed to create HDF5 dataspace'
260 CALL h5tcopy_f(h5t_c_s1, type_id, error)
261 CALL h5tset_cset_f(type_id, h5t_cset_utf8_f, error)
262 CALL h5tset_size_f(type_id, len(attr_data, size_t), error)
265 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
267 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
268 ' ERROR: failed to create HDF5 attribute'
273 buffer = c_loc(attr_data)
276 CALL h5awrite_f(attr_id, type_id, buffer, error)
278 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
279 ' ERROR: failed to write HDF5 attribute'
284 CALL h5aclose_f(attr_id, error)
286 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
287 ' ERROR: failed to close HDF5 attribute'
292 CALL h5sclose_f(space_id, error)
294 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
295 ' ERROR: failed to close HDF5 dataspace'
300 CALL h5tclose_f(type_id, error)
302 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
303 ' ERROR: failed to close HDF5 datatype'
307 END SUBROUTINE h5awrite_fixlen_string
315 SUBROUTINE h5awrite_boolean(loc_id, attr_name, attr_data)
316 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
317 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
318 LOGICAL,
INTENT(IN) :: attr_data
320 INTEGER :: error, output_unit
321 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
322 INTEGER(KIND=size_t) :: enum_size = 1
323 INTEGER,
TARGET :: attr_data_to_int
324 TYPE(c_ptr) :: buffer
329 CALL h5screate_f(h5s_scalar_f, space_id, error)
331 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
332 ' ERROR: failed to create HDF5 dataspace'
337 CALL h5tcreate_f(h5t_enum_f, enum_size, type_id, error)
338 CALL h5tenum_insert_f(type_id,
"FALSE", 0, error)
339 CALL h5tenum_insert_f(type_id,
"TRUE", 1, error)
347 buffer = c_loc(attr_data_to_int)
350 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
352 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
353 ' ERROR: failed to create HDF5 attribute'
358 CALL h5awrite_f(attr_id, type_id, buffer, error)
360 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
361 ' ERROR: failed to write HDF5 attribute'
366 CALL h5aclose_f(attr_id, error)
368 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
369 ' ERROR: failed to close HDF5 attribute'
374 CALL h5sclose_f(space_id, error)
376 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
377 ' ERROR: failed to close HDF5 dataspace'
382 CALL h5tclose_f(type_id, error)
384 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
385 ' ERROR: failed to close HDF5 datatype'
389 END SUBROUTINE h5awrite_boolean
397 SUBROUTINE h5awrite_integer_scalar(loc_id, attr_name, attr_data)
398 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
399 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
400 INTEGER,
INTENT(IN),
TARGET :: attr_data
402 INTEGER :: error, output_unit
403 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
404 TYPE(c_ptr) :: buffer
407 CALL h5screate_f(h5s_scalar_f, space_id, error)
409 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
410 ' ERROR: failed to create HDF5 dataspace'
415 buffer = c_loc(attr_data)
418 type_id = h5t_native_integer
421 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
423 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
424 ' ERROR: failed to create HDF5 attribute'
429 CALL h5awrite_f(attr_id, type_id, buffer, error)
431 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
432 ' ERROR: failed to write HDF5 attribute'
437 CALL h5aclose_f(attr_id, error)
439 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
440 ' ERROR: failed to close HDF5 attribute'
445 CALL h5sclose_f(space_id, error)
447 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
448 ' ERROR: failed to close HDF5 dataspace'
452 END SUBROUTINE h5awrite_integer_scalar
460 SUBROUTINE h5awrite_double_scalar(loc_id, attr_name, attr_data)
461 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
462 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
463 REAL(KIND=
dp),
INTENT(IN),
TARGET :: attr_data
466 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
467 TYPE(c_ptr) :: buffer
470 CALL h5screate_f(h5s_scalar_f, space_id, error)
471 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 dataspace')
474 buffer = c_loc(attr_data)
477 type_id = h5t_native_double
480 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
481 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 attribute')
484 CALL h5awrite_f(attr_id, type_id, buffer, error)
485 IF (error < 0) cpabort(
'ERROR: failed to write HDF5 attribute')
488 CALL h5aclose_f(attr_id, error)
489 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 attribute')
492 CALL h5sclose_f(space_id, error)
493 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataspace')
495 END SUBROUTINE h5awrite_double_scalar
503 SUBROUTINE h5awrite_string_simple(loc_id, attr_name, attr_data)
504 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
505 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
506 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(IN),
TARGET :: attr_data
509 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
510 INTEGER(KIND=hsize_t),
DIMENSION(2) :: dims
511 TYPE(c_ptr) :: buffer
513 dims(1) = len(attr_data(1), kind=hsize_t)
514 dims(2) =
SIZE(attr_data, kind=hsize_t)
517 CALL h5tcopy_f(h5t_c_s1, type_id, error)
518 CALL h5tset_cset_f(type_id, h5t_cset_utf8_f, error)
519 CALL h5tset_size_f(type_id, int(dims(1), size_t), error)
522 CALL h5screate_simple_f(1, dims(2:2), space_id, error)
523 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 dataspace')
526 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
527 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 attribute')
530 buffer = c_loc(attr_data(1))
533 CALL h5awrite_f(attr_id, type_id, buffer, error)
534 IF (error < 0) cpabort(
'ERROR: failed to write HDF5 attribute')
537 CALL h5aclose_f(attr_id, error)
538 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 attribute')
541 CALL h5sclose_f(space_id, error)
542 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataspace')
545 CALL h5tclose_f(type_id, error)
546 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 datatype')
548 END SUBROUTINE h5awrite_string_simple
556 SUBROUTINE h5awrite_double_simple(loc_id, attr_name, attr_data)
557 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
558 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
559 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN),
TARGET :: attr_data
562 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
563 INTEGER(KIND=hsize_t),
DIMENSION(1) :: dims
564 TYPE(c_ptr) :: buffer
566 dims(1) =
SIZE(attr_data, kind=hsize_t)
569 type_id = h5t_native_double
572 CALL h5screate_simple_f(1, dims, space_id, error)
573 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 dataspace')
576 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
577 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 attribute')
580 buffer = c_loc(attr_data(1))
583 CALL h5awrite_f(attr_id, type_id, buffer, error)
584 IF (error < 0) cpabort(
'ERROR: failed to write HDF5 attribute')
587 CALL h5aclose_f(attr_id, error)
588 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 attribute')
591 CALL h5sclose_f(space_id, error)
592 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataspace')
594 END SUBROUTINE h5awrite_double_simple
602 SUBROUTINE h5awrite_integer_simple(loc_id, attr_name, attr_data)
603 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
604 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
605 INTEGER,
DIMENSION(:),
INTENT(IN),
TARGET :: attr_data
608 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
609 INTEGER(KIND=hsize_t),
DIMENSION(1) :: dims
610 TYPE(c_ptr) :: buffer
612 dims(1) =
SIZE(attr_data, kind=hsize_t)
615 type_id = h5t_native_integer
618 CALL h5screate_simple_f(1, dims, space_id, error)
619 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 dataspace')
622 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
623 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 attribute')
626 buffer = c_loc(attr_data(1))
629 CALL h5awrite_f(attr_id, type_id, buffer, error)
630 IF (error < 0) cpabort(
'ERROR: failed to write HDF5 attribute')
633 CALL h5aclose_f(attr_id, error)
634 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 attribute')
637 CALL h5sclose_f(space_id, error)
638 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataspace')
640 END SUBROUTINE h5awrite_integer_simple
648 SUBROUTINE h5dwrite_double_simple(loc_id, dset_name, dset_data)
649 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
650 CHARACTER(LEN=*),
INTENT(IN) :: dset_name
651 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN),
TARGET :: dset_data
654 INTEGER(KIND=hid_t) :: dset_id, space_id, type_id
655 INTEGER(KIND=hsize_t),
DIMENSION(1) :: dims
656 TYPE(c_ptr) :: buffer
658 dims(1) =
SIZE(dset_data, kind=hsize_t)
661 type_id = h5t_native_double
664 CALL h5screate_simple_f(1, dims, space_id, error)
665 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 dataspace')
668 CALL h5dcreate_f(loc_id, dset_name, type_id, space_id, dset_id, error)
669 IF (error < 0) cpabort(
'ERROR: failed to create HDF5 dataset')
672 buffer = c_loc(dset_data(1))
675 CALL h5dwrite_f(dset_id, type_id, buffer, error)
676 IF (error < 0) cpabort(
'ERROR: failed to write HDF5 dataset')
679 CALL h5dclose_f(dset_id, error)
680 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataset')
683 CALL h5sclose_f(space_id, error)
684 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataspace')
686 END SUBROUTINE h5dwrite_double_simple
694 SUBROUTINE h5dread_double_simple(loc_id, dset_name, dset_data)
695 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
696 CHARACTER(LEN=*),
INTENT(IN) :: dset_name
697 REAL(KIND=
dp),
DIMENSION(:),
INTENT(OUT) :: dset_data
700 INTEGER(KIND=hid_t) :: dset_id, npoints, space_id, type_id
701 INTEGER(KIND=hsize_t),
DIMENSION(1) :: dims
703 dims(1) =
SIZE(dset_data, kind=hsize_t)
706 type_id = h5t_native_double
709 CALL h5dopen_f(loc_id, dset_name, dset_id, error)
710 IF (error < 0) cpabort(
'ERROR: failed to open HDF5 dataset')
713 CALL h5dget_space_f(dset_id, space_id, error)
714 IF (error < 0) cpabort(
'ERROR: failed to fetch HDF5 dataspace info')
717 CALL h5sget_simple_extent_npoints_f(space_id, npoints, error)
718 IF (error < 0) cpabort(
'ERROR: failed to fetch HDF5 dataspace dimension')
721 CALL h5dread_f(dset_id, type_id, dset_data, dims, error)
722 IF (error < 0) cpabort(
'ERROR: failed to read HDF5 dataset')
725 CALL h5dclose_f(dset_id, error)
726 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataset')
729 CALL h5sclose_f(space_id, error)
730 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 dataspace')
732 END SUBROUTINE h5dread_double_simple
740 SUBROUTINE h5aread_double_scalar(loc_id, attr_name, attr_data)
741 INTEGER(KIND=hid_t),
INTENT(IN) :: loc_id
742 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
743 REAL(KIND=
dp),
INTENT(OUT),
TARGET :: attr_data
746 INTEGER(KIND=hid_t) :: attr_id, type_id
747 TYPE(c_ptr) :: buffer
750 type_id = h5t_native_double
753 CALL h5aopen_f(loc_id, attr_name, attr_id, error)
754 IF (error < 0) cpabort(
'ERROR: failed to open HDF5 attribute')
756 buffer = c_loc(attr_data)
758 CALL h5aread_f(attr_id, type_id, buffer, error)
759 IF (error < 0) cpabort(
'ERROR: failed to read HDF5 attribute')
762 CALL h5aclose_f(attr_id, error)
763 IF (error < 0) cpabort(
'ERROR: failed to close HDF5 attribute')
765 END SUBROUTINE h5aread_double_scalar
A wrapper around the HDF5 Fortran API.
Defines the basic variable types.
integer, parameter, public dp