見出し画像

数値予報モデルWRFをセットアップする

はじめに

WRF (Weather Research and Forecasting Model) とはアメリカの気象機関を中心に開発されているメソ気象モデル(非静力学モデル)の一つで、日本でいうと気象庁のMSM・LFM(気象研究所のNHM)に相当する数値予報モデルです。WRFはオープンソースのため世界中で利用されており、研究者や国の気象機関だけでなく、民間気象会社によるビジネス利用の実績もあります。

歴史的に見ると、アメリカでは複数のメソ気象モデルが独自に開発されてきました。主なモデルとして、NCAR(アメリカ大気研究センター)とペンシルベニア州立大学のMM5、オクラホマ大学のARPS、コロラド州立大学のRAMS、NCEP(アメリカ国立環境予測センター)のEtaなどがありました。
しかしモデル開発には多くの開発費や開発人員が必要になります。このような状況の中、学術研究と気象予報の現業の両方で活用できるメソモデルを共同開発するプロジェクトが立ち上がりました。こうして開発されてきたのがWRFです。

こうして、多くの気象機関がWRFプロジェクトに参加して、一つのメソ気象モデルWRFを共同開発しているわけですが、一方でコロラド州立大学は「複数のモデルが開発されてバリエーションを持てることも重要」との考えから、独自路線でRAMS開発を続けています。これ、とても面白いですよね。

参考サイト・参考資料
Weather Research and Forecasting Model
領域気象モデルWRFについて

WRF環境構築

VirtualBoxとUbuntu

さて本題です。

上述の通りWRFはオープンソースなので、ソースコードを入手してコンパイルすれば、誰でもSOTAな気象モデルを走らせることができます。が、そのコンパイルするのが結構大変です。

そこで私が自分で実際にコンパイルした方法を紹介します。私の場合、下記のようなPC環境でWRFのセットアップを行いました。

  • PCのOSは『Windows 10』

  • VirtualBoxを使って仮想環境を構築

  • 仮想環境にUbuntu 22.04 LTSをインストール

ということで、UbuntuでWRFのコンパイルを行なっています。
VirtualBoxについて、またVirtualBoxにUbuntuをインストールする方法については、ネット検索すればたくさん情報が見つかりますので、ここでは割愛します。

ではここからは、上記PC環境の前提で進めます。まずWRFをコンパイルする前準備、のための前準備として、以下のパッケージをインストールします。

sudo apt install build-essential
sudo apt install csh tcsh
sudo apt install gfortran
sudo apt install curl libcurl4
sudo apt install m4
sudo apt install libxml2-dev

次にコンパイラです。GNUコンパイラ(gfortran / gcc)でもよいのですが、Intelコンパイラ(ifort / icc)を使った方が計算速度が速くなるらしいので、Intelコンパイラを使用しました。

「あれ、上では gfortran をインストールしてるよね?」って思ったそこのあなた!大丈夫です(?)
WRFを使うならGRIB2形式の気象データを扱うことになりますが、その際に十中八九『wgrib2』を利用する機会があります。wgrib2はGRIB2形式の気象データを処理するソフトウェアで、コンパイルするのにgfortranが必要です。なのであらかじめgfortranをインストールしておいて損はないです。

またcsh系をインストールしていますが、私は個人的に学生時代から今でもtcshを好んで使っています。本noteでも環境変数の設定などはtcshを前提に記載しますので、bashやzshの場合は適宜読み替えて下さい。
ただそれだけではなくて、WRFのコンパイルにcshが必要、という事情もあります。もしかしたら気象系の人は伝統的にcsh系が好きなのでしょうか?よく知りませんが…

Intelコンパイラのインストール

以下、ifort / iccを使って記述します。
gfortran / gccに変更してもたぶんうまく動作すると思いますが、私自身では未確認です。悪しからず。

ではまずIntelコンパイラ『Intel oneAPI Base Toolkit + HPC Toolkit』をインストールします。aptを使ったインストール方法は、こちらのIntelサイトに掲載されています。

上記サイトを参考に、実際に私が実行したコマンドは以下の通りです。

# download the key to system keyring
wget -O- "https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB" | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null

# add signed entry to apt sources and configure the APT client to use Intel repository:
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list

# install oneAPI
sudo apt install intel-basekit
sudo apt install intel-hpckit

