Символ h5dread_f отсутствует в библиотеках hdf5 (fortran) - PullRequest
0 голосов
/ 11 мая 2018

У меня возникла проблема при компиляции кода WRF-DA (код здесь )

Ошибка строки компиляции -

ftn -c -ip -O3  -w -ftz -fno-alias -align all -FR -convert big_endian   -r8        -real-size `expr 8 \* 8` -i4 -I../external/crtm_2.2.3/libsrc   -I/opt/cray/pe/hdf5/1.10.0.3/INTEL/16.0/include   -L/opt/cray/pe/hdf5/1.10.0.3/INTEL/16.0/lib/  -lhdf5hl_fortran -lhdf5_fortran -lhdf5  da_radiance.f 

  da_radiance.f(5884): error #6285: There is no matching specific subroutine for this generic subroutine call.   [H5DREAD_F]
      call H5Dread_f(dhnd1, &
-----------^

Я попытался найти соответствующий символ в библиотеке, и, как и ожидалось, символа не было (вместо него присутствует h5dread_f_c).

nm /opt/cray/pe/hdf5/1.10.0.3/INTEL/16.0/lib/libhdf5*|grep -i h5dread_f
nm: /opt/cray/pe/hdf5/1.10.0.3/INTEL/16.0/lib/libhdf5.settings: File format not recognized
nm: /opt/cray/pe/hdf5/1.10.0.3/INTEL/16.0/lib/libhdf5_cpp_intel_160.la: File format not recognized
                 U h5dread_f_c
                 U h5dread_f_c
0000000000001290 T h5dread_f_c
0000000000035320 T h5dread_f_c
                 U h5dread_f_c
                 U h5dread_f_c
0000000000001290 T h5dread_f_c
0000000000035320 T h5dread_f_c
                 U h5dread_f_c
                 U h5dread_f_c
0000000000001290 T h5dread_f_c
0000000000035320 T h5dread_f_c
0000000000035320 T h5dread_f_c
0000000000035320 T h5dread_f_c

Я попытался скомпилировать hdf5-1.10.2. Быстро взглянув на код, я увидел, что функция, кажется, была объявлена ​​(и прокомментирована) в fortran / src / H5Dff.F90 как -

!  M. Scot Breitenfeld
!  September 17, 2011
!
! Fortran2003 Interface:
!!  SUBROUTINE h5dread_f(dset_id, mem_type_id, buf, hdferr, &
!!                       mem_space_id, file_space_id, xfer_prp)
!!    INTEGER(HID_T), INTENT(IN)              :: dset_id
!!    INTEGER(HID_T), INTENT(IN)              :: mem_type_id
!!    TYPE(C_PTR)   , INTENT(INOUT)           :: buf
!!    INTEGER       , INTENT(OUT)             :: hdferr
!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: mem_space_id
!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: file_space_id
!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: xfer_prp
!*****
  SUBROUTINE h5dread_ptr(dset_id, mem_type_id, buf, hdferr, &
       mem_space_id, file_space_id, xfer_prp)

Эта функция была прекращена в последних версиях HDF5? Если да, пожалуйста, поделитесь соответствующей (более старой) версией библиотеки (и соответствующими флагами компиляции) для HDF5, в которой я могу найти этот символ.

Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию.

1 Ответ

0 голосов
/ 12 мая 2018

h5dread_f - это интерфейс, который отображается на один из следующих

INTERFACE h5dread_f
   MODULE PROCEDURE h5dread_reference_obj
   MODULE PROCEDURE h5dread_reference_dsetreg
   MODULE PROCEDURE h5dread_char_scalar
   MODULE PROCEDURE h5dread_ptr
END INTERFACE

Кажется, в функцию переданы недопустимые типы.

(спасибо Дэйву Аллуреду из группы HDF5)

...