Dr. Takayuki UMEDA
Associate Professor

Center for Integrated Data Science
Institute for Space-Earth Environmental Research
Nagoya University
Nagoya, Aichi 464-8601, JAPAN

Email: taka.umeda @ nagoya-u.jp
Tel: +81-52-747-6351
Fax: +81-52-747-6334

セールス等はお断りしておりますのでご遠慮ください

HDF5

HDF5は、 米国立スーパーコンピュータ応用研究所 (NCSA: National Center for Supercomputing Applications)が開発した、 フリーな階層データフォーマット(Hierarchical Data Format)です。 Windows, Mac, Solaris, Linux など、 バイナリの形式が異なるプラットフォームにおいて、 (NFS, Samba等で)共有化されたストレージに対して、 バイナリ形式を気にすることなくデータを読むことができるのが特徴です。

欠点としては、 Moduleを使用するため、Fortran 77 には対応していないことと、 HDF5を読むための使いやすくてフリーなソフトがないことです。

ホームページより、HDF5とzlibのソースファイルが入手できます。

Intel(R) Fortran/C++ コンパイラによる rebuild

Intel(R)コンパイラの性能とx86-64の恩恵をフルに受けるために、 自前でコンパイルします。
#コンパイラのバージョンが上がるたびに rebuild する必要があります。

以下の環境変数を設定(.tcsh/.cshの場合):

    setenv F9X 'ifort -ipo -mcmodel=large -O3'
    setenv FC 'ifort -ipo -mcmodel=large -O3'
    setenv CC 'icc -ipo -mcmodel=large -no-gcc'
    setenv CXX 'icpc -ipo -mcmodel=large -O3 -no-gcc'
    setenv AR 'xiar'
    setenv LD 'xild -lib'
    setenv RANLIB 'xiar s'
    setenv MAKELIB 'xiar crus'
    (.sh/.bash の場合は export AR='xiar' とかで。)

インストール環境によっては
catastrophic error: could not open source file "limits.h" # include_next <limits.h>
というエラーが出る。 この場合は -no-gcc が必要。

zlib のコンパイル:
    ./configure --prefix=/usr/local
    Makefile内の "AR=xiar" を "AR=xiar rv" に変更
    make
    su で root になる
    make install
HDF5 のコンパイル:
    ./configure --enable-fortran --with-zlib=/usr/local/lib --prefix=/usr/local/hdf5
    make
    su で root になる
    make install
    (./configure で ./config/内の各プラットフォーム用の設定ファイルが読み込まれるので、コンパイルが通らないときはそちらを変更する。)

hdf5-1.10/12.x メモ

./configure --enable-fortran --enable-shared=no

MAC OS 10 with ifort & gcc

    setenv FC 'ifort'
    setenv F9X 'ifort'
    setenv CC 'gcc -m64'
    setenv CXX 'gcc -m64'

-mcmodel=large はノンサポート。あとは同じのはず。

by 深沢氏

AIX with 日立 Fortran & xlc

    setenv FC 'f90'
    setenv CC 'xlc'
    setenv F9X 'f90
    setenv CXX 'xlC'
    setenv AR 'ar -X64'
    alias make gmake

hdf5-1.X.x/config/powerpc-ibm-aix5.x を編集して、xlf のオプションを全て無効化。

hdf5-1.X.x/configure を編集して、ac_cv_fortran_dummy_main=none に変更。

hdf5-1.X.x/fortran/src/H5f90proto.h を編集して、#define H5_FC_FUNC_(name, NAME) NAME を常に有効化。

かなりややこしいが、これで行けるはず。

富士通 Fortran & C

    setenv FC 'frt'
    setenv CC 'fcc'
    setenv F9X 'frt'
    setenv CXX 'FCC'
    setenv FORT90C '-Kfast,tl_notrt -Am'
    setenv FCC_ENV '-Kfast,tl_notrt'
    setenv fcc_ENV '-Kfast,tl_notrt'
    setenv c99_ENV '-Kfast'
    setenv FCLIBS '-lfj90i -lfj90f -lelf -lm -lrt'
    alias make gmake

Solaris:hdf5-1.X.x/config/solaris2.x を編集して、H5_CFLAGS="$H5_CFLAGS" に変更。

Linux:hdf5-1.X.x/config/linux-gnulibc1 を編集して、intel-flags・intel-fflags を読み込まないようにする。
./configure のときに --disable-shared が要る場合がある。

京/FX10用 バッチ経由でコンパイル

  • hdf5-1.X.x/bin/config.guess を編集して、強制的に UNAME_MACHINE=sparc になるように変更。

  • hdf5-1.X.x/config/linux-gnulibc1 を編集して、intel-flags・intel-fflags を読み込まないようにする。

  • バッチスクリプトの中身:
      export FC='mpifrt -Kfast'
      export CC='mpifcc -Kfast'
      export F9X='mpifrt -Kfast'
      export CXX='mpiFCC -Kfast'
      export FCLIBS='-lfj90i -lfj90f -lelf -lm -lrt'
      ./configure --enable-fortran --enable-parallel
      make clean; make install

    富岳/FX1000用 バッチ経由でコンパイル

  • configの修正なしでOKになりました。

  • バッチスクリプトの中身:(hdf5-1.10/12.x用)
      export FC='mpifrt -Kfast'
      export CC='mpifcc -Kfast'
      export F9X='mpifrt -Kfast'
      export CXX='mpiFCC -Kfast'
      export FCLIBS='-lfj90i -lfj90f -lelf -lm -lrt'
      ./configure --enable-fortran --enable-parallel --enable-shared=no
      make clean; make install

    integer(kind=8)読み書き用拡張プログラム

    hdf5-1.10_int8 hdf5-1.8_int8 該当ファイルを置き換えて再コンパイルしてください。

    ※HDF5-1.12 より integer(kind=8) はデフォルトで対応されました。

    Fortran 90 用 簡易HDF5モジュール

    HDF5 のデータの読み書きは、version 4 と比べて手続きが面倒になりましたので、 すべての手続きを1つの subroutine にまとめたモジュールを作成しました。

    以下のような簡単な操作でファイルの書き込みができます。

      call hdf_create('file.hdf') : file.hdf というファイルを作成
      call hdf_write( 'Data','file.hdf',msize(1:3), data(1:nx,1:ny,1:nz)) :  file.hdf に data という配列を Data という名前をつけて書き込む
      (msize(1:3) = (nx,ny,nz) の 8バイト整数)
    このモジュールを使用してみたい方は御連絡ください。