↑noteの自動シンタックスハイライトの都合で、見やすくするためにURLをダブルクォーテーション""で囲っていますが、なくてもOKです。

著者注釈

これでインストールはできましたが、実際に利用するには毎回ターミナルを立ち上げるたびに以下を実行する必要があります。

# tcshの場合は以下を実行
bash -c 'source /opt/intel/oneapi/setvars.sh ; exec tcsh'

# bashの場合は以下でよいはず
source /opt/intel/oneapi/setvars.sh

関連ライブラリのインストール

次にWRFをコンパイルする前準備として、WRFに必要なライブラリ類のコンパイルを行います。ここでWRF公式サイトのインストールガイドにならって、WRFの作業用ディレクトリを作り、ライブラリ類もそのディレクトリ内にインストール先を設けることとします。私の場合、以下のようにしました。

# あらかじめ、ホームディレクトリに移動します
# WRF作業用に「WRF」という名称でディレクトリを作成
mkdir WRF

# WRF/以下に移動し、ライブラリインストール先ディレクトリ「Libraries」を作成
cd WRF/
mkdir Libraries

必要なライブラリは以下の通りです(インデントは依存関係を表す)

ここで、MPICHとは並列計算をさせるために必要なソフトウェアです。今回、私はIntel oneAPIに含まれるIntel-MPIを利用することにしたので、MPICHのコンパイルは行っていません。それ以外のパッケージについて、以下にインストール方法を記載します。

まず環境変数の設定をしておきます。中には関連ライブラリのインストール後に設定すればよいものもありますが、害はないのでまとめて設定してしまいます。

(後日追記)
もしかしたら下記の環境変数を一度に設定してしまうと、いずれかのライブラリのコンパイル時にエラーが出てしまうかもしれません。その場合は12行目までの環境変数をまず設定し、残りはNetCDF4のコンパイル後に設定してみて下さい。

setenv DIR $HOME/WRF/Libraries
setenv CC icc
setenv CXX icpc
setenv FC ifort
setenv F77 ifort
setenv F90 ifort
setenv CFLAGS '-O3 -ip'
setenv CXXFLAGS '-O3 -ip'
setenv FCFLAGS '-O3 -ip'
setenv FFLAGS '-O3 -ip'
setenv CPP "icc -E"
setenv CXXCPP "icpc -E"
setenv JASPERLIB $DIR/lib
setenv JASPERINC $DIR/include
setenv LDFLAGS -L$DIR/lib
setenv CPPFLAGS -I$DIR/include
setenv LD_LIBRARY_PATH $DIR/lib:$LD_LIBRARY_PATH
setenv PATH $DIR/bin:$PATH
setenv NETCDF $DIR

最初のDIRについては、上で作成したライブラリインストール先ディレクトリを指定します。

ここで公式サイトにも記述がある重要な点として、必要なライブラリ類のコンパイルはWRFをコンパイルするのと同じコンパイラで行う必要があります。ですので環境変数にて『ifort / icc』を使うよう設定しています。

ライブラリ類はそれぞれ公式サイトからダウンロードします。ここで注意点として、最近のNetCDFはC版とFortran版に分かれているので、両方をダウンロードします。私の場合、ダウンロードした圧縮アーカイブファイルは『$DIR/src/』以下に置きました。

libpng・JasPer・szipに関しては、それぞれ圧縮アーカイブファイルを解凍・展開した後、各パッケージのディレクトリに移動して以下を実行します。

(後日追記)
JasPerはバージョン2からcmakeによるコンパイルに変更になっています。筆者はこの時はバージョン1.9を利用して下記手順でコンパイルしました。また詳細は省略しますが、ifort・iccをcmakeで利用してコンパイルも可能なようです。

./configure --prefix=$DIR
make
make check
make install

zlibについては、私が参照していたサイトの記述をもとに、この時だけ環境変数CFLAGSを少し変更してコンパイルしました。
(どういう意味があるのかはよく分かってません…)

# この時だけ環境変数CFLAGSを変更
setenv CFLAGS '-O3 -ip -fPIC'
./configure --prefix=$DIR
make
make check
make install
# 環境変数CFLAGSを元に戻す
setenv CFLAGS '-O3 -ip'

HDF5はconfigureオプションを以下のようにしてコンパイルします。

./configure --prefix=$DIR --enable-fortran --enable-cxx --enable-hl --with-szlib=$DIR --with-zlib=$DIR
make
make check
make install

