【まだ書きかえます。どこをいつ書きかえたか、かならずしも明示しません。】
【この記事は、技術的作業のおぼえがきです。その技術のマニュアルではなく、試行錯誤の記録です。表現が、わかる人にだけわかるものになっているところがあります。】
- 1 -
わたしは、データの可視化に、かつては NCAR Graphics をよくつかっていたのだが、2000年ごろからあまりつかわなくなった。ただし、2020年に、2000年ごろにつかっていたプログラムの動作確認のために Linux (Ubuntu 18.04) に いれてみたことはあった。そのあたりのことは [2020-09-10 データの可視化の道具「NCARグラフィックス」および「GKS標準」とわたしのかかわり ] の記事に書いた。
NCAR Graphics は、2000年代には NCL (NCAR Command Language) という形で発達してきたが、いまでは更新をやめてしまっている。NCAR Graphics のウェブサイト https://ngwww.ucar.edu/ によれば、それをつくってきた人たちは、GeoCAT https://geocat.ucar.edu/ というプロジェクトにうつり、Python のライブラリ Cartopy などをつかって気象データを可視化することを推進しているらしい。NCL のウェブサイト https://www.ncl.ucar.edu/ には、NCL と NCAR Graphics をあわせたソースアーカイブ ncl_ncarg-6.6.2.tar.gz があるが、内容の README.md などのファイルのタイムスタンプは 2019-02-28 であり、そこで更新がとまったようだ。
わたしも、[2021-05-09 気象データの可視化、Python でとりかかったところ] の記事に書いたように、気象データの可視化は Cartopy などをつかって Python でやるようになったので、NCAR Graphics からはとおざかっている。
- 2 -
他方、NCARが中心となって開発されている WRF という気象モデルがある。この名まえは Weather Research & Forecasting Model の略だそうだ。ウェブ上の WRF のホームページはここにある。https://www.mmm.ucar.edu/models/wrf
この WRF の出力の解析・可視化のためのソフトウェアとして RIP というものがある。この名まえは Read/Interpolate/Plot の略だそうだ。ウェブ上では https://github.com/NCAR/RIP/ にソースプログラムとドキュメントがある。 ソースプログラムの最新版は RIP_47.tar.gz (Version 4.7) で、その更新日付は 2018年 1月である。
この RIP が NCAR Graphics を前提としてなりたっている。わたしは、自分が管理する Linux マシン上で WRF をつかおうとして、WRF とともに RIP をインストールしようとした。
この計算機に入れた Linux のディストリビューションは Ubuntu 22.04 だ。2020年の記事に書いた Ubuntu 18.04 のばあいと同様、Ubuntu用の ncl-ncarg パッケージが用意されていて、「apt install ncl-ncarg」 でインストールできる。(実際には sudo で管理者権限をえているがその記述は省略する。)
ところが、RIP をインストールする準備の configure をかけてみて気づいたのだが、Ubuntu 22.04 用の Linux パッケージから展開された ncarg のディレクトリ構成は変なものになっている。このことは、つぎのページでバグ報告されているが、対策などのコメントはついていない。
[Ubuntu ncl package] ncl-ncarg broken install missing folder path
Bug #2017712 reported by Diego Remolina on 2023-04-25
https://bugs.launchpad.net/ubuntu/+source/ncl/+bug/2017712
このままでは、RIP の configure スクリプトは正常に動作しないだろうと思った。【[2023-11-24 補足] このバグレポートでディレクトリ構成のまちがいが指摘されているのは、ncl の実行例がおかれた部分だった。もしそれだけのことで、RIPが必要とするライブラリやヘッダファイルのディレクトリ構成はただしかったのならば、この状態でも NCARG_ROOT を /usr とすれば configure できたかもしれない。わたしはそれをたしかめずにあきらめてしまった。】
NCL のウェブサイトの「Install NCL」というページ https://www.ncl.ucar.edu/Download/ をみると、すすめられているのは、Anaconda (または miniconda) の中にインストールすることだ。わたしの Ubuntu 22.04 でもすでに Anaconda をいれているから、そのなかに ncl をインストールすることはできた。しかし、RIP を Anaconda に依存する形にはしたくない。
そこで、ソースパッケージ ncl_ncarg-6.6.2.tar.gz を展開してコンパイルしてみることにした。それは楽ではなかった。応用パッケージである NCAR Graphics のほうは変化していないが、コンパイラ や X Window 環境 を構成するソフトウェアが変化してしまったからだ。
- 3 -
ncl_ncarg-6.6.2.tar.gz を展開すると、ncl_ncarg-6.6.2 というディレクトリができる。インストールの基本的手順は、そのなかで「./Configure」を実行し、「make Everything」を実行することである。
そのまえに、必要とされるライブラリを入れておくべきだ。しかし、NCLのサイトの記述で必要とされているライブラリのうちどれがすでに Ubuntu のパッケージとしてインストールずみか、ライブラリ名を見るだけでは判断がむずかしい。わたしは、netcdf を (Ubuntu のパッケージでよかったのかもしれないが不安だったので) ソースからコンパイルして /usr/local の下にインストールした。netcdf の version 4 の機能をつかうために、hdf5 も入れた。また、物理量の単位をあつかうライブラリ udunits2 も入れた。そのほかは、make をこころみて不足していたものを補充するという態度でやってみた。
まず ./Configure を実行した。インストールさきを /usr/local/ncarg と指定した。Fortranコンパイラは、商用のものをいれていないので、 gfortran にきまっている。X のライブラリのあるところが、Configure の既定値である /usr/X11R6/lib, /usr/X11R6/include ではなく、/usr/lib/x86_64-linux-gnu, /usr/include/x86_64-linux-gnu である。netcdf4 をつかうが、HDF、GRIB、raster、triangle は全部見送ることにした。(NASA の HDF や 気象現業機関がつくった GRIB を読めたほうが便利ではあるのだが、当面は WRF が出力した netcdf が読めればよいとする。)
- 4 -
- 4a -
./Configure につづいて make を実行してみると、ところどころ、Fortran プログラムのコンパイルでエラーがおきてオブジェクトファイル (「.o」でおわる名まえのファイル) ができないことがある。その原因は「引き数の型があっていない」ことだった。
Fortran の変数には、整数型と「実数型」 (実際は浮動小数点型) と文字型がある。NCAR Graphics の Fortran サブルーチンのうちには、同じ位置の引き数に、それを呼び出すプログラム側でちがう型の変数をわりあてることができ、呼び出された側で内容をみて判断するしくみになっているものがある。1970年代には、整数型も実数型も記憶容量は同じ (すべてではないが多くの計算機で 4バイト = 32ビット) だったし、文字型はまだ確立しておらず整数型変数に文字をおしこめていたから、このようなしくみでもさしつかえなかったのだ。しかしいまでは、整数型と浮動小数点型は記憶容量がちがうかもしれないし、文字型は、たとえば文字の種別や文字数がさきにきているかもしれない。コンパイルの段階で型のくいちがいに気づくことができるとはかぎらないが、ちかごろのコンパイラは、それに気づいたらエラーにするようになったのだ。
しかし、古い設計のプログラムをコンパイルしたい需要にもこたえて、型があっていなくてもエラーにしないオプションはある。gfortran では -fallow-argument-mismatch だ。実行時の動作が保証されるわけではないが、コンパイル作業はさきにすすむ。
問題がおきた Fortran ソースプログラムのあるディレクトリの Makefile の FcOptions に -fallow-argument-mismatch を追加してそのディレクトリの make をやりなおせば、そのディレクトリに関するかぎりうまくいく。しかし、トップレベル (ncl_ncarg-6.6.2 の直下) の Makefile を修正して make をやりなおしたのではうまくいかない。make の過程で Makefile の内容が既定値にもどってしまう。それは、このソフトウェアの make が ymake というしかけをつかっているからだ。ymake が見ているのは yMakefile というファイルだが、これに書きこんでもうまくいかなかった。ymake は config というディレクトリのなかみも見る。config/Site.local には Configureスクリプトの実行の際に指定したことが書かれている。ここに、FcOptions を追加指定してみたが、これもうまくいかなかった。config にあるファイルのうちで「LINUX」がえらばれていることがわかったので、config/LINUX の FcOptions を書きかえた。これで、この件は解決した。
- 4b -
ncarg2d/src/libncarg_gks/bwi/argb2ci.f がコンパイルの際にエラーになったのも、変数の型のくいちがいだったが、現象はちょっとちがっていた。ここでは、ビット列を16進数で表現して、それを整数とみなし、他の整数とのビットごとの and, or 演算したり、整数演算をしたりしている。16進数は、たとえば「Z'1234CDEF'」のような形であらわされている。(10進数の10が「A」、そして順に、15が「F」である。1980年代に見たメインフレーム機での Fortran では「Z1234CDEF」のような形がつかわれていたが、ここでは16進値が引用符でくくられている。) gfortran では、このような16進表現を「BOZ」とよんでいる。いまのバージョンの gfortran では、BOZ は整数とは別の型とされ、混同するとエラーとしているのだ。ソースプログラムを修正して「int(Z'1234CDEF') 」のような形で意識的に整数に変換してやるようにした。
- 5 -
C言語でかかれたプログラムのコンパイルがうまくいかなかったところがいくつかあった。いずれも、X Window System に関連するライブラリのヘッダファイルがみつからないことによるもので、ライブラリがすでにあればその場所を指定することで、まだなければインストールすることで解決した。
- 5a -
ncarview/src/bin/ctrans/ctrans ができなかった。たどってみると、ncarview/src/lib/libctrans/libctrans.o ができていなかった。それは、ncarview/src/lib/libctrans/xresources.h, xresources.c など多数のファイルに「#include <X11/Xlib.h>」があったが、それに対応するヘッダファイルがなかったのだった。「apt install libx11-dev」で /usr/include/X11/Xlib.h ができ、それをよびだすプログラムがコンパイルできるようになった。
- 5b -
ncarview/src/bin/idt/idt もできなかった。
ひとつには ncarview/src/bin/idt/xrubber.c の「#include <X11/Xmu/WinUtil.h>」がエラーになっていた。「apt install libxmu libxmu-dev」をしたら、「/usr/include/X11/Xmu/WinUtil.h」ができ、それをよびだすプログラムがコンパイルできるようになった。
もうひとつには、このディレクトリにあるプログラムには、「#include <X11/Xaw/____.h>」の形の include指定 が多数あった。「apt install libxaw7 libxaw7-dev」をしたら「/usr/include/X11/Xaw」ができ、Athena Widget をよびだすプログラムがコンパイルできるようになった。
- 5c -
ncarg2d/src/libncarg_gks/cdrivers/cro_device.c をコンパイルするところで、「#include <cairo/cairo.h>」がエラーになった。cairo ライブラリははいっていたがヘッダファイルが不足していたようなので「apt install libcairo-dev」でインストールした。
つぎには、そこからよびだされた「/usr/include/cairo/cairo-ft.h」の「#include <ft2build.h>」がエラーになった。しらべてみると、ft2build.h は freetype2 のファイルだ。また、ncarg2d/src/libncarg_gks/cdrivers/cro.c で freetype2 の関数 FT_Init_FreeType を呼びだしている。freetype2 はすでにインストールされており、そのヘッダファイルは /usr/include/freetype2 にあったのだが、make の際にそこをさがしていなかった。そのディレクトリの Makefile を編集し、INCSEARCH に -I/usr/include/freetype2 を追加した。(INCSEARCH にすでに書かれていた -I/usr/include/1-1-gnu は実在しないディレクトリを指定しているからそれを消して置きかえてもよかったはずだが、追加で動作したのでそのままにした。)
これで、NCAR Graphics のコンパイルが成功したようだ。「make install」で /usr/local/ncarg の下にインストールした。
- 6. RIP -
RIPをインストールするには、configure スクリプトを実行するとできる「configure.rip」というファイルを修正してから「make linux_gnu」をすればよいことがわかった。修正点がわかるまで、だいぶ試行錯誤したが。
configure.rip の修正点はつぎのとおり。
netcdf と NCAR Graphics のありかを指定する。(これは環境変数でもよいらしいが、configure.rip でそれをつかうところの直前に書いたほうがわかりやすい。)
NETCDF = /usr/local
NCARG_ROOT = /usr/local/ncarg
FFLAGS に -fallow-argument-mismatch を追加する。
LOCAL_LIBS が「-L/usr/X11R6/lib64 -lX11」となっていたのを「-L/usr/lib/x86_64-linux-gnu -lX11 -lcairo -lfreetype」と変える。
これで RIP のコンパイルには成功した。動作確認はこれからである。 11月16日にためしたかぎりでは動作した。
- 7. GrADS [2023-11-23 補足] -
おもわぬところに副作用が生じた。GrADS (Ubuntu のパッケージでインストールしてあった) を実行して、netcdf 形式のファイルを sdfopen でひらこうとすると、hdf5 のライブラリがあっていないというエラーメッセージを出して、すぐ grads コマンドが終了してしまう。
これは、わたしが hdf5 ライブラリをコンパイルして /usr/local/ にインストールしたせいだ。Ubuntu むけの hdf5 関係のパッケージの構成は複雑でどれが必要なのかよくわからないが、/usr/lib/x86_64-linux-gnu/libhdf5.so がある状態ならば、実行時にはそれがつかわれているらしい。ところが、/etc/ld.so.conf では、/etc/ld.so.conf.d/libc.conf が、その横ならびの x86_64-linux-gnu.conf よりも優先されるようになっており、libc.conf に「usr/local/lib」と書かれているので、わたしがコンパイルした libhdf5.so がよびだされてしまい、動的リンクに失敗するのだ。
ほかの場面では /usr/local を優先したいことがあるので、ld.so.conf を書きかえたくはない。/usr/local/bin/grads というスクリプトをつくり、その内容は「export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu」のあとに「/usr/bin/grads $*」とした。コマンドパスも /usr/local/bin を優先するように設定してあれば、grads でこのスクリプトがうごき、sdfopen も正常に動作した。