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

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

[1.0] はじめに

前回,みなさんには地球惑星科学分野における「知の集積」の役割を担う数値モデルの一つのDCPAM を動かしてもらいました.
ここではその計算データを Dennou Ruby Project で開発されているツール群を用いて解析し,描画することで(目で見て)分かりやすい形にしてみましょう.ちなみに,人の目で見て分かりやすい形にすることを「可視化」と言います.

[1.0.1] 事前準備

今回も実技時間内での作業は 1 つのアカウントで行い,適宜入力する人を交代して進めてください.他のアカウントでも同じ作業を行ないたい場合には授業時間外にやってください.

まず,インストールされているパッケージに更新が無いか確認を行ってください.
(この作業の目的は,第 8 回 「0. 今後, 情報実習を受講するにあたってのお願い 」を参照)

$ sudo apt-get update
$ sudo apt-get upgrade

[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 ファイルの中身を見ておくことにします. まず実験を行なったディレクトリに行ってください. そして, 以下のようにしてファイルの中身を見てください.

$ cd ~/dcpam/dcpam5-exp/Earth-exp/
$ 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 では各行にコメントをつけてあります. ファイルの中を見て各行でどのようなことをやっているかを確認してください.
$  less zonalmean_3dim_snapshot.rb

いまは 2 日目の瞬間値の図 (スナップショットと言います) を書いてみましたが,これからは zonalmean_3dim_snapshot.rb を編集して, 時間を変更した図も作ってみましょう.
以下の三つについて図を作ってください.

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

image/Temp_zonalmean_last.png
図2: 1095 日目の温度の経度平均分布

図1 の 2 日目の図とは異なり温度分布が形成されていることがわるでしょう. 地表付近では, 低緯度で高温・高緯度で高温となっていることがわかると思います. 赤道と極の温度差はおよそ 70K になっていますね. また, 熱帯域では地表から上空に向かって高度を高くしていくとσ =0.1 付近 (気圧にしておよそ 100hPa, 高度にしておよそ 15km) で 温度が極小になっています. これが対流圏界面と呼ばれる領域です.

image/Temp_zonalmean.png
図3: 3 年目の 1 年平均をとった温度の経度平均分布

1 年平均をしたために, 図2 に比べて南北対称なパターンになっていますね.

image/Temp_zonalmean_summer.png
図4: 3 年目の夏季平均をとった温度の経度平均分布

図4 では, 図3 と比べて南極の上空における低温領域が目立ちます. この場合で南極上空で温度が下がる理由はわかりますか?

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

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

image/U_last.png
図5: 1095 日目の東西風の経度平均分布

図5 では, 緯度 40 度, σ =0.2 を中心とした領域で東西風が正 (西風. 西から東に向かって吹く風) で強くなっています. これがジェット気流と呼ばれるものです.

image/U_zonalmean.png
図6: 3 年目の1 年平均をとった東西風の経度平均分布

image/U_zonalmean_summer.png
図7: 3 年目の夏季平均をとった東西風の経度平均分布

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

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

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

[1.4] 水に関する量を作図してみよう

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

まず, horizontalmap_2dim_snapshot.rb をダウンロードして実行してみてください. このスクリプトは 3 年目の最後の瞬間の降水量の経度緯度分布の図(図8)を描くものです.

$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2017/0721/practical/horizontalmap_2dim_snapshot.rb

image/PRCP_last.png
図8: 1095 日目の降水量の経度緯度分布

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

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

image/PRCP_mean.png
図9: 3 年目の1 年平均をとった降水量の経度緯度分布

image/PRCP_mean_summer.png
図10: 3 年目の夏季平均をとった降水量の経度緯度分布

次に,降水量の東西平均 (経度方向の平均) の図も作ってみましょう. そのためのスクリプト zonalmean_2dim_snapshot.rb をダウンロードして実行してください.

image/PRCP_lonmean_last.png
図11: 1095 日目の降水量の経度平均分布

線グラフの図を描くことができたでしょうか? それができたら, も作ってみてください.

image/PRCP_lonmean_mean.png
図12: 3 年目の1 年平均をとった降水量の経度平均分布

上で描いた経度緯度分布 (図9) では海陸分布の影響が強く出ていますが, 図12 ではその影響を目立たなくなります. その分, 降水量の緯度変化のおおまかな様子が よくわかるようになります. 赤道付近と中緯度域 (緯度にして 40 度から 50 度)の領域で降水量が大きくなるということがわかると思います.

image/PRCP_lonmean_mean_summer.png
図13: 3 年目の夏季平均をとった降水量の経度平均分布

更に,緯度方向にも平均をして降水量の水平平均 (経度方向にも緯度方向にも平均) の図を作ってみましょう. そのためのスクリプト globalmean_2dim_timeseries.rb をダウンロードして実行してください.

image/PRCP_globalmean.png
図14: 3 年目の水平平均をとった降水量の時間変化

線グラフの図を描くことができたでしょうか?

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

image/vapflux_mean.png
図15: 3 年目の 1 年平均をとった蒸発量の経度緯度分布

降水の経度緯度分布(図9) とは異なり熱帯の海洋上で蒸発量が大きくなっていることがわかります. おおざっぱには, 蒸発量は表面温度が高いほど大きくなるためです.

image/vapflux_mean_summer.png
図16: 3 年目の夏季平均をとった蒸発量の経度緯度分布

image/vapflux_last.png
図17: 1095 日目の蒸発量の経度緯度分布

image/vapflux_zonalmean.png
図18: 3 年目の1 年平均をとった蒸発量の経度平均分布

image/vapflux_zonalmean_summer.png
図19: 3 年目の夏季平均をとった蒸発量の経度平均分布

image/vapflux_globalmean.png
図20: 3 年目の水平平均をとった蒸発量の時間変化

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

image/PE_last.png
図21: 1095 日目の降水と蒸発の差の経度緯度分布

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

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

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


最終更新日: 2017/07/21 渡辺 健介 更新 Copyright © 2000-2017 inex