NICAM 事始め（チュートリアル）（VL 講習会資料）
2012/02/23	
  三浦裕亮0. NICAM について
	  NICAM とは、Nonhydrostatic Icosahedral Atmosphere Model という大気モデルの略称です。皆さんは、2002 年に稼働した当時世界一の計算速度を誇った地球シミュレータというスーパーコンピューターを知っています
か？もう 10 年も昔の話なので、若い人は知らないかもしれないですね。と
もかく、NICAM はその地球シミュレータという新しい並列計算機を念頭に、1999 年位から開発が始まりました（詳しくは佐藤正樹先生の講義）。大規模並列計算機では従来型のスペクトル法モデルは計算負荷が大きくなるので格子法モデルに切り替えよう、というのが開発の主たる動機です（このような面倒な話は分からなくても大丈夫です）。
	  NICAM では全球をほぼ一様な面積の 6 角形/5 角形で覆うことのできる正20 面体格子という格子形を採用しています。そのような若干扱いにくい格子系を採用しているのは、計算効率を高めるためであったり、物理過程のパラ
メタの単一性を保つためであったりしますが、科学的な理由だけでなく、その格子構造が見た目にも美しく興味深いものであるという（主観的）事実も、何となく他の格子系の採用を躊躇ってしまう由縁であるかもしれません。
	  このような蘊蓄（うんちく）めいた話はともかく、NICAM を体験してみる、というのがここでの目的です。“体験してみる”の意味は、1. プログラ
ムを計算機上で動かし、2. 出力されたデータを気象学的に見てみる、ということです。以下、色々と作業が必要になるため、作業の途中で自分が“何のため”に“何を”行っているか、が不明瞭になってしまう危険があります。
数値モデルを使う場合、どのようなモデルであっても多かれ少なかれ“使いにくいなぁ”という感じは抱くものですが（人間の頭は特異な世界に馴染むのに時間が必要なのかもしれません）、折角の機会ですので“NICAM は簡単に使えた”という体験をしていただけるように進めたいと思います。
	  ところで、最初に断っておきますが、この文書は NICAM の正式なチュー
トリアルではありません。正式版は英語で、nicam_tutorial-vl2012.txt という名前です。この文章中でおかしいなぁと思うことがあれば正式版を参照してください（間違いの指摘は大歓迎です）。また、この文章中では必要なコ

1

マンドを重点的に記述し、設定の詳細までは立ち入らないため、具体的な設定の詳細を知りたいときも正式版を参照する必要があると思います。
1. 準備	  実際の作業に移る前にその進め方について整理しておきましょう。作業を進める途中で“今何をやっているのか”分からなくなったらここに戻って参照してみてください。何が終わって何が終わっていないかを確認しながら進めば、道に迷った感じも軽減されるのではないでしょうか。下記項目の数字は本文章中での節の番号、アルファベットは nicam_tutorial-vl2012.txt 中の見出しに対応しています。
1.

(A) モデルのファイルをコピーし、作業ディレクトリに展開する

2.

(A) モデルを make し、バイナリ（実行形式）を作成する

3.

(B) mnginfo ファイル（領域分布記述ファイル）を作る

4.

(C) 正 20 面体格子データを作る

5.

(D) 正 20 面体格子→緯度経度格子（解析用）の内挿重みの計算

6.

(E) 鉛直格子を作る

7.

(F) 地形・植生データを作る

8.

(G) オゾンデータを作る

9.

(H) 初期条件データ（大気・海洋・陸面）を作る

10. (I, J) 海面温度の参照データを作る
11. (K) 大気の基準成層データを作る
12. (L) NICAM を動かす
13. (M) 出力データを緯度経度変換する
結構大変そうでしょう？でも、今日 NICAM を動かして、その結果で論文を書こう、なんて人はいないですよね？それなら心配ありません。今日の目的は、ただただ流れを追って、モデルに慣れることです。必要なコマンドはす
べて明記しながら進めます。
	  ところで、具体的な作業に入る前に約束事が一つとお詫びが一つあります。
