44 use iso_fortran_env
, only: output_unit, error_unit
55 init_dset, append_dat, write_latt, write_comment
58 MODULE PROCEDURE write_attribute_double, write_attribute_int, write_attribute_string, write_attribute_logical
61 MODULE PROCEDURE read_attribute_double, read_attribute_int, read_attribute_string, read_attribute_logical
64 MODULE PROCEDURE test_attribute_double, test_attribute_int, test_attribute_string, test_attribute_logical
69 Subroutine init_dset(file_id, dsetname, dims, is_complex, chunklen)
101 INTEGER(HID_T),
intent(in) :: file_id
102 Character (len=64),
intent(in) :: dsetname
103 INTEGER(HSIZE_T),
intent(in) :: dims(:)
104 logical,
intent(in) :: is_complex
105 INTEGER(HSIZE_T),
intent(in),
optional :: chunklen
107 INTEGER :: rank, hdferr
108 INTEGER(HSIZE_T),
allocatable :: dimsc(:), maxdims(:)
109 INTEGER(HID_T) :: dset_id, dataspace, crp_list
115 allocate( dimsc(rank), maxdims(rank) )
118 if (
present(chunklen) ) dimsc(rank) = chunklen
120 maxdims(rank) = h5s_unlimited_f
123 if (dims(rank) /= 0)
then 124 write(error_unit,*)
'Error in init_dset: dims(rank) /= 0' 125 Call terminate_on_error(error_generic,__file__,__line__)
129 CALL h5screate_simple_f(rank, dims, dataspace, hdferr, maxdims)
132 CALL h5pcreate_f(h5p_dataset_create_f, crp_list, hdferr)
133 CALL h5pset_chunk_f(crp_list, rank, dimsc, hdferr)
136 CALL h5pset_deflate_f(crp_list, hdf5_zlib, hdferr)
140 CALL h5dcreate_f(file_id, dsetname, h5t_native_double, dataspace, &
141 dset_id, hdferr, crp_list )
143 CALL write_attribute_logical(dset_id,
'.',
'is_complex', is_complex, hdferr)
146 CALL h5sclose_f(dataspace, hdferr)
147 CALL h5pclose_f(crp_list, hdferr)
148 CALL h5dclose_f(dset_id, hdferr)
149 deallocate( dimsc, maxdims )
151 end Subroutine init_dset
155 Subroutine append_dat(file_id, dsetname, dat_ptr, Nbins_in)
184 INTEGER(HID_T),
intent(in) :: file_id
185 Character (len=64),
intent(in) :: dsetname
186 TYPE(c_ptr),
intent(in) :: dat_ptr
187 INTEGER,
optional,
intent(in) :: nbins_in
189 INTEGER :: rank, hdferr, i, nbins
190 INTEGER(HSIZE_T) :: mem_dims(1)
191 INTEGER(HSIZE_T),
allocatable :: dims(:), maxdims(:), offset(:), count(:)
192 INTEGER(HID_T) :: dset_id, dataspace, memspace
195 if(
present(nbins_in) )
then 202 CALL h5dopen_f(file_id, dsetname, dset_id, hdferr)
205 CALL h5dget_space_f(dset_id, dataspace, hdferr)
208 CALL h5sget_simple_extent_ndims_f(dataspace, rank, hdferr)
209 allocate( dims(rank), maxdims(rank), offset(rank), count(rank) )
212 CALL h5sget_simple_extent_dims_f(dataspace, dims, maxdims, hdferr)
216 offset(rank) = dims(rank)
219 dims(rank) = dims(rank)+nbins
220 CALL h5dset_extent_f(dset_id, dims, hdferr)
221 CALL h5sclose_f(dataspace, hdferr)
222 CALL h5dget_space_f(dset_id, dataspace, hdferr)
223 CALL h5sselect_hyperslab_f(dataspace, h5s_select_set_f, offset, count, hdferr)
228 mem_dims = mem_dims*dims(i)
230 CALL h5screate_simple_f (1, mem_dims, memspace, hdferr)
233 CALL h5dwrite_f(dset_id, h5t_native_double, dat_ptr, hdferr, &
234 mem_space_id = memspace, file_space_id = dataspace)
237 CALL h5sclose_f(memspace, hdferr)
238 CALL h5sclose_f(dataspace, hdferr)
239 CALL h5dclose_f(dset_id, hdferr)
241 deallocate( dims, maxdims, offset, count )
243 end Subroutine append_dat
247 Subroutine write_latt(obj_id, Latt, Latt_Unit)
269 INTEGER(HID_T),
intent(in) :: obj_id
270 type(
lattice),
intent(in) :: latt
273 Character (len=64) :: group_name, dset_name, attr_name
274 INTEGER(HID_T) :: group_id
275 LOGICAL :: link_exists
277 INTEGER(HSIZE_T) :: size_dat
278 Real (Kind=Kind(0.d0)),
allocatable :: temp(:)
280 group_name =
"lattice" 281 CALL h5lexists_f(obj_id, group_name, link_exists, ierr)
282 if ( link_exists )
return 283 call h5gcreate_f(obj_id, group_name, group_id, ierr)
285 size_dat =
size(latt%L1_p)
288 call h5ltset_attribute_double_f(group_id, dset_name, attr_name, latt%a1_p, size_dat, ierr )
290 call h5ltset_attribute_double_f(group_id, dset_name, attr_name, latt%a2_p, size_dat, ierr )
292 call h5ltset_attribute_double_f(group_id, dset_name, attr_name, latt%L1_p, size_dat, ierr )
294 call h5ltset_attribute_double_f(group_id, dset_name, attr_name, latt%L2_p, size_dat, ierr )
296 attr_name =
"N_coord" 297 call write_attribute(group_id,
'.', attr_name, latt_unit%N_coord, ierr)
301 call write_attribute(group_id,
'.', attr_name,
size(latt_unit%Orb_pos_p, 2), ierr)
303 size_dat =
size(latt_unit%Orb_pos_p, 2)
304 allocate(temp(size_dat))
305 do no = 1, latt_unit%Norb
306 temp(:) = latt_unit%Orb_pos_p(no,:)
307 write(attr_name,
'("Orbital", I0)') no
308 call h5ltset_attribute_double_f(group_id, dset_name, attr_name, temp, size_dat, ierr )
312 call h5gclose_f(group_id, ierr)
314 end Subroutine write_latt
320 Subroutine write_attribute_double(loc_id, obj_name, attr_name, attr_value, ierr)
350 INTEGER(HID_T),
INTENT(IN) :: loc_id
351 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
352 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
353 real(Kind=Kind(0.d0)),
INTENT(IN) :: attr_value
354 INTEGER,
INTENT(OUT) :: ierr
356 INTEGER(HID_T) :: space_id, attr_id
357 INTEGER(HSIZE_T),
parameter :: dims(1) = 1
359 CALL h5screate_f (h5s_scalar_f, space_id, ierr)
360 call h5acreate_by_name_f(loc_id, obj_name, attr_name, h5t_native_double, &
361 space_id, attr_id, ierr)
362 call h5awrite_f (attr_id, h5t_native_double, attr_value, dims, ierr)
363 call h5aclose_f (attr_id, ierr)
364 call h5sclose_f (space_id, ierr)
365 end Subroutine write_attribute_double
369 Subroutine write_attribute_int(loc_id, obj_name, attr_name, attr_value, ierr)
399 INTEGER(HID_T),
INTENT(IN) :: loc_id
400 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
401 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
402 INTEGER,
INTENT(IN) :: attr_value
403 INTEGER,
INTENT(OUT) :: ierr
405 INTEGER(HID_T) :: space_id, attr_id
406 INTEGER(HSIZE_T),
parameter :: dims(1) = 1
408 CALL h5screate_f (h5s_scalar_f, space_id, ierr)
409 call h5acreate_by_name_f(loc_id, obj_name, attr_name, h5t_native_integer, &
410 space_id, attr_id, ierr)
411 call h5awrite_f (attr_id, h5t_native_integer, attr_value, dims, ierr)
412 call h5aclose_f (attr_id, ierr)
413 call h5sclose_f (space_id, ierr)
414 end Subroutine write_attribute_int
418 Subroutine write_attribute_string(loc_id, obj_name, attr_name, attr_value, ierr)
448 INTEGER(HID_T),
INTENT(IN) :: loc_id
449 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
450 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
451 CHARACTER(LEN=*),
INTENT(IN) :: attr_value
452 INTEGER,
INTENT(OUT) :: ierr
454 call h5ltset_attribute_string_f(loc_id, obj_name, attr_name, &
456 end Subroutine write_attribute_string
460 Subroutine write_attribute_logical(loc_id, obj_name, attr_name, attr_value, ierr)
490 INTEGER(HID_T),
INTENT(IN) :: loc_id
491 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
492 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
493 LOGICAL,
INTENT(IN) :: attr_value
494 INTEGER,
INTENT(OUT) :: ierr
496 INTEGER :: attr_value2
497 INTEGER(HID_T) :: space_id, attr_id
498 INTEGER(HSIZE_T),
parameter :: dims(1) = 1
501 if ( attr_value ) attr_value2 = 1
503 CALL h5screate_f (h5s_scalar_f, space_id, ierr)
504 call h5acreate_by_name_f(loc_id, obj_name, attr_name, h5t_native_integer, &
505 space_id, attr_id, ierr)
506 call h5awrite_f (attr_id, h5t_native_integer, attr_value2, dims, ierr)
507 call h5aclose_f (attr_id, ierr)
508 call h5sclose_f (space_id, ierr)
509 end Subroutine write_attribute_logical
513 Subroutine read_attribute_double(loc_id, obj_name, attr_name, attr_value, ierr)
543 INTEGER(HID_T),
INTENT(IN) :: loc_id
544 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
545 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
546 real(Kind=Kind(0.d0)),
INTENT(OUT) :: attr_value
547 INTEGER,
INTENT(OUT) :: ierr
549 INTEGER(HID_T) :: attr_id
550 INTEGER(HSIZE_T),
parameter :: dims(1) = 1
552 call h5aopen_by_name_f(loc_id, obj_name, attr_name, attr_id, ierr)
553 call h5aread_f (attr_id, h5t_native_double, attr_value, dims, ierr)
554 call h5aclose_f (attr_id, ierr)
555 end Subroutine read_attribute_double
559 Subroutine read_attribute_int(loc_id, obj_name, attr_name, attr_value, ierr)
589 INTEGER(HID_T),
INTENT(IN) :: loc_id
590 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
591 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
592 INTEGER,
INTENT(OUT) :: attr_value
593 INTEGER,
INTENT(OUT) :: ierr
595 INTEGER(HID_T) :: attr_id
596 INTEGER(HSIZE_T),
parameter :: dims(1) = 1
598 call h5aopen_by_name_f(loc_id, obj_name, attr_name, attr_id, ierr)
599 call h5aread_f (attr_id, h5t_native_integer, attr_value, dims, ierr)
600 call h5aclose_f (attr_id, ierr)
601 end Subroutine read_attribute_int
605 Subroutine read_attribute_string(loc_id, obj_name, attr_name, attr_value, ierr)
635 INTEGER(HID_T),
INTENT(IN) :: loc_id
636 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
637 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
638 CHARACTER(LEN=*),
INTENT(OUT) :: attr_value
639 INTEGER,
INTENT(OUT) :: ierr
641 call h5ltget_attribute_string_f(loc_id, obj_name, attr_name, &
643 end Subroutine read_attribute_string
647 Subroutine read_attribute_logical(loc_id, obj_name, attr_name, attr_value, ierr)
677 INTEGER(HID_T),
INTENT(IN) :: loc_id
678 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
679 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
680 LOGICAL,
INTENT(OUT) :: attr_value
681 INTEGER,
INTENT(OUT) :: ierr
683 INTEGER :: attr_value2
684 INTEGER(HID_T) :: attr_id
685 INTEGER(HSIZE_T),
parameter :: dims(1) = 1
687 call h5aopen_by_name_f(loc_id, obj_name, attr_name, attr_id, ierr)
688 call h5aread_f (attr_id, h5t_native_integer, attr_value2, dims, ierr)
689 call h5aclose_f (attr_id, ierr)
691 if ( attr_value2 == 0 )
then 693 elseif ( attr_value2 == 1 )
then 696 write(error_unit,*)
"Error in read_attribute_logical: attr_value2 is neither 0 or 1, but", attr_value2
697 Call terminate_on_error(error_generic,__file__,__line__)
699 end Subroutine read_attribute_logical
703 Subroutine test_attribute_double(loc_id, obj_name, attr_name, attr_value, ierr)
734 INTEGER(HID_T),
INTENT(IN) :: loc_id
735 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
736 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
737 real(Kind=Kind(0.d0)),
INTENT(IN) :: attr_value
738 INTEGER,
INTENT(OUT) :: ierr
740 LOGICAL :: attr_exists
741 real(Kind=Kind(0.d0)),
parameter :: ZERO = 10d-8
742 real(Kind=Kind(0.d0)) :: test_double, diff
744 call h5aexists_by_name_f(loc_id, obj_name, attr_name, attr_exists, ierr)
746 if ( .not. attr_exists )
then 747 call write_attribute_double(loc_id, obj_name, attr_name, attr_value, ierr)
749 call read_attribute_double(loc_id, obj_name, attr_name, test_double, ierr)
750 diff = abs(attr_value - test_double)
751 if (diff > zero)
then 752 write(error_unit,*)
'Error in test_attribute_double:', attr_name,
' = ', attr_value,
'/=', test_double
753 Call terminate_on_error(error_generic,__file__,__line__)
756 end Subroutine test_attribute_double
760 Subroutine test_attribute_int(loc_id, obj_name, attr_name, attr_value, ierr)
791 INTEGER(HID_T),
INTENT(IN) :: loc_id
792 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
793 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
794 INTEGER,
INTENT(IN) :: attr_value
795 INTEGER,
INTENT(OUT) :: ierr
797 LOGICAL :: attr_exists
800 call h5aexists_by_name_f(loc_id, obj_name, attr_name, attr_exists, ierr)
802 if ( .not. attr_exists )
then 803 call write_attribute_int(loc_id, obj_name, attr_name, attr_value, ierr)
805 call read_attribute_int(loc_id, obj_name, attr_name, test_int, ierr)
806 if (attr_value /= test_int)
then 807 write(error_unit,*)
'Error in test_attribute_int:', attr_name,
' = ', attr_value,
'/=', test_int
808 Call terminate_on_error(error_generic,__file__,__line__)
811 end Subroutine test_attribute_int
815 Subroutine test_attribute_string(loc_id, obj_name, attr_name, attr_value, ierr)
846 INTEGER(HID_T),
INTENT(IN) :: loc_id
847 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
848 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
849 CHARACTER(LEN=*),
INTENT(IN) :: attr_value
850 INTEGER,
INTENT(OUT) :: ierr
852 LOGICAL :: attr_exists
853 CHARACTER(LEN=64) :: test_string
855 call h5aexists_by_name_f(loc_id, obj_name, attr_name, attr_exists, ierr)
857 if ( .not. attr_exists )
then 858 call write_attribute_string(loc_id, obj_name, attr_name, attr_value, ierr)
860 call read_attribute_string(loc_id, obj_name, attr_name, test_string, ierr)
861 if (trim(attr_value) /= trim(test_string))
then 862 write(error_unit,*)
'Error in test_attribute_string:', attr_name,
' = ', attr_value,
'/=', test_string
863 Call terminate_on_error(error_generic,__file__,__line__)
866 end Subroutine test_attribute_string
870 Subroutine test_attribute_logical(loc_id, obj_name, attr_name, attr_value, ierr)
901 INTEGER(HID_T),
INTENT(IN) :: loc_id
902 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
903 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
904 LOGICAL,
INTENT(IN) :: attr_value
905 INTEGER,
INTENT(OUT) :: ierr
907 LOGICAL :: attr_exists
910 call h5aexists_by_name_f(loc_id, obj_name, attr_name, attr_exists, ierr)
912 if ( .not. attr_exists )
then 913 call write_attribute_logical(loc_id, obj_name, attr_name, attr_value, ierr)
915 call read_attribute_logical(loc_id, obj_name, attr_name, test_bool, ierr)
916 if (attr_value .neqv. test_bool)
then 917 write(error_unit,*)
'Error in test_attribute_logical:', attr_name,
' = ', attr_value,
'/=', test_bool
918 Call terminate_on_error(error_generic,__file__,__line__)
921 end Subroutine test_attribute_logical
925 Subroutine write_comment(loc_id, obj_name, attr_name, comment, ierr)
957 INTEGER(HID_T),
INTENT(IN) :: loc_id
958 CHARACTER(LEN=*),
INTENT(IN) :: obj_name
959 CHARACTER(LEN=*),
INTENT(IN) :: attr_name
960 CHARACTER(len=64),
INTENT(IN) :: comment(:)
961 INTEGER,
INTENT(OUT) :: ierr
963 INTEGER(HID_T) :: attr_id
964 INTEGER(HID_T) :: space_id
965 INTEGER(HID_T) :: type_id
967 INTEGER(HSIZE_T) :: dims(1)
968 INTEGER(SIZE_T) :: attrlen = 64
971 dims(1) =
size(comment)
972 CALL h5screate_simple_f(rank, dims, space_id, ierr)
975 CALL h5tcopy_f(h5t_native_character, type_id, ierr)
976 CALL h5tset_size_f(type_id, attrlen, ierr)
979 call h5acreate_by_name_f(loc_id, obj_name, attr_name, type_id, &
980 space_id, attr_id, ierr)
983 CALL h5awrite_f(attr_id, type_id, comment, dims, ierr)
986 CALL h5aclose_f(attr_id, ierr)
987 CALL h5tclose_f(type_id, ierr)
988 CALL h5sclose_f(space_id, ierr)
990 end Subroutine write_comment