16 GLSC についてまとめておく (2021年版)

今年度の3年生の Mac を見たら、GLSC が入っていなかった。あれあれ。 今どきメインで使うものではないかもしれないが、 時々古いプログラムを使うことがあるので(プログラムは案外と長寿命なもの。 今の自分の課題に、30年前に書かれたプログラムが参考になる、 というような状況がごく普通に生じる。 このような場合、古いプログラムが動作すると、とても助かる)、 入っていると便利である。

GLSCとは何か    

「実は、多くのプログラミング言語で、 グラフィックスの機能は言語仕様に含まれていません。 グラフィックスを実現するには、 その環境に合った(プログラム)ライブラリィを利用するのが普通です。」

「GLSC (Graphic Library for Scientific Computing) とは、 龍谷大学数理情報学科のグループが作成した、 科学技術計算の結果を可視化するためのライブラリィです。」

「GLSCは、いわゆるフリーソフトウェアで、 オリジナル・バージョンは 1995年にリリースされたものが最終版です。」

「C言語や Fortran で書かれたプログラムから、 X Window System (X11) の 描画機能 (Xlib) を呼び出すことで、 グラフィックスを実現します。」 Mac では XQuartz をインストールすれば、 X Window System が使えるようになります (現象数理学科 Mac では、XQuartz をインストールしてありますが、 macOS をクリーン・インストールしたりすると消えてしまうので、 その場合は自分で XQuartz をインストールすること。)。

「GLSCの紹介」 と言うのを書いた。いいかげん新しいのを書くべきだけど放置している。

GLSCのマニュアル

GLSCのインストール

(一応、Mac を念頭においているが、 Windows 環境の WSL2 でもほぼ同様でインストール出来る。)

macOS Catalinaまではこれでインストールできた
rm -rf sagyou
mkdir sagyou
cd sagyou
curl -O  http://www602.math.ryukoku.ac.jp/~nakano/software/math/glsc-3.5.a.tar.Z
curl -O  http://nalab.mind.meiji.ac.jp/~mk/daishin/glsc-3.5+a.patch
curl -O  http://nalab.mind.meiji.ac.jp/~mk/program/graphics/glsc-3.5+mk.patch

tar xzf glsc-3.5.a.tar.Z
cd glsc-3.5.a
patch -p1 < ../glsc-3.5+a.patch
patch -p1 < ../glsc-3.5+mk.patch
gfortran を使う必要があるならば、ここで、 MakefileFCgfortran にセットする。
make >& make.log
sudo mkdir -p /usr/local/bin /usr/local/lib /usr/local/include
sudo make install >& make-install.log
続いてテストするには
cd test
./ctests
./ctestd
./ftests
./ftestd
(順に、C言語単精度、C言語倍精度、Fortran単精度、Fortran倍精度)

ところが Big Sur の /usr/bin/cc (LLVM+clang) は、 暗黙の宣言を禁止しているので、コンパイル出来ない。 MacPorts で gcc (/opt/local/bin/gcc) をインストールして、 それを Makefile の CC に登録するとコンパイル出来る。 しかし、CC = gcc だとなぜか gfortran がうまく使えない。

というわけで、Big Sur 用に新しいパッチを用意した。

macOS Big Sur では、これでインストールできる
rm -rf sagyou
mkdir sagyou
cd sagyou
curl -O  http://www602.math.ryukoku.ac.jp/~nakano/software/math/glsc-3.5.a.tar.Z
curl -O  http://nalab.mind.meiji.ac.jp/~mk/daishin/glsc-3.5+a.patch
curl -O  http://nalab.mind.meiji.ac.jp/~mk/program/graphics/glsc-3.5+mk.patch20201229
tar xzf glsc-3.5.a.tar.Z
cd glsc-3.5.a
patch -p1 < ../glsc-3.5+a.patch
patch -p1 < ../glsc-3.5+mk.patch20201229
ここで必要があるならば、 MakefileFCgfortran にセットする。
make>&make.log
sudo mkdir -p /usr/local/bin /usr/local/include /usr/local/lib
sudo make install >& make-install.log
テストは上と同様にできるはず。
(2021/7/2追記) M1 を搭載した某 Mac Book Air (学生の持ち物) で試したところ、 最初はうまく行かなかった。 XQuartz が古かったので、それを更新してからやり直したら、 エラーなく make が終了して、 テスト・プログラムも動作した。 最初にターミナルで xeyes など害のないプログラムを起動して、 XQuartz にアップデートあるか、自己チェックさせると良いかもしれない。

(2021/7/11追記) まだ M1 を搭載した Mac で、 Fortran で書かれたサンプル・プログラムの実行に成功していない。 夏休み案件かも。


古い GLSC は、たくさん直さないとダメだが、 秋山 正和公式オフィシャルサイト にある G.L.S.C. ならば少し直せばすむかもしれない。 http://www.isc.meiji.ac.jp/~akiyama_masakazu/Software/glsc-3.8.6.zipがソースファイル一式である。

GLSCを利用したプログラムのコンパイルの仕方 (コンパイラーへの指定法)

以上から、倍精度のプログラム nantoka.c をコンパイルするには
  cc -O -o nantoka -I/usr/local/include -I/usr/X11/include nantoka.c -L/usr/X11/lib -L/usr/local/lib -lglscd -lX11 -lm
のような感じになる。 これは面倒なので、何か工夫をすべきである。

個人的には、UNIX 伝統の make を使っていて、 (数値計算のデータを扱ったりするにも使えるので) それを勧めたい。


お気軽にやるには、シェル・スクリプトや、エイリアスを使うのかもしれない。

