早崎トップ 研究(気候気象) 研究(大気汚染) データリスト Linux Tips Mac Tips

wgrib2 使用方法

GRIB2 ファイルの dump (wgrib2 コマンド)

GIRB-2 形式ファイル(単にGRIB2ファイルと称されることもある)の 読み出し(デコード; decode)に関するメモ.

wgrib2 の使用方法

読み出したいGRIB2 ファイル名を hoge.grib とする.

コマンドラインでの使い方はこんな感じ:

wgrib2 [オプション] hoge.grib

これだけじゃ単純過ぎると思うかもしれませんが, wgrib2 のオプションと UN*X コマンドを使い, シェルスクリプト内で時間に関するループ(スクリプト雛型以下)などを使えば, データの抜き出し・バイナリ変換など,データ解析時に必要な一次処理の大部分が実現できます.

私的に作った wgrib2 の使い方

下記のメモ,自分でもたまに間違いを見つける (2012-10-10, 記述開始は2010年1月20日頃). 本ページで間違いを見つけたら,遠慮なく私まで連絡を.

  注意点

wgrib ユーザが陥りやすい, wgrib2 になってからの大きな違いは, ファイル出力時の緯度方向の記録順序が,南から北向きをデフォルトとしていること です.くれぐれも間違えないように!! (私は間違えてました.少なくとも丸1日悩んだ.アホや)

 wgrib2 の基本

以下の6つの実行例だけを知れば,とりあえずGRIB2ファイルの中身の情報を知ることができ, バイナリダンプして GrADS やら Fortran の計算プログラムに流し込むなどが出来るはず. これで大抵の事は出来るでしょう.

それ以外にも wgrib2 には豊富な機能(データを選択して切り出し,出力形式の変更など)がある. 詳細はwgrib2 メモ(早崎私家版) または tricks.wgrib2 の簡易日本語訳を参照.

 データの中身を表示

変数名,日付などの基本情報だけを知りたいとき

wgrib2 ifile.grb2

上記に加え,グリッド数,データの単位,データの範囲(最大・最小値など)を知りたいとき

(1データブロックにつき複数行表示)
  wgrib2 -V ifile.grb2

(グリッド情報のみ)
  wgrib2 -grid ifile.grb2

(1データブロックは1行表示.ただし,オプションの付け方で表示情報が変化)
  wgrib2 -v0 ifile.grb2
  wgrib2 -v  ifile.grb2
  wgrib2 -v2 ifile.grb2
(-v2 が最も verbose )

 バイナリ形式に変換

ダイレクトアクセスバイナリ形式(direct-access binary format)への変換. GrADSユーザにとって使い易い形式,と表現すれば,(気象学の関係者なら)わかる人も多いだろう.

big endian バイナリ形式に変換したいとき. オプション(-no_header & -ieee)の順序は入替え不可. -ieee オプション(IEEE形式,いわゆる big endian に相当?)は,直後の引数を出力ファイル名に使うため.

wgrib2 ifile.grb2 -no_header -ieee ofile.bin

little endian (Intel 系CPUで使用してるバイナリコード) バイナリ形式に変換したいとき. オプション(-no_header & -bin)の順序は入替え不可. -bin オプションは,直後の引数を出力ファイル名に使うため.

wgrib2 ifile.grb2 -no_header -bin ofile.bin

(例: 500 hPa面のジオポテンシャル高度のみ変換したいとき)
wgrib2 ifile.grb2 -match ":HGT:500 mb:" -no_header -bin ofile_z500.bin

 オプションの種類・意味を知りたい

コマンドラインにて引数無しで wgrib2 を実行.パイプを通してページャ less に渡す. 大学生くらいなら,表示されたものを見ればわかるでしょう. オプションは,種類によっては引数を伴うものがある. そこだけは注意.

wgrib2 | less

 wgrib2 メモ(早崎私家版)

以下は早崎による使用例とその解説. 個人的メモのテキストファイルHOW2USE-jp_wgrib2を HTMLに include して掲載.

*** wgrib2 の使い方(日本語版) ***
          last update: 2012-10-10
          3rd release: 2012-08-14
          2nd release: 2010-01-26
          1st release: 2010-01-01

          written by M. Hayasaki (Kyushu Univ., Japan)

文中の言葉の意味
 ifile.grb2 : input file (GRIB-2)
 ofile.grb2 : output file (GRIB-2)
 ofile.bin  : output file (binary; hardware dependent)
 ofile.ieee : output file (big-endian binary)
を意味する

!!!!! 以前からの wgrib ユーザのかたへ:
  少々違いはあるけれども,wgrib とほぼ同じ形式で記述できる.
  重要な違いは,以下の2点
    1. ファイル出力する際の "-o" オプションが不要になったこと
    2. 緯度方向の記録順序が南から北向きで出力されること
  wgrib 時代のユーザは間違えやすいので注意

  私が動作確認した wgrib2 のバージョン:
      wgrib2 v0.1.8.1 8/2009
!!!!!


0) wgrib2
  wgrib2 のオプションが表示される.
  非常に多くのオプションが存在するが,日常的に使うものは多くない(と思う).


1) wgrib2 ifile.grb2
  ifile.grb2 のデータリストが表示される.1行につき1レコード分.


