数値データの取り扱いの初歩

  1. 数値データの取り扱いの初歩

ここでは Dennou Ruby Project で開発されているツール群を用いて 解析・描画を行ないます.

今回も実技時間内での作業は 1 つのアカウントで行なってください. 他のアカウントでも同じ作業を行ないたい場合には授業時間外に やってください.

[1.1] Dennou Ruby Project のツールとは

Dennou Ruby Project のツールは オブジェクト指向スクリプト言語の Ruby を使って 作られています.

Ruby は日本人のまつもとひろゆき氏によって開発されており, 日本語の書籍も多く出版されています. 詳しくはRuby のホームページ などを参照してください. Ruby はオブジェクト指向に基づいて設計された言語です. 非常に粗っぽい説明をすれば, プログラムの世界におけるオブジェクトとは, 「データ」と手続きを一体にしたようなものです. それぞれのデータのタイプに応じて手続きを定めるというのを 基本にしてプログラミングを行ないます. なお, ここまで「手続き」と呼んでいたものは Ruby の世界では メソッドと呼ばれます.

ruby を使ったスクリプトの例としてシェルスクリプトの課題 (INEX 第 3 回, 04/28) の解答となる ruby スクリプトを挙げます. こちらを見て各自で作成したシェルスクリプトと比較してみてください. だいぶ様子が違うのではないでしょうか.

今回の実習で使う Dennou Ruby Project のツールのうち, 中心となるのはGPhys というものです. GPhys については GPhys のホームページを参照してください. ここにある GPhys のチュートリアルを一通りやると GPhys の基礎を学ぶことができます.

ここでは, GPhys のチュートリアルの中の以下の部分を実際にやって, GPhys と Ruby に慣れることにしましょう.

[1.2] 計算結果の netCDF ファイルの中身を確認する

解析・描画の作業を開始する前に, 使用する netCDF ファイルの中身を見ておくことにします. まず実験を行なったディレクトリに行ってください. そして, 以下のようにしてファイルの中身を見てください.

$ ncdump Temp.nc | less

まずデータの軸変数を見ておきましょう. Temp.nc の variables: の項目を見てください. 軸に関する変数の中には以下のものがあります.

次に, time の値を確認してください.

time = 0, ......, 1095
となっていれば 3 年目まで計算ができています. ここに並んでいる数字はデータ出力された時刻を表しています. ここでは時刻の単位として「日」が使われているので 1095 日分, つまり 3 年分のデータが格納されていることになります.

[1.3] 作図スクリプトを作成して大気の状態を眺める

前回, irb を使って図を 1 枚かきました. 今回はスクリプトを使って解析描画を行なってみましょう. zonalmean_3dim_snapshot.rb は前回 irb を使って行なったものと同様の内容をスクリプトに保存したものです. まず, このスクリプトをダウンロードして実行できるか確認しましょう. とやってください. zonalmean_3dim_snapshot.rb では各行にコメントをつけてあります. ファイルの中を見て各行でどのようなことをやっているかを確認してください.

ここまでは 2 日目の瞬間値の図 (スナップショットと言います) を書いてきましたが, zonalmean_3dim_snapshot.rb を編集して, 時間を変更した図も作ってみましょう.

3 年目の 1 年平均をとるには zonalmean_3dim_snapshot.rb のGGraph.tone の行を以下のように変更します.
GGraph.tone( gphys.mean('lon').cut('time'=>731..1095).mean('time') )
とします.

今度は, 違う変数の図を書いてみましょう. 東西風のデータ U.nc を使って次の図を描いてみてください.

余裕があれば, 南北風 V.nc, 鉛直風 SidDot.nc, 水蒸気量 QH2OVap.nc についても同様の図を描いてみましょう.

なお, 作成した図をファイルに保存するには, スクリプト中において

DCL.gropn(2)
と変更します. これでスクリプトを走らせると, 画像の pdf ファイルが生成されます. ただし, この pdf ファイルは画像が横倒しになってしまって いますので, 回転させる必要があります. 画像を回転させ, 更に png 形式に変換するには以下のようにします.
$ convert -rotate 90 dcl.pdf Temp_zonalmean.png

また, dcl.pdf は上書きされてしまうので画像を保存しておきたい場合には, 毎回 convert してファイル名を変えるようにしてください.

[1.4] 水に関する量をいくつかかいてみる

降水量と蒸発量のデータを使って簡単なデータ処理をやってみましょう.

まず, horizontalmap_2dim_snapshot.rb をダウンロードして実行してみてください. このスクリプトは 3 年目の最後の瞬間の降水量の経度緯度分布の図を描くものです.
この図は緯度経度分布を示す図になっているので, 海岸線もプロットされています. おおまかには, 降水量は赤道で大きくなっています. これは赤道上で上昇流が生じ雲が形成されるためです. また, 日本付近でも降水量が大きくなっています. これは低気圧に伴う雨です. この図はとある瞬間の図に過ぎませんが, 以下で作成する時間平均図でも同様の傾向が現れているのかよく見てみてください.

降水量に関する別の図も作ってみましょう. 以下の平面分布の図を作ってください.

降水量の東西平均 (経度方向の平均) の図も作ってみましょう. そのためのスクリプト zonalmean_2dim_snapshot.rb をダウンロードして実行してください. 線グラフの図を描くことができたでしょうか? それができたら,

も作ってみてください.

更に緯度方向にも平均をして降水量の水平平均 (経度方向にも緯度方向にも平均) の図を作ってみましょう. そのためのスクリプト globalmean_2dim_timeseries.rb をダウンロードして実行してください. 線グラフの図を描くことができたでしょうか?

では, ここまでに用いたスクリプトを改変して, 表面からの蒸発量の図を描いてみましょう. 蒸発量のデータファイルは SurfH2OVapFlux.nc です. このファイルの中には SurfH2OVapFlux という変数名で蒸発量が格納されています. 蒸発量に関して, 以下の図を何枚か作ってみてください.

最後に, 降水と蒸発の差 (ここでは P-E と表します) を計算してそれを図にしてみましょう. ここでは, 水平分布の図を作ってみます. horizontalmap_2dim_snapshot.rb を更に改変しましょう. 降水量の読みこみ先を gphys_prcp に変更した上で, 蒸発量をの読みこみ先を gphys_h2ovapflux とする設定を追加しましょう. 更に, スクリプト内で gphys_prcp - gphys_h2ovapflux を計算して, 3 年目の最後の瞬間の P-E の平面分布の図を描けるようにしてください.

[1.5] 課題に向けての準備

今日はレポート課題が出題されます. 内容は P-E に関する以下の図を作成し, それらの図に関する記述を行なうというものです.

この課題に取り組むための準備として, 前回の最後から今回にかけておこなった 3 年積分のデータを各自のホームディレクトリにコピーしてください.


最終更新日: 2017/07/14 石渡 正樹 作成 Copyright © 2000-2017 inex