GPMを振り回す

NetCDF4の関数を使ってHDF5形式のGPM DPR v3 プロダクトを読み込む


データを読む前に

全球降水観測(Global Precipitation Measurement; GPM)計画のコア衛星に搭載された「雨雲スキャンレーダ」こと 二周波降雨レーダ(Dual-frequency Precipitation Radar; DPR)は, 熱帯降雨観測衛星(Tropical Rainfall Measuring Mission; TRMM)に 搭載された降雨レーダ(Precipitagion Radar; PR)の次世代センサである. DPRはKuPR, KaPRの二つのレーダを搭載し, KuPRはTRMM PRと同じ周波数(13 GHz), KaPRは新規周波数(35 GHz)のレーダである. DPRの詳細は大本山(全球降水観測計画) に譲るとして, ここではデータの読み込みについて触れる.

DPRを含むGPMプロダクトはHDF5形式によって提供されている. TRMM PR (v7) や CloudSat CPRのデータ形式はHDF4であるが, HDF4とHDF5に互換性はない. そのため, HDF4の遺産を使ってHDF5のデータを読み込むことは出来ず, HDF5の読み込み方法を新たに習得する必要がある. データ読み込みの基本的な流れはHDF4と変わらないので, HDF5の関数を使っていけば,データの読み込みは出来る.

しかし, HDF5の関数はFortran使いには少し使い勝手が悪い. なぜなら, 現状のFortran版のHDF5の読み込み関数は2 byte 整数に対応していないようである. 緊急避難的な用法として, 2 byte characterの読み込みからbit数を参照して2 byte整数に 変換することが可能であるが, 面倒なことこの上ない(筆者の無知によることが原因で, 実は出来るのかもしれません).

そこで, ここではNetCDF4の関数を使ってDPRのデータを読み込むことにする. 実は, NetCDF4はHDF5のライブラリを使用しているため, NetCDF4とHDF5のデータ形式はほぼ等しい. 先ほど挙げた問題は, (何故かは知らないが) NetCDF4の関数を使用するにおいては問題にならない. また, NetCDF4はHDF4の読み込みにもオプションで対応しているので, NetCDF4をマスターすれば, HDF4やHDF5だけでなくNetCDF3にも対応がほぼ出来る (ただし, 筆者はHDF4のvdata読み込みが出来ない).

HDF5データの読み込み

HDF5データの読み込みの流れは大体こんな感じである.

  1. hdf5ファイルのidを求める
  2. 欲しい名前のgroupのindexを求める
  3. そのidから詳しい情報を読み出す
  4. グループ内の名前のindexを求める
  5. それらを使って肝心な中身のデータを読み出す
  6. 開けたら閉める(idの初期化)

簡単に言えば,宝探しゲームみたいなものか?暗号を解いて,宝箱の中身をとりだすイメージ?

では上記のことをどうやってするか,である.初心者にはこれが大問題. 筆者は次のようにして読み込んでいる(Fortran使い).

  1. nf90_open---------- hdf5ファイルのidを求める
  2. nf90_inq_grp_ncid-- 欲しい名前のgroupのindexを求める
  3. nf90_inq_dimids---- そのidから詳しい情報を読み出す
  4. nf90_inq_varid----- グループ内の名前のindexを求める
  5. nf90_get_var------- それらを使って肝心な中身のデータを読み出す
  6. nf90_close--------- 開けたら閉める(idの初期化)

とりあえずどんな感じになるかはこれ

サンプル(NetCDF4)
サンプル(HDF5)

コンパイルする

とりあえずどんな感じになるかはこれ

サンプル(compile)

コンパイルは出来たかな?

コンパイルが出来ないとき(NetCDF4版)

NetCDF4はNetCDF enhancedをサポートさせる必要がある. ちょっと面倒. Anacondaでもろもろインストールできる. ただし, ライブラリをインストールするときのコンパイラと計算するプログラムのコンパイラは一致しないと問題が起きる.

コンパイルが出来ないとき(HDF5版)

h5fc を使えたらそれを使うとよい. Anacondaでもろもろインストールできる. ただし, ライブラリをインストールするときのコンパイラと計算するプログラムのコンパイラは一致しないと問題が起きる. 16bit整数は32bit整数で用意すれば読めるらしいが, よく分からない.


[Return]