cachu's page

Last modified: Thu Sep 5 04:42:58 JST 2002

Fortran90 で grd 形式のデータを出力する

[研究| GMT トップ| ホーム ]

はじめに

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

となります。

TODO

現在のところまだ grd 形式のデータを作る関数しか用意していませんので、 将来的にはもう少しいろいろ出来るようにしたいと思います。

更新履歴

□ 2002/09/05 □
バグ修正
□ 2002/09/04 □
一般公開開始

by mkato@pastel.ocn.ne.jp