まず、$マークが出てきたら、Linux (or Mac)のターミナル上のコマンドを表していると理解してください。これが約束です。それから、申し訳ないですが Linux (or Mac)でファイルを編集するためのプログラム(emacs や vi)については、知っているものと仮定します。もし分からないときは遠慮無く聞い2

てください。
	  それでは、具体的な作業に入りましょう。まず、今日の演習で使用する計算機にログインします。コマンドは、i.

$ ssh -X (アカウント)@nicamgate.aori.u-tokyo.ac.jp (Enter)ii.

$ ssh -X compute0 (または compute1) (Enter以後、省略します)です。ターミナルのコマンドの最後にリターンキー(Enter キー)を押してコ
マンドの入力を完了するようにしてください。次に、作業ディレクトリに移動し、そこに NICAM のチュートリアルパッケージをコピーします。
iii.

$ cd /data1/(アカウント)iv.

$ cp /data1/tutorial/nicam_src_20111214.tar.gz ./v.

$ cp /data1/tutorial/reg_nicam_gl05_rl00-20111117.tar.gz ./vi.

$ cp /data1/tutorial/nicam_tutorial-vl2012.txt ./うまくコピーできているでしょうか？（$ ls で確認できます。）ついでに、次の 2 つのディレクトリにリンクを張りましょう。
vii.

$ ln -s /data1/tutorial/NICAM_DATABASE

viii.

$ ln -s /data1/tutorial/FNL

NICAM_DATABASE には NICAM が必要とする外部データが、FNL には
初期条件データを作る際の参照データが置いてあります。最後に、NICAMのソースファイル（プログラムが書いてあるファイル）とチュートリアルで使用する雛形のディレクトリを展開しましょう。
ix.

$ tar zxvf nicam_src_20111214.tar.gzx.

$ tar zxvf reg_nicam_gl05_rl00-20111117.tar.gz

これで、ずらずらとファイルが展開され、NICAM、reg_nicam_gl05_rl00の 2 つの新しいディレクトリが作られたと思います($ ls -lF で確認してみてください)。
	  以上で NICAM チュートリアルの準備作業は終了です。まだまだ余裕ですか？それは先々有望ですね。少し不安ですか？分からないことがあれば質問してくださいね。すぐに慣れるので、心配しなくても大丈夫です。これまでに出てきた Linux (or Mac)のコマンドは、分からなければ“おまじない”程
度に思っていても差し支えありません。
2. make する3	  “make する”とは、プログラムを記述した複数のファイルを、正しい順番
でコンパイルして、実際に動く実行形式を作成する、という一連の作業を表す言葉です。なぜ“make する”と言うのかというと、make という Linux（orMac）のプログラムを利用するからです。NICAM でも実行形式を作成する
際に make を使います。
	  早速 make の作業にとりかかりましょう。NICAM のディレクトリに移動
し、nicamgate 用の Mkinclude を設定します。
i.

$ cd NICAM

ii.

$ ln -s Mkinclude.vl Mkinclude

次に、Mkinclude を編集して、TOPPATH を変更します。
iii.

$ emacs Mkinclude

として、ファイルを開いてください。2 行目に TOPPATH を設定している行がありますが、TOPPATH=/data1/(アカウント)/NICAM と編集してください。変更したファイルを保存するコマンドは Ctrl-x Ctrl-s です。ファイルを保存したら Emacs を終了します。終了コマンドは Ctrl+x Ctrl-c です。Emacsの操作がよく分からないときは遠慮無く聞いて下さい。次がいよいよ make
コマンドです。
iv.

$ make

これだけです。実行が終わるまで時間がかかりますので、これまでの作業を復習しつつ、気長に待ちましょう。無事 make コマンドが終了したら、v.

$ ls bin/と入力して、実行形式置き場を見てみましょう。ファイルが 72 個ありますか？（$ ls -1F bin/ | grep -v / | wc -l と入力して数えることができます。もちろん目で数えるのもありです。
）72 個確認できなければ make の時に何か問題が発生した可能性があるので、質問してください。bin/にある
nhm_driver が NICAM を実行するプログラムです。今日の演習は$ nhm_driver と打ち込むところまでです（実際は最後もう 1 ステップ、データ変換がありますが）。頑張って前に進みましょう。
3. 領域分布記述ファイル(mnginfo)の作成
	  領域分布記述ファイル、というのはここだけの名前で、NICAM を使っている人は普通、マネージインフォファイルなどと呼ぶことが多いようです。

