前回,みなさんには地球惑星科学分野における「知の集積」の役割を担う数値モデルの一つのDCPAM を動かしてもらいました.
ここではその計算データを Dennou Ruby Project で開発されているツール群を用いて解析し,描画することで(目で見て)分かりやすい形にしてみましょう.ちなみに,人の目で見て分かりやすい形にすることを「可視化」と言います.
今回も実技時間内での作業は 1 つのアカウントで行い,適宜入力する人を交代して進めてください.他のアカウントでも同じ作業を行ないたい場合には授業時間外にやってください.
まず,インストールされているパッケージに更新が無いか確認を行ってください.
(この作業の目的は,第 8 回 「0. 今後, 情報実習を受講するにあたってのお願い 」を参照)
$ sudo apt-get update |
$ sudo apt-get upgrade |
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 に慣れることにしましょう.
解析・描画の作業を開始する前に, 使用する netCDF ファイルの中身を見ておくことにします. まず実験を行なったディレクトリに行ってください. そして, 以下のようにしてファイルの中身を見てください.
$ cd ~/dcpam/dcpam5-exp/Earth-exp/ $ ncdump Temp.nc | less |
次に, time の値を確認してください.
time = 0, ......, 1095 |
$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2017/0721/practical/zonalmean_3dim_snapshot.rb |
$ chmod 755 zonalmean_3dim_snapshot.rb |
$ ./zonalmean_3dim_snapshot.rb |
$ less zonalmean_3dim_snapshot.rb |
いまは 2 日目の瞬間値の図 (スナップショットと言います) を書いてみましたが,これからは zonalmean_3dim_snapshot.rb を編集して, 時間を変更した図も作ってみましょう.
以下の三つについて図を作ってください.
gphys = GPhys::IO.open('Temp.nc', 'Temp').cut('time'=>0..1095) : GGraph.tone( gphys.mean('lon').cut('time'=>731..1095).mean('time') ) |
図1 の 2 日目の図とは異なり温度分布が形成されていることがわるでしょう. 地表付近では, 低緯度で高温・高緯度で高温となっていることがわかると思います. 赤道と極の温度差はおよそ 70K になっていますね. また, 熱帯域では地表から上空に向かって高度を高くしていくとσ =0.1 付近 (気圧にしておよそ 100hPa, 高度にしておよそ 15km) で 温度が極小になっています. これが対流圏界面と呼ばれる領域です.
1 年平均をしたために, 図2 に比べて南北対称なパターンになっていますね.
図4 では, 図3 と比べて南極の上空における低温領域が目立ちます. この場合で南極上空で温度が下がる理由はわかりますか?
今度は, 違う変数の図を書いてみましょう. 東西風のデータファイル U.nc (東西風の変数名: U )を使って次の図を描いてみてください.
図5 では, 緯度 40 度, σ =0.2 を中心とした領域で東西風が正 (西風. 西から東に向かって吹く風) で強くなっています. これがジェット気流と呼ばれるものです.
なお, 作成した図をファイルに保存するには, スクリプト中において
DCL.gropn(2) |
$ convert -rotate 90 dcl.pdf Temp_zonalmean.png |
降水量と蒸発量のデータを使って簡単なデータ処理をやってみましょう.
まず, horizontalmap_2dim_snapshot.rb をダウンロードして実行してみてください. このスクリプトは 3 年目の最後の瞬間の降水量の経度緯度分布の図(図8)を描くものです.
$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2017/0721/practical/horizontalmap_2dim_snapshot.rb |
図8 は緯度経度分布を示す図になっているので, 海岸線もプロットされています.おおまかには, 降水量は赤道で大きくなっています. これは赤道上で上昇流が生じ雲が形成されるためです. また, 日本付近でも降水量が大きくなっています. これは低気圧に伴う雨です. 図8 はとある瞬間の図に過ぎませんが, 以下で作成する時間平均図でも同様の傾向が現れているのかよく見てみてください.
また降水量に関する別の図も作ってみましょう. 以下の平面分布の図を作ってください.
次に,降水量の東西平均 (経度方向の平均) の図も作ってみましょう. そのためのスクリプト zonalmean_2dim_snapshot.rb をダウンロードして実行してください.
上で描いた経度緯度分布 (図9) では海陸分布の影響が強く出ていますが, 図12 ではその影響を目立たなくなります. その分, 降水量の緯度変化のおおまかな様子が よくわかるようになります. 赤道付近と中緯度域 (緯度にして 40 度から 50 度)の領域で降水量が大きくなるということがわかると思います.
更に,緯度方向にも平均をして降水量の水平平均 (経度方向にも緯度方向にも平均) の図を作ってみましょう. そのためのスクリプト globalmean_2dim_timeseries.rb をダウンロードして実行してください.
では, ここまでに用いたスクリプトを改変して, 表面からの蒸発量の図を描いてみましょう. 蒸発量のデータファイルは SurfH2OVapFlux.nc です. このファイルの中には SurfH2OVapFlux という変数名で蒸発量が格納されています. 蒸発量に関して, 以下の図を何枚か作ってみてください.
降水の経度緯度分布(図9) とは異なり熱帯の海洋上で蒸発量が大きくなっていることがわかります. おおざっぱには, 蒸発量は表面温度が高いほど大きくなるためです.
最後に, 降水と蒸発の差 (ここでは P-E と表します) を計算してそれを図にしてみましょう. ここでは, 水平分布の図を作ってみます. horizontalmap_2dim_snapshot.rb を更に改変しましょう. 降水量の読みこみ先を gphys_prcp に変更した上で, 蒸発量をの読みこみ先を gphys_h2ovapflux とする設定を追加しましょう. 更に, スクリプト内で gphys_prcp - gphys_h2ovapflux を計算して, 3 年目の最後の瞬間の P-E の平面分布の図を描けるようにしてください.
今日はレポート課題が出題されます. 内容は P-E に関する以下の図を作成し, それらの図に関する記述を行なうというものです.
最終更新日: 2017/07/21 渡辺 健介 更新 | Copyright © 2000-2017 inex |