2) wgrib2 ifile.grb2 -match ":HGT:" -grib ofile.grb2
  ifile.grb2 からジオポテンシャル高度だけ切り出して、GRIB-2 形式で
  ofile.grb2 に出力.

  2.1) wgrib2 ifile.grb2 | grep ":HGT:" | wgrib2 ifile.grb2 -i -grib ofile.grb2
    従来の書式.こちらでも同じ事をしているが,実行速度は遅くなる.
    wgrib2 を2回かけていることになるので,遅くなるのは当然か.


3) wgrib2 ifile.grb2 -match ":HGT:"  -no_header -bin ofile.bin
  ifile.grb2 からジオポテンシャル高度だけ切り出し, BINARY 形式
  で ofile.bin に出力する.
  !!!緯度方向の記録順序は,南から北に向かうので要注意!!!

  ※ GrADS でアクセスできる標準形式.
  ヘッダ情報などが無く,データブロックのみ
  実行する計算機のCPUに依存した endian code で出力される.

  -no_header オプションを付けないと,ヘッダ情報(グリッド数の情報)
  が付加されてしまうので,GrADSからのアクセス時に意図しない数値
  (4-byte 整数が2個)が混入してしまうので注意.
  ヘッダ情報の有無により,ファイルサイズは以下のようになる:
    -no_header ありのファイルサイズ = grid数 * 4 [byte]
    -no_header なしのファイルサイズ = 8 + grid数 * 4 [byte]
  -no_header 無しの場合に増えてる 8-byte ぶんが緯度・経度方向のグリッド数である.

  ある1つの気象要素・1つの時刻の全球データを dump した場合,
  以下のようなファイルサイズになっているはず:
    NCEP-1 or NCEP-2: 144 x 73 x 4 = 42048 byte (2.5 x 2.5; 144 x 73 grids)
    ERA40: 320 x 161 x 4 = 206080 byte (1.125 x 1.125; 320 x 161 grids)
    JRA25/JCDAS: 288 x 145 x 4 = 167040 byte (1.25 x 1.25; 288 x 145 grids)
    NCEP FNL: 360 x 181 x 4 = 260640 byte (1.0 x 1.0; 360 x 181 grids)
    NCEP CFSR: 720 x 361 x 4 = 1039680 byte (0.5 x 0.5; lon x lat = 720 x 361 grids)
    JMA GSM (sfc - 100hPa): 720 x 361 x 4 = 1039680 byte (0.5 x 0.5; 720 x 361 grids)


3.1) wgrib2 ifile.grb2 -match ":HGT:" -no_header -ieee ofile.ieee
  ifile.grb2 からジオポテンシャル高度だけ切り出し,IEEE 形式 
  (wgrib2 のデフォルトは big-endian)
  で ofile.ieee に出力.
  !!!緯度方向の記録順序は,南から北に向かうので要注意!!!
  ※ GrADS でアクセスする形式.

  IEEE に準拠した big-endian code で出力される (IEEE の詳細は知らない) .
  Intel互換CPUを搭載した(little endian 系の) PCでも 
  big endian で出力されるため,PC UNIX (Linux, FreeBSD など)
  で使用したデータをスパコンなど(big endian系)に移動しても
  バイナリデータの読み出しが可能.

  私の場合,学生時代に Sun OS とPC-UN*X (FreBSD) の両方を同時期に使用していたため,
  PC-UN*X に完全移行(多分2000年頃)してからも,big-endian で統一している.
  バイナリ配布される気象データは big-endian の場合がある
  (big と little のどっちが多いか調べたこと無いけど,個人的経験では
  big-endian の方が多かったと思う).
  他者とのデータ交換などの事態を考慮すると,まぁ悪くない選択なんでしょう.


[ 3, 3.1 共通]
  BINARY 形式を読み出す Fortran90 sample code
  ** 例 JMA GPV GSM data の場合 (0.5 deg. 間隔, 720 x 361 grids) **
  (Intel Fortran の場合,コンパイルオプションに "-asume byterecl" を付ける)
  (Intel Fortran and big-endian 出力の場合,上に同じく "-convert big_endian" を付ける)
--- sample_read_GSM.f90 ----------------------------------------------
program main
  implicit none
  integer, parameter :: nx = 720, ny = 361
  integer, parameter :: max_rec = 10      ! dummy
  integer, parameter :: iunit = 21
  integer, parameter :: mx = 281, my = 261   ! 140E, 40N
  real, parameter :: xint = 0.5, yint = 0.5

  real(4) data(nx, ny, max_rec)
  real(4) xlon, ylat
  integer ix, iy
  integer rec_num
  character(len=255) :: ifile

  write(*, *) 'input full-path filename'
  read(*, *) ifile
  write(*, '(a, a)') 'Input filename is: ', trim(ifile)
  open(iunit, file=TRIM(ifile), recl=nx*ny*4,   &
        access='direct', form='unformatted')

  do rec_num = 1, max_rec
    read(iunit, rec=rec_num)    &
        ((data(ix, iy, rec_num), ix = 1, nx), iy = 1, ny)

! +++ Standard output at (140E, 40N)
    ix = mx  ;  iy = my   ! reference point
    xlon = xint * (ix - 1)
    ylat = -90. + yint * (iy - 1)   ! from South Pole to North Pole
    write(*, *)    &
        rec_num, xlon, ylat, data(ix, iy, rec_num)
  end do  ! rec

