grd 形式のデータを作成するにはテキスト形式で出力してから xyz2grd コマンド を用いるのが一般的だと思います。grd 形式は netCDF 形式のファイルですので xyz2grd コマンド利用しなくても直接作成することが可能です。ここでは grd 形式 を作成する Fortran90 用モジュールを公開します。
Fortran90 から直接 grd 形式を出力出来れば、わざわざテキストに落とす手間 が省けて作業の効率化が期待されます。現段階では単純に grd 形式のデータを 出力するだけの関数しか用意されていませんが、将来的にはもうちょっと いろいろなことが出来るようにしたいと思います。
GMT モジュールは以下より入手してください。
入手先 | 最終更新日 | サイズ | |
---|---|---|---|
netcdf モジュールがある場合 | module_GMT35.f90 | 2002/09/05 | 6.7kB |
netcdf モジュールがない場合 | module_GMT34.f90 | 2002/09/05 | 7.1kB |
netCDF のバージョンが 3.5 以上の場合には netcdf モジュール(netcdf.mod,
typesizes.mod)が netCDF のインクルードファイルがインストールされている
ディレクトリにあると思います。その場合には module_GMT35.f90 を、
netCDF のバージョンが 3.4 以下の場合、あるいは netcdf モジュールが
インストールされていない場合には module_GMT34.f90 をダウンロード
してください(どちらも機能、使い方は変わりません)。
(注)標準で netCDF 3.5 をインストールした場合、
typesizes.mod が正しくインストールされないようです。その場合は
手動でコピーしてください。
現在のところ用意されている関数は1つだけです。以下にその使い方を説明します。
integer function |
grd_create |
( grdfile, var, x_range, y_range, spacing,
node_offset, overwrite, NaN, iscan, jscan ) |
character ( len=* ), |
intent(IN) |
:: |
grdfile |
! 出力する grd ファイル名 | |
real, |
intent(IN) |
:: |
var( : , : ) |
! データが記述されている配列 | |
doubleprecision, |
intent(IN) |
:: |
x_range(2) |
! X 軸の範囲 | |
doubleprecision, |
intent(IN) |
:: |
y_range(2) |
! Y 軸の範囲 | |
doubleprecision, |
intent(IN) |
:: |
spacing(2) |
! 格子間隔 | |
integer, |
optional |
:: |
node_offset |
! データの配置方法 | |
logical, |
optional |
:: |
overwrite |
! grd ファイルが存在する場合上書きするかどうか | |
real, |
optional |
:: |
NaN |
! 未定義値に対応する値 | |
integer, |
optional |
:: |
iscan |
! X方向のデータ格納方法 | |
integer, |
optional |
:: |
jscan |
! Y方向のデータ格納方法 |
optional 属性がついている変数に関しては省略可能です。例えば経度 0 〜 330度 まで 30度間隔、緯度 30 〜 45度まで 15度間隔のデータの grd 形式のファイルを 作成する場合には x_range = (/0d0, 330d0/), y_range= (/30d0, 45d0/), spacing = (/30d0, 15d0/) のようになります。node_offsetは 0 の場合 Grid line registration、1 の場合 Pixel registration と なります(後日絵を載せますそれまではマニュアルの Appendix B を 参照して下さい)。デフォルトは 0 です。指定した grdfile がすでに存在している場合には overwrite=.true. とすると強制的に上書きをします。未定義または欠測値に対応する数字を 引数NaNで指定することにより、この値を "NaN" として取り扱います。GMT のデータは北西から南東に向かってデータが 記述されていると仮定しています。例えば var(ix,jx) のデータの場合、 var(1,1) が北西端、var(ix,jx) が南東端となります。これに対して、 引数として渡す配列 var が南西から北東に向かっている場合、すなわち j 方向のデータの順番が逆の時jscan = 1とします。 i方向のデータの順番が逆の時には iscan=1とします。
戻り値ですが、正常終了した場合には 1、grd ファイルの作成が出来なかった 場合には -1 、そしてデータを grd 形式に出力できなかった場合に -2 となります。
以下にサンプルプログラムを紹介します。
program tmp use GMT integer :: status real :: wind(12,2) wind(1:6,1) = 10. wind(7:12,1) = 20. wind(:,2) = 100. status = grd_create( 'test.grd', wind, (/0d0,330d0/), (/30d0,45d0/), & & (/30d0,15d0/), NaN=100., jscan=1 ) stop end program tmp
このプログラムを実行してできた test.grd を grd2xyz した結果、
0 45 NaN 30 45 NaN 60 45 NaN 90 45 NaN 120 45 NaN 150 45 NaN 180 45 NaN 210 45 NaN 240 45 NaN 270 45 NaN 300 45 NaN 330 45 NaN 0 30 10 30 30 10 60 30 10 90 30 10 120 30 10 150 30 10 180 30 20 210 30 20 240 30 20 270 30 20 300 30 20 330 30 20
となります。
現在のところまだ grd 形式のデータを作る関数しか用意していませんので、 将来的にはもう少しいろいろ出来るようにしたいと思います。
■ | バグ修正 |
■ | 一般公開開始 |