1!****h* ROBODoc/H5D
2!
3! NAME
4!  MODULE H5D
5!
6! FILE
7!  fortran/src/H5Dff.f90
8!
9! PURPOSE
10!  This file contains Fortran interfaces for H5D functions. It includes
11!  all the functions that are independent on whether the Fortran 2003 functions
12!  are enabled or disabled.
13!
14! COPYRIGHT
15! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
16!   Copyright by The HDF Group.                                               *
17!   Copyright by the Board of Trustees of the University of Illinois.         *
18!   All rights reserved.                                                      *
19!                                                                             *
20!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
21!   terms governing use, modification, and redistribution, is contained in    *
22!   the COPYING file, which can be found at the root of the source code       *
23!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
24!   If you do not have access to either file, you may request a copy from     *
25!   help@hdfgroup.org.                                                        *
26! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
27!
28! NOTES
29!                         *** IMPORTANT ***
30!  If you add a new H5D function you must add the function name to the
31!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
32!  This is needed for Windows based operating systems.
33!
34!*****
35
36MODULE H5D
37  USE H5GLOBAL
38
39  INTERFACE h5dextend_f
40     MODULE PROCEDURE h5dset_extent_f
41  END INTERFACE
42
43  INTERFACE h5dread_vl_f
44     MODULE PROCEDURE h5dread_vl_integer
45     MODULE PROCEDURE h5dread_vl_real
46     MODULE PROCEDURE h5dread_vl_string
47  END INTERFACE
48
49  INTERFACE h5dwrite_vl_f
50     MODULE PROCEDURE h5dwrite_vl_integer
51     MODULE PROCEDURE h5dwrite_vl_real
52     MODULE PROCEDURE h5dwrite_vl_string
53  END INTERFACE
54
55CONTAINS
56
57!
58!****s* H5D/h5dcreate_f
59!
60! NAME
61!  h5dcreate_f
62!
63! PURPOSE
64!  Creates a dataset at the specified location
65!
66! INPUTS
67!  loc_id 	 - file or group identifier
68!  name 	 - dataset name
69!  type_id 	 - dataset datatype identifier
70!  space_id 	 - dataset dataspace identifier
71! OUTPUTS
72!  dset_id 	 - dataset identifier
73!  hdferr 	 - Returns 0 if successful and -1 if fails
74! OPTIONAL PARAMETERS
75!  creation_prp  - Dataset creation property list
76!  lcpl_id 	 - Link creation property list
77!  dapl_id 	 - Dataset access property list
78!
79! AUTHOR
80!  Elena Pourmal
81!  August 12, 1999
82!
83! HISTORY
84!
85!  - Explicit Fortran interfaces were added for
86!    called C functions (it is needed for Windows
87!    port).  February 28, 2001
88!
89!  - Added version's 1.8 new optional parameters
90!    February, 2008
91!
92! SOURCE
93  SUBROUTINE h5dcreate_f(loc_id, name, type_id, space_id, dset_id, &
94       hdferr, dcpl_id, lcpl_id, dapl_id)
95    IMPLICIT NONE
96    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
97    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset
98    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
99    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
100    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier
101    INTEGER, INTENT(OUT) :: hdferr         ! Error code
102!*****
103    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dcpl_id ! Dataset creation property list
104    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list
105    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id ! Dataset access property list
106
107    INTEGER(HID_T) :: lcpl_id_default
108    INTEGER(HID_T) :: dcpl_id_default
109    INTEGER(HID_T) :: dapl_id_default
110
111    INTEGER :: namelen ! Name length
112
113!  MS FORTRAN needs explicit interface for C functions called here.
114!
115    INTERFACE
116       INTEGER FUNCTION h5dcreate_c(loc_id, name, namelen, type_id, &
117            space_id, lcpl_id_default, dcpl_id_default, dapl_id_default, dset_id)
118         USE H5GLOBAL
119         !DEC$IF DEFINED(HDF5F90_WINDOWS)
120         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DCREATE_C'::h5dcreate_c
121         !DEC$ENDIF
122         !DEC$ATTRIBUTES reference :: name
123         INTEGER(HID_T), INTENT(IN) :: loc_id
124         CHARACTER(LEN=*), INTENT(IN) :: name
125         INTEGER :: namelen
126         INTEGER(HID_T), INTENT(IN) :: type_id
127         INTEGER(HID_T), INTENT(IN) :: space_id
128
129         INTEGER(HID_T) :: lcpl_id_default
130         INTEGER(HID_T) :: dcpl_id_default
131         INTEGER(HID_T) :: dapl_id_default
132
133         INTEGER(HID_T), INTENT(OUT) :: dset_id
134       END FUNCTION h5dcreate_c
135    END INTERFACE
136
137    lcpl_id_default = H5P_DEFAULT_F
138    dcpl_id_default = H5P_DEFAULT_F
139    dapl_id_default = H5P_DEFAULT_F
140
141    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
142    IF(PRESENT(dcpl_id)) dcpl_id_default = dcpl_id
143    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
144
145    namelen = LEN(name)
146    hdferr = h5dcreate_c(loc_id, name, namelen, type_id, space_id, &
147         lcpl_id_default, dcpl_id_default, dapl_id_default, dset_id)
148
149  END SUBROUTINE h5dcreate_f
150
151!
152!****s* H5D/h5dopen_f
153!
154! NAME
155!  h5dopen_f
156!
157! PURPOSE
158!  Opens an existing dataset.
159!
160! INPUTS
161!  loc_id 	 - file or group identifier
162!  name 	 - dataset name
163! OUTPUTS
164!  dset_id 	 - dataset identifier
165!  hdferr 	 - Returns 0 if successful and -1 if fails
166! OPTIONAL PARAMETERS
167!  dapl_id 	 - Dataset access property list
168!
169! AUTHOR
170!  Elena Pourmal
171!  August 12, 1999
172!
173! HISTORY
174!  -Explicit Fortran interfaces were added for
175!   called C functions (it is needed for Windows
176!   port).  February 28, 2001
177!
178!  -Added 1.8 (optional) parameter dapl_id
179!   February, 2008, M. Scot Breitenfeld
180!
181! SOURCE
182  SUBROUTINE h5dopen_f(loc_id, name, dset_id, hdferr, dapl_id)
183    IMPLICIT NONE
184    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
185    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset
186    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier
187    INTEGER, INTENT(OUT) :: hdferr         ! Error code
188    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id ! Dataset access property list
189!*****
190    INTEGER :: namelen                     ! Name length
191
192    INTEGER(HID_T) :: dapl_id_default
193
194    INTERFACE
195       INTEGER FUNCTION h5dopen_c(loc_id, name, namelen, dapl_id_default, dset_id)
196         USE H5GLOBAL
197         !DEC$IF DEFINED(HDF5F90_WINDOWS)
198         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DOPEN_C'::h5dopen_c
199         !DEC$ENDIF
200         !DEC$ATTRIBUTES reference :: name
201         INTEGER(HID_T), INTENT(IN) :: loc_id
202         CHARACTER(LEN=*), INTENT(IN) :: name
203         INTEGER :: namelen
204         INTEGER(HID_T), INTENT(IN) :: dapl_id_default
205         INTEGER(HID_T), INTENT(OUT) :: dset_id
206       END FUNCTION h5dopen_c
207    END INTERFACE
208
209    dapl_id_default = H5P_DEFAULT_F
210    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
211
212    namelen = LEN(name)
213    hdferr = h5dopen_c(loc_id, name, namelen, dapl_id_default, dset_id)
214
215  END SUBROUTINE h5dopen_f
216
217!
218!****s* H5D/h5dclose_f
219!
220! NAME
221!  h5dclose_f
222!
223! PURPOSE
224!  Closes a dataset.
225!
226! INPUTS
227!  dset_id 	 - dataset identifier
228! OUTPUTS
229!  hdferr 	 - Returns 0 if successful and -1 if fails
230!
231! AUTHOR
232!  Elena Pourmal
233!  August 12, 1999
234!
235! HISTORY
236!  Explicit Fortran interfaces were added for
237!  called C functions (it is needed for Windows
238!  port).  February 28, 2001
239!
240! SOURCE
241  SUBROUTINE h5dclose_f(dset_id, hdferr)
242    IMPLICIT NONE
243    INTEGER(HID_T), INTENT(IN) :: dset_id ! Dataset identifier
244    INTEGER, INTENT(OUT) :: hdferr        ! Error code
245!*****
246    INTERFACE
247       INTEGER FUNCTION h5dclose_c(dset_id)
248         USE H5GLOBAL
249         !DEC$IF DEFINED(HDF5F90_WINDOWS)
250         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DCLOSE_C'::h5dclose_c
251         !DEC$ENDIF
252         INTEGER(HID_T), INTENT(IN) :: dset_id
253       END FUNCTION h5dclose_c
254    END INTERFACE
255
256    hdferr = h5dclose_c(dset_id)
257
258  END SUBROUTINE h5dclose_f
259
260!
261!****s* H5D/h5dget_type_f
262!
263! NAME
264!  h5dget_type_f
265!
266! PURPOSE
267!  Returns an identifier for a copy of the datatype for a
268!  dataset.
269!
270! INPUTS
271!  dataset_id 	 - dataset identifier
272! OUTPUTS
273!  datatype_id 	 - dataspace identifier
274!  hdferr 	 - Returns 0 if successful and -1 if fails
275!
276! AUTHOR
277!  Elena Pourmal
278!  August 12, 1999
279!
280! HISTORY
281!  Explicit Fortran interfaces were added for
282!  called C functions (it is needed for Windows
283!  port).  February 28, 2001
284!
285! NOTES
286!
287! SOURCE
288  SUBROUTINE h5dget_type_f(dataset_id, datatype_id, hdferr)
289    IMPLICIT NONE
290    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
291    INTEGER(HID_T), INTENT(OUT) :: datatype_id    ! Datatype identifier
292    INTEGER, INTENT(OUT) :: hdferr                ! Error code
293!*****
294    INTERFACE
295       INTEGER FUNCTION h5dget_type_c (dataset_id, datatype_id)
296         USE H5GLOBAL
297         !DEC$IF DEFINED(HDF5F90_WINDOWS)
298         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_TYPE_C'::h5dget_type_c
299         !DEC$ENDIF
300         INTEGER(HID_T), INTENT(IN) :: dataset_id
301         INTEGER(HID_T), INTENT(OUT) :: datatype_id
302       END FUNCTION h5dget_type_c
303    END INTERFACE
304
305    hdferr = h5dget_type_c (dataset_id, datatype_id)
306  END SUBROUTINE h5dget_type_f
307
308!
309!****s* H5D/h5dset_extent
310!
311! NAME
312!  h5dset_extent (instead of obsolete name: h5dextend_f)
313!
314! PURPOSE
315!  Extends a dataset with unlimited dimension.
316!
317! INPUTS
318!  dataset_id 	 - dataset identifier
319!  size 	 - array containing the new magnitude of
320!                  each dimension
321! OUTPUTS
322!  hdferr 	 - Returns 0 if successful and -1 if fails
323!
324! AUTHOR
325!  Elena Pourmal
326!  August 12, 1999
327!
328! HISTORY
329!  Explicit Fortran interfaces were added for
330!  called C functions (it is needed for Windows
331!  port).  February 28, 2001
332!
333!  Changed name from the now obsolete h5dextend_f
334!  to h5dset_extent_f. Provided interface to old name
335!  for backward compatability. -MSB- March 14, 2008
336!
337! SOURCE
338  SUBROUTINE h5dset_extent_f(dataset_id, size, hdferr)
339    IMPLICIT NONE
340    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
341    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN)  :: size
342    ! Array containing
343    ! dimensions' sizes
344    INTEGER, INTENT(OUT) :: hdferr                ! Error code
345!*****
346    INTERFACE
347       INTEGER FUNCTION h5dset_extent_c(dataset_id, size)
348         USE H5GLOBAL
349         !DEC$IF DEFINED(HDF5F90_WINDOWS)
350         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSET_EXTENT_C'::h5dset_extent_c
351         !DEC$ENDIF
352         INTEGER(HID_T), INTENT(IN) :: dataset_id
353         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN)  :: size
354       END FUNCTION h5dset_extent_c
355    END INTERFACE
356
357    hdferr = H5Dset_extent_c(dataset_id, size)
358  END SUBROUTINE h5dset_extent_f
359
360!****s* H5D/h5dget_create_plist_f
361!
362! NAME
363!  h5dget_create_plist_f
364!
365! PURPOSE
366!  Returns an identifier for a copy of the dataset creation
367!  property list for a dataset.
368!
369! INPUTS
370!  dataset_id 	 - dataset identifier
371! OUTPUTS
372!  plist_id 	 - creation property list identifier
373!  hdferr 	 - Returns 0 if successful and -1 if fails
374!
375! AUTHOR
376!  Elena Pourmal
377!  August 12, 1999
378!
379! HISTORY
380!  Explicit Fortran interfaces were added for
381!  called C functions (it is needed for Windows
382!  port).  February 28, 2001
383! SOURCE
384  SUBROUTINE h5dget_create_plist_f(dataset_id, plist_id, hdferr)
385    IMPLICIT NONE
386    INTEGER(HID_T), INTENT(IN) :: dataset_id   ! Dataset identifier
387    INTEGER(HID_T), INTENT(OUT) :: plist_id    ! Dataset creation
388                                               ! property list identifier
389    INTEGER, INTENT(OUT) :: hdferr             ! Error code
390!*****
391    INTERFACE
392       INTEGER FUNCTION h5dget_create_plist_c(dataset_id, plist_id)
393         USE H5GLOBAL
394         !DEC$IF DEFINED(HDF5F90_WINDOWS)
395         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_CREATE_PLIST_C'::h5dget_create_plist_c
396         !DEC$ENDIF
397         INTEGER(HID_T), INTENT(IN) :: dataset_id
398         INTEGER(HID_T), INTENT(OUT) :: plist_id
399       END FUNCTION h5dget_create_plist_c
400    END INTERFACE
401
402    hdferr = h5dget_create_plist_c(dataset_id, plist_id)
403  END SUBROUTINE h5dget_create_plist_f
404
405!
406!****s* H5D/h5dget_storage_size_f
407!
408! NAME
409!  h5dget_storage_size_f
410!
411! PURPOSE
412!  Returns the amount of storage requires by a dataset
413!
414! INPUTS
415!  dataset_id 	 - dataset identifier
416! OUTPUTS
417!  size 	 - datastorage size
418!  hdferr 	 - Returns 0 if successful and -1 if fails
419!
420! AUTHOR
421!  Elena Pourmal
422!  October 15, 2002
423! SOURCE
424  SUBROUTINE h5dget_storage_size_f(dataset_id, size, hdferr)
425    IMPLICIT NONE
426    INTEGER(HID_T), INTENT(IN) :: dataset_id ! Dataset identifier
427    INTEGER(HSIZE_T),  INTENT(OUT)  :: size  ! Amount of storage
428                                             ! allocated for dataset
429    INTEGER, INTENT(OUT) :: hdferr           ! Error code
430!*****
431    INTERFACE
432       INTEGER FUNCTION h5dget_storage_size_c(dataset_id, size)
433         USE H5GLOBAL
434         !DEC$IF DEFINED(HDF5F90_WINDOWS)
435         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_STORAGE_SIZE_C'::h5dget_storage_size_c
436         !DEC$ENDIF
437         INTEGER(HID_T), INTENT(IN) :: dataset_id
438         INTEGER(HSIZE_T), INTENT(OUT)  :: size
439       END FUNCTION h5dget_storage_size_c
440    END INTERFACE
441
442    hdferr = h5dget_storage_size_c(dataset_id, size)
443  END SUBROUTINE h5dget_storage_size_f
444
445!
446!****s* H5D/h5dvlen_get_max_len_f
447!
448! NAME
449!  h5dvlen_get_max_len_f
450!
451! PURPOSE
452!  Returns maximum length of the VL array elements
453!
454! INPUTS
455!  dataset_id 	 - dataset identifier
456!  type_id 	 - datatype identifier
457!  space_id 	 - dataspace identifier
458! OUTPUTS
459!  size 	 - buffer size
460!  hdferr 	 - Returns 0 if successful and -1 if fails
461! OPTIONAL PARAMETERS
462!  NONE
463!
464! AUTHOR
465!  Elena Pourmal
466!  October 15, 2002
467!
468! SOURCE
469  SUBROUTINE h5dvlen_get_max_len_f(dataset_id, type_id, space_id, len,  hdferr)
470    IMPLICIT NONE
471    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
472    INTEGER(HID_T), INTENT(IN) :: type_id         ! Datatype identifier
473    INTEGER(HID_T), INTENT(IN) :: space_id        ! Dataspace identifier
474    INTEGER(SIZE_T),  INTENT(OUT)  :: len         ! Maximum length of the element
475    INTEGER, INTENT(OUT) :: hdferr                ! Error code
476!*****
477    INTERFACE
478       INTEGER FUNCTION h5dvlen_get_max_len_c(dataset_id, type_id, space_id, len)
479         USE H5GLOBAL
480         !DEC$IF DEFINED(HDF5F90_WINDOWS)
481         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DVLEN_GET_MAX_LEN_C'::h5dvlen_get_max_len_c
482         !DEC$ENDIF
483         INTEGER(HID_T), INTENT(IN) :: dataset_id
484         INTEGER(HID_T), INTENT(IN) :: type_id
485         INTEGER(HID_T), INTENT(IN) :: space_id
486         INTEGER(SIZE_T), INTENT(OUT)  :: len
487       END FUNCTION h5dvlen_get_max_len_c
488    END INTERFACE
489
490    hdferr = h5dvlen_get_max_len_c(dataset_id, type_id,  space_id, len)
491  END SUBROUTINE h5dvlen_get_max_len_f
492
493!
494!****s* H5D/h5dget_space_status_f
495!
496! NAME
497!  h5dget_space_status_f
498!
499! PURPOSE
500!  Returns the status of data space allocation.
501!
502! INPUTS
503!  dset_id	 - dataset identifier
504! OUTPUTS
505!  flag          - status; may have one of the following values:
506!		    H5D_SPACE_STS_ERROR_F
507!		    H5D_SPACE_STS_NOT_ALLOCATED_F
508!		    H5D_SPACE_STS_PART_ALLOCATED_F
509!		    H5D_SPACE_STS_ALLOCATED_F
510!  hdferr 	 - Returns 0 if successful and -1 if fails
511!
512! AUTHOR
513!  Elena Pourmal
514!  March 12, 2003
515!
516! SOURCE
517  SUBROUTINE h5dget_space_status_f(dset_id, flag, hdferr)
518    IMPLICIT NONE
519    INTEGER(HID_T), INTENT(IN) :: dset_id  ! Dataspace identifier
520    INTEGER, INTENT(OUT)       :: flag     ! Memory buffer to fill in
521    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
522  !*****
523    INTERFACE
524       INTEGER FUNCTION h5dget_space_status_c(dset_id, flag)
525         USE H5GLOBAL
526         !DEC$IF DEFINED(HDF5F90_WINDOWS)
527         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_SPACE_STATUS_C'::h5dget_space_status_c
528         !DEC$ENDIF
529         INTEGER(HID_T) :: dset_id
530         INTEGER        :: flag
531       END FUNCTION h5dget_space_status_c
532    END INTERFACE
533
534    hdferr = h5dget_space_status_c(dset_id, flag)
535  END SUBROUTINE h5dget_space_status_f
536
537!
538!****s* H5D/h5dcreate_anon_f
539!
540! NAME
541!  h5dcreate_anon_f
542!
543! PURPOSE
544!  Creates a dataset in a file without linking it into the file structure
545!
546! INPUTS
547!  loc_id	 - Identifier of the file or group within which to create the dataset.
548!  type_id	 - Identifier of the datatype to use when creating the dataset.
549!  space_id	 - Identifier of the dataspace to use when creating the dataset.
550! OUTPUTS
551!  dset_id	 - dataset identifier
552!  hdferr 	 - Returns 0 if successful and -1 if fails
553! OPTIONAL PARAMETERS
554!  dcpl_id       - Dataset creation property list identifier.
555!  dapl_id  	 - Dataset access property list identifier.
556!
557! AUTHOR
558!  M. Scot Breitenfeld
559!  February 11, 2008
560!
561! SOURCE
562  SUBROUTINE h5dcreate_anon_f(loc_id, type_id, space_id, dset_id, hdferr, dcpl_id, dapl_id)
563    IMPLICIT NONE
564    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier.
565    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier.
566    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier.
567    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier.
568    INTEGER, INTENT(OUT) :: hdferr         ! Error code.
569    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dcpl_id  ! Dataset creation property list identifier.
570    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id  ! Dataset access property list identifier.
571!*****
572    INTEGER(HID_T) :: dcpl_id_default
573    INTEGER(HID_T) :: dapl_id_default
574
575    !
576    !  MS FORTRAN needs explicit interface for C functions called here.
577    !
578    INTERFACE
579       INTEGER FUNCTION h5dcreate_anon_c(loc_id, type_id, space_id, dcpl_id_default, dapl_id_default, dset_id)
580         USE H5GLOBAL
581         !DEC$IF DEFINED(HDF5F90_WINDOWS)
582         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DCREATE_ANON_C'::h5dcreate_anon_c
583         !DEC$ENDIF
584         INTEGER(HID_T), INTENT(IN) :: loc_id
585         INTEGER(HID_T), INTENT(IN) :: type_id
586         INTEGER(HID_T), INTENT(IN) :: space_id
587         INTEGER(HID_T) :: dcpl_id_default
588         INTEGER(HID_T) :: dapl_id_default
589         INTEGER(HID_T), INTENT(OUT) :: dset_id
590       END FUNCTION h5dcreate_anon_c
591    END INTERFACE
592
593    dcpl_id_default = H5P_DEFAULT_F
594    dapl_id_default = H5P_DEFAULT_F
595
596    IF(PRESENT(dcpl_id)) dcpl_id_default = dcpl_id
597    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
598
599    hdferr = h5dcreate_anon_c(loc_id, type_id, space_id, dcpl_id_default, dapl_id_default, dset_id)
600
601  END SUBROUTINE h5dcreate_anon_f
602
603  SUBROUTINE h5dwrite_vl_integer(dset_id, mem_type_id, buf, dims, len, &
604       hdferr, &
605       mem_space_id, file_space_id, xfer_prp)
606    IMPLICIT NONE
607    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
608    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
609    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! MAX len x num_elem
610    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len ! Array to store
611                                                     ! the length of each
612                                                     ! element
613    INTEGER, INTENT(IN), &
614         DIMENSION(dims(1),dims(2)), TARGET :: buf   ! Data buffer
615    INTEGER, INTENT(OUT) :: hdferr      ! Error code
616    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
617    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
618    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
619    INTEGER(HID_T) :: xfer_prp_default
620    INTEGER(HID_T) :: mem_space_id_default
621    INTEGER(HID_T) :: file_space_id_default
622
623    INTERFACE
624       INTEGER FUNCTION h5dwrite_vl_integer_c(dset_id, mem_type_id, &
625            mem_space_id_default, &
626            file_space_id_default, &
627            xfer_prp_default, buf, dims, len)
628         USE H5GLOBAL
629         !DEC$IF DEFINED(HDF5F90_WINDOWS)
630         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_VL_INTEGER_C'::h5dwrite_vl_integer_c
631         !DEC$ENDIF
632         INTEGER(HID_T), INTENT(IN) :: dset_id
633         INTEGER(HID_T), INTENT(IN) :: mem_type_id
634         INTEGER(HID_T)  :: mem_space_id_default
635         INTEGER(HID_T) :: file_space_id_default
636         INTEGER(HID_T) :: xfer_prp_default
637         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
638         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len
639         INTEGER, INTENT(IN), &
640              DIMENSION(dims(1),dims(2)) :: buf
641       END FUNCTION h5dwrite_vl_integer_c
642    END INTERFACE
643
644    xfer_prp_default = H5P_DEFAULT_F
645    mem_space_id_default = H5S_ALL_F
646    file_space_id_default = H5S_ALL_F
647
648    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
649    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
650    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
651
652    hdferr = h5dwrite_vl_integer_c(dset_id, mem_type_id, mem_space_id_default, &
653         file_space_id_default, xfer_prp_default, &
654         buf, dims, len)
655
656  END SUBROUTINE h5dwrite_vl_integer
657
658  SUBROUTINE h5dread_vl_integer(dset_id, mem_type_id, buf, dims, len, &
659       hdferr, &
660       mem_space_id, file_space_id, xfer_prp)
661    IMPLICIT NONE
662    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
663    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
664    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims  ! MAX len x num_elem
665    INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len ! Array to store
666                                                        ! the length of each
667                                                        ! element
668    INTEGER, INTENT(INOUT), &
669         DIMENSION(dims(1),dims(2)), TARGET :: buf   ! Data buffer
670    INTEGER, INTENT(OUT) :: hdferr ! Error code
671                                   ! -1 if failed, 0 otherwise
672    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
673    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
674    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
675    INTEGER(HID_T) :: xfer_prp_default
676    INTEGER(HID_T)  :: mem_space_id_default
677    INTEGER(HID_T) :: file_space_id_default
678    INTEGER(HID_T) :: tmp
679    INTEGER :: error
680
681    INTERFACE
682       INTEGER FUNCTION h5dread_vl_integer_c(dset_id, mem_type_id, &
683            mem_space_id_default, &
684            file_space_id_default, &
685            xfer_prp_default, buf, dims, len)
686         USE H5GLOBAL
687         !DEC$IF DEFINED(HDF5F90_WINDOWS)
688         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_VL_INTEGER_C'::h5dread_vl_integer_c
689         !DEC$ENDIF
690         INTEGER(HID_T), INTENT(IN) :: dset_id
691         INTEGER(HID_T), INTENT(IN) :: mem_type_id
692         INTEGER(HID_T)  :: mem_space_id_default
693         INTEGER(HID_T) :: file_space_id_default
694         INTEGER(HID_T) :: xfer_prp_default
695         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
696         INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len
697         INTEGER, INTENT(INOUT), &
698              DIMENSION(dims(1),dims(2)) :: buf
699       END FUNCTION h5dread_vl_integer_c
700    END INTERFACE
701
702    CALL h5dget_space_f(dset_id, tmp, error)
703    xfer_prp_default = H5P_DEFAULT_F
704    mem_space_id_default = tmp
705    file_space_id_default = tmp
706
707    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
708    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
709    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
710
711    hdferr = h5dread_vl_integer_c(dset_id, mem_type_id, mem_space_id_default, &
712         file_space_id_default, xfer_prp_default, &
713         buf, dims, len)
714
715  END SUBROUTINE h5dread_vl_integer
716
717  SUBROUTINE h5dwrite_vl_real(dset_id, mem_type_id, buf, dims, len, &
718       hdferr, &
719       mem_space_id, file_space_id, xfer_prp)
720    IMPLICIT NONE
721    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
722    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
723    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! MAX len x num_elem
724    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len   ! Array to store
725                                                       ! the length of each
726                                                       ! element
727    REAL, INTENT(IN), &
728         DIMENSION(dims(1),dims(2)) :: buf ! Data buffer
729    INTEGER, INTENT(OUT) :: hdferr         ! Error code
730    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
731    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
732    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
733
734    INTEGER(HID_T) :: xfer_prp_default
735    INTEGER(HID_T) :: mem_space_id_default
736    INTEGER(HID_T) :: file_space_id_default
737
738    INTERFACE
739       INTEGER FUNCTION h5dwrite_vl_real_c(dset_id, mem_type_id, &
740            mem_space_id_default, &
741            file_space_id_default, &
742            xfer_prp_default, buf, dims, len)
743         USE H5GLOBAL
744         !DEC$IF DEFINED(HDF5F90_WINDOWS)
745         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_VL_REAL_C'::h5dwrite_vl_real_c
746         !DEC$ENDIF
747         INTEGER(HID_T), INTENT(IN) :: dset_id
748         INTEGER(HID_T), INTENT(IN) :: mem_type_id
749         INTEGER(HID_T)  :: mem_space_id_default
750         INTEGER(HID_T) :: file_space_id_default
751         INTEGER(HID_T) :: xfer_prp_default
752         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
753         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len
754         REAL, INTENT(IN), &
755              DIMENSION(dims(1),dims(2)) :: buf
756       END FUNCTION h5dwrite_vl_real_c
757    END INTERFACE
758
759
760    xfer_prp_default = H5P_DEFAULT_F
761    mem_space_id_default = H5S_ALL_F
762    file_space_id_default = H5S_ALL_F
763
764    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
765    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
766    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
767
768    hdferr = h5dwrite_vl_real_c(dset_id, mem_type_id, mem_space_id_default, &
769         file_space_id_default, xfer_prp_default, &
770         buf, dims, len)
771
772  END SUBROUTINE h5dwrite_vl_real
773
774  SUBROUTINE h5dread_vl_real(dset_id, mem_type_id, buf, dims, len, &
775       hdferr, &
776       mem_space_id, file_space_id, xfer_prp)
777    IMPLICIT NONE
778    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
779    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
780    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims  ! MAX len x num_elem
781    INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len ! Array to store the length of each element
782    REAL, INTENT(INOUT), &
783         DIMENSION(dims(1),dims(2)) :: buf ! Data buffer
784    INTEGER, INTENT(OUT) :: hdferr         ! Error code
785                                           ! -1 if failed, 0 otherwise
786    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
787    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
788    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
789
790    INTEGER(HID_T) :: xfer_prp_default
791    INTEGER(HID_T)  :: mem_space_id_default
792    INTEGER(HID_T) :: file_space_id_default
793    INTEGER(HID_T) :: tmp
794    INTEGER :: error
795
796    INTERFACE
797       INTEGER FUNCTION h5dread_vl_real_c(dset_id, mem_type_id, &
798            mem_space_id_default, &
799            file_space_id_default, &
800            xfer_prp_default, buf, dims, len)
801         USE H5GLOBAL
802         !DEC$IF DEFINED(HDF5F90_WINDOWS)
803         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_VL_REAL_C'::h5dread_vl_real_c
804         !DEC$ENDIF
805         INTEGER(HID_T), INTENT(IN) :: dset_id
806         INTEGER(HID_T), INTENT(IN) :: mem_type_id
807         INTEGER(HID_T)  :: mem_space_id_default
808         INTEGER(HID_T) :: file_space_id_default
809         INTEGER(HID_T) :: xfer_prp_default
810         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
811         INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len
812         REAL, INTENT(INOUT), &
813              DIMENSION(dims(1),dims(2)) :: buf
814       END FUNCTION h5dread_vl_real_c
815    END INTERFACE
816
817    CALL h5dget_space_f(dset_id, tmp, error)
818    xfer_prp_default = H5P_DEFAULT_F
819    mem_space_id_default = tmp
820    file_space_id_default = tmp
821
822    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
823    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
824    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
825
826    hdferr = h5dread_vl_real_c(dset_id, mem_type_id, mem_space_id_default, &
827         file_space_id_default, xfer_prp_default, &
828         buf, dims, len)
829
830  END SUBROUTINE h5dread_vl_real
831
832  SUBROUTINE h5dwrite_vl_string(dset_id, mem_type_id, buf, dims, str_len, &
833       hdferr, &
834       mem_space_id, file_space_id, xfer_prp)
835    IMPLICIT NONE
836    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
837    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
838    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims   ! Number of strings
839    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: str_len ! Array to store the length of each element
840    CHARACTER(LEN=*), INTENT(IN), &
841         DIMENSION(dims(2)) :: buf  ! Data buffer
842    INTEGER, INTENT(OUT) :: hdferr  ! Error code
843    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
844    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
845    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
846
847    INTEGER(HID_T) :: xfer_prp_default
848    INTEGER(HID_T)  :: mem_space_id_default
849    INTEGER(HID_T) :: file_space_id_default
850
851    INTERFACE
852       INTEGER FUNCTION h5dwrite_vl_string_c(dset_id, mem_type_id, &
853            mem_space_id_default, &
854            file_space_id_default, &
855            ! xfer_prp_default, tmp_buf, dims, str_len)
856            xfer_prp_default, buf, dims, str_len)
857         USE H5GLOBAL
858         !DEC$IF DEFINED(HDF5F90_WINDOWS)
859         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_VL_STRING_C'::h5dwrite_vl_string_c
860         !DEC$ENDIF
861         !DEC$ATTRIBUTES reference :: buf
862         INTEGER(HID_T), INTENT(IN) :: dset_id
863         INTEGER(HID_T), INTENT(IN) :: mem_type_id
864         INTEGER(HID_T)  :: mem_space_id_default
865         INTEGER(HID_T) :: file_space_id_default
866         INTEGER(HID_T) :: xfer_prp_default
867         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims
868         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: str_len
869         CHARACTER(LEN=*), DIMENSION(dims(2)) :: buf
870       END FUNCTION
871    END INTERFACE
872
873
874    xfer_prp_default = H5P_DEFAULT_F
875    mem_space_id_default = H5S_ALL_F
876    file_space_id_default = H5S_ALL_F
877
878    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
879    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
880    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
881
882    hdferr = h5dwrite_vl_string_c(dset_id, mem_type_id, mem_space_id_default, &
883         file_space_id_default, xfer_prp_default, &
884         buf, dims, str_len)
885
886  END SUBROUTINE h5dwrite_vl_string
887
888  SUBROUTINE h5dread_vl_string(dset_id, mem_type_id, buf, dims, str_len, &
889                                         hdferr, &
890                                         mem_space_id, file_space_id, xfer_prp)
891    IMPLICIT NONE
892    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
893    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
894    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! number of strings
895    INTEGER(SIZE_T), INTENT(OUT), DIMENSION(*) :: str_len ! Array to store
896    ! the length of each
897    ! element
898    CHARACTER(LEN=*), INTENT(OUT), &
899         DIMENSION(dims(2)) :: buf      ! Data buffer
900    INTEGER, INTENT(OUT) :: hdferr      ! Error code
901    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
902    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
903    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
904
905    INTEGER(HID_T) :: xfer_prp_default
906    INTEGER(HID_T)  :: mem_space_id_default
907    INTEGER(HID_T) :: file_space_id_default
908
909    INTERFACE
910       INTEGER FUNCTION h5dread_vl_string_c(dset_id, mem_type_id, &
911            mem_space_id_default, &
912            file_space_id_default, &
913            xfer_prp_default, buf, dims, str_len)
914         USE H5GLOBAL
915         !DEC$IF DEFINED(HDF5F90_WINDOWS)
916         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_VL_STRING_C'::h5dread_vl_string_c
917         !DEC$ENDIF
918         !DEC$ATTRIBUTES reference :: buf
919         INTEGER(HID_T), INTENT(IN) :: dset_id
920         INTEGER(HID_T), INTENT(IN) :: mem_type_id
921         INTEGER(HID_T)  :: mem_space_id_default
922         INTEGER(HID_T) :: file_space_id_default
923         INTEGER(HID_T) :: xfer_prp_default
924         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims
925         INTEGER(SIZE_T), INTENT(OUT), DIMENSION(*) :: str_len
926         CHARACTER(LEN=*), DIMENSION(dims(2)) :: buf
927       END FUNCTION h5dread_vl_string_c
928    END INTERFACE
929
930    xfer_prp_default = H5P_DEFAULT_F
931    mem_space_id_default = H5S_ALL_F
932    file_space_id_default = H5S_ALL_F
933
934    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
935    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
936    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
937
938    hdferr = h5dread_vl_string_c(dset_id, mem_type_id, mem_space_id_default, &
939         file_space_id_default, xfer_prp_default, &
940         buf, dims, str_len)
941    RETURN
942  END SUBROUTINE h5dread_vl_string
943
944!
945!****s* H5D/h5dget_space_f
946!
947! NAME
948!  h5dget_space_f
949!
950! PURPOSE
951!  Returns an identifier for a copy of the dataspace for a
952!  dataset.
953!
954! INPUTS
955!  dataset_id 	 - dataset identifier
956! OUTPUTS
957!  dataspace_id  - dataspace identifier
958!  hdferr 	 - Returns 0 if successful and -1 if fails
959!
960! AUTHOR
961!  Elena Pourmal
962!  August 12, 1999
963!
964! HISTORY
965!  Explicit Fortran interfaces were added for
966!  called C functions (it is needed for Windows
967!  port).  February 28, 2001
968!
969! SOURCE
970  SUBROUTINE h5dget_space_f(dataset_id, dataspace_id, hdferr)
971    IMPLICIT NONE
972    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
973    INTEGER(HID_T), INTENT(OUT) :: dataspace_id   ! Dataspace identifier
974    INTEGER, INTENT(OUT) :: hdferr                ! Error code
975!*****
976    INTERFACE
977       INTEGER FUNCTION h5dget_space_c(dataset_id, dataspace_id)
978       USE H5GLOBAL
979       !DEC$IF DEFINED(HDF5F90_WINDOWS)
980       !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_SPACE_C'::h5dget_space_c
981       !DEC$ENDIF
982       INTEGER(HID_T), INTENT(IN) :: dataset_id
983       INTEGER(HID_T), INTENT(OUT) :: dataspace_id
984     END FUNCTION h5dget_space_c
985  END INTERFACE
986
987  hdferr = h5dget_space_c(dataset_id, dataspace_id)
988END SUBROUTINE h5dget_space_f
989
990!****s* H5D/h5dget_access_plist_f
991!
992! NAME
993!  h5dget_access_plist_f
994!
995! PURPOSE
996!  Returns a copy of the dataset creation property list.
997!
998! INPUTS
999!  dset_id       - Dataset identifier
1000!
1001! OUTPUTS
1002!  plist_id	 - Dataset access property list identifier
1003!  hdferr 	 - Returns 0 if successful and -1 if fails
1004!
1005! AUTHOR
1006!  M. Scot Breitenfeld
1007!  April 13, 2009
1008!
1009! SOURCE
1010SUBROUTINE h5dget_access_plist_f(dset_id, plist_id, hdferr)
1011  IMPLICIT NONE
1012  INTEGER(HID_T), INTENT(IN)  :: dset_id
1013  INTEGER(HID_T), INTENT(OUT) :: plist_id
1014  INTEGER       , INTENT(OUT) :: hdferr
1015!*****
1016  INTERFACE
1017     INTEGER FUNCTION h5dget_access_plist_c(dset_id, plist_id)
1018       USE H5GLOBAL
1019       !DEC$IF DEFINED(HDF5F90_WINDOWS)
1020       !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_ACCESS_PLIST_C'::h5dget_access_plist_c
1021       !DEC$ENDIF
1022       INTEGER(HID_T), INTENT(IN) :: dset_id
1023       INTEGER(HID_T), INTENT(OUT) :: plist_id
1024     END FUNCTION h5dget_access_plist_c
1025  END INTERFACE
1026
1027  hdferr = h5dget_access_plist_c(dset_id, plist_id)
1028
1029END SUBROUTINE h5dget_access_plist_f
1030
1031END MODULE H5D
1032
1033
1034