なお、ここでは計算機としては主にSunのSPARCstationを考えているが、一部の SunFortranに特有な機能を除けば、他のプラットホームにも適用できる。 筆者は、Sun(Solaris1.1.2およびSolaris2.5)およびLinuxを使用している。
また、本稿の旧版ではグラフィックルーチンとしてMONGOを取り上げたが この版からはPGPLOTを使うものとした。MONGOについては旧版「IRAF/IMFORT、MONGO およびKISOlibによるソフト開発」を参照していただきたい。
IMFORTを使うと、(1) バイナリファイルの読み書き、(2) IRAF形式 の画像の読み書き、(3) コマンドラインの引数の使用、 (4) 画像ファイルのヘッダの読み書きなどが容易にできる。
program argument1 argument2 ...というようにプログラムのパラメータをコマンドラインに指定できるということであ る。また、引数を省略した場合には、その引数がそのプログラムにとって必須 のものであれば、プログラムの中からこれを要求してやるというようなことも 可能である。
以下にあげる例は、IRAF形式で書かれた符号無しの2バイト整数型(unsigned short integer)の画像ファイルを読み、実数型の配列を得るための サブルーチンの例である。
入力画像は既にIMOPENルーチンでオープンされ、画像識別番号(image descriptor) im が得られているものとし、画像の大きさ iext, jextも既知とする。 このサブルーチンによって実数型の配列 gに画像が読み込まれる。 ierはリターンコード(正常終了なら0)である。
はじめの例は、コマンドラインの iarg番目の引数として画像のファイル名 imageを与えた時に、オープンモード modeでファイルをオープンし、 その画像識別番号 im、画像のタイトル title、データ型(変数の型) dtype、画像の大きさ iext, jextを得るためのサブルーチンである (ここで mode = 1 なら Read only、mode = 3 なら Read/write モードになる)。 さらに、リターンコードが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
f77 -o crstest crstest.f -lpgplot -lX11等とする)
このプログラムは文字「q」を入力する(単にqを押す)ことで終了する。 マウスのボタンも文字に対応しているが、一応念のため上記のテストプログラムで ボタンと文字コードの対応を調べておいたほうがよいだろう。
なお、上記の PGCURSは本来は整数型の関数であり idum = PGCURS(x, y, ch) と いった呼ばれ方をすべきであるが、何故か Linux の場合はエラーとなってしまう。 上記の記述に従えば、SunでもLinuxでもうまく働く。
一方、SPIRALは上記を駆使したプログラムパッケージであり、そのノウハウの一部が サブルーチンパッケージとして蓄えられている。これが、SPIRAL Libraryである。 SPIRAL Libraryは、SPIRALの中の、source/libディレクトリにあるサブルーチン群 の総称である(あるいはlibspiral.aがそのオブジェクトをライブラリ化したもの である)。
SPIRAL libraryには画像処理プログラム(とりわけSPIRAL)で良く使われるサブルーチンの 他 PGPLOTやIMFORTあるいはFITSIOを使い易くするための、一種のマクロ的なサブルーチン が含まれている。したがって、SPIRAL LibraryによってIMFORT, FITSIO, PGPLOTも より容易に使えるようになっている。
ただし、SPIRAL libraryのうちかなりの部分は、Facom S-3500版の開発時に 作成されたKISOlibをSun用に書き換えたものであり、中にはチェックの充分でないもの 等もあり、使用に際しては注意が必要である(特に下記の表に無いものは使用しないほうが 無難)。
使用法については、各サブルーチンのソースの始めの部分にあるコメントが 使用法、引数の意味等について解説しているのでそれを参照されたい。 また、SPIRALの中の、source/libにあるlibspiral.docがそれらをまとめた 簡易マニュアルとなっている。
下記は、SPIRAL Libraryの主なルーチンと、その機能を簡単に記したものである。 たとえば、SUBGUTYのサブルーチンのソースは subguty.fにある。
具体的なサブルーチンの呼び方については後述の Makefileを参照されたい。
IMFORTを使用するプログラムの場合は、libimfort.a, libsys.a, libvops.a, libos.a FITSIOを使用する場合は、libfitsio.a PGPLOTを使用する場合は、libpgplot.a, libX11.a SPIRAL Libraryを使用する場合は、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の中に依存関係と コンパイル法などを記述しておくと、再コンパイルが楽なだけでなく、多くの部分に影響する変更を行ったときも、全体を完全に変更することが出来間違いを防ぐことができる。
以下で # はコメント行、\ は継続行の印である。 <TAB>は表示されていない。
この例では、プログラムのコンパイルのほか、ライブラリの作成、圧縮ファイルの 作成などもできるようになっている。 Makefileのもっと良い例としては、X-Window System, PGPLOT その他のPDS、 フリーソフトのものが挙げられる。もしも、手元にあればぜひ眺めていただきたい。
このプログラムをコンパイルしたものが isocontourであるとすると、
% isocontour imageとすれば画面にコントアを描き、
% isocontour image m51.psとすれば、画面にコントアを描いた後 PostScript 形式のファイルを m51.ps という名前でハードコピーを出力する。
この例では、IMFORT, PGPLOTのサブルーチンの他に、上で例に挙げたSPIRAL Libraryの サブルーチン opninp, matrd も使ってある。また、pointerと mallocによって、画像のためのメモリを動的に割り当てている事にも 注目して欲しい。