4このファイルには、正 20 面体格子を並列計算機で実行する際、どの領域がどの MPI プロセスに割り当てられ、他の領域とどのように繋がっているか、についての情報が記述されています。このように書いても、何を言っているのかさっぱり分からないと思いますが、それで何も問題ありません。NICAM
を利用している研究者でも正 20 面体格子の詳細まで理解している人はあまり多くありませんし、興味がなければ理解する必要もありません。正 20 面体格子の人為的なルールより先に、我々が調べるべき大気現象はたくさんあります。今は演習に必要な mnginfo ファイルの作成に焦点を絞ります。
	  まず、先ほどの NICAM ディレクトリからチュートリアル作業ディレクト
リの mnginfo 用ディレクトリに移動しましょう。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/mnginfo

ここで、先ほど make で作成した mkmnginfo コマンドを実行します。相対
パスで記述すると
ii.

$ ../../NICAM/bin/mkmnginfoです。rl00-prc000002.info というファイルが生成されたでしょうか($ ls で確認)。mkmnginfo はこのディレクトリにある mkmnginfo.cnf という設定ファイルを参照して rl00-prc000002.info という領域分布記述ファイルを生成しています。mkmnginfo.cnf を見てみると($ less mkmnginfo.cnf)、領域分
割レベルが 0 で、並列プロセス数が 2 の時の領域分布記述ファイルを
rl00-prc000002.info という名前で出力せよ、という設定が確認できます。このような詳細については本演習では分からなくても大丈夫です。
4. 正 20 面体格子データの作成	  さて、正 20 面体格子の格子位置情報データを作成しましょう。正 20 面体
格子がどのような形をしていて、どのようにして作るのか、については佐藤正樹先生の講義で話があると思いますので、ここでは格子作りに焦点を絞ります。
（具体的なイメージが湧かないと辛いですか？基本はサッカーボール
で、その 6 角形/5 角形を細かく分割していくと思っておいてください。5 角
形はいつも 12 個、6 角形はいっぱい。）
	  まず、サッカーボールを分割した構造を作ります。チュートリアルの作業
ディレクトリの grid/hgrid に移動しましょう。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/grid/hgrid

5ここで、格子作成プログラム mkgrid を実行します。
ii.

$ mpirun -np 2 ../../../NICAM/bin/mkgrid

どのような格子が作成されたか不安ではありませんか？ここで、宮川くんが作成してくれた view_ico.exe というプログラムを使って格子の構造を見てみましょう。
iii.

$ view_ico.exe setview.cnf-_grid

3 角形の頂点に相当する場所が 6 角形/5 角形セルの中心点になります。プロ
グラムを終了するには、図が表示された窓をクリックしてください。
	  次に、北極に格子を集中化するために transgrid を実行します。
iv.

$ mpirun -np 2 ../../../NICAM/bin/transgridv.

$ view_ico.exe setview.cnf-_s10grid

その後、格子集中化した領域を高解像度でシミュレーションしたい領域に移すため、rotategrid を実行します。
vi.

$ mpirun -np 2 ../../../NICAM/bin/rotategridvii.

$ view_ico.exe setview.cnf-_rotate

インドネシアのあたりに格子の密な場所が移動しています。最後に、格子点を 6 角形の重心に再定義するべく、mkgcgrid を実行します。
viii.

$ mpirun -np 2 ../../../NICAM/bin/mkgcgridix.

$ view_ico.exe setview.cnf-grid

