1996年1月1日
なお、ここでは計算機としては主にSunのSPARCstationを考えているが、一部の SunFortranに特有な機能を除けば、他のプラットホームにも適用できる。 筆者は、Sun(Solaris1.1.2およびSolaris2.4)およびLinuxを使用している。
また、本稿の旧版ではグラフィックルーチンとしてMONGOを取り上げたが この版からはPGPLOTを使うものとした。MONGOについては旧版「IRAF/IMFORT、MONGO およびKISOlibによるソフト開発」を参照していただきたい。
program argument1 argument2 ...というようにプログラムのパラメータをコマンドラインに指定できるということであ る。また、引数を省略した場合には、その引数がそのプログラムにとって必須 のものであれば、プログラムの中からこれを要求してやるというようなことも 可能である。
以下にあげる例は、IRAF形式で書かれた符号無しの2バイト整数型(unsigned short integer)の画像ファイルを読み、実数型の配列を得るための サブルーチンの例である。
入力画像は既にIMOPENルーチンでオープンされ、画像識別番号(image descriptor) im が得られているものとし、画像の大きさ iext, jext も 既知とする。このサブルーチンによって実数型の配列 gに画像が読み込まれる。 ier はリターンコード(正常終了なら0)である。
次の例は、画像識別番号 imとしてオープンされたファイルから、 変数型が dtypeで、大きさが iext, jextの画像を、実数型の配列 gに 読み込むためのサブルーチンである。 dtypeとしては 単精度実数型あるいは2バイト符号付整数のみを扱えるようにしてある。
Interger hard hard=0 # ハードコピーのflag call PGBEG(0,'/xserve',1,1) # 画面表示用デバイスの設定 1000 continue # ここに描画コマンドを使う if ( hard.eq.0 ) then call PGEND # 以下はハードコピーの取り方 write(*,'(a,$)') 'Hardcopy 1:yes, 0:no' read(*,'(i)') hard if ( hard.eq.1 ) then call PGBEG(0,'output.ps/ps',1,1) # LANDSCAPEモードの時 call PGSCF(2) go to 1000 end if end if if ( hard.eq.1 ) then call PGEND end if stop end
このプログラムは文字「q」を入力する(単にqを押す)ことで終了する。 マウスのボタンも文字に対応しているが、一応念のため上記のテストプログラムで ボタンと文字コードの対応を調べておいたほうがよいだろう。
なお、上記のPGCURSは本来は整数型の関数でありidum=PGCURS(x, y, ch) といった呼ばれ方をすべきであるが、何故かLinuxの場合はエラーとなってしまう。 上記の記述に従えば、SunでもLinuxでもうまく働く。
一方、SPIRALは上記を駆使したプログラムパッケージであり、そのノウハウの一部が サブルーチンパッケージとして蓄えられている。これが、KISOlibライブラリである。 KISOlibライブラリは、SPIRALの中の、source/libディレクトリにあるサブルーチン群 の総称である(あるいはlibspiral.aがそのオブジェクトをライブラリ化したもの である)。
KISOlibには画像処理プログラム(とりわけSPIRAL)で良く使われるサブルーチンのほか KISOimageやIMFORTを使い易くするための、一種のマクロ的なサブルーチンが含まれ ている。したがって、KISOlibによってIMFORT, KISOimageなどもより容易に使える ようになっている。
ただし、KISOlibのうちかなりの部分は、FACOM S-3500版の開発時に作成された ものをSun用に書き換えたものであり、中にはチェックの充分でないもの等もあり、 使用に際しては注意が必要である(特に下記の表に無いものは使用しないほうが 無難)。
使用法については、各サブルーチンのソースの始めの部分にあるコメントが 使用法、引数の意味等について解説しているのでそれを参照されたい。
下記は、KISOlibの主なルーチンと、その機能を簡単に記したものである。 たとえば、SUBGUTYのサブルーチンのソースはsubguty.fにある。 また、SUBIMAGEについては subimagef.fにソースがあり、そのベースとなる KISOimageそのもののソースはsubimagec.cにある。 具体的なサブルーチンの呼び方については後述の Makefileを参照されたい。
IMFORTを使用するプログラムの場合は、libimfort.a, libsys.a, libvops.a, libos.a PGPLOTを使用する場合は、 libpgplot.a, libX11.a KISOlibを使用する場合は、 libspiral.aといったライブラリをリンクしなくてはならない。
ライブラリの格納場所はサイトによって異なるはずである。 後述のSPIRALの Makefileの実例を参考にしていただきたい。
簡単な例: PGPLOTのみを使うとき src.fをコンパイルして objectを作るなら
f77 -o object src.f -lpgplot -lX11もしもPGPLOTのライブラリが/usr/lib以外にあるならば、-lpgplotの代りに /usr/local/pgplot/libpgplot.aなどとする。
このような目的のために、UNIXにはプログラム開発用のツールmakeが用意されている。 これはMakefikeというファイルに、ファイルの依存関係や作成法(コンパイル法)を 記述しておき、必要なものだけを必要なときにだけ実行するものである。
やや詳しくかつわかりやすい参考書としては、「unixツールガイドブック」(坂本文著; 共立出版)があるので、それを勉強していただきたいが、ここではSPIRALの開発時に 使用しているMakefileの例を紹介しよう。
ターゲット: 依存するファイル TAB (ターゲットの作成法)makeはターゲットとその依存するファイルの更新日付を比較し、依存するファイルの 方が新しい日付を持っていればコマンドを起動してターゲットを作成し直す。
例) program: source1.o source2.o f77 -o program source1.o sourece2.o source1.o: f77 -c source1.f source2.o: f77 -c source2.f (f77の前には空白ではなくタブが入る)この場合は、たとえばsouce1.fだけが変更されるとsource1.fのみが コンパイルされ、次いで、programが作り直される。source2.fは 再コンパイルされない。 多くのプログラムから成るシステムを作るときは、Makefileの中に依存関係と コンパイル法などを記述しておくと、再コンパイルが楽なだけでなく、多くの部分に 影響する変更を行ったときも、全体を完全に変更することが出来間違いを防ぐことが できる。
この例では、プログラムのコンパイルのほか、ライブラリの作成、圧縮ファイルの 作成などもできるようになっている。 Makefileのもっと良い例としては、X-Window System, PGPLOT その他のPDS、 フリーソフトのものが挙げられる。もしも、手元にあればぜひ眺めていただきたい。
% isocontour imageとすれば画面にコントアを描き、
% isocontour image m51.psとすれば、画面にコントアを描いた後PostScript形式のファイルをm51.ps という名前でハードコピーを出力する。 この例では、IMFORT, PGPLOTのサブルーチンの他に、上で例に挙げたKISOlibの サブルーチンopninp, matrdも使ってある。また、pointerと mallocによって、画像のためのメモリを動的に割り当てている事にも 注目して欲しい。
以上