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

  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 の基礎を学ぶことができます.

[1.2] netCDF ファイルの中身を見る

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

$ ncdump Temp.nc | less

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

このようにして netCDF ファイルの中身を確認することができます. 中身がわからなくなってしまった netCDF データについては, メタデータを確認するようにしましょう.

では, 次に温度のデータの軸を確認しましょう. Temp.nc の variables: の項目を見てください. 軸に関する変数の中には以下のものがあります.

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

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

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

今度は, 違う変数の図を書いてみましょう.

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

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

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

まず, 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 の平面分布の図を描けるようにしてください.

上記ができたら, 以下の P-E に関する図を作ってください.

[1.6] 課題に向けて

季節ごとの図を作ってみる?

最終更新日: 2017/07/14 石渡 正樹 2017年度用に改訂 Copyright © 2000-2017 inex