diff options
author | Elena Pourmal <epourmal@hdfgroup.org> | 2000-10-10 04:13:14 (GMT) |
---|---|---|
committer | Elena Pourmal <epourmal@hdfgroup.org> | 2000-10-10 04:13:14 (GMT) |
commit | 02092cd24e8cb79c66903d5556515bd755deeeeb (patch) | |
tree | bf4cc467138236ae3dbf8d531e1ef4ae4eaee60a /fortran/src/H5Rff.f90 | |
parent | a1e44979edfe671a6c7f8278a8798d9a834476c3 (diff) | |
download | hdf5-02092cd24e8cb79c66903d5556515bd755deeeeb.zip hdf5-02092cd24e8cb79c66903d5556515bd755deeeeb.tar.gz hdf5-02092cd24e8cb79c66903d5556515bd755deeeeb.tar.bz2 |
[svn-r2648]
Purpose:
Reimplemented references to the objects and dataset regions.
Description:
Previous implementation was not portable. This implementation
should work on UNIX workstations and Crays, but is very inefficient
since it uses memcpy to repack Fortran buffers with references
to C buffers and vice versa.
Solution:
I used fortran derived datatype with integer fields. h5dwrite_f and
h5dread_f have extra parameter when references are written or read.
This parameter describes size of the buffer that holds references.
Platforms tested:
J90 and Solaris 2.6
H5Pf.c
Some of the functions do not exist now in the development branch.
Commented those out, so one does not need to apply patch in order
to build Fortran Library.
Diffstat (limited to 'fortran/src/H5Rff.f90')
-rw-r--r-- | fortran/src/H5Rff.f90 | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/fortran/src/H5Rff.f90 b/fortran/src/H5Rff.f90 index 3fd9142..b9d373e 100644 --- a/fortran/src/H5Rff.f90 +++ b/fortran/src/H5Rff.f90 @@ -4,15 +4,17 @@ MODULE H5R USE H5FORTRAN_TYPES USE H5FORTRAN_FLAGS +! If you change the value of these parameters, do not forget to change corresponding +! values in the H5f90.h file. + INTEGER, PARAMETER :: REF_OBJ_BUF_LEN = 2 + INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3 TYPE hobj_ref_t_f - !INTEGER(KIND=4) ref(2) could cause trouble on Crays - CHARACTER ref(8) + INTEGER ref(REF_OBJ_BUF_LEN) END TYPE TYPE hdset_reg_ref_t_f - !INTEGER(KIND=4) reg_ref(3) could cause troubles on Crays - CHARACTER ref(12) + INTEGER ref(REF_REG_BUF_LEN) END TYPE INTERFACE h5rcreate_f @@ -54,11 +56,15 @@ INTEGER, INTENT(OUT) :: hdferr ! Error code INTEGER :: namelen ! Name length + INTEGER :: ref_f(REF_OBJ_BUF_LEN) ! Local buffer to pass reference INTEGER, EXTERNAL :: h5rcreate_object_c namelen = LEN(name) - hdferr = h5rcreate_object_c(ref, loc_id, name, namelen ) - + ref_f = 0 + hdferr = h5rcreate_object_c(ref_f, loc_id, name, namelen ) + ref%ref = ref_f + END SUBROUTINE h5rcreate_object_f + SUBROUTINE h5rcreate_region_f(loc_id, name, space_id, ref, hdferr) IMPLICIT NONE @@ -70,9 +76,12 @@ INTEGER, INTENT(OUT) :: hdferr ! Error code INTEGER :: namelen ! Name length + INTEGER :: ref_f(REF_REG_BUF_LEN) ! Local buffer to pass reference INTEGER, EXTERNAL :: h5rcreate_region_c namelen = LEN(name) - hdferr = h5rcreate_region_c(ref, loc_id, name, namelen, space_id ) + ref_f = 0 + hdferr = h5rcreate_region_c(ref_f, loc_id, name, namelen, space_id ) + ref%ref = ref_f END SUBROUTINE h5rcreate_region_f @@ -84,9 +93,10 @@ INTEGER, INTENT(OUT) :: hdferr ! Error code INTEGER :: ref_type ! Reference type + INTEGER :: ref_f(REF_OBJ_BUF_LEN) ! Local buffer to pass reference INTEGER, EXTERNAL :: h5rdereference_object_c - ref_type = H5R_OBJECT_F - hdferr = h5rdereference_object_c(dset_id, ref, obj_id ) + ref_f = ref%ref + hdferr = h5rdereference_object_c(dset_id, ref_f, obj_id ) END SUBROUTINE h5rdereference_object_f @@ -98,9 +108,11 @@ INTEGER, INTENT(OUT) :: hdferr ! Error code INTEGER :: ref_type ! Reference type + INTEGER :: ref_f(REF_REG_BUF_LEN) ! Local buffer to pass reference INTEGER, EXTERNAL :: h5rdereference_region_c ref_type = H5R_DATASET_REGION_F - hdferr = h5rdereference_region_c(dset_id, ref, obj_id ) + ref_f = ref%ref + hdferr = h5rdereference_region_c(dset_id, ref_f, obj_id ) END SUBROUTINE h5rdereference_region_f @@ -111,9 +123,11 @@ TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref ! Dataset region reference INTEGER(HID_T), INTENT(OUT) :: space_id ! Space identifier INTEGER, INTENT(OUT) :: hdferr ! Error code + INTEGER :: ref_f(REF_REG_BUF_LEN) ! Local buffer to pass reference INTEGER, EXTERNAL :: h5rget_region_region_c - hdferr = h5rget_region_region_c(dset_id, ref, space_id ) + ref_f = ref%ref + hdferr = h5rget_region_region_c(dset_id, ref_f, space_id ) END SUBROUTINE h5rget_region_region_f @@ -129,9 +143,11 @@ ! H5G_TYPE_F 3 INTEGER, INTENT(OUT) :: hdferr ! Error code + INTEGER :: ref_f(REF_OBJ_BUF_LEN) ! Local buffer to pass reference INTEGER, EXTERNAL :: h5rget_object_type_obj_c - hdferr = h5rget_object_type_obj_c(dset_id, ref, obj_type ) + ref_f = ref%ref + hdferr = h5rget_object_type_obj_c(dset_id, ref_f, obj_type ) END SUBROUTINE h5rget_object_type_obj_f |