最終改訂: 2005 年 03 月 25 日
DCCHART プロジェクトでアーカイブする NCEP/NCAR をソースとするデータおよび サンプル図表の作り方について解説する.
集めるデータは以下のとおり.
NCEP では公開データにエラーが見つかった場合, 随時修正している. そのため, ダウンロードした時期により, エラーを含む割合が変わる. 以下, どのファイルがいつ頃ダウンロードされたものか記述する.
まず CDC の web サイトからオリジナルの netCDF データを取得する.
ダウンローダには wget を利用するとよい. ORG_data/ 中にある download.txt に欲しいデータの URL を 書いておき,
% wget -bnv -i download.txt
とすると, ログアウトしてもバックグラウンドジョブとして続行してくれる. なお, ORG_data/ 以下にある Makefile にて上記コマンドを設定してあるので 単に make と打っても良し.
export RUBYLIB=/GFD_Dennou_Club/ftp/arch/dcchart/atmos_global/bin
daily データは, ORG_data/ 以下のオリジナルデータを util/netcdf_cutter.rb を用いて月毎に切り出したものを指す. それぞれ 1 つのファイルに 1 月分のデータが格納されるようにしている.
NCEP/NCAR データは 約 50 年分あるので, いちいち SIGEN ファイルや Makefile を書くのはうっとうしい. DCCHART ではある程度自動化するように 以下の作業を行う.
まず daily データを格納するディレクトリを作成する. ディレクトリ名は "物理量.daily.NCEP" とする. 以降, "newphys" という物理量のデータに関して 作業することにする.
% mkdir NEWPHYS.daily.NCEP
作成したディレクトリに移動する.
% cd NEWPHYS.daily.NCEP
ついで Makefile および SIGEN ファイルの雛型を作成する. これらの雛形ファイルを後述のスクリプトを用いて処理することで, 複数年のサブディレクトリおよび Makefile, SIGEN ファイルが生成される.
daily データ作成用 Makefile の雛型例
# Makefile for newphys.{year}.daily # # 2004/05/06 D. Tsukahara ## make daily-NEWPHYS nc. ## PHYS = newphys # 基本的に書き換えはここだけ! FILE = $(PHYS). YEAR = {year} # 後述のスクリプトによって置換( ex. 2002 ) COMMAND_MKNC = ruby ../../util/netcdf_cutter_NCEP.rb COMMAND_RMAT = ruby ../../bin/gtattr.rb ATTR1 = actual_range ATTR2 = valid_range all: nc attr nc: $(COMMAND_MKNC) ../../ORG_data.NCEP/$(FILE)$(YEAR).nc attr: $(COMMAND_RMAT) --delete $(ATTR1) $(PHYS) ./*.nc $(COMMAND_RMAT) --delete $(ATTR2) $(PHYS) ./*.nc
daily データサブディレクトリ用 SIGEN ファイル の雛型例
Subject: NCEP Re-Analysys 新物理量(NEWPHYS) {year} 年 6-hourly Maintainer: 作業者名 Update: 編集日 Description: relative:ORG_data に格納される NCEP のオリジナルデータを月ごとに分割した データ. 詳細は relative:../ORG_data.SIGEN および relative:../../NCEP.SIGEN 参照のこと. 履歴 編集日 作業者名
上記の雛形ファイルをそれぞれ NEWPHYS.NCEP.Makefile.hinagata, NEWPHYS.NCEP.SIGEN.hinagata という名前で保存する.
上記の雛形ファイルを元にサブディレクトリ, Makefile, SIGEN ファイルを生成するには util/make-dcchart-dir.rb を用いる. 1980 年から 1999 年までのサブディレクトリ, Makefile, SIGEN ファイルをカレントディレクトリ以下に 生成したい場合,
% ls ./ NEWPHYS.daily.NCEP.Makefile.hinagata NEWPHYS.daily.NCEP.SIGEN.hinagata % make-dcchart-dir.rb --range 1980:1999 ./
とする. すると
% ls ./ NEWPHYS.1980.daily.NCEP NEWPHYS.1990.daily.NCEP NEWPHYS.1980.daily.NCEP.SIGEN NEWPHYS.1990.daily.NCEP.SIGEN NEWPHYS.1981.daily.NCEP NEWPHYS.1991.daily.NCEP NEWPHYS.1981.daily.NCEP.SIGEN NEWPHYS.1991.daily.NCEP.SIGEN NEWPHYS.1982.daily.NCEP NEWPHYS.1992.daily.NCEP NEWPHYS.1982.daily.NCEP.SIGEN NEWPHYS.1992.daily.NCEP.SIGEN NEWPHYS.1983.daily.NCEP NEWPHYS.1993.daily.NCEP NEWPHYS.1983.daily.NCEP.SIGEN NEWPHYS.1993.daily.NCEP.SIGEN NEWPHYS.1984.daily.NCEP NEWPHYS.1994.daily.NCEP NEWPHYS.1984.daily.NCEP.SIGEN NEWPHYS.1994.daily.NCEP.SIGEN NEWPHYS.1985.daily.NCEP NEWPHYS.1995.daily.NCEP NEWPHYS.1985.daily.NCEP.SIGEN NEWPHYS.1995.daily.NCEP.SIGEN NEWPHYS.1986.daily.NCEP NEWPHYS.1996.daily.NCEP NEWPHYS.1986.daily.NCEP.SIGEN NEWPHYS.1996.daily.NCEP.SIGEN NEWPHYS.1987.daily.NCEP NEWPHYS.1997.daily.NCEP NEWPHYS.1987.daily.NCEP.SIGEN NEWPHYS.1997.daily.NCEP.SIGEN NEWPHYS.1988.daily.NCEP NEWPHYS.1998.daily.NCEP NEWPHYS.1988.daily.NCEP.SIGEN NEWPHYS.1998.daily.NCEP.SIGEN NEWPHYS.1989.daily.NCEP NEWPHYS.1999.daily.NCEP NEWPHYS.1989.daily.NCEP.SIGEN NEWPHYS.1999.daily.NCEP.SIGEN NEWPHYS.daily.NCEP.Makefile.hinagata NEWPHYS.daily.NCEP.SIGEN.hinagata
サブディレクトリ名はカレントディレクトリから判断, 名づけられる. 既にディレクトリや Makefile, SIGEN ファイルが存在する場合は何もしない.
daily ファイルを作成する場合は,各ディレクトリにおいて,
% make
を実行することで, 作成される. ファイルを消去する際は
% make ncclean
とすること. 詳細は netcdf_cutter.rb, Makefile を参照のこと.
複数年分のファイルを一度に生成したい場合がほとんどである. カレントディレクトリに以下のような Makefile を用意しておくとよいだろう.
# Makefile for newphys.daily # # 2004/04/28 D. Tsukahara ## make daily-NEWPHYS nc. ## PHYS = NEWPHYS all: 1940 1950 1960 1970 1980 1990 2000 200?: 2000 2001 2002 2003 199?: 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 198?: 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 197?: 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 196?: 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 195?: 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 194?: 1948 1949 ## each year 2003: cd $(PHYS).$@.daily.NCEP; make; cd ../ 2002: cd $(PHYS).$@.daily.NCEP; make; cd ../ 2001: cd $(PHYS).$@.daily.NCEP; make; cd ../ ...
monthly-mean データは, daily データに util/mkmean-nc_NCEP.rb を作用させて生成される. データ作成のコマンドは各ディレクトリにおいてある Makefile に記述されている. monthly-mean ファイルを作成する場合は,各ディレクトリにおいて,
% make ncall
を実行することで, 作成される. サンプル図表の絵は
% make fig
で生成される. 単に make した場合は, ファイルと絵の双方が生成される. 詳細は mkmean-nc.rb, Makefile を参照のこと.
オリジナルデータより計算される量は, bin/gt*.rb により計算される. どの物理量がどのスクリプトによって生成されたかは, 各ディレクトリ以下の Makefile を参照のこと.
NCEP の actual_range, valid_range はパックを展開した後に上記範囲を比較するように 定められている.
しかし, ruby-netcdf の仕様は パックしたまま(展開前に) 値を比べ有効値か否かを判断 する仕様になっている. よってほとんどの場合, 全てのグリッドが欠損値扱いされてしま う.
これを防ぐため, NCEP 用の作業メソッドを定義している libgphys-n.rb では, scaling _get の仕様を変え, 展開済みのデータにおいて値を比較するようにしてある.
ちなみに NCEP の valid_range, actual_range は非常に狭い範囲を定義しているので, いずれにしろ gtool4 規約化するときは属性を削除している.
GPhys のバージョンを 0.3.3 以上から, 外部から GPhys 内部における NetCDFVar 等のメソッドを変更することが出来ないようである. DCCHART 関連の作業で困るのは get_with_miss_and_scaling を NCEP のデータ方式に変更できないこと, すなわち 欠損値を正しく扱えないことである. とりあえずの対策として仕方無しに, netcdf_miss.rb 中のメソッドを libgphys-n.rb に定義したメソッドを読むよう直接書き換えることにした. 具体的には get_with_miss_and_scaling を get_with_miss_and_scaling2 という fix したメソッドを読むようにした. 仕様のないこととはいえ, 非常に気持ち悪い. 良い解決策がないか考える.
欠損値を含んだデータの微分は激しく注意が必要である. それは, 定義される格子のとなりの値も参照するため, 元のデータの 欠損領域よりも広い範囲で欠損となるからである.
DCCHART で計算する EP_Flux は欠損なしの風速, 温度データから計算し, その結果に地表面マスクをかぶせることにしている. その理由は 特に中緯度において, 欠損となる格子が多くなり, その平均的状態としての 値が極めてよろしくないからである.
1989/01 月の温度, 熱帯域の 200 hPa より高高度の領域で, TOVS のデータ抜けと見られるエラーが 存在するらしい. (情報元: http://www.jreap.org/results/tseq.html)
その他の物理量や年に関しても同様のエラーが存在するやも知れない. NCEP のサイトの Problem list を参照するなどして押さえておくこと.