NetCDF4はまずC版からコンパイルします。

# NetCDF4のC版
./configure --prefix=$DIR --enable-netcdf-4
make
make check
make install

続いてFortran版のコンパイルを行います。

# NetCDF4のFortran版
./configure --prefix=$DIR
make
make check
make install

以上で事前準備は終了です。

WRFインストール

ソースコード入手

次にいよいよWRF本体・およびWRFのプリプロセスを行うWPSのコンパイルに進みます。

まず以下2つの環境変数を追加します。

setenv WRF_EM_CORE 1
setenv LANG C

次にWRF・WPSのソースコードを入手します。これらは最近はGitHubから入手するのが本流のやり方のようです。(時代も変わったなあ。余談ですが。)

# あらかじめWRF作業用ディレクトリに移動しておきます
git clone "https://github.com/wrf-model/WRF.git"
git clone "https://github.com/wrf-model/WPS.git"

↑noteの自動シンタックスハイライトの都合で、見やすくするためにURLをダブルクォーテーション""で囲っていますが、なくてもOKです。

著者注釈

WRF本体のコンパイル

コンパイルはまずWRF本体の方から行います。git cloneするとWRFというディレクトリが作成されているはずなので、そこに移動して、まずconfigureを実行します。

# configureを実行すると、いくつかのオプションを選択するモードになります
./configure

configureのオプションですが、WRF v4.4では、私の場合はINTEL (ifort/icc)dmpar(並列計算のためのオプション)で15番を選びました。その他のオプションについてはWRF公式のユーザーズガイド等の記述を読んでください。またWRFのバージョンが違うとオプションの数も変化し、番号も変わるかもしれないので、表示される選択肢をよく読んで番号を選択して下さい。
もう1つのオプションとして、ネスティングのオプションは1番を選びました。Moving Nestで台風の計算をしたいなど、特殊な事情がなければ1番で良いと思います。オプションの詳細はやはり公式ドキュメント等でご確認下さい。

続いてコンパイルを実行しますが、私の場合はその前に、configureを行うと作成されるconfigure.wrfの中身を少し編集しました。

#--170行目から
#DM_FC           =       mpif90 -f90=$(SFC)
DM_FC           =       mpiifort
#DM_CC           =       mpicc -cc=$(SCC)
DM_CC           =       mpiicc

これはIntel-MPIを使うための変更なので、デフォルトでいいよという方は変更なしで大丈夫です。(私自身は未確認ですが、そのはずです。)

# compileオプションは現実大気の予測計算をする『em_real』を指定します
# またコンパイル中の出力をログファイルとして記録しておきます
./compile em_real >& compile.log

compileを実行する時の引数にもいくつか種類があります。通常の地球大気のシミュレーション計算をしたいならem_realで良いです。それ以外にも、例えば何か理想的な状態でのシミュレーション計算をしたい場合のオプションなど、いくつかあります。私も詳しくないので、やはり公式ドキュメント等を参照して下さい。

コンパイルには時間がかかります。気長に待ちましょう。

コンパイルが成功すると(em_realの場合)4つの実行ファイルが作成されているはずです。ファイルサイズがゼロでない、4つの実行ファイルが作成されたかどうか確認します。

