今年度の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.patchgfortran を使う必要があるならば、ここで、 Makefile の FC をgfortran にセットする。 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ここで必要があるならば、 Makefile の FC をgfortran にセットする。 make>&make.log sudo mkdir -p /usr/local/bin /usr/local/include /usr/local/lib sudo make install >& make-install.logテストは上と同様にできるはず。 |
(2021/7/11追記) まだ M1 を搭載した Mac で、 Fortran で書かれたサンプル・プログラムの実行に成功していない。 夏休み案件かも。
(2024/8/3追記) こんなの書きました。「Apple Silicon Mac で GLSC をコンパイルする」
古い 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 |
グラフィックスの保存法 オリジナルでは、 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 |
桂田 祐史