これら一連のプログラムの実行で grid.rgn000[00-09]という正 20 面体格子
データファイルが生成されます（$ ls で確認）。それぞれのプログラムの設定
ファイルは、mkgrid.cnf、transgrid.cnf、rotategrid.cnf、mkgcgrid.cnf という名前でこのディレクトリにあらかじめ置かれています（興味があれば中を見てみてください）。ちなみに、集中格子でない通常の全球準一様な正 20面体格子の場合には上記 iii と iv の過程は必要なく、省略可能です（作業する際は設定ファイルの input_base に気をつけてください）。
5. 緯度経度変換重みデータの作成	  次に、作成した正 20 面体格子データを使って、緯度経度変換時に使用する内挿重みデータを生成しておきます。このデータは NICAM の実行に直接関係しないのですが、この演習の最後のステップで可視化用のデータを作成する際に使用します。

6	  チュートリアル作業ディレクトリの grid/llmap に移動し、mkllmap というプログラムを使用します。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/grid/llmapii.

$ mpirun -np 2 ../../../NICAM/bin/mkllmap

このプログラムの実行により llmap.rgn000[00-09]というファイルが生成されます（$ ls で確認）。これで緯度経度変換重みデータの作成は終了です。
6. 鉛直格子データの作成	  次に鉛直格子を作成しましょう。先ほど作成した正 20 面体格子は球（例えば地球）の表面を 6 角形/5 角形で覆うような構造でした。しかし、我々が理解の対象としている大気の運動は 3 次元世界で起こっています。どんなに薄く儚い感じがしても、大気には水平方向だけでなく鉛直方向の運動があり、
大気大循環において重要な役割を果たします。そのようなわけで、大気の運動をモデル化するには球面に直交する方向（高さ方向）の格子が必要です。
	  前置きが長くなりましたが、さくさくと鉛直格子データを作成してしまいましょう。チュートリアル作業ディレクトリ中の grid/vgrid に移動し、mkvlayer というコマンドを利用します。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/grid/vgridii.

$ ../../../NICAM/bin/mkvlayer

このプログラムの実行で vgrid40.dat という鉛直格子データファイルが生成されます（$ ls で確認）。
7. 地形・植生データを作る	  これまでに、最初に提示した 13 個の行程のうち約半分の作業が終わったことになりますが、どのように感じていますか？よく分からなくなってきた、という人は最初に整理した項目リストに戻ってこれまでの行程を確認してみてください。簡単にまとめると、ファイルを展開し、NICAM の実行形式
を make し、球面上に 3 次元座標を作成しました。
	  これまでに作成したデータを読み込むことで、NICAM は 3 次元空間上のどの場所に計算ノードをとればよいか、を知ることができます。実行を開始する時点では NICAM は何の情報も持たないのですから、これはかなりの進歩です。しかしながら、地球大気のシミュレーションを行うには NICAM に

7

もっと多くのことを教える必要があります。例えば、NICAM はどこが海で
どこが大陸かを知りませんし、大陸上に山があってそれがどの程度の高さなのかも知りません。これらの情報を NICAM に教えるためのデータを作成しましょう。
	  まず、チュートリアル作業ディレクトリの地形・植生データ用の場所(external_data/MATSIRO)に移動しましょう。詳しくは触れませんが、
MATSIRO というのは NICAM や気候モデル MIROC が利用している地表面
計算プログラムの名前です。ここでは、mklanddata2 というプログラムを動かします。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/external_data/MATSIRO

ii.

$ mpirun -np 2 ../../../NICAM/bin/mklanddata2

この作業により、topog.rgn000[00-09]、topog_std.rgn000[00-09]、
veget_mat.rgn000[00-09]、slidx.rgn000[00-09]、albedo_nir.rgn000[00-09]、
albedo_vis.rgn000[00-09]、lai_clm_1982-1998.rgn000[00-09]、
landmask.rgn000[00-09]、sl_area.rgn[00-09]、gradz.rgn000[00-09]という複数種類のファイルが作成されます（$ ls で確認）。
8. オゾンデータを作る	  次に NICAM に教えてあげるのはオゾンの分布です。「一般気象学」など
で大気の温度成層について勉強したことがあるでしょうか？地球大気の対流圏においては、標高が 100ｍ高くなるごとに約 0.6 度温度が下がることが知られています。ところが対流圏を超えて成層圏に達すると、対流圏とは逆に、高度が上がるにつれて温度が高くなっていきます。その理由は成層圏にはオゾンが濃い高度が存在し、オゾンが太陽からの短波放射を吸収して温度が高くなるためです。NICAM で雲の高さをもっともらしく計算するには、対流圏と成層圏の境目である対流圏界面付近において、その安定な温度成層が現実的であることが必要です。そのような理由から、対流圏の計算が目的の場合でも、（特にシミュレーションが長期の場合には）オゾンデータが必須です。
	  オゾンのデータはチュートリアル作業ディレクトリの external_data/O3