現象数理学科 Mac では、 コンパイル用のスクリプトとして、cglsc というのを使って来た。
cglsc
#!/bin/csh -f

if ($#argv >= 1) then
	if( '-s' == "$1" ) then
		set glsc=glscs
		set exflag=-DG_SINGLE
		shift
	else
		set glsc=glscd
		set exflag=-DG_DOUBLE
	endif
endif

if ($#argv == 0) exit 0

set main=$1:r cmd=("cc -g -O")

foreach f ($argv)
	set cmd=($cmd ${f:r}.c)
end

exec $cmd $exflag -I/usr/X11/include -I/usr/local/include -o $main -L/usr/local/lib -l$glsc -L/usr/X11/lib -lX11 -lm

C++バージョンも掲げておく。

cglsc++
#!/bin/csh -f

if ($#argv >= 1) then
	if( '-s' == "$1" ) then
		set glsc=glscs
		set exflag=-DG_SINGLE
		shift
	else
		set glsc=glscd
		set exflag=-DG_DOUBLE
	endif
endif

if ($#argv == 0) exit 0

setenv CXXFLAGS	"-O3"

set target=$1:r
if (-e $target) then
	mv $target $target.$$
endif

c++ $CXXFLAGS $exflag -I/usr/X11/include -I/usr/local/include -o $target $* -L/usr/local/lib -l$glsc -L/usr/X11/lib -lX11 -lm

cglsc, cglsc++ のインストール
curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/20210429/cglsc
curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/20210429/cglsc++
chmod +x cglsc cglsc++
cp -p cglsc cglsc++ どこか
“どこか” は ~/bin/usr/local/bin かな。 後者の場合は sudo が必要だろう。
sudo cp -p cglsc cglsc++ /usr/local/bin

動作チェック1 (1次元熱方程式)
% curl -O  http://nalab.mind.meiji.ac.jp/~mk/program/fdm/heat1d-e-glsc.c
% cglsc heat1d-e-glsc.c
% ./heat1d-e-glsc
区間の分割数 N = 50
λ (=τ/h^2) = 0.5
τ=0.0002
最終時刻 Tmax = 0.5
終りました。X の場合はウィンドウをクリックして下さい。
%

動作チェック2 (2次元熱方程式)
% curl -O http://nalab.mind.meiji.ac.jp/~mk/program/fdm/heat2d-i-2017.c
% cglsc heat2d-i-2017.c
% ./heat2d-i-2017
Nx, Ny: 100 100
θ (0≦θ≦1): 0.5
τ(≦5e-05≡最大値ノルムに関する安定性条件を満たすτの上限): 1e-4
注意: λ=2>1/2(1-θ) となっています。
備考: 1+2θλ= 3.0, -θλx=-0.50, -θλy=-0.50
Tmax: 0.5
Δt: 0.01

動作チェック3 (常微分方程式)
% curl -O http://nalab.mind.meiji.ac.jp/~mk/program/ode_prog/reidai8a-glsc.c
% curl -O http://nalab.mind.meiji.ac.jp/~mk/program/ode_prog/rei8a.data
% cglsc reidai8a-glsc.c
% cat rei8a.data | ./reidai8a-glsc

図: 常微分方程式の相図
Image reidai8a
GLSCとマウス     X11 は、3つのボタンがあるマウスを備えたコンピューター (ワークステーションと呼ばれた) をターゲットとして作られた。 Windows マシンのマウスで 3 ボタンは普通なので、 想像するのは難しくないだろう (右クリックは普通にあり、 ホイール・クリックが中ボタンのクリックに相当する)。 一方、Mac の純正マウスは1つしかボタンがない。 Mac で X11 を実現する XQuartz は、 XQuartz の[環境設定][入力]にある 「3ボタンマウスをエミュレート」にチェックを入れることで、 次のように動作する。 (というように、3ボタンマウスのエミュレートは一応出来るわけだけれど、 あまり使いやすくない、というかイライラしてくるので、 常用するのならば、3ボタンマウスを接続することを強く勧める。)

グラフィックスの保存法     オリジナルでは、 g_outというコマンドが用意されていて、 メタファイルを PostScript 形式に変換して使うようになっていたが、 今では PostScript は使いにくいし、 領域を塗りつぶして描画するようなプログラムを描く人がいたせいか (これは g_out と相性悪い?)、 ImageMagick の import コマンドを使って、 イメージ・ファイルとして保存する使い方が普及している (た?)。 次の g_dump() という関数を使えば、 そのときグラフィックスを表示しているウィンドウが、 イメージ・ファイルとして保存できる。

void g_dump(char *fname, Display *display, Window wid)
{
  char command[256];
  sprintf(command, "import -window %lu %s", wid, fname);
  system(command);
}
こんなふうに使う
  g_dump("nantoka.png", g_get_display(), g_get_window());

なお、ずっと以前、この g_dump() で大量の図を保存しようとして、 オープンできるファイルの最大数制限に引っかかって失敗していた人がいた (「Macの ulimit」 で回避できる?)。

時間依存する系で、アニメーションを作りたければ、 「GLSCで動画作り」 も見よ。


(2022/6/22 追記) 古いプログラムを走らせようとしたが、 コンパイルに ccmg というのが必要だった (最近はなるべく cglsc で済むようにしてあるけれど)。
curl -O  http://nalab.mind.meiji.ac.jp/~mk/program/matrix/matrix-lib3.41.tar.gz
tar xzf matrix-lib3.41.tar.gz
cd matrix-lib3.41
make
sudo make install
sudo cp ccmg /usr/local/bin

桂田 祐史