Writing a double precision data

Hello,

I have a fortran file of size Nx*Ny*Nz which can contain either single or
double precision data. I store the data type information in a variable
called "sizeofreal" (which can either have the value 4 or 8).

After reading this page <http://www.hdfgroup.org/HDF5/Tutor/datatypes.html>,
I wrote a fortran file for creating h5 files, so that it can automatically
write the final h5 file with the correct Datatype. Here is a gist of the
code I wrote:

···

----------------------------------------------------------
********** code for initialization ***************
     ! Read the input data.
     open
(in_file_id,FILE=in_file,form='unformatted',access='direct',recl=sizeofreal*nx*ny*nz)
     read (in_file_id,rec=1) buff

     ! Initialize FORTRAN interface of HDF5.
     CALL h5open_f(error)

     ! Create a new file.
     CALL h5fcreate_f (out_file, H5F_ACC_TRUNC_F, out_file_id, error)

     ! Create the dataspace.
     CALL h5screate_simple_f(rank, dims, dspace_id, error)

     if (sizeofreal.eq.8) then

        ! Create the dataset with default properties.
        CALL h5dcreate_f(out_file_id, dsetname, H5T_NATIVE_DOUBLE,
dspace_id, &
             dset_id, error)

        ! Write the dataset.
        CALL h5dwrite_f(dset_id, H5T_NATIVE_DOUBLE, buff, dims, error)

     else

        ! Create the dataset with default properties.
        CALL h5dcreate_f(out_file_id, dsetname, H5T_NATIVE_REAL, dspace_id,
&
             dset_id, error)

        ! Write the dataset.
        CALL h5dwrite_f(dset_id, H5T_NATIVE_REAL, buff, dims, error)

     end if

********** code for termination ***************
--------------------------------------------------------------------------

This is not working for double-precision data. For single precision data it
works fine. If I remove the "if" statement in between, then no matter if I
have double or single precision data in my original data file, when I do
the "h5dump -H" on the final h5 file, the final Datatype is always DATATYPE
H5T_IEEE_F32LE. This cannot be correct.

Please help me in this regard,
Thank you,
Pradeep

The following similar example might help you, can you check if you obtain a similar output.

PROGRAM main

   USE HDF5

   INTEGER, PARAMETER :: nx=2
   INTEGER :: error
   INTEGER(HID_T) :: out_file, out_file_id,dspace_id
   INTEGER(HID_T) :: dset_id_r, dset_id_d
   INTEGER, PARAMETER :: rank=1
   INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/2/)

   REAL*4, DIMENSION(1:nx) :: buff_r
   REAL*8, DIMENSION(1:nx) :: buff_d

   buff_r = 3.14
   buff_d = 2.44

   ! Initialize FORTRAN interface of HDF5.
   CALL h5open_f(error)

   ! Create a new file.
   CALL h5fcreate_f("out.h5", H5F_ACC_TRUNC_F, out_file_id, error)

   ! Create the dataspace.
   CALL h5screate_simple_f(rank, dims, dspace_id, error)

! IF (sizeofreal.EQ.8) THEN

   ! Create the dataset with default properties.
   CALL h5dcreate_f(out_file_id, "DS_DOUBLE", H5T_NATIVE_DOUBLE, dspace_id, &
        dset_id_r, error)

   ! Write the dataset.
   CALL h5dwrite_f(dset_id_r, H5T_NATIVE_DOUBLE, buff_d, dims, error)

! else

   ! Create the dataset with default properties.
   CALL h5dcreate_f(out_file_id, "DS_REAL", H5T_NATIVE_REAL, dspace_id, &
        dset_id_d, error)

   ! Write the dataset.
   CALL h5dwrite_f(dset_id_d, H5T_NATIVE_REAL, buff_r, dims, error)

! end if
   CALL h5sclose_f(dspace_id, error)
   CALL h5fclose_f(out_file_id,error)

END PROGRAM main

h5dump:

HDF5 "out.h5" {
GROUP "/" {
    DATASET "DS_DOUBLE" {
       DATATYPE H5T_IEEE_F64LE
       DATASPACE SIMPLE { ( 2 ) / ( 2 ) }
       DATA {
       (0): 2.44, 2.44
       }
    }
    DATASET "DS_REAL" {
       DATATYPE H5T_IEEE_F32LE
       DATASPACE SIMPLE { ( 2 ) / ( 2 ) }
       DATA {
       (0): 3.14, 3.14
       }
    }
}

···

On 2013-02-28 04:42, Pradeep Jha wrote:

Hello,

I have a fortran file of size Nx*Ny*Nz which can contain either
single or double precision data. I store the data type information in
a variable called "sizeofreal" (which can either have the value 4 or
8).

After reading this page [1], I wrote a fortran file for creating h5
files, so that it can automatically write the final h5 file with the
correct Datatype. Here is a gist of the code I wrote:

----------------------------------------------------------

********** code for initialization ***************
! Read the input data.
open

(in_file_id,FILE=in_file,form='unformatted',access='direct',recl=sizeofreal*nx*ny*nz)

 read \(in\_file\_id,rec=1\) buff

 \! Initialize FORTRAN interface of HDF5\.

 CALL h5open\_f\(error\)

 \! Create a new file\.

  CALL h5fcreate\_f \(out\_file, H5F\_ACC\_TRUNC\_F, out\_file\_id, error\)

 \! Create the dataspace\.

 CALL h5screate\_simple\_f\(rank, dims, dspace\_id, error\)

 if \(sizeofreal\.eq\.8\) then

    \! Create the dataset with default properties\.

    CALL h5dcreate\_f\(out\_file\_id, dsetname, H5T\_NATIVE\_DOUBLE, dspace\_id, &amp;

         dset\_id, error\)

    \! Write the dataset\.

    CALL h5dwrite\_f\(dset\_id, H5T\_NATIVE\_DOUBLE, buff, dims, error\)

 else

    \! Create the dataset with default properties\.

    CALL h5dcreate\_f\(out\_file\_id, dsetname, H5T\_NATIVE\_REAL, dspace\_id, &amp;

         dset\_id, error\)

    \! Write the dataset\.

    CALL h5dwrite\_f\(dset\_id, H5T\_NATIVE\_REAL, buff, dims, error\)

 end if

********** code for termination ***************

--------------------------------------------------------------------------

This is not working for double-precision data. For single precision
data it works fine. If I remove the "if" statement in between, then no
matter if I have double or single precision data in my original data
file, when I do the "h5dump -H" on the final h5 file, the final
Datatype is always DATATYPE H5T_IEEE_F32LE. This cannot be correct.

Please help me in this regard,
Thank you,
Pradeep

Links:
------
[1] http://www.hdfgroup.org/HDF5/Tutor/datatypes.html

_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org

Hello,

please help me regarding this question.

Thank you,
Pradeep

···

2013/2/28 Pradeep Jha <pradeep@ccs.engg.nagoya-u.ac.jp>

Hello,

I have a fortran file of size Nx*Ny*Nz which can contain either single or
double precision data. I store the data type information in a variable
called "sizeofreal" (which can either have the value 4 or 8).

After reading this page<http://www.hdfgroup.org/HDF5/Tutor/datatypes.html>,
I wrote a fortran file for creating h5 files, so that it can automatically
write the final h5 file with the correct Datatype. Here is a gist of the
code I wrote:

----------------------------------------------------------
********** code for initialization ***************
     ! Read the input data.
     open
(in_file_id,FILE=in_file,form='unformatted',access='direct',recl=sizeofreal*nx*ny*nz)
     read (in_file_id,rec=1) buff

     ! Initialize FORTRAN interface of HDF5.
     CALL h5open_f(error)

     ! Create a new file.
     CALL h5fcreate_f (out_file, H5F_ACC_TRUNC_F, out_file_id, error)

     ! Create the dataspace.
     CALL h5screate_simple_f(rank, dims, dspace_id, error)

     if (sizeofreal.eq.8) then

        ! Create the dataset with default properties.
        CALL h5dcreate_f(out_file_id, dsetname, H5T_NATIVE_DOUBLE,
dspace_id, &
             dset_id, error)

        ! Write the dataset.
        CALL h5dwrite_f(dset_id, H5T_NATIVE_DOUBLE, buff, dims, error)

     else

        ! Create the dataset with default properties.
        CALL h5dcreate_f(out_file_id, dsetname, H5T_NATIVE_REAL,
dspace_id, &
             dset_id, error)

        ! Write the dataset.
        CALL h5dwrite_f(dset_id, H5T_NATIVE_REAL, buff, dims, error)

     end if

********** code for termination ***************
--------------------------------------------------------------------------

This is not working for double-precision data. For single precision data
it works fine. If I remove the "if" statement in between, then no matter if
I have double or single precision data in my original data file, when I do
the "h5dump -H" on the final h5 file, the final Datatype is always DATATYPE
H5T_IEEE_F32LE. This cannot be correct.

Please help me in this regard,
Thank you,
Pradeep

Thanks for the example. That helps.

···

2013/3/4 <brtnfld@hdfgroup.org>

The following similar example might help you, can you check if you obtain
a similar output.

PROGRAM main

  USE HDF5

  INTEGER, PARAMETER :: nx=2
  INTEGER :: error
  INTEGER(HID_T) :: out_file, out_file_id,dspace_id
  INTEGER(HID_T) :: dset_id_r, dset_id_d
  INTEGER, PARAMETER :: rank=1
  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/2/)

  REAL*4, DIMENSION(1:nx) :: buff_r
  REAL*8, DIMENSION(1:nx) :: buff_d

  buff_r = 3.14
  buff_d = 2.44

  ! Initialize FORTRAN interface of HDF5.
  CALL h5open_f(error)

  ! Create a new file.
  CALL h5fcreate_f("out.h5", H5F_ACC_TRUNC_F, out_file_id, error)

  ! Create the dataspace.
  CALL h5screate_simple_f(rank, dims, dspace_id, error)

