diff options
Diffstat (limited to 'HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90')
-rw-r--r-- | HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90 | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90 b/HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90 new file mode 100644 index 0000000..01142a0 --- /dev/null +++ b/HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90 @@ -0,0 +1,176 @@ +!************************************************************ +! +! This example shows how to read and write region references +! to a dataset. The program first creates a dataset +! containing characters and writes references to region of +! the dataset to a new dataset with a dataspace of DIM0, +! then closes the file. Next, it reopens the file, +! dereferences the references, and outputs the referenced +! regions to the screen. +! +! This file is intended for use with HDF5 Library version 1.8 +! with --enable-fortran2003 +! +!************************************************************ +PROGRAM main + + USE HDF5 + use ISO_C_BINDING + + IMPLICIT NONE + + CHARACTER(LEN=22), PARAMETER :: filename = "h5ex_t_regref_F03.h5" + CHARACTER(LEN=3) , PARAMETER :: dataset = "DS1" + CHARACTER(LEN=3) , PARAMETER :: dataset2 = "DS2" + INTEGER , PARAMETER :: dim0 = 2 + INTEGER , PARAMETER :: ds2dim0 = 16 + INTEGER , PARAMETER :: ds2dim1 = 3 + + INTEGER(HID_T) :: file, memspace, space, dset, dset2 ! Handles + INTEGER :: hdferr + + INTEGER(HSIZE_T), DIMENSION(1:1) :: dims = (/dim0/) + INTEGER(HSIZE_T), DIMENSION(1:1) :: dims3 + INTEGER(HSIZE_T), DIMENSION(1:2) :: dims2 = (/ds2dim0,ds2dim1/) + + INTEGER(HSIZE_T), DIMENSION(1:2,1:4) :: coords = RESHAPE((/2,1,12,3,1,2,5,3/),(/2,4/)) + + INTEGER(HSIZE_T), DIMENSION(1:2) :: start=(/0,0/),stride=(/11,2/),count=(/2,2/), BLOCK=(/3,1/) + + INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims + INTEGER(hssize_t) :: npoints + TYPE(hdset_reg_ref_t_f), DIMENSION(1:dim0), TARGET :: wdata ! Write buffer + TYPE(hdset_reg_ref_t_f), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer + + INTEGER(size_t) :: size + CHARACTER(LEN=1), DIMENSION(1:ds2dim0,1:ds2dim1), TARGET :: wdata2 + + CHARACTER(LEN=80),DIMENSION(1:1), TARGET :: rdata2 + CHARACTER(LEN=80) :: name + INTEGER :: i + TYPE(C_PTR) :: f_ptr + CHARACTER(LEN=ds2dim0) :: chrvar + ! + ! Initialize FORTRAN interface. + ! + CALL h5open_f(hdferr) + + chrvar = "The quick brown " + READ(chrvar,'(16A1)') wdata2(1:16,1) + chrvar = "fox jumps over " + READ(chrvar,'(16A1)') wdata2(1:16,2) + chrvar = "the 5 lazy dogs " + READ(chrvar,'(16A1)') wdata2(1:16,3) + ! + ! Create a new file using the default properties. + ! + CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, hdferr) + ! + ! Create a dataset with character data. + ! + CALL h5screate_simple_f(2, dims2, space, hdferr) + CALL h5dcreate_f(file,dataset2, H5T_STD_I8LE, space, dset2, hdferr) + f_ptr = C_LOC(wdata2(1,1)) + + CALL h5dwrite_f(dset2, h5kind_to_type(KIND(wdata2(1,1)),H5_INTEGER_KIND), f_ptr, hdferr) + ! + ! Create reference to a list of elements in dset2. + ! + CALL h5sselect_elements_f(space, H5S_SELECT_SET_F, 2, INT(4,size_t), coords, hdferr) + f_ptr = C_LOC(wdata(1)) + CALL h5rcreate_f(file, DATASET2, H5R_DATASET_REGION_F, f_ptr, hdferr, space) + ! + ! Create reference to a hyperslab in dset2, close dataspace. + ! + CALL h5sselect_hyperslab_f (space, H5S_SELECT_SET_F, start, count, hdferr, stride, block) + f_ptr = C_LOC(wdata(2)) + CALL h5rcreate_f(file, DATASET2, H5R_DATASET_REGION_F, f_ptr, hdferr, space) + + CALL h5sclose_f(space, hdferr) + ! + ! Create dataspace. Setting maximum size to the current size. + ! + CALL h5screate_simple_f(1, dims, space, hdferr) + + ! + ! Create the dataset and write the region references to it. + ! + CALL h5dcreate_f(file, dataset, H5T_STD_REF_DSETREG, space, dset, hdferr) + f_ptr = C_LOC(wdata(1)) + CALL h5dwrite_f(dset, H5T_STD_REF_DSETREG, f_ptr, hdferr) + ! + ! Close and release resources. + ! + CALL h5dclose_f(dset , hdferr) + CALL h5dclose_f(dset2, hdferr) + CALL h5sclose_f(space, hdferr) + CALL h5fclose_f(file , hdferr) + + ! + ! Now we begin the read section of this example. + ! + ! + ! Open file and dataset. + ! + CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, hdferr) + CALL h5dopen_f(file, dataset, dset, hdferr) + + ! + ! Get dataspace and allocate memory for read buffer. + ! + CALL h5dget_space_f(dset, space, hdferr) + CALL h5sget_simple_extent_dims_f(space, dims, maxdims, hdferr) + ALLOCATE(rdata(1:dims(1))) + CALL h5sclose_f(space, hdferr) + ! + ! Read the data. + ! + f_ptr = C_LOC(rdata(1)) + CALL h5dread_f( dset, H5T_STD_REF_DSETREG, f_ptr, hdferr) + ! + ! Output the data to the screen. + ! + DO i = 1, dims(1) + WRITE(*,'(A,"[",i1,"]:",/,2X,"->")', ADVANCE='NO') dataset, i-1 + ! + ! Open the referenced object, retrieve its region as a + ! dataspace selection. + ! + CALL H5Rdereference_f(dset, rdata(i), dset2, hdferr) + CALL H5Rget_region_f(dset, rdata(i), space, hdferr) + + ! + ! Get the length of the object's name, allocate space, then + ! retrieve the name. + ! + CALL H5Iget_name_f(dset2, name, 80_size_t, size, hdferr) + ! + ! Allocate space for the read buffer. + ! + CALL H5Sget_select_npoints_f(space, npoints, hdferr) + dims3(1) = npoints + ! + ! Read the dataset region. + ! + CALL h5screate_simple_f(1, dims3, memspace, hdferr) + + f_ptr = C_LOC(rdata2(1)(1:1)) + CALL h5dread_f( dset2, h5kind_to_type(KIND(rdata2(1)),H5_INTEGER_KIND), f_ptr, hdferr, memspace, space) + ! + ! Print the name and region data, close and release resources. + ! + WRITE(*,'(A,": ",A)') name(1:size),rdata2(1)(1:npoints) + + CALL H5Sclose_f(space, hdferr) + CALL H5Sclose_f(memspace, hdferr) + CALL H5Dclose_f(dset2, hdferr) + + END DO + ! + ! Close and release resources. + ! + DEALLOCATE(rdata) + CALL H5Dclose_f(dset, hdferr) + CALL H5Fclose_f(file, hdferr) + +END PROGRAM main |