2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

dockerを使ってWRFをインストールしてみた

Last updated at Posted at 2024-12-08

:pencil: 2024/12/11 コンテナのボリュームを有効活用するよう一部修正しました
:pencil: 2024/12/13 WindowsはWindows subsystem for LinuxのUbuntu24.04に下記のインストールスクリプトが有効でdockerは不要でした.以下の記事ににわかり易くまとめられています.

作戦

Weather Research & Forecasting Model (WRF) はユーザー登録をすれば誰でも使える最先端の気象モデルだが,自分のような初心者にはインストールが難しい.こちらの記事では,以下のようなワンクリックで完結する神インストールスクリプトが紹介されていて衝撃を受けた.

しかし,debian系Linux専用.最近流行り(?)のdockerという高速な仮想環境(?)でubuntuを構築すればMacでも使えるかも..!

ということで上記インストールスクリプトを利用し,Apple silicon Mac(または非debian系LinuxやWindows)でdockerにUbuntuコンテナを作成しWRFを動かしてみよう,が今回の作戦.

なお,dockerもWRFも初心者なので詳しい&正確な説明は諦めています.dockerの説明は探せば色々出てきますが,サプーさんの説明動画が個人的にはわかりやすかったです(照)

メリット

  • OSに関わらずインストール方法を固定できる
  • 自力でのライブラリ構築の必要がない
  • ほぼ最新版のWRFを使える(スクリプト管理者に感謝)
  • (dockerの勉強になる)

デメリット

  • Intel fortranはデフォルトでは使えない(gfortran, openmpiが使われる)
  • dockerとはいえ仮想環境であることのオーバーヘッドはある
  • Apple silicon Macの場合x86_64へエミュレートする分更にオーバーヘッドになる
  • Macではコンテナ起動時にGUIの操作が要求されるためSSHに向かない(解決法模索中)

環境

  • MacBoock Air (2020, M1)
  • macOS Sequoia 15.1.1
  • docker desktop Version 4.36.0
  • Docker version 27.3.1
  • WRF4.6.1

Dockerのインストール

Macの場合は以下を参照.

設定からCPUやメモリの上限を設定できるので,余裕を持たせておくと良いと思う.

LinuxやWindowsの方はすみませんが各々セットアップしてください.

Ubuntuコンテナの作成

こちらを参考にした.以下順次解説する.

ホームディレクトリにdockerディレクトリを作成し,基本的にはそこで作業する.

$ cd
$ mkdir docker
$ cd docker
$ mkdir ubuntu_volume

ubuntu_volumeは後ほど使うが,コンテナの一部を格納する場所.

~/docker内で以下のようにcompose.yamlを作成する.

compose.yaml
services:
  ubuntu:
    image: ubuntu:24.04
    container_name: ubuntu_container
    tty: true
    platform: linux/amd64
    volumes:
      - "ubuntu_volume:/home/ubuntu"

volumes:
  ubuntu_volume:
     driver_opts:
      type: none
      device: ${PWD}/ubuntu_volume
      o: bind
  • servicesubuntuというサービスを定義.
  • imageで利用するイメージを指定する.イメージは初回起動時にダウンロードされる.
  • container_nameはコンテナ名.サービス名と異なる扱い.
  • tty: trueは端末を利用するために必要.
  • platformの箇所はApple silicon Macで利用するために必要.IntelかAMDのCPUマシンの場合は消す.

Apple siliconはaarch64というARM系のアーキテクチャ.ここでのWRFはx86_64を想定しており,そのままだとインストールに失敗する.上記によりx86_64としてRosetta2がエミュレートしてくれるらしい.アーキテクチャはuname -mコマンドで確認できる.

  • volumesは簡単に言えばコンテナの一部(ここでは/home/ubuntu以下)の保存場所を指定している.その直下にあるもう一つのvolumesではubuntu_volumeという「名前付きボリューム」を先ほど作成したubuntu_volumeディレクトリにマウントするよう指定している.ボリュームに関しては以下の記事が詳しい.

次に以下のコマンドでコンテナを起動する.必ずcompose.yamlのあるディレクトリで実行すること

$ docker compose up -d

一度起動した後にcompose.yamlを編集するとコンテナが初期化されてしまうことがあるので注意.--rmオプションをつけたdockerコマンド操作も同様なので禁物.逆に最初からやり直したい場合はdocker rm ubuntu_containerで削除できる.

コンテナの生成・起動の確認はdocker psコマンド.

$ docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES
e4edfa990d25   ubuntu:24.04   "/bin/bash"   22 minutes ago   Up 22 minutes             ubuntu_container