! IF (sizeofreal.EQ.8) THEN

  ! Create the dataset with default properties.
  CALL h5dcreate_f(out_file_id, "DS_DOUBLE", H5T_NATIVE_DOUBLE, dspace_id,
&
       dset_id_r, error)

  ! Write the dataset.
  CALL h5dwrite_f(dset_id_r, H5T_NATIVE_DOUBLE, buff_d, dims, error)

! else

  ! Create the dataset with default properties.
  CALL h5dcreate_f(out_file_id, "DS_REAL", H5T_NATIVE_REAL, dspace_id, &
       dset_id_d, error)

  ! Write the dataset.
  CALL h5dwrite_f(dset_id_d, H5T_NATIVE_REAL, buff_r, dims, error)

! end if
  CALL h5sclose_f(dspace_id, error)
  CALL h5fclose_f(out_file_id,error)

END PROGRAM main

h5dump:

HDF5 "out.h5" {
GROUP "/" {
   DATASET "DS_DOUBLE" {
      DATATYPE H5T_IEEE_F64LE
      DATASPACE SIMPLE { ( 2 ) / ( 2 ) }
      DATA {
      (0): 2.44, 2.44
      }
   }
   DATASET "DS_REAL" {
      DATATYPE H5T_IEEE_F32LE
      DATASPACE SIMPLE { ( 2 ) / ( 2 ) }
      DATA {
      (0): 3.14, 3.14

      }
   }
}
}

On 2013-02-28 04:42, Pradeep Jha wrote:

Hello,

I have a fortran file of size Nx*Ny*Nz which can contain either
single or double precision data. I store the data type information in
a variable called "sizeofreal" (which can either have the value 4 or
8).

After reading this page [1], I wrote a fortran file for creating h5

files, so that it can automatically write the final h5 file with the
correct Datatype. Here is a gist of the code I wrote:

------------------------------**----------------------------

********** code for initialization ***************
     ! Read the input data.
     open

(in_file_id,FILE=in_file,form=**'unformatted',access='direct',**
recl=sizeofreal*nx*ny*nz)

     read (in_file_id,rec=1) buff

     ! Initialize FORTRAN interface of HDF5.

     CALL h5open_f(error)

     ! Create a new file.

      CALL h5fcreate_f (out_file, H5F_ACC_TRUNC_F, out_file_id, error)

     ! Create the dataspace.

     CALL h5screate_simple_f(rank, dims, dspace_id, error)

     if (sizeofreal.eq.8) then

        ! Create the dataset with default properties.

        CALL h5dcreate_f(out_file_id, dsetname, H5T_NATIVE_DOUBLE,
dspace_id, &

             dset_id, error)

        ! Write the dataset.

        CALL h5dwrite_f(dset_id, H5T_NATIVE_DOUBLE, buff, dims, error)

     else

        ! Create the dataset with default properties.

        CALL h5dcreate_f(out_file_id, dsetname, H5T_NATIVE_REAL,
dspace_id, &

             dset_id, error)

        ! Write the dataset.

        CALL h5dwrite_f(dset_id, H5T_NATIVE_REAL, buff, dims, error)

     end if

********** code for termination ***************

------------------------------**------------------------------**
--------------

This is not working for double-precision data. For single precision
data it works fine. If I remove the "if" statement in between, then no
matter if I have double or single precision data in my original data
file, when I do the "h5dump -H" on the final h5 file, the final
Datatype is always DATATYPE H5T_IEEE_F32LE. This cannot be correct.

Please help me in this regard,
Thank you,
Pradeep

Links:
------
[1] http://www.hdfgroup.org/HDF5/**Tutor/datatypes.html<http://www.hdfgroup.org/HDF5/Tutor/datatypes.html>

______________________________**_________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/**mailman/listinfo/hdf-forum_**hdfgroup.org<http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org>

______________________________**_________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/**mailman/listinfo/hdf-forum_**hdfgroup.org<http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org>