2015年1月21日水曜日

「Linux上でifortを使い、プログラムをコンパイル実行(Fortran77)」


1)まずFortranのプログラム内でのフォーマットは以下のように記述

     parameter(ia=100,ja=100,ka=5)
     dimension am(ia,ja,ka)

  write(cf1,'(a)') './mode/mode1.grd'
  lrecl = ia*ja*ka*4
  open(60,file=cf1,status='unknown'
&    ,form='unformatted',access='direct',recl=lrecl)
     write(60,rec=1) (((am(i,j,k,1),i=1,ia),j=1,ja),k=1,ka)

     end

配列データを出力するプログラム

2)プログラムをコンパイル 実行

スクリプトファイルの例

2−1) 最も単純なもの

#!/bin/csh -f
setenv LANG C
ifort  mode_conv1.f
./a.out &

2−2)メインプログラムのほか、外部のサブルーチンプログラムを使う場合

#!/bin/csh -f
setenv LANG C
ifort  -O3  - mode_conv1.f  ~/program/S_EIGN.for ~/program/S_HAUS.for ~/program/S_OUTM.for ~/program/S_QR.for ~/program/S_DOT.for ~/program/S_FDBS.for ~/program/S_INMG.for ~/program/S_PIVO.for
./a.out &

3−2)1)で示した配列バイナリデータを読み込み、出力する場合は、パソコン環境によってbig_endian, little_endian方式の2通りがある。そのため、2−1)のような最も単純なコンパイル、実行をすると、うまく読めない、出力できないときがある。そこで、必ず間違えないように、以下のように引数を使ってバイナリデータの読み込み、出力形式を指定しておく

#!/bin/csh -f
setenv LANG C
ifort  -O3  -g -convert big_endian mode_conv1.f  ~/program/S_EIGN.for ~/program/S_HAUS.for ~/program/S_OUTM.for ~/program/S_QR.for ~/program/S_DOT.for ~/program/S_FDBS.for ~/program/S_INMG.for ~/program/S_PIVO.for
./a.out &

3−3)プログラムが大きすぎて、メモリが足りない場合がある。そのときは、引数に-shared_intel -mcmodel=medium 

#!/bin/csh -f
setenv LANG C
ifort  -O3  -g -convert big_endian  -shared_intel -mcmodel=medium  mode_conv1.f  ~/program/S_EIGN.for ~/program/S_HAUS.for ~/program/S_OUTM.for ~/program/S_QR.for ~/program/S_DOT.for ~/program/S_FDBS.for ~/program/S_INMG.for ~/program/S_PIVO.for


./a.out &

3−4)プログラムにエラーがあって、止まっている場所を知りたいときは、引数 -gen_interfaces や-tracebackをつけて試してみる。


注:上はIntelのifortコマンドで実行する場合なので、gcc, gfortranなどのコンパイルコマンドの場合は別

0 件のコメント:

コメントを投稿