GrADS (Grid Analysis and Display System)は,気象・気候の分野で用いられてきた,グリッド解析表示システム(ソフト)です.
(GrADS 本家サイト:http://cola.gmu.edu/grads/)
格子点データ(大気再解析データや数値シミュレーションの出力データなど)を特に地図上に作図するために用いられます.等値線等に加えて地図を容易に描画する事が出来,全球スケールの気象を扱う分野で広く使われています.
(同様の目的に使えるソフトウェア・ツールはGrADS以外にも複数存在しています.このようなソフトウェアなしに地図付の図を描画するのは非常に大変です.想像するのが難しいかもしれませんが,ソフトウェアなしに等値線を描画する事自体,とても大変です.興味のある方はトライしてみて下さい)
GrADSを用いてこのような図を描く事ができます.
(冬季の降水量と海面気圧の気候値,JRA-55)
このチュートリアルは,約 30 分~1時間で,GrADS の基本的な機能を体験するためのものです.
GrADSの機能はここで紹介したものに留まりません.補足資料として,興味のある方のさらなる学習に役立つ情報をチュートリアルの後に掲載しています.
気象・気候の分野では,多次元(三次元以上)のデータを用いることがほとんどです.
空間次元は東西・南北・鉛直方向の三次元あり,それに時間次元が1つないしそれ以上,さらにその他の次元が加わる事もあります.
しかし,一般的な方法で図を描画する場合,一次元ないし二次元のデータを描画することしかできません.下の図のように,多次元のデータというのは,言うなれば世界地図が大量にあるような状況です.当然,大量の世界地図を同時に表示することはできません.
本インターンシップでも三次元以上のデータを扱いますが,それらを通常の方法で描画するには,(少なくとも)二次元のデータとして,抽出・加工する必要があります.
多次元かつ非常に大きなサイズのデータ,所謂「ビッグデータ」を,どのように解析・加工し,我々が理解出来る図として描画するか,というのが,気象・気候の研究において非常に重要な点であるという事が想像できるかもしれません.
非常に大きなサイズのデータを用いてどのような論を立てるか,というのが気象・気候を相手とする研究の醍醐味の一つであると言えますが,何かを主張するためには「他の人が理解出来る図表」を作成する必要があります.
この点を念頭に置きつつ,このチュートリアルを行ってみて下さい.
より「研究に触れる」ことが出来ると思います.
ターミナルを起動し,サーバにログインした後,適当なディレクトリに移動します.例えば
$ cd /home/local/internship/202303/shared/clim
です.
次に,以下のコマンドでGrADSを起動します。
$ grads
この時,
Landscape mode? ('n' for portrait):
という表示が出ますが,気にせずEnterを押してください.
すると、GrADSのウィンドウが立ち上がり、ターミナルのプロンプトが
ga->
に変わります(GrADSのウィンドウは黒いままで何も表示されていないはずです)
ウィンドウが立ち上がらない場合,おそらくX windowの設定が正しく行われていません.
GrADSの終了は
ga-> quit
で行います.
💡 ディレクトリとファイル
ディレクトリ(=フォルダ)は箱で,その中に入っているのがファイル.
CUI (文字=コマンドで情報の表示と操作を行う形式)では,ディレクトリの中に入って作業を行うイメージです.
💻 GrADSの起動と終了を行ってみましょう.
まずGrADSを起動します.
今回解析するデータはnetcdfと呼ばれる形式です.今回のインターンシップではデータの形式に関する詳細を知る必要はないですが,netcdfはファイルの中に格子情報などが格納された自己記述型の形式であるという特徴があります.
netcdfファイルのオープンにはsdfopenというコマンドを用います.仮に,自分が今いるディレクトリにあるatmos.clim.slp.ncというファイルをオープンする場合,
ga-> sdfopen atmos.clim.slp.nc
です.ファイル名は,以下のように絶対パス(今いる場所からの相対的な場所ではなく絶対的な場所)で指定する事も出来ます.
ga-> sdfopen /home/local/internship/202303/shared/clim/atmos.clim.slp.nc
💡 相対パスと絶対パス
相対パス:自分が今いるディレクトリから見た,あるディレクトリやファイルの位置
絶対パス:ルートディレクトリを基準とした、あるディレクトリやファイルの位置
正常にオープン出来た場合,” Scanning self-describing file: ~~~”などのいくつかの情報が出ます.もし正常にオープンできなかった場合にはエラーメッセージが出ます.
(ターミナルに表示されるメッセージを見る習慣を付けましょう.これはGrADSに限らず,CUIによる操作全般に言える事です.例えば現在の航空機の操縦において,クルーは機体の状態をモニタリングして情報を伝えるシステムのメッセージに対処することで問題に対処します.)
開いたファイルについて,ファイル情報(変数名や軸情報)を表示したい場合は
ga-> q file
と実行します.
GrADSを終了するとオープンされていたファイルが自動的にクローズされます.
GrADSを終了せずにファイルをクローズしたい場合には
ga-> close 1
のようにします.”1”はファイルの番号で,今はatmos.clim.slp.ncというファイルしか開いていないため1番です.
ここから想像されるように,GrADSでは複数のファイルを同時にオープンする事が(後述のように)可能ですが,その場合には開かれているファイルの中で番号の一番大きなファイルのみクローズする事が出来ます.
ファイル形式には,もちろんnetcdf以外の形式もあります.GrADSでよく用いられる形式として,データのみが格納されたファイル (バイナリ=人間が読めないデータ.GrADS形式と言われる事があります)がありますが,この形式では格子情報を”.ctl”という拡張子のコントロールファイルによって別に与えてあげる必要があります.この形式の場合,
ga-> open slp.ctl
のように,openコマンドを用います.(今回のインターンシップでは使いませんが)
💻 GrADSを起動し,ファイルをオープン→情報を表示→クローズしてみましょう.
モデル実験データを用いて、等値線図を描いてみます.
GrADSを起動し、
ga-> sdfopen atmos.clim.slp.nc
で海面気圧の格納されたファイルを開きます.atmos.clim.slp.ncはx,y,tの三次元データなので(格子点数がそれぞれ144x90x36),水平面(x,yの二次元)の等値線を描画するには,時間次元について切り出す位置を指定する必要があります.
今回は,時間次元の1番目(Jan1997),鉛直次元の1番目(1000hPa)を指定するとして
ga-> set t 1
ga-> set z 1
とします.(これらを指定しないと自動的に1番目のデータを読みこんで表示します)
変数名がslpであるので,
ga-> d slp
で,下のような海面気圧の等値線を描く事が出来ます.
描画した図を消去するには
ga-> c
とします.”c”は”clear”の略で,clearと実行しても同じ効果が得られます.そして
ga-> close 1
でファイルを閉じておきましょう.
今度は気温について,緯度-鉛直断面を描いてみましょう.気温のデータは(x,y,z,t)の四次元データ(144x90x17x36) なので,(y,z)断面を描くには,xとtの次元を指定してあげます.例えば
ga-> sdfopen atmos.clim.temp.nc
ga-> set lon 180
ga-> set lev 1000 100
ga-> set time Jan1997
ga-> d temp
とすることで,以下のような図を描くことが出来ます.(lonはlongitude=経度のことです)
💻 温度の等値線を,水平面・緯度-鉛直断面についてそれぞれ描いてみましょう.
3.で簡単な図を画面に表示する事が出来るようになりましたが,このままでは誰か他の人に図を見せるのが難しいです.学会発表でライブコーディングならぬライブドローイングをする訳には行きません.
そこで,描画した図を画像ファイルとして保存することを考えましょう.
図を描画した後に,gxprintというコマンドを実行することで,画像ファイルとして保存する事が可能です.例えば
ga-> gxprint image.png
とするとpng形式で"image.png"という名前の画像を保存できます.
解像度を指定するには,例えば
ga-> gxprint image.png x1200
のようにします(この場合は横1200ピクセルとなる).
他の形式 (jpg,epsなど)にも対応しています.
💻 表示した画像を画像ファイルとして保存してみましょう.
GrADSでは,複雑でない計算を行うためのコマンド群が用意されています.
例えば平均を計算する操作を行うことが出来ます.気温の時間方向の平均を計算して描画する場合,
ga-> sdfopen atmos.clim.temp.nc
ga-> set time jan1997
ga-> set lev 1000
ga-> set lon 120 180
ga-> set lat 20 60
ga-> define tm=ave(temp,time=jan1997,time=dec1999)
ga-> set cint 5
ga-> set cthick 5
ga-> d tm
のようにすると,下のような図が描けます.
”ave”が平均を計算するための関数で,”define”は新しい変数を定義するコマンドです.
“cint”は等値線を描く値の間隔,”cthick”は線の太さを指定するためのものです.