上記の感じなら多分OK.

コンテナの停止と再起動の確認

手順には含まないが,いざという時困るので先に解説.どの方法が最適か理解していないが,ひとまずcomposeを使って安定した方法を紹介.

1. コンテナからログアウト

exitするだけ.コンテナは稼働し続ける.

2. コンテナの停止

$ docker stop ubuntu_container

引数はコンテナ名を与える.
docker psubuntu_containerが消えているか確認.

$ docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED        STATUS          PORTS     NAMES

3. コンテナの再起動

$ docker compose up -d

-dはバックグラウンドで起動するオプションらしい.
(オフラインだと失敗することがあり要ネット接続.オフラインOKな方法を知ったら追記するかも)

4. コンテナへの再ログイン

compose.yamlのあるディレクトリへ移動し,以下を実行.

$ docker compose exec ubuntu /bin/bash

ここではコンテナ名ではなくサービス名を与える.

スクリプト実行の準備

$ docker exec ubuntu /bin/bashにより,dockerコンテナにはrootユーザーとしてログインされる.後のライブラリインストールで非ルートユーザーを使う必要がある.自動的にubuntuというユーザーが生成されていたので用いる.

rootとしてコンテナにログインした後,まずubuntuユーザーのパスワードを更新し,sudoユーザーに登録しておく.(結構重要)

root@e4edfa990d25:/# passwd ubuntu
New password:
Retype new password:
passwd: password updated successfully
root@e4edfa990d25:/# gpasswd -a ubuntu sudo
Adding user ubuntu to group sudo

まずはaptを最新にする.

root@e4edfa990d25:/# apt update

aptを使ってsudoをインストール.他にも必要なものがあればここで.

root@e4edfa990d25:/# apt install sudo
root@e4edfa990d25:/# apt install wget
root@e4edfa990d25:/# apt install vim  # エディタ
root@e4edfa990d25:/# apt install less  # ビューワ

ubuntuユーザーでsudoが使えるか確認.

root@e4edfa990d25:/# su - ubuntu
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@e4edfa990d25:~$ sudo ls -a
[sudo] password for ubuntu:
.  ..  .bash_history  .bash_logout  .bashrc  .profile  .sudo_as_admin_successful

OK.

WRFインストールスクリプトの実行

例のWRF-Install-Scriptよりお好きなバージョンを選択.今回は4.6.1

Screenshot 2024-12-07 at 20.23.26.png

Rawをクリック.

Screenshot 2024-12-07 at 20.25.48.png

そのページのアドレスをコピー,端末でwgetする.これはコンテナ外からでも良い.

$ cd ~/docker/ubuntu_volume
$ wget https://raw.githubusercontent.com/bakamotokatas/WRF-Install-Script/refs/heads/master/WRF4.6.1_Install.bash

コンテナ内にログインし,ダウンロードしたスクリプトを実行する(ボリュームに保存したものはコンテナ内と完全に同期).WRFとWPS(前処理システム)がインストールされる.容量は約52GB.

ubuntu@e4edfa990d25:~$ bash WRF4.6.1_Install.bash

環境によるが40~60分かかる.終了したら生成物を確認する.

ubuntu@b07cbba8e72e:~/Build_WRF$ ls
LIBRARIES  WPS-4.6.0  WPSV4.6.0.TAR.gz  WPS_GEOG  WRF-4.6.1-ARW  WRFV4.6.1.tar.gz  geog_high_res_mandatory.tar.gz
ubuntu@b07cbba8e72e:~/Build_WRF$ ls WRF-4.6.1-ARW/run/*exe
WRF-4.6.1-ARW/run/ndown.exe  WRF-4.6.1-ARW/run/real.exe  WRF-4.6.1-ARW/run/tc.exe  WRF-4.6.1-ARW/run/wrf.exe
ubuntu@b07cbba8e72e:~/Build_WRF$ ls WPS-4.6.0/*exe
WPS-4.6.0/geogrid.exe  WPS-4.6.0/metgrid.exe  WPS-4.6.0/ungrib.exe

きちんと実行ファイルが生成されている(驚嘆)

ARWpostのインストール

使わない人は省略可能.

以下のARWpost(後処理システム)インストールの箇所を参考にする.

先ほどのページを参考にホームディレクトリにARWpost_install.bashを以下のように作成する.# remove download file # rename WRF directoryのブロックは除いてある(好みの問題)

ARWpost_install.bash
#!/bin/bash
# From install_wrf.sh
##  Download and install required library and data files for WRF.
##  License: LGPL
##  Jamal Khan <jamal.khan@legos.obs-mip.fr>

# grads install
sudo apt update
sudo apt -y upgrade
sudo apt -y install grads unzip default-jre

# ARWpost install
cd ~/Build_WRF
wget -c https://www2.mmm.ucar.edu/wrf/src/ARWpost_V3.tar.gz
tar -xvzf ARWpost_V3.tar.gz -C ~/Build_WRF
cd ~/Build_WRF/ARWpost
cd arch
cp Config.pl Config.pl_backup
sed -i '79s/.*/  $response = 3 ;/' Config.pl
cd ..
./clean
sed -i -e 's/-lnetcdf/-lnetcdff -lnetcdf/g' ~/Build_WRF/ARWpost/src/Makefile
./configure #3
sed -i -e 's/-C -P/-P/g' ~/Build_WRF/ARWpost/configure.arwp
sed -i -e 's/-frecord-marker=4/-frecord-marker=4 -fallow-argument-mismatch/' ~/Build_WRF/ARWpost/configure.arwp
./compile