end program main
----------------------------------------------------------------------

4) wgrib2 ifile.grb2 -order we:ns -no_header -ieee ofile.ieee
  ifile.grb2 のデータを IEEE 形式でバイナリダンプ.
  ただし,緯度方向の記録順序をデフォルトの南から北向きでなく,
  北から南に向かう("-order we:ns" の部分)ように変更.

  !!以前からの wgrib ユーザだと,この事を忘れると痛い目にあうので注意!!
  普通の研究者なら,南北半球が逆転したデータを解析して
  気づかないって事はないでしょう.多分.
  ただ,研究慣れしていない卒論生などが,先輩からもらったプログラムをそのまま使って
  データ処理してたりすると,もしかしたらしばらく間違いに気づかないかも...
  これは極めて危険なので,要注意.


5) wgrib2 ifile.grb2 -d 137 -grib ofile.grb2
  ifile.grb2 の137番目のデータを GRIB 形式で ofile.grb2 に出力
  JMA GPVデータの場合は,-d 1.137 などと書く.
  要するに,wgrib2 ifile.bin を実行したときの第1カラムの文字列
  (コロン ":" がfield separator)を指定せよ,という事.


6) wgrib2 ifile.grb2 -match ":HGT:500 mb:" -grib ofile.grb2
  ifile.grb2 から 500hPa のジオポテンシャル高度だけ切り出し,
  GRIB-2 形式で ofile.grb2 に出力

  6.1) wgrib2 ifile.grb2 | grep ":HGT:" | grep ":500 mb:" | wgrib2 ifile.grb2 -i -grib ofile.grb2
    GRIB-1 ファイル & wgrib コマンドでの書式.
    ほぼ同じ形式で記述できるが,-o オプションが不要であることは忘れずに.

  6.2) GRIB-2 ファイルから,特定の変数のみを分離
    入力ファイルの例: 気象庁GPV MSM surface データ

    6.2.1)
      wgrib2 ifile.grb2 -match ":APCP:" -grib ofile_prec.grb2
      wgrib2 ifile.grb2 -not   ":APCP:" -grib ofile_other.grb2
        => この場合は,APCP (total precipitation) とそれ以外とを分離

    6.2.2)
      wgrib2 ifile.grb2 -match ":*CDC:" -grib ofile_cloud.grb2
      wgrib2 ifile.grb2 -not   ":*CDC:" -grib ofile_other.grb2
        => この場合は,cloud cover (LCDC, MCDC, HCDC, TCDC) とそれ以外とを分離

      自分の意図しない変数が混入しないようにするには,ワイルドカードでなく
      変数名を明記するとよい.そんな時は,正規表現を使う
      wgrib2 ifile.grb2 -match "(:LCDC:|:MCDC:|:HCDC:|:TCDC:)" -grib ofile_cloud.grb2


7) wgrib2 ifile.grb2 -d 116 -append -grib ofile.grb2
  ifile.grb2 から116番目のデータを取り出し、GRIB 形式で(すでに存在している)
  ofile.grb2 に追加
  ※ -append の位置に注意.-ieee と同様,-grib も引数(出力ファイル名)を
  伴うので,"-grib ofile.grb2" の部分はひとまとめにする.
  "-grib -append ofile.grb2" などと書くとエラーになる.
  ※ -append は 6) と併用すると使い勝手がよい.
  つまり,自分が使用する気象要素だけをオリジナルから
  抜きだして別ファイルに格納するなど,「自分専用データ」の作成が出来るようになる


8) wgrib2 ifile.grb2 -V
  ifile.grb2 のファイル情報を詳細表示.
  1レコードにつき複数行の情報があり,かなり冗長である.
  データのドキュメントが入手できない場合,これを見るだけでも
  ある程度の事がわかるの便利.

  8.1) wgrib2 ifile.grb2 -v
  8.2) wgrib2 ifile.grb2 -v2
    ifile.grb2 のファイル情報を詳細表示.
    -V と異なり,1レコードにつき1行の情報.
    知りたい変数が何行目かわかっているときは,探すのが簡単.

    記録変数の省略名(例えばTMPやRHなど)だけでなく,
    省略しない表記(Temperature や Relative humidity など)や数値の単位
    (TMPなら[K],RHなら[%]など)を標準出力する.
    「ちょっと知りたい情報」がわかる
    また,awk/grep/sed など,行単位で処理するコマンドと併用し,
    必要情報を選択するのには適切だろう.

----------------------------------------------------------------------
[Change logs]
* 2012-10-10: wgrib2 0.1.9.6a 対応版に修正.-append の記述ミスを修正
* 2012-08-14: 誤字の修正
* 2010-01-26: -order オプション関連を追加.
    => つい3日ほど前まで,緯度方向の記録順序を勘違いしていた.
      wgrib だと,GRIB 内部の形式通り,北から南向きの出力だったので,
      まさか wgrib2 でそれを逆向きにしているとは思いもよらなかった.
      JMA GPV MSM の850hPa T & RHをバイナリダンプして相当温位を計算,
      850 theta_e の水平分布図をGMTで書いて,初めて気づいた.
      「何で北の方が大きいんだ?」.そんなアホな.
      GrADS でのアクセスだと, ctl ファイルを一回書いてしまえば,
      緯度の記録順序など意識しないでよかったので,気づくのが遅れた...
      反省.

