1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
! Copyright by The HDF Group. *
! All rights reserved. *
! *
! This file is part of HDF5. The full HDF5 copyright notice, including *
! terms governing use, modification, and redistribution, is contained in *
! the COPYING file, which can be found at the root of the source code *
! distribution tree, or in https://www.hdfgroup.org/licenses. *
! If you do not have access to either file, you may request a copy from *
! help@hdfgroup.org. *
! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
!
! This example illustrates how to create a compressed dataset.
! It is used in the HDF5 Tutorial.
!
PROGRAM h5_cmprss
USE HDF5 ! This module contains all necessary modules
IMPLICIT NONE
!
! The dataset is stored in file "h5_cmprss.h5"
!
CHARACTER(LEN=12), PARAMETER :: filename = "h5_cmprss.h5"
INTEGER, PARAMETER :: rank = 2 ! Rank of the data set
INTEGER, PARAMETER :: dim0 = 100 ! Data set sizes
INTEGER, PARAMETER :: dim1 = 20
INTEGER(hid_t) :: file_id, dataset_id, dataspace_id ! Identifiers
INTEGER(hid_t) :: plist_id ! Property list identifier
INTEGER :: error
INTEGER(hsize_t), DIMENSION(1:rank) :: dims ! dimensions of data
INTEGER(hsize_t), DIMENSION(1:rank) :: cdims ! sizes of chunked data
INTEGER :: i,j, numfilt
INTEGER, DIMENSION(1:dim0,1:dim1) :: buf ! write buffer
INTEGER, DIMENSION(1:dim0,1:dim1) :: rbuf ! read buffer
INTEGER(HSIZE_T), DIMENSION(1:rank) :: data_dims ! dimensions of data buffers
INTEGER, DIMENSION(1:1) :: cd_values ! Auxiliary data for the filter
INTEGER(size_t) :: nelmts ! Number of elements in cd_values
INTEGER :: flags ! Bit vector specifying certain general properties of the filter
INTEGER(SIZE_T) :: namelen = 180 ! Anticipated number of characters in name
CHARACTER(LEN=180) :: name ! Name of the filter
INTEGER :: filter_id ! Filter identification number
! Uncomment these variables to use SZIP compression
!INTEGER :: szip_options_mask
!INTEGER :: szip_pixels_per_block
!
!Initialize FORTRAN predefined datatypes
!
CALL h5open_f(error)
!
! Create a file
CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
!
! Create dataset "Compressed Data" in the group using absolute name.
dims(1:2) = (/dim0, dim1/)
CALL h5screate_simple_f(rank, dims, dataspace_id, error)
CALL h5pcreate_f(H5P_DATASET_CREATE_F, plist_id, error)
!
! Dataset must be chunked for compression
cdims(1:2) = 20
CALL h5pset_chunk_f(plist_id, 2, cdims, error)
! Set ZLIB / DEFLATE Compression using compression level 6.
! To use SZIP Compression comment out these lines.
CALL h5pset_deflate_f(plist_id, 6, error)
! Uncomment these lines to set SZIP Compression
!szip_options_mask = H5_SZIP_NN_OM_F
!szip_pixels_per_block = 16
!CALL H5Pset_szip_f(plist_id, szip_options_mask, szip_pixels_per_block, error)
! Create data set
CALL h5dcreate_f(file_id, "Compressed_Data", H5T_NATIVE_INTEGER, dataspace_id, &
dataset_id, error, dcpl_id=plist_id)
DO j = 1, dim1
DO i = 1, dim0
buf(i,j) = i+j
ENDDO
ENDDO
data_dims(1:2) = (/dim0,dim1/)
CALL h5dwrite_f(dataset_id, H5T_NATIVE_INTEGER, buf, data_dims, error)
! Close resources
CALL h5sclose_f(dataspace_id, error)
CALL h5pclose_f(plist_id, error)
CALL h5dclose_f(dataset_id, error)
CALL h5fclose_f(file_id, error)
! Now reopen the file and dataset in the file.
CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file_id, error)
CALL h5dopen_f(file_id, "Compressed_Data", dataset_id, error)
! Retrieve filter information.
CALL h5dget_create_plist_f(dataset_id, plist_id, error)
CALL h5pget_nfilters_f(plist_id, numfilt, error)
WRITE(*,'(A, I0)') "Number of filters associated with dataset: ", numfilt
DO i = 1, numfilt
nelmts = 1
CALL h5pget_filter_f(plist_id, 0, flags, nelmts, cd_values, &
namelen, name, filter_id, error)
WRITE(*,'(30X,A)', ADVANCE='NO')"Filter Type: "
IF(filter_id.EQ.H5Z_FILTER_DEFLATE_F)THEN
WRITE(*,'(A)') "H5Z_FILTER_DEFLATE"
ELSEIF (filter_id.EQ.H5Z_FILTER_SZIP_F)THEN
WRITE(*,'(A)') "H5Z_FILTER_SZIP"
ELSE
WRITE(*,'(A)') "Other filter type included"
ENDIF
ENDDO
data_dims(1:2) = (/dim0,dim1/)
CALL h5dread_f(dataset_id, H5T_NATIVE_INTEGER, rbuf, data_dims, error)
CALL h5dclose_f(dataset_id, error)
CALL h5pclose_f(plist_id, error)
CALL h5fclose_f(file_id, error)
END PROGRAM h5_cmprss
|