で作成します。使用するプログラムは mko3 です。

8

i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/external_data/O3ii.

$ mpirun -np 2 ../../../NICAM/bin/mko3

プログラムの実行により、amip2o3.rgn000[00-09]というデータファイルが作成されます（$ ls で確認）。
	  nicamgate では問題にならないよう既に設定されていますが、Linux でmko3 を実行しようとすると segmentation fault というエラーに遭遇することがあります。そのような場合には、$ ulimit -s unlimited（bash の場合）という“おまじない”を試してみてください。このエラーは、NICAM が Linuxから許可されている以上にメモリの stack と呼ばれる領域を使用しようとするため起こります。上記の“おまじない”は使ってもよい stack の大きさを変更するコマンドです。
9. 初期条件データを作る	
  NICAM に教える地球についての情報の最後は、初期条件と呼ばれるものです。NICAM は、ある時点の気象状態を起点とし、決められた（理論的・経験的）物理法則に従って気象状態の時間変化を計算します。そのため、物理的に無理のない気象状態を起点として与える必要があります。“物理的に無理のない”と書きましたが、例えば、目の前にコップがあるとして、コップに入っている水の重さが-100g だったらどうしましょう？-100g の水が増えたり減ったり、というのはただの数字としては計算できますが、物理的な意味付けには困りますよね？この場合、水の重さは正の値であることが期待されています。この例のように、大気の密度や温度にも“それらしい”範囲というものがあって、そこから著しく逸脱した値を教えると、NICAM の計算が破綻してしまったりします。この演習では、ある日(2009 年 7 月 1 日)の現実的な気象状態を起点として与え、その後の気象状態の時間変化を計算することにします。
	  初期条件の作成には少し準備が必要になります。まず、チュートリアル作
業ディレクトリの local/src に移動し、置いてある Makefile を編集します。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/local/src

ii.

$ emacs Makefile

Makefile 中の 4 行目を NICAM_TOPDIR=/data1/(アカウント)/NICAM と書
き換え、Ctrl-x Ctrl-s で保存し、Ctrl-x Ctrx-c で emacs を終了します。続9

いて、１つ上のディレクトリに移動し、make プログラムを走らせます。
iii.

$ cd ../

iv.

$ make

これで、local/bin/に conv_lnd、conv_ocn、conv_ocn_ndg、conv_prs、
conv_prs_ndg、swap_by_clmsnw というプログラム群が生成されたと思います。これらのプログラムを利用（するシェルプログラムを利用）して初期条件を作成していきましょう。
	  初期条件の作成はチュートリアル作業ディレクトリ中の initial_data で行います。
v.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/initial_data

まず、大気、海洋、陸面の元データを作成します。
vi.

$ sh mk_atm.sh ../../FNL/fnl_20090701_00_00_cvii.

$ sh mk_ocn.sh ../../FNL/fnl_20090701_00_00_cviii.

$ sh mk_lnd.sh ../../FNL/fnl_20090701_00_00_c

これらのプログラムにより、atm.dat、ocn.dat、lnd.dat という 3 つのデータが生成されます（$ ls で確認）
。次に、それぞれのデータを正２０面体格子系に変換しましょう。
ix.

$ cd ATMx.

$ ../../../NICAM/bin/mkinit_atm

xi.

$ cd ../OCN

xii.

$ ../../../NICAM/bin/mkinit_ocn

xiii.

$ cd ../LND

xiv.

$ ../../../NICAM/bin/mkinit_lnd

これらのプログラムを実行することで、ATM/init_atm.rgn000[00-09]、
OCN/init_ocn.rgn000[00-09]、LND/init_lnd.rgn000[00-09]のように初期条
件ファイルが生成されます（$ ls で確認）。
	  初期条件ファイルの作成で、NICAM 実行までの大きな山を越えました。