* 2010-01-12: -no_header オプション関連を修正.
    => 使い始めの頃,wgrib2 でダンプする時には,デフォルトでヘッダ情報
    (東西&南北グリッド数)が出力されないと勘違いしていた.

  tricks.wgrib2 の簡易日本語訳

個人的メモのテキストファイルtricks.wgrib2-jpを HTMLに include して掲載.

                                        Tricks for wgrib2     5/09

* wgrib2 の使い方 [早崎メモ]
* tricks.wgrib2 に対して,早崎による日本語注釈を追記.
* 追記箇所は行頭に asterisk 表示
*
*     文責: 早崎将光 (Kyushu Univ., Japan)
*     written by M. Hayasaki (Kyushu Univ., Japan)
*     last update: 2012-10-10 (Kyushu Univ., Japanese text only)
*     2nd release: 2010-01-05 (CEReS, Chiba Univ., Japanese text only)
*     1st edit: 2009-12-28 (CEReS, Chiba Univ., Japanese text only)

old: compatible with wgrib
new: wgrib2 only


(1) How do I conver the entire file to binary?
*  GRIB2ファイル全体をバイナリに変換するには?

    wgrib2 grib_file -bin out.bin

* -bin オプションの場合は,CPUアーキテクチャに依存したバイナリ.
* Intel 系CPU搭載のPCの場合, little-endian になる.
* big-endian 出力したい場合は -bin の代わりに -ieee オプションを使う.


(2) How do I get a verbose listing of the 20th record only?
*  20番目のレコードの詳細情報を表示するには

    wgrib2 -V -d 20 grib_file

* -V は,記録要素の詳細情報を表示.
* 変数の省略名だけでは意味が分からないとき,
* 記録要素の数値の範囲(最小値・最大値)を知りたいときなどに重宝する.
* 
* JMA GPV の global data の場合は, -d 1.20 などの表記にする.
* つまり, wgrib2 hoge.grib を実行したときの左端(コロン区切りの1列目)
* を指定すれば良い


(3) How do I extract the 20th and 30th records?
* 20番目から30番目のデータを切り出したい場合は?

    new: wgrib2 grib_file -match "(^20:^30:)" -bin binary_file
    new: wgrib2 grib_file -for "20:30:10" -bin binary_file
    old: wgrib2 grib_file | egrep "(^20:|^30:)" | wgrib2 -i grib_file -bin binary_file


(4) How do I extract the first 10 records as a grib file?
* 最初の10個分のデータを切り出したい場合は?

    new: wgrib2 grib_file -for 1:10 -grib new_grib_file
    old: wgrib2 grib_file | head -n 10 | wgrib2 -i grib_file -grib new_grib_file

