(git:374b731)
Loading...
Searching...
No Matches
hdf5_wrapper.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief A wrapper around the HDF5 Fortran API
10!> \par History
11!> 04.2023 created [SB]
12!> \author Stefano Battaglia
13! **************************************************************************************************
15
16#ifdef __HDF5
17 USE hdf5, ONLY: &
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
25#endif
26 USE iso_c_binding, ONLY: c_loc, &
27 c_ptr
28 USE kinds, ONLY: dp
29#include "./base/base_uses.f90"
30
31 IMPLICIT NONE
32
33 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'hdf5_wrapper'
34#ifdef __HDF5
35 INTEGER, PARAMETER, PUBLIC :: hdf5_id = hid_t
36#endif
37
38CONTAINS
39
40#ifdef __HDF5
41! **************************************************************************************************
42!> \brief Initialize the HDF5 fortran API
43! **************************************************************************************************
44 SUBROUTINE h5open()
45 INTEGER :: error
46
47 CALL h5open_f(error)
48 IF (error < 0) cpabort('ERROR: failed to initialize HDF5 interface')
49
50 END SUBROUTINE h5open
51
52! **************************************************************************************************
53!> \brief Close the HDF5 fortran API
54! **************************************************************************************************
55 SUBROUTINE h5close()
56 INTEGER :: error
57
58 CALL h5close_f(error)
59 IF (error < 0) cpabort('ERROR: failed to close HDF5 interface')
60
61 END SUBROUTINE h5close
62
63! **************************************************************************************************
64!> \brief Create a HDF5 file
65!> \param filename the name of the hdf5 file
66!> \param file_id the file id of the hdf5 file
67! **************************************************************************************************
68 SUBROUTINE h5fcreate(filename, file_id)
69 CHARACTER(LEN=*), INTENT(IN) :: filename
70 INTEGER(KIND=hid_t), INTENT(OUT) :: file_id
71
72 INTEGER :: error
73
74 CALL h5fcreate_f(filename, h5f_acc_trunc_f, file_id, error)
75 IF (error < 0) cpabort('ERROR: failed to create HDF5 file')
76
77 END SUBROUTINE h5fcreate
78
79! **************************************************************************************************
80!> \brief Open a HDF5 file
81!> \param filename the name of the hdf5 file
82!> \param file_id the file id of the hdf5 file
83! **************************************************************************************************
84 SUBROUTINE h5fopen(filename, file_id)
85 CHARACTER(LEN=*), INTENT(IN) :: filename
86 INTEGER(KIND=hid_t), INTENT(OUT) :: file_id
87
88 INTEGER :: error
89
90 CALL h5fopen_f(trim(filename), h5f_acc_rdonly_f, file_id, error)
91 IF (error < 0) cpabort('ERROR: failed to open HDF5 file')
92
93 END SUBROUTINE h5fopen
94
95! **************************************************************************************************
96!> \brief Close a HDF5 file
97!> \param file_id the file id of the hdf5 file
98! **************************************************************************************************
99 SUBROUTINE h5fclose(file_id)
100 INTEGER(KIND=hid_t), INTENT(IN) :: file_id
101
102 INTEGER :: error
103
104 CALL h5fclose_f(file_id, error)
105 IF (error < 0) cpabort('ERROR: failed to close HDF5 file')
106
107 END SUBROUTINE h5fclose
108
109! **************************************************************************************************
110!> \brief Create a HDF5 group
111!> \param loc_id file or group identifier
112!> \param name name of the group
113!> \param grp_id group identifier
114! **************************************************************************************************
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
119
120 INTEGER :: error
121
122 CALL h5gcreate_f(loc_id, name, grp_id, error)
123 IF (error < 0) cpabort('ERROR: failed to create HDF5 group')
124
125 END SUBROUTINE h5gcreate
126
127! **************************************************************************************************
128!> \brief Open a HDF5 group
129!> \param loc_id file or group identifier
130!> \param name name of the group
131!> \param grp_id group identifier
132! **************************************************************************************************
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
137
138 INTEGER :: error
139
140 CALL h5gopen_f(loc_id, name, grp_id, error)
141 IF (error < 0) cpabort('ERROR: failed to open HDF5 group')
142
143 END SUBROUTINE h5gopen
144
145! **************************************************************************************************
146!> \brief Close a HDF5 group
147!> \param grp_id group identifier
148! **************************************************************************************************
149 SUBROUTINE h5gclose(grp_id)
150 INTEGER(KIND=hid_t), INTENT(IN) :: grp_id
151
152 INTEGER :: error
153
154 CALL h5gclose_f(grp_id, error)
155 IF (error < 0) cpabort('ERROR: failed to close HDF5 group')
156
157 END SUBROUTINE h5gclose
158
159! **************************************************************************************************
160!> \brief Write a variable-length string attribute
161!> \param loc_id either file id or group id
162!> \param attr_name the name of the attribute
163!> \param attr_data the attribute data, i.e. the string to write
164! **************************************************************************************************
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
169
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
174
175 ! create a scalar dataspace
176 CALL h5screate_f(h5s_scalar_f, space_id, error)
177 IF (error < 0) THEN
178 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
179 ' ERROR: failed to create HDF5 dataspace'
180 RETURN
181 END IF
182
183 ! create a variable-length string type
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)
187
188 ! create the attribute
189 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
190 IF (error < 0) THEN
191 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
192 ' ERROR: failed to create HDF5 attribute'
193 RETURN
194 END IF
195
196 ! weird in-between pointer needed for variable-length
197 ! string to a scalar dataspace
198 in_between_ptr = c_loc(attr_data)
199 ! the actual pointer to be passed
200 buffer = c_loc(in_between_ptr)
201
202 ! write the string attribute to file
203 CALL h5awrite_f(attr_id, type_id, buffer, error)
204 IF (error < 0) THEN
205 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
206 ' ERROR: failed to write HDF5 attribute'
207 RETURN
208 END IF
209
210 ! close attribute
211 CALL h5aclose_f(attr_id, error)
212 IF (error < 0) THEN
213 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
214 ' ERROR: failed to close HDF5 attribute'
215 RETURN
216 END IF
217
218 ! close dataspace
219 CALL h5sclose_f(space_id, error)
220 IF (error < 0) THEN
221 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
222 ' ERROR: failed to close HDF5 dataspace'
223 RETURN
224 END IF
225
226 ! close datatype
227 CALL h5tclose_f(type_id, error)
228 IF (error < 0) THEN
229 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
230 ' ERROR: failed to close HDF5 datatype'
231 RETURN
232 END IF
233
234 END SUBROUTINE h5awrite_varlen_string
235
236! **************************************************************************************************
237!> \brief Write a fixed-length string attribute
238!> \param loc_id either file id or group id
239!> \param attr_name the name of the attribute
240!> \param attr_data the attribute data, i.e. the string to write
241! **************************************************************************************************
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
246
247 INTEGER :: error, output_unit
248 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
249 TYPE(c_ptr) :: buffer
250
251 ! create a scalar dataspace
252 CALL h5screate_f(h5s_scalar_f, space_id, error)
253 IF (error < 0) THEN
254 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
255 ' ERROR: failed to create HDF5 dataspace'
256 RETURN
257 END IF
258
259 ! create a fixed-length string datatype
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)
263
264 ! create the attribute
265 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
266 IF (error < 0) THEN
267 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
268 ' ERROR: failed to create HDF5 attribute'
269 RETURN
270 END IF
271
272 ! the actual pointer to be passed
273 buffer = c_loc(attr_data)
274
275 ! write the string attribute to file
276 CALL h5awrite_f(attr_id, type_id, buffer, error)
277 IF (error < 0) THEN
278 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
279 ' ERROR: failed to write HDF5 attribute'
280 RETURN
281 END IF
282
283 ! close attribute
284 CALL h5aclose_f(attr_id, error)
285 IF (error < 0) THEN
286 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
287 ' ERROR: failed to close HDF5 attribute'
288 RETURN
289 END IF
290
291 ! close dataspace
292 CALL h5sclose_f(space_id, error)
293 IF (error < 0) THEN
294 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
295 ' ERROR: failed to close HDF5 dataspace'
296 RETURN
297 END IF
298
299 ! close datatype
300 CALL h5tclose_f(type_id, error)
301 IF (error < 0) THEN
302 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
303 ' ERROR: failed to close HDF5 datatype'
304 RETURN
305 END IF
306
307 END SUBROUTINE h5awrite_fixlen_string
308
309! **************************************************************************************************
310!> \brief Write a boolean attribute
311!> \param loc_id either file id or group id
312!> \param attr_name the name of the attribute
313!> \param attr_data the attribute data, i.e. the logical to write (.true. or .false.)
314! **************************************************************************************************
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
319
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
325
326 ! 8-bit integers in enum bool_type
327
328 ! create a scalar dataspace
329 CALL h5screate_f(h5s_scalar_f, space_id, error)
330 IF (error < 0) THEN
331 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
332 ' ERROR: failed to create HDF5 dataspace'
333 RETURN
334 END IF
335
336 ! create the datatype
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)
340
341 IF (attr_data) THEN
342 attr_data_to_int = 1
343 ELSE
344 attr_data_to_int = 0
345 END IF
346 ! the C pointer to the actual data
347 buffer = c_loc(attr_data_to_int)
348
349 ! create the attribute
350 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
351 IF (error < 0) THEN
352 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
353 ' ERROR: failed to create HDF5 attribute'
354 RETURN
355 END IF
356
357 ! write the string attribute to file
358 CALL h5awrite_f(attr_id, type_id, buffer, error)
359 IF (error < 0) THEN
360 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
361 ' ERROR: failed to write HDF5 attribute'
362 RETURN
363 END IF
364
365 ! close attribute
366 CALL h5aclose_f(attr_id, error)
367 IF (error < 0) THEN
368 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
369 ' ERROR: failed to close HDF5 attribute'
370 RETURN
371 END IF
372
373 ! close dataspace
374 CALL h5sclose_f(space_id, error)
375 IF (error < 0) THEN
376 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
377 ' ERROR: failed to close HDF5 dataspace'
378 RETURN
379 END IF
380
381 ! close datatype
382 CALL h5tclose_f(type_id, error)
383 IF (error < 0) THEN
384 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
385 ' ERROR: failed to close HDF5 datatype'
386 RETURN
387 END IF
388
389 END SUBROUTINE h5awrite_boolean
390
391! **************************************************************************************************
392!> \brief Write a (scalar) integer attribute
393!> \param loc_id either file id or group id
394!> \param attr_name the name of the attribute
395!> \param attr_data the attribute data, i.e. the integer to write
396! **************************************************************************************************
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
401
402 INTEGER :: error, output_unit
403 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
404 TYPE(c_ptr) :: buffer
405
406 ! create a scalar dataspace
407 CALL h5screate_f(h5s_scalar_f, space_id, error)
408 IF (error < 0) THEN
409 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
410 ' ERROR: failed to create HDF5 dataspace'
411 RETURN
412 END IF
413
414 ! the C pointer to the actual data
415 buffer = c_loc(attr_data)
416
417 ! set the type of data
418 type_id = h5t_native_integer
419
420 ! create the attribute
421 CALL h5acreate_f(loc_id, attr_name, type_id, space_id, attr_id, error)
422 IF (error < 0) THEN
423 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
424 ' ERROR: failed to create HDF5 attribute'
425 RETURN
426 END IF
427
428 ! write the string attribute to file
429 CALL h5awrite_f(attr_id, type_id, buffer, error)
430 IF (error < 0) THEN
431 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
432 ' ERROR: failed to write HDF5 attribute'
433 RETURN
434 END IF
435
436 ! close attribute
437 CALL h5aclose_f(attr_id, error)
438 IF (error < 0) THEN
439 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
440 ' ERROR: failed to close HDF5 attribute'
441 RETURN
442 END IF
443
444 ! close dataspace
445 CALL h5sclose_f(space_id, error)
446 IF (error < 0) THEN
447 WRITE (unit=output_unit, fmt="(/,T5,A,/)") &
448 ' ERROR: failed to close HDF5 dataspace'
449 RETURN
450 END IF
451
452 END SUBROUTINE h5awrite_integer_scalar
453
454! **************************************************************************************************
455!> \brief Write a (scalar) double precision attribute
456!> \param loc_id either file id or group id
457!> \param attr_name the name of the attribute
458!> \param attr_data the attribute data, i.e. the double to write
459! **************************************************************************************************
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
464
465 INTEGER :: error
466 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
467 TYPE(c_ptr) :: buffer
468
469 ! create a scalar dataspace
470 CALL h5screate_f(h5s_scalar_f, space_id, error)
471 IF (error < 0) cpabort('ERROR: failed to create HDF5 dataspace')
472
473 ! the C pointer to the actual data
474 buffer = c_loc(attr_data)
475
476 ! set the type of data
477 type_id = h5t_native_double
478
479 ! create the attribute
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')
482
483 ! write the string attribute to file
484 CALL h5awrite_f(attr_id, type_id, buffer, error)
485 IF (error < 0) cpabort('ERROR: failed to write HDF5 attribute')
486
487 ! close attribute
488 CALL h5aclose_f(attr_id, error)
489 IF (error < 0) cpabort('ERROR: failed to close HDF5 attribute')
490
491 ! close dataspace
492 CALL h5sclose_f(space_id, error)
493 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataspace')
494
495 END SUBROUTINE h5awrite_double_scalar
496
497! **************************************************************************************************
498!> \brief Write an array of fixed-length string attribute
499!> \param loc_id either file id or group id
500!> \param attr_name the name of the attribute
501!> \param attr_data the attribute data, i.e. the array of strings
502! **************************************************************************************************
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
507
508 INTEGER :: error
509 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
510 INTEGER(KIND=hsize_t), DIMENSION(2) :: dims
511 TYPE(c_ptr) :: buffer
512
513 dims(1) = len(attr_data(1), kind=hsize_t) ! length of a string entry
514 dims(2) = SIZE(attr_data, kind=hsize_t) ! length of array of strings
515
516 ! create a fixed-length string datatype
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)
520
521 ! create a simple dataspace
522 CALL h5screate_simple_f(1, dims(2:2), space_id, error)
523 IF (error < 0) cpabort('ERROR: failed to create HDF5 dataspace')
524
525 ! create the atrtibute
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')
528
529 ! the actual pointer to be passed
530 buffer = c_loc(attr_data(1))
531
532 ! write the string array attribute to file
533 CALL h5awrite_f(attr_id, type_id, buffer, error)
534 IF (error < 0) cpabort('ERROR: failed to write HDF5 attribute')
535
536 ! close attribute
537 CALL h5aclose_f(attr_id, error)
538 IF (error < 0) cpabort('ERROR: failed to close HDF5 attribute')
539
540 ! close dataspace
541 CALL h5sclose_f(space_id, error)
542 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataspace')
543
544 ! close datatype
545 CALL h5tclose_f(type_id, error)
546 IF (error < 0) cpabort('ERROR: failed to close HDF5 datatype')
547
548 END SUBROUTINE h5awrite_string_simple
549
550! **************************************************************************************************
551!> \brief Write an array of doubles attribute
552!> \param loc_id either file id or group id
553!> \param attr_name the name of the attribute
554!> \param attr_data the attribute data, i.e. the array of doubles
555! **************************************************************************************************
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
560
561 INTEGER :: error
562 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
563 INTEGER(KIND=hsize_t), DIMENSION(1) :: dims
564 TYPE(c_ptr) :: buffer
565
566 dims(1) = SIZE(attr_data, kind=hsize_t) ! length of array of strings
567
568 ! set the type of data
569 type_id = h5t_native_double
570
571 ! create a simple dataspace
572 CALL h5screate_simple_f(1, dims, space_id, error)
573 IF (error < 0) cpabort('ERROR: failed to create HDF5 dataspace')
574
575 ! create the atrtibute
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')
578
579 ! the actual pointer to be passed
580 buffer = c_loc(attr_data(1))
581
582 ! write the string array attribute to file
583 CALL h5awrite_f(attr_id, type_id, buffer, error)
584 IF (error < 0) cpabort('ERROR: failed to write HDF5 attribute')
585
586 ! close attribute
587 CALL h5aclose_f(attr_id, error)
588 IF (error < 0) cpabort('ERROR: failed to close HDF5 attribute')
589
590 ! close dataspace
591 CALL h5sclose_f(space_id, error)
592 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataspace')
593
594 END SUBROUTINE h5awrite_double_simple
595
596! **************************************************************************************************
597!> \brief Write an array of integers attribute
598!> \param loc_id either file id or group id
599!> \param attr_name the name of the attribute
600!> \param attr_data the attribute data, i.e. the array of integers
601! **************************************************************************************************
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
606
607 INTEGER :: error
608 INTEGER(KIND=hid_t) :: attr_id, space_id, type_id
609 INTEGER(KIND=hsize_t), DIMENSION(1) :: dims
610 TYPE(c_ptr) :: buffer
611
612 dims(1) = SIZE(attr_data, kind=hsize_t) ! length of array of strings
613
614 ! set the type of data
615 type_id = h5t_native_integer
616
617 ! create a simple dataspace
618 CALL h5screate_simple_f(1, dims, space_id, error)
619 IF (error < 0) cpabort('ERROR: failed to create HDF5 dataspace')
620
621 ! create the atrtibute
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')
624
625 ! the actual pointer to be passed
626 buffer = c_loc(attr_data(1))
627
628 ! write the string array attribute to file
629 CALL h5awrite_f(attr_id, type_id, buffer, error)
630 IF (error < 0) cpabort('ERROR: failed to write HDF5 attribute')
631
632 ! close attribute
633 CALL h5aclose_f(attr_id, error)
634 IF (error < 0) cpabort('ERROR: failed to close HDF5 attribute')
635
636 ! close dataspace
637 CALL h5sclose_f(space_id, error)
638 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataspace')
639
640 END SUBROUTINE h5awrite_integer_simple
641
642! **************************************************************************************************
643!> \brief Write a dataset containing an array of doubles
644!> \param loc_id either file id or group id
645!> \param dset_name the name of the dataset
646!> \param dset_data the dataset data, i.e. the array of doubles
647! **************************************************************************************************
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
652
653 INTEGER :: error
654 INTEGER(KIND=hid_t) :: dset_id, space_id, type_id
655 INTEGER(KIND=hsize_t), DIMENSION(1) :: dims
656 TYPE(c_ptr) :: buffer
657
658 dims(1) = SIZE(dset_data, kind=hsize_t) ! length of array
659
660 ! set the type of data
661 type_id = h5t_native_double
662
663 ! create a simple dataspace
664 CALL h5screate_simple_f(1, dims, space_id, error)
665 IF (error < 0) cpabort('ERROR: failed to create HDF5 dataspace')
666
667 ! create the dataset
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')
670
671 ! the actual pointer to be passed
672 buffer = c_loc(dset_data(1))
673
674 ! write the string array attribute to file
675 CALL h5dwrite_f(dset_id, type_id, buffer, error)
676 IF (error < 0) cpabort('ERROR: failed to write HDF5 dataset')
677
678 ! close dataset
679 CALL h5dclose_f(dset_id, error)
680 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataset')
681
682 ! close dataspace
683 CALL h5sclose_f(space_id, error)
684 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataspace')
685
686 END SUBROUTINE h5dwrite_double_simple
687
688! **************************************************************************************************
689!> \brief Read a dataset containing an array of doubles
690!> \param loc_id either file id or group id
691!> \param dset_name the name of the dataset
692!> \param dset_data where the read dataset data will be written
693! **************************************************************************************************
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
698
699 INTEGER :: error
700 INTEGER(KIND=hid_t) :: dset_id, npoints, space_id, type_id
701 INTEGER(KIND=hsize_t), DIMENSION(1) :: dims
702
703 dims(1) = SIZE(dset_data, kind=hsize_t) ! length of array
704
705 ! set the type of data
706 type_id = h5t_native_double
707
708 ! open the dataset
709 CALL h5dopen_f(loc_id, dset_name, dset_id, error)
710 IF (error < 0) cpabort('ERROR: failed to open HDF5 dataset')
711
712 ! get information on the dataspace
713 CALL h5dget_space_f(dset_id, space_id, error)
714 IF (error < 0) cpabort('ERROR: failed to fetch HDF5 dataspace info')
715
716 ! get dataspace dims
717 CALL h5sget_simple_extent_npoints_f(space_id, npoints, error)
718 IF (error < 0) cpabort('ERROR: failed to fetch HDF5 dataspace dimension')
719
720 ! read the data
721 CALL h5dread_f(dset_id, type_id, dset_data, dims, error)
722 IF (error < 0) cpabort('ERROR: failed to read HDF5 dataset')
723
724 ! close dataset
725 CALL h5dclose_f(dset_id, error)
726 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataset')
727
728 ! close dataspace
729 CALL h5sclose_f(space_id, error)
730 IF (error < 0) cpabort('ERROR: failed to close HDF5 dataspace')
731
732 END SUBROUTINE h5dread_double_simple
733
734! **************************************************************************************************
735!> \brief Read an attribute containing a scalar double
736!> \param loc_id either file id or group id
737!> \param attr_name ...
738!> \param attr_data ...
739! **************************************************************************************************
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
744
745 INTEGER :: error
746 INTEGER(KIND=hid_t) :: attr_id, type_id
747 TYPE(c_ptr) :: buffer
748
749 ! set the type of data
750 type_id = h5t_native_double
751
752 ! open the attribute
753 CALL h5aopen_f(loc_id, attr_name, attr_id, error)
754 IF (error < 0) cpabort('ERROR: failed to open HDF5 attribute')
755
756 buffer = c_loc(attr_data)
757 ! read the data
758 CALL h5aread_f(attr_id, type_id, buffer, error)
759 IF (error < 0) cpabort('ERROR: failed to read HDF5 attribute')
760
761 ! close the attribute
762 CALL h5aclose_f(attr_id, error)
763 IF (error < 0) cpabort('ERROR: failed to close HDF5 attribute')
764
765 END SUBROUTINE h5aread_double_scalar
766
767#endif
768
769END MODULE hdf5_wrapper
A wrapper around the HDF5 Fortran API.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34