コンテナ内で実行する.

ubuntu@b07cbba8e72e:~$ bash ARWpost_install.bash

実行ファイルを確認.

ubuntu@b07cbba8e72e:~/Build_WRF$ ls ARWpost/*exe
ARWpost/ARWpost.exe

完了:beer:

もう.tar.gzファイルは不要なので消したい人は消す.(コンテナ内・外どちらからでも消せる)

ubuntu@b07cbba8e72e:~/Build_WRF$ rm *tar.gz *TAR.gz

WRFを使ってみる

あとはお好きなように,,ですが,先ほどのページを参考に動作確認してみる.

1と2は完了しているので3.気象データダウンロードから実行してゆく.

気象データダウンロード

UCARからNFLダウンロードスクリプトを取得

Mac(以下,コンテナ外)のブラウザでこちらから2024年8月30日(台風10号上陸時)のファイルを選択しcshスクリプトをダウンロード.

図説

Screenshot 2024-12-08 at 9.34.08.png

Screenshot 2024-12-08 at 9.35.21.png

Screenshot 2024-12-08 at 10.39.33.png

Screenshot 2024-12-08 at 9.40.30.png

Screenshot 2024-12-08 at 9.41.15.png

Screenshot 2024-12-08 at 9.45.20.png

cshのダウンロードが完了したら,コンテナ外からubuntu_volume/Build_WRFにアクセス,FNL_DATAディレクトリを作ってcshをコピーする.

$ cd ~/docker/ubuntu_volume/Build_WRF
$ mkdir FNL_DATA
$ cp ~/Downloads/rda-download.csh .
$ csh rda-download.csh

compose.yamlでボリュームを設定していない場合はコンテナ外からcshをコンテナ内へ送る必要がある.参考

WRF実行

以下,単なる動作確認につき,再現性を高めるチューニングは行なっていない.

詳しいことは使い慣れた人に聞く,公式のBest PracticesUser's Guideを読む,など.

namelist.wpsを編集

$ cd ../WPS-4.6.0
$ vi namelist.wps  # お好きな方法で

max_dom start_date end_date interval_seconds を修正.1ドメインで計算するので2列目は無視される.

 max_dom = 1,
 start_date = '2024-08-30_00:00:00','2019-09-04_12:00:00',
 end_date   = '2024-08-30_18:00:00','2019-09-04_12:00:00',
 interval_seconds = 21600

計算や出力を緯度経度格子にしたい場合はmap_proj = 'mercator',とする.今回はlambert

map_proj = 'lambert',

ref_lat ref_lon stand_lonを修正.気象庁のメソ客観解析が参考になる.

 ref_lat   =  35.00,
 ref_lon   = 135.00,
 truelat1  =  30.0,
 truelat2  =  60.0,
 stand_lon = 135.0,

そのほかは弄らず.

geogrid.exe, ungrib.exe, metgrid.exeの実行

NFLデータへのリンクの作成.

$ ./link_grib.csh ../FNL_DATA/*grib2

GRIBFILE.AAA ~ GRIBFILE.AAD が生成されていればOK.以下,コンテナ内へログインして順次実行.

ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ./geogrid.exe
ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable
ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ./ungrib.exe
ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ./metgrid.exe

namelist.inputの編集

移動とエディタの起動(コンテナ外).

$ cd ../WRF-4.6.1-ARW/run/
$ vi namelist.input  # お好きな方法で

run_hours start_* end_* interval_secondsを編集.

&time_control
 run_days                            = 0,
 run_hours                           = 18,
 run_minutes                         = 0,
 run_seconds                         = 0,
 start_year                          = 2024, 2019,
 start_month                         = 08,   09,
 start_day                           = 30,   04,
 start_hour                          = 0,   12,
 end_year                            = 2024, 2019,
 end_month                           = 08,   09,
 end_day                             = 30,   06,
 end_hour                            = 18,   00,
 interval_seconds                    = 21600

あとは&domainsmax_dom1に変更するのも忘れずに.その他はひとまずデフォルト.

real.exe, wrf.exeの実行

metgridしたファイルのリンクを貼り,順次実行.

ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ ln -s ~/Build_WRF/WPS-4.6.0/met*nc .
ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ ./real.exe

今回は4並列で計算.

ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ mpirun -np 4 ./wrf.exe

約15分で計算終了:airplane:

ARWpostによる変換

使わない人は省略可.

ARWpostディレクトリへ移動し出力データのリンクを作成.

ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ cd ../../ARWpost
ubuntu@b07cbba8e72e:~/Build_WRF/ARWpost$ ln -s ../WRF-4.6.1-ARW/run/wrfout* .

namelist.ARWpostを編集.詳細はUser's Guide

オリジナルは保存しておいた方が良い.

ubuntu@b07cbba8e72e:~/Build_WRF/ARWpost$ cp namelist.ARWpost namelist.ARWpost.org

編集した例.

namelist.ARWpost
&datetime
 start_date = '2024-08-30_00:00:00',
 end_date   = '2024-08-30_18:00:00',
 interval_seconds = 3600,
 tacc = 0,
 debug_level = 0,
/

&io
 input_root_name = './wrfout_d01_*'
 output_root_name = './test'
 plot = 'list'
 fields = 'height,pressure,tk,tc,umet,vmet,u10m,v10m,slp,geopt,max_dbz'
 mercator_defs = .true.
/

! Below is a list of all available diagnostics
! fields = 'height,geopt,theta,tc,tk,td,td2,rh,rh2,umet,vmet,pressure,u10m,v10m,wdir,wspd,wd10,ws10,slp,mcape,mcin,lcl,lfc,cape,cin,dbz,max_dbz,clfr'

&interp
 interp_method = 1,
 interp_levels = 1000.,950.,900.,850.,800.,750.,700.,650.,600.,550.,500.,450.,400.,350.,300.,250.,200.,150.,100.,
/

実行.

ubuntu@b07cbba8e72e:~/Build_WRF/ARWpost$ ./ARWpost.exe

test.dat test.ctlが生成されていれば成功.

計算結果の描画

compose.yamlでボリュームを設定していない場合はコンテナ内の計算結果をコンテナ外から取り出す参考

試しにPythonを使って10時間積分した生データ(wrfout_d01_2024-08-30_10:00:00)の積算降水を作図.投影系に関してはnamelist.wpsで設定した値を使う.stackoverflowを参考にした.

import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use("Agg")  # 念の為
import cartopy.crs as ccrs

ds = xr.open_dataset("./wrfout_d01_2024-08-30_10:00:00")

da = ds.RAINC[0]+ds.RAINNC[0]
x = da.XLONG.values
y = da.XLAT.values

map_proj = ccrs.LambertConformal(
    central_latitude=30,
    central_longitude=140,
    standard_parallels=(30, 60),
)
# map_proj = ccrs.PlateCarree()  # namelist.wpsでmap_proj = 'mercator'の場合こちら

ax=plt.axes(projection=map_proj)
ax.coastlines()

s = ax.contourf(x,y,da,transform=ccrs.PlateCarree())
plt.colorbar(s)

plt.savefig("test.png")
plt.close()

test.png

雨が降っていることを確認 :umbrella:

終わりに

これでめでたくコンパイル失敗地獄から解放されそうな雰囲気.とはいえ冒頭に書いたようにデメリットもあるので万人にはおすすめできない.

dockerの便利さを実感でき,良い勉強になった.コンテナ外からシームレスにアクセスできるので,例えばコンテナ内環境でいちいちテキストエディタを普段通りにカスタムし直す,など必要なく,普通にいつものエディタで編集でき良い.

エンディアンについては深く考えていなかったが,なぜかうまくいってしまったので未検証.環境によっては注意が必要かも.

ネイティブにIntel FortranでコンパイルしたWRFとどれくらい速度差が出るのか,いつか検証してみたい(やらないやつ).そもそも15kmメッシュでしか計算していないので,高解像度で計算した時に使いものになるかは未知数.こちらは後日試す予定.

WRFに関する電子情報を残してこられた歴々たる先輩方へ感謝申し上げます.

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?