(4') How do I extract records 34-66 from a file as a grib file?

* GRIB2 形式でデータを切り出したい (ここでは 34 - 66番目) 場合は?

    new: wgrib2 grib_file -for 34:66 -grib new_grib_file

    old: Here is an example of an awk filter.

        wgrib2 -s grib_file | awk '{if ($1 > 33 && $1 < 67) print $0}'
            FS=':' | wgrib2 -i grib_file -grib new_grib_file

    FS=':' implies that arguments are separated by colons.  As
    a result, the record number is the first argument ($1).
    The variable "$0" is the entire input line.  Isn't awk fun?

(4''') How do I extract records 10,12,19 from a grib file
* 10, 12, 19番目のデータを切り出したい場合は?

       wgrib2 old_grib -match '^(10|12|19):' -grib new_grib

    The ^ is a special regular-expression character that matches the
    start of the line. The () denotes an expression and the vertical bar
    is the OR operator.  See you book on regular expressions for details.
  

* 上記の例だけでは,有効性が理解しにくいだろうが,
* 正規表現を使えることで,多種多様な方法でデータの選択が可能になった.
* ただし,データの並び順でデータを切り出すのは,将来GRIB-2ファイルに新データ追加
* (新規気象要素や気圧面の追加)など生じた場合に,スクリプトを
* 修正せねばならない.
* パイプ通して変数名などを grep 切り出しする方式の方が,フォーマット変更に伴う
* スクリプト変更の頻度が少ないと思われる.
 
(5) Some NCEP polar stereographic/lambert conformal files say that dx=0 and dy=0.

    Some NCEP files encode the grid spacing but set a flag specifying that
    the grid spacing is not given.  In this case wgrib2 and wgrib display a grid
    spacing of zero.  You can set the flag correctly by


    wgrib2 -set_flag_table_3.3 48  in.grb -grib out.grb

(6) CMC files have some variables which don't have a name.

    wgrib2 doesn't include the local extentions from CMC.  The CMC grib 
    tables follows the NCEP grib table except where they don't.  So
    you may be able to get by by having wgrib2 use the NCEP tables.
    This can be done changing the center flag to NCEP (7).

       wgrib2 -set center 7 (CMC grib file)
       obsolete: wgrib2 -set_center 7 (CMC grib file)

    Warning, "-set center 7" changes the center of the in-memory
    grib message.  If you write out the grib message, it will now
    have the center set to 7!

    wgrib2 -set center 7 (CMC grib file) -match 'HGT' -grib hgt.grb
    Note that hgt.grb will be labelled as coming from NCEP (7).

    If you are using g2ctl, you can use the NCEP table by changing

       $wgrib='wgrib';

    to

       $wgrib='wgrib -set center 7';

    in the g2ctl source code.
    

(7) I get  *** ERROR: not handled by to_we_sn_scan ***
* numbering のミス? (6) が2箇所あったので,ここから番号を修正,
* 以後1ずつ増やした.

   The default mode of wgrib2 is to convert the grid to WE:SN order.  
The code to convert from the native order to WE:SN hasn't been tested 
or written.  This happens with grids with a variable number of lat or 
lon points.  In order to use this file, you have to use the file in 
raw-order mode.  I.e., use "-order raw" on the command line.  When 
you dump the data, the grid points will be output without any translation 
of the order.

     wgrib2 -order raw -d 1 grib_file -bin out.bin

(8) Getting more information
* 詳細な情報を得るには?

    The option -v and -v2 should be tried.  Some of the options give
    a more verbose output.  

* -v や -v2 を付けると,記録変数の省略名(例えばTMPやRHなど)だけでなく,
* 省略しない表記(Temperature や Relative humidity など)や数値の単位
* (TMPなら[K],RHなら[%]など)を標準出力する.
* GRIB-2 ファイルの中身をちょっと確認するときなどには便利.


(9) I am generating a text dump (CSV) and the size of the file is really large.
* テキストファイルにダンプしたんだけど,サイズが大きすぎるよ,これ...

    You can set grid point values to "undefined" and then they won't print out.

    wgrib2 grib_file -undefine out-box 30:40 -10:10 -csv out.txt

   The grid points outside of the box are set to undefined.  The -csv options
   tries to print the entire grid but finds only the values between 30N-40N and 
   10W-10E are defined.

* undefined を出力しないことで,ファイルサイズを節約できる.
*
* ... ただ,個人的見解ではあるが,そもそも客観解析データを
* テキストファイルに出力しなきゃ解析できない人は,
* もっと自分のデータ処理技術を高める努力をした方が良いだろう.
* 短期間ならCSVファイルに変換しても解析可能だろうが,
* 長期気候変動の研究のような莫大な量のデータ解析は,
* (現時点の計算機資源では)事実上不可能だろう.
* この場合には,例えばプログラミング言語を習得して,バイナリデータを
* 読み込み,必要な数値処理を施した上で結果のみをテキスト出力するとか,
* 計算機資源の節約・人間がおこなう作業の省力化の手法・技術を習得すべきだ.
*
* 技術習得に関して努力しない学生が多数派になると,
* 「プログラミングは出来ないが,温暖化予測結果を使って長期気候変動の研究をやりたい」
* などとのたまう,トンデモ大学生・大学院生が出てくる可能性がある.
* やりたきゃ勝手にやれ.莫大な量のテキストデータを,表計算ソフトでも使って
* シコシコ処理するがいい.
* 時間がかかるわりには得るものが少ないという事実に,そのうち直面するだろう.
*
* 幸いな事に,今のところそんな面白い人物を直接見たことは無い(はず).
* 将来も出会うことがありませんように...


(9') I am generating a text dump (CSV) and the size of the file is very large
     and I need all the points including undefined.

   The -ijbox will print out all the values within a box, including the undefined valued.

(10) I tried using the small_grib option but the files are bigger than the original.

   By default, The small_grib option writes a regional subset in grib1-packing.
   This is faster but produces larger files that the jpeg packing.  To make
   smaller files, use the -set_grib_type_type jpeg before the -grib_out option.

(11) I want to modify some existing grib files.  For example, I want to make
   sure the RH is positive.

   Suppose my file only has 1 record.

   1) Save the data in a text file, tmp.out.

     -sh-3.00$ wgrib2 test.grb  -no_header -text tmp.out
     1:0:d=2009030712:SPFH:2 m above ground:6 hour fcst:

   2) Change the data file, tmp.out, using the program of your choice.

   3) Use the import_text option to read in new data values and use the
      -grib_out to write the values to a grib file.  Note that you can
      not use the -grib option.

     -sh-3.00$ wgrib2 test.grb -no_header -import_text tmp.out -grib_out new.grb
     1:0:d=2009030712:SPFH:2 m above ground:6 hour fcst:


(12) My software won't handle the level "30-0 mb above ground".  How do
     I change the level to "15 mb above ground"?
* 自分が使ってるソフトでは,30-0 mb という高度情報を取り扱えないんだけど...
* 高度情報を 15 mb というように変更したいんだけど,どうすればいい?

     wgrib2 in.grb -if ":30-0 mb above ground" -set_lev "15 mb above ground"
          -fi -grib out.grb

* 上の例を見りゃわかるでしょ.


    Requires 5/09 version of wgrib2.

----------------------------------------------------------------------
* [以後は,オリジナル (tricks.wgrib2) には無い,早崎による独自メモ]

(a) ある特定のデータだけを除外した GRIB-2 ファイルを作るには?
    wgrib2 hoge.grib -not ':APCP:' -grib new_hoge.grib

* 変数名 "APCP" だけを除外した GRIB-2 ファイルを作成.
*
* JMA GPV の MSM surface データを使って GrADS ctl ファイルを
* 作ろうとした(g2ctl & gribmap 使用)際に,APCP (total precipitation) 
* があると正常動作しなかったため,上記データだけを除外した.

(a') ある特定のデータだけを「残した」 GRIB-2 ファイルを作るには?
    wgrib2 hoge.grib -match ':APCP:' -grib new_hoge_prec.grib


(b) 


  GRIB2 データへの GrADS による直接アクセス

g2ctl (perl script) と GrADS 付属の gribmap コマンドを使用.

JMA GPV data の場合

JMA GPVデータの情報は, JMA GPV メモ (hysk) も参照. See also 大気科学データ情報 > 現業気象データ.

私の場合は, g2ctl を /usr/local/bin/ 以下にコピー & chmod 755 して使用.

g2ctl  hogehoge.grib > hogehoge.ctl
gribmap -i hogehoge.ctl -0
  ※gribmap の最後のオプションは「ゼロ」です.0時間予報値(解析値)だけを使う場合.
  • Problems
  1. 格子間隔の異なるデータが混在していると, GrADS で正常表示されない? (JMA GSM データを使い,g2ctl & gribmap による ctl, idx ファイル作成した場合に確認)
  2. 時間降水量(1時間積算値)とそれ以外の気象要素が混在しているデータ (例: JMA MSM) を使って,gribmap を実行すると異常終了する (自分の使用方法に問題があるためかもしれない.詳細は後述)
    • ctl ファイルで options template を使い, 初期時刻ごとに分割された GRIB2 ファイルの idx を作成しようとして失敗
    • (以下は個人的推測.内部のコードを見たわけじゃないので, 間違っている可能性も十分ある.要注意) ある初期時刻(hour=00 とする) のデータファイルには, 毎正時の解析値・予報値と時間積算降水量が入っている. この時,ファイル内に含まれる時刻情報が2つ(hour=00 & hour=+01)存在する
    • ctl ファイル内の tdef の時間数を, 日数 x 24 で与えてしまうと,GRIB2 ファイルの時間数と一致 (ctl ファイルの指定が1時間不足)せず,データ不足とみなされて異常終了... といったところか?

NCEP FNL (GRIB2) の場合

JMA GPV と特に違いは無い(と思う). というより,現時点では違いを見つけられるほど私が使い込んでいない, というのが実状.

気象庁レーダーアメダス解析雨量

  • 気象業務支援センター販売のDVD,2006年以後のデータが GRIB-2 形式
  • g2ctl & gribmap を使った GrADS idx ファイル作成が出来ない. まだ原因究明してない
  • バイナリダンプはどうやら正常に出来ていそうなので, GRIB2 ファイルの直接アクセスは(とりあえず)断念. 見たい期間があれば,必要に応じてバイナリダンプする,という方法で当座は対応

NCEP CFSR

ごく一般的な GRIB2ファイル. 使用上の問題,特に無し. このデータに関する情報は, 長期再解析 # NCEP CFS 再解析, or CFS 再解析 メモ に記載.

上記以外の GRIB2 データ

今のところ(update 2016-02-28),上記以外で GRIB2 形式で配布しているデータセットを知らない. 他に存在するときには教えてください >> 皆様

wgrib2 サンプルスクリプト

 GRIB-2 から IEEE形式への変換

  • 対象スクリプト: grib2_to_bin(下に表示してるものと同一)
  • 私はこれを自分用バイナリ変換スクリプトとして,~/local/bin/ 以下に置いて使用.
  • 使い方: grib2_to_bin 入力ファイル 出力ファイル
#!/bin/sh
my_name=~/local/bin/grib2_to_bin
wgrib2=/usr/local/bin/wgrib2

if [ $# -lt 2 ]; then
  echo -e "** Script ${my_name} requires two arguments (input/output files with full-path). Stopped."
  echo -e "\t Usage: ${my_name} input_grib  output_bin"
  echo -e "\t Return code: 9"
  exit 9
fi

input_grib=$1
output_bin=$2

$wgrib2 $input_grib  -no_header -ieee  $output_bin > /dev/null
echo -e "*** Convert from GRIB-2 to big-endian binary w/o header."
echo -e "\t wgrib2 $input_grib  -no_header -ieee  $output_bin"

実際の使用例として, 気温データを温位に変換, grdmath の POW & MUL operator も参照. GRIB-2形式データをGMTで使う例として,細かいけど結構有用なノウハウを使っている(つもり).

 JMA GPV (MSM) 再アーカイブ

#!/bin/bash
# Make GrADS ctl files for 3-hourly meteorological variables
#
# Problem:
#   (NOT identified yet)
#
# Memo:
#
#                     last update: 2012-07-22
#                     2nd release: 2010-01-13
#                     1st release: 2010-01-05
source $HOME/bin/function/chk_dir_file
source $HOME/bin/function/get_dateinfo

#my_name=$PWD/$0
my_name=rearchive_MSM_pall.sh

ftp_scripts_path="(FTP root)/operational/JMA_GPV/scripts/"

### Set input/output path of data.
ipath_base=$HOME/reanal02/operational/JMA_GPV/anal
sfc_ipath_base=$HOME/reanal02/operational/JMA_GPV/anal
ctl_path=$HOME/reanal02/operational/JMA_GPV/anal/case_study
  chk_dir $ctl_path

if [ $# -lt 2 ]; then
  echo -e "***** Too short arguments. Stopped (code 9). *****"
  echo -e "\t Usage:  ./rearchive_MSM_pall.sh  \$syyyymmdd \$eyyyymmdd "
  exit 9
elif [ $1 -gt $2 ]; then
  echo -e "***** Start and end year is incorrect. Stopped (code 8). *****"
  echo -e "\t Usage:  ./rearchive_MSM_pall.sh  \$syyyymmdd \$eyyyymmdd "
  exit 8
fi

sdate=$1
edate=$2
  echo -e "\t Period for making ctl files: ${sdate} - ${edate}"
  echo -e "\t (These two arguments must be YYYYMMDD style (8-digit number)."

hr_int_prs=3
hr_int_sfc=1
  obs_per_day_sfc=`echo "24 / $hr_int_sfc" | bc -q`
  obs_per_day_prs=`echo "24 / $hr_int_prs" | bc -q`

## DEBUG
  echo -e "obs_per_day_sfc = $obs_per_day_sfc "
#exit

###for ccyy in $ccyy_list ; do

syyyy=${sdate:0:4}
eyyyy=${edate:0:4}

  strt_date="01Z01Jan${syyyy}"

if [ $sdate -lt 19000000   -o   $edate -lt 19000000 ]; then
  echo -e "***** Incorrect number of arguments. Stopped (code 7). *****"
  echo -e "\t \$1 or \$2 are too small. \$1 = $sdate ; \$2 = $edate"
  exit 7
fi


strt_date=`LANG=C; \date --date="${sdate}" +"00Z%d%b%Y"`
# Return $total_day (total number of days; see $HOME/bin/function/get_dateinfo)
return_total_days  ${sdate}  ${edate}
nobs_sfc=`echo "$total_day * $obs_per_day_sfc" | bc -q`
nobs_prs=`echo "$total_day * $obs_per_day_prs" | bc -q`

final_file=${ctl_path}/MSM_pall_${sdate}-${edate}_${hr_int_prs}hrly_anal.grib
index_file=${ctl_path}/`basename ${final_file} .grib`.idx
  chk_file ${final_file}

final_ctl=${ctl_path}/MSM_pall_${sdate}-${edate}_${hr_int_prs}hrly_anal.ctl

### Catalogue all pressure-level files into a yearly file.
yyyymmdd=$sdate
while [ $yyyymmdd -le $edate ]; do
  ccyy=`\date --date="${yyyymmdd}" +"%Y"`
  ccyymm=`\date --date="${yyyymmdd}" +"%Y%m"`
  target_path=${sfc_ipath_base}/${ccyy}/${ccyymm}
  daily_file=${target_path}/MSM_L-pall_${yyyymmdd}_3hrly_anal.grib

#  cat $daily_file >> ${final_file}
#  echo "cat $daily_file >> ${final_file}"
  wgrib2 -append $daily_file -GRIB ${final_file} > /dev/null
  echo "wgrib2 -append $daily_file -GRIB ${final_file}"

  yyyymmdd=`\date --date="${yyyymmdd} +1 day"  +"%Y%m%d"`
done    # yyyymmdd

cat > $final_ctl << EOF
dset ^`basename ${final_file}`
index ^`basename ${index_file}`
undef 9.999E+20
title JMA-MSM pressure level variables (3-hourly analysis; GRIB2)
*  produced by g2ctl v0.0.4o and manually modified by M. Hayasaki (Kyushu Univ.)
* (see ${my_name} under $ftp_scripts_path)
*
* [procedure for making GrADS ctl and idx files]
* step 1. Execute "g2ctl" using a sample file in the data directory.
*   ex. g2ctl MSM_pall_20090101_3hrly_anal.grib > hoge.ctl
* step 2. Edit ctl file
*   2.1.  Modify GrADS ctl filename (if you want)
*   2.2.  Set directory path (full-path) and date parameters (e.g., "%y4", "%m2", etc.)
*   2.3.  Append "template" in a "options" category
*   2.4.  Set number of times in a "tdef" category (e.g., 1-hourly, 365-day = 8760-times per common-year)
*   2.5.  Delete "prs" in a variable name (if you want)
* step 3. Catalogue all daily files into one file
* step 4. Execute "gribmap" command
*   ex. gribmap -i MSM_pall_y2009_3hrly_anal.ctl
*
* griddef=1:0:(241 x 253):grid_template=0: lat-lon grid:(241 x 253) units 1e-06 input WE:NS output WE:SN res 48 lat 47.600000 to 22.400000 by 0.100000 lon 120.000000 to 150.000000 by 0.125000 #points=60973:winds(N/S)

dtype grib2
***ydef 505 linear 22.400000 0.05
***xdef 481 linear 120.000000 0.062500
ydef 253 linear 22.400000 0.10
xdef 241 linear 120.000000 0.125000
tdef ${nobs_prs} linear ${strt_date} ${hr_int_prs}hr
zdef 16 levels 100000 97500 95000 92500 90000 85000 80000 70000 60000 50000 40000 30000 25000 20000 15000 10000
options pascals
*
vars 6
HGT    16,100  0,3,5 ** (1000 975 950 925 900.. 300 250 200 150 100) Geopotential Height [gpm]
RH    12,100  0,1,1 ** (1000 975 950 925 900.. 700 600 500 400 300) Relative Humidity [%]
TMP    16,100  0,0,0 ** (1000 975 950 925 900.. 300 250 200 150 100) Temperature [K]
UGRD    16,100  0,2,2 ** (1000 975 950 925 900.. 300 250 200 150 100) U-Component of Wind [m/s]
VGRD    16,100  0,2,3 ** (1000 975 950 925 900.. 300 250 200 150 100) V-Component of Wind [m/s]
VVEL    16,100  0,2,8 ** (1000 975 950 925 900.. 300 250 200 150 100) Vertical Velocity (Pressure) [Pa/s]
ENDVARS
EOF

### Make index (*idx) files
  cd ${target_path}
  gribmap -i $final_ctl -0
#  \mv -f `basename ${index_file}` ${ctl_path}/.

 NCEP CFSR 6-hourly の再アーカイブ

CISL RDA ds093.0より取得した, NCEP CFSv1 6-hourly (ファイル名の例: pgbhnl.gdas.1979010100.grb2) を,月別・要素別のGRIB-2形式ファイルに再編集するスクリプト. 37-level & 6-hourly のデータを1ヶ月分,1ファイルにまとめている (ファイルサイズ: 300 - 800 MB; 要素によりサイズが大きく異なる).

  • 要素: HGT (ジオポテンシャル高度), UGRD (東西風), VGRD (南北風), TMP (気温), SPFH (比湿), VVEL (鉛直p速度), STRM (流線関数), VPOT (速度ポテンシャル).
  • period = 1979-01-01 to 2011-03-31. 2011-04-01 以後は,アーカイブファイルの命名規則が変更されているので, 入力ファイル名の代入部分を改変せねばならない.
  • script path: ~/NCEP/CFSR/util/re_archive_CFSR_var_month.sh
    • Input: ${prefix}.${yyyymmddhh}.grb2 (ex. pgbhnl.gdas.2009101500.grb2)
    • Output: ${data_src}_${var}_${yyyymm}.grb2 (ex. CFSR_HGT_200910.grb2)
#!/bin/sh
#
# Re-archive NCEP CFSR (v1) dataset.
#   output filename: CFSR_${var}_${yyyymm}.grb2
#
#     var= HGT, UGRD, VGRD, ..., etc.
#
#       last update: 2012-11-02
#       1st release: 2012-10-10
#
#       written by M. Hayasaki (Kyushu Univ., Japan)
#
source $HOME/bin/function/chk_dir_file

data_src=CFSR

s_yyyy=1979
e_yyyy=2010

s_yyyy=2009   # TEST
e_yyyy=2010   # TEST

hh_list=" 00 06 12 18 "
mm_list=" 01 02 03 04 05 06 07 08 09 10 11 12 "
#mm_list=" 01 "

var_list=" HGT UGRD VGRD TMP SPFH VVEL   STRM VPOT "
#var_list=" STRM VPOT "
#var_list=" HGT "

### 37-level in total
level_list=" 1000 975 950 925 900 875 850 825 800 775   \
    750 700 650 600 550 500 450 400 350 300  \
    250 225 200 175 150 125 100  70  50  30  \
     20  10   7   5   3   2   1  "

ipath_base=/work3/hayasaki/reanal/CFSR/org/6hrly
opath_base=/work23/hayasaki/reanal/CFSR/grib/6hrly/atmos

prefix=pgbhnl.gdas

for var in $var_list ; do
  opath=${opath_base}/${var}
    chk_dir ${opath}

yyyy=$s_yyyy
while [ ${yyyy} -le ${e_yyyy} ]; do
  ipath=${ipath_base}/${yyyy}

  for mm in $mm_list ; do
    yyyymm=${yyyy}${mm}
    s_yyyymmdd=${yyyymm}01
    e_yyyymmdd=`\date --date="${yyyymm}01 +1 month -1 day" +"%Y%m%d"`

    ofile=${opath}/${data_src}_${var}_${yyyymm}.grb2
    echo "output (GRIB2) = $ofile"
      chk_file $ofile

    yyyymmdd=${s_yyyymmdd}
    while [ ${yyyymmdd} -le ${e_yyyymmdd} ]; do
      dd=${yyyymmdd:6:2}
      for hh in $hh_list ; do
        yyyymmddhh=${yyyymmdd}${hh}
        ifile=${ipath}/${prefix}.${yyyymmddhh}.grb2

        for level in $level_list ; do
          wgrib2 ${ifile} -match ":d=${yyyymmddhh}:${var}:${level} mb:anl:" -append -grib ${ofile} > /dev/null
        done    # level
      done    # hh
      yyyymmdd=`\date --date="${yyyy}${mm}${dd} +1 day" +"%Y%m%d"`
    done    # yyyymmdd
  done    # mm
  yyyy=`expr $yyyy + 1`
done  # yyyy

done  # var

wgrib2 & GRIB-2 関連リンク

更新履歴

Date Changes
2016-02-28 更新履歴の追加,CFS 関連の情報追加, リンク切れの修正など.
2010-01-20 初稿作成.