みなさんもだいぶ疲れてきたのではないでしょうか？準備はあとわずか、残りは海面温度の参照データと基準成層データです。ここまで頑張ってあきらめるのも勿体ないので、なんとか付いてきて下さい。
10. 海面温度データを作る

10	  最近寒い日が続いていますが、暖かい南の島に遊びにいきたいなぁ、と思ったりしませんか？ところで、なぜ南の島は暖かいのでしょうか。熱帯に行
けば、太陽は真上から照りつけるようになり、直射日光は確かに暑く感じます。しかし、残念ながら対流圏の大気は太陽の短波放射を効率よく吸収でき
る訳ではありません。むしろ、陸面や海水の温度上昇を介して、顕熱・潜熱の形で多くの熱を受け取ります。NICAM では、顕熱・潜熱フラックス計算に必要とされる海面温度の時間変化を海洋混合層モデルで計算しますが、その計算のために海面温度の参照データが必要になります。
	  海面温度の参照データはチュートリアル作業ディレクトリ中のnudging_data で、mk_sst.sh を使って作成します。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/nudging_dataii.

$ sh mk_sst.sh ../../FNL/fnl_20090

このシェルプログラムの実行により sst.dat というデータが生成されます。
次に、このデータを正 20 面体格子系に変換しましょう。
iii.

$ cd OCNiv.

$ mpirun -np 2 ../../../NICAM/bin/mkgisst

sst.rgn000[00-09]というデータが生成されます。せっかくなので SST デー
タの中身をチェックしてみましょう。
v.

$ view_ico.exe setview.cnf-sst

6 角形上のセルのそれぞれに温度が設定されていることが確認できます。
	  ここでついでに、海面温度に加えて海氷のデータも作っておきましょう。
vi.

$ cd ../OCN_CLM

vii.

$ mpirun -np 2 ../../../NICAM/bin/mkgisst

このプログラムの実行により、cmip3ice1979-1999_clm.rgn000[00-09]、
cmip3snw1979-1999_clm.rgn000[00-09]、
hadsst1979-1999_clm.rgn000[00-09]という 3 種類のファイルが生成されます。
11. 大気の基準成層データを作る	  大気の基準成層データは、音波や重力波の項を線形化する際に使われますが、ここでは詳細にこだわらずデータの作成に集中しましょう。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/refstateii.

$ ../../NICAM/bin/mkbsstate11この作業により vgrid40_ref.dat というファイルが生成されます。これで準備完了です。様々な作業が五里霧中なうちに連続し、“つらいなぁ”と感じた人も多かったかもしれません。よくここまで我慢してくれました。次はい
よいよ NICAM のメインプログラムの実行です。
12. NICAM を動かす
	  前置きはなしで、早速 NICAM を実行しましょう。
i.

$ cd /data1/(アカウント)/reg_nicam_gl05_rl00/runii.

$ mpirun -np 2 ../../NICAM/bin/nhm_driver

以上です。計算が終わるまでの間、ここまでの作業を振り返るなり、頭を休
めるなり、モデル中の時計の進行を眺めるなり、nhm_driver.cnf の中を見て訳がわからないなぁと思うなり、のんびりとお過ごしください。
13. 出力データを緯度経度変換する
	  計算が終わったら、出力データを正 20 面体格子から緯度経度格子に変換して解析してみましょう。nhm_driver を実行したディレクトリ下の checkに移動し、変換プログラム ico2ll を動かします。
i.

$ cd checkii.

$ ../../../NICAM/bin/ico2ll*.ctl と*.grd というファイルが複数作成されたことと思います。これらのデータを GrADS という描画ソフトを用いて解析するのが、明日の演習の目標です。

謝辞
文章の間違いを指摘してくれた大野くん、及川くん、久保川くん、三澤くん、有り難う。初期段階から計算機の設定と NICAM のテストをしていた宮川くん、西川くん、端野くんにも感謝。五藤くんは全体のとりまとめ、お疲れ様。

12