# コマンド
ls -l main/*.exe

# 出力例
-rwxrwxr-x 1 user group 52699976 Jul 10 23:36 main/ndown.exe
-rwxrwxr-x 1 user group 52764920 Jul 10 23:36 main/real.exe
-rwxrwxr-x 1 user group 52022528 Jul 10 23:36 main/tc.exe
-rwxrwxr-x 1 user group 57164440 Jul 10 23:35 main/wrf.exe

ログファイルも見てみましょう。ファイルの最後に『Executables successfully built』と記録されていればOKです。

これでWRF本体のインストールが完了しました。

WPSのコンパイル

次にWPSのコンパイルです。注意点として、必ずWRF本体のコンパイルから先に行う必要があります。
WRF作業ディレクトリ内に、git cloneしてWPSディレクトリが作成されているはずなので、そこに移動してまずconfigureを実行します。

# configureを実行すると、いくつかのオプションを選択するモードになります
./configure

私の場合、オプションとして『17. Linux x86_64, Intel compiler (serial)』、つまり17番を選択しました。公式ドキュメントによると、よほどの広い領域を扱うのでない限りシングル計算推奨(シングル計算で十分)とのことだったので、並列計算(dmpar)は選択しませんでした。

続いてコンパイルを実行しますが、WRF本体と同じくIntel-MPIを利用するためにconfigure.wpsを以下のように編集しています。もしかしたらシングル計算を選んでいるので、編集しても意味なかったかもしれませんが…念のため。
WRF本体同様にデフォルトで良いという方はこの編集は不要です。

#---67行目から
#DM_FC               = mpif90
DM_FC               = mpiifort
#DM_CC               = mpicc
DM_CC               = mpiicc

ではコンパイルを実行します。今回は特別な引数はありません。

./compile >& compile.log

WPSはWRF本体ほどの時間はかからずコンパイル完了します。

コンパイルが完了すると、以下の3つの実行ファイルとそのシンボリックリンクが作成されます。3つのファイル名と、リンク元は以下の通りです。

# コマンド
ls -l *.exe

# 出力例
lrwxrwxrwx 1 user group 23  711 00:01 geogrid.exe -> geogrid/src/geogrid.exe*
lrwxrwxrwx 1 user group 23  711 00:02 metgrid.exe -> metgrid/src/metgrid.exe*
lrwxrwxrwx 1 user group 21  711 00:01 ungrib.exe -> ungrib/src/ungrib.exe*

# コマンド
ls -l geogrid/src/geogrid.exe ; ls -l ungrib/src/ungrib.exe ; ls -l metgrid/src/metgrid.exe

# 出力例
-rwxrwxr-x 1 user group 3782632  711 00:01 geogrid/src/geogrid.exe*
-rwxrwxr-x 1 user group 2527784  711 00:01 ungrib/src/ungrib.exe*
-rwxrwxr-x 1 user group 3789608  711 00:02 metgrid/src/metgrid.exe*

ゼロでない実行ファイルが作成されていればOKです。

ログファイルですが、WPSの場合は特にコンパイルが成功した旨の記述は出力されないので、ログファイルの最後にエラーっぽいメッセージが出ていなければたぶん大丈夫です。

これでWPSのインストールも完了しました。

おわりに

どこかで躓いたら

さて私はここまで紹介した手順でWRF・WPSのコンパイルに成功しましたが、ご利用のPC環境によっては、どこかでエラーが発生して躓く方もいらっしゃるのではないかと思います。

でも、大丈夫です!それ、普通です!(笑)
いや、なんの解決にもなっていませんが。。(汗)

でも実際、私もたった1つのサイト・ブログ記事等を参考にして、その通りにやって最後のWRF・WPSコンパイルまでうまくできたことは、一度もありません。何かしらで躓いて、その度に別のサイトを見たり、エラー内容でググって調べたりしました。

なので根気よく続けてみていただければと思います。

WRF実行までの道のりは長い

さてこれでWRFのコンパイルができて、「やった!じゃあ早速実行だ!」と思ってwrf.exeを実行しても…もちろんそれだけでWRF計算が走るわけではありません(笑)

他にもいろいろ、必要なモノ・コトがあります。例えばインプットする気象データとか。それらについてはまた別のnoteで…と言いたいところですが(笑)ちょっとまだ書くかは未定ですし、書いても有料とさせていただくかもしれません。

実は『WRFでシミュレーション計算する環境を構築してほしい』といった依頼を受けて、WRFを実際に走らせるところまでサポートする仕事をいただいたこともあります。類似のご依頼であれば、お役に立てることもあるかと思います。

また、私自身WRFを走らせる環境を構築しましたので、例えば過去の気象状態をWRFでシミュレーション計算して、その計算結果をもとに何らかのサポートをさせていただくような、そんなビジネスもできるかもしれないと、楽観的に想像を膨らませております(笑)。
いや、実際にヨーロッパの方では、AWSでWRFを走らせてその計算結果を売る、というサービスを個人でやっている人がいるみたいなのです。

なので、WRFを使った気象シミュレーションにご興味のある企業・個人の方、ご相談いただけましたら最適なご提案をさせていただきますので、ぜひご検討いただければ幸いです。

…と宣伝をしたところで、本noteはこれにて締めたいと思います。
最後まで読んでいただき、ありがとうございました。

参考サイト

(1)WRF公式のユーザーズガイドです

(2)WRF公式のインストールガイドです

(3)私が主に参考にさせていただいたサイトです

この記事が気に入ったらサポートをしてみませんか?