tips

読み込み専用,書き込み専用で開く

読み込み専用で開く場合.

open(10,file='input.dat',action='read')

その他,action='write', action='readwrite'もある.

コンパイラオプション

  • プログラム作成段階においては,配列外参照,暗黙の型宣言,浮動小数点演算例外の検出はつけてコンパイルした方が良い.
  • プログラムが完成して,エラーがない場合には以下のコンパイルオプションはない方が良い.ない方が早く計算できる.
compiler gfortran ifort frt
エラーの検出FIXME-Wall-check all-Eg?
配列外参照-fbounds-check-CB
暗黙の型宣言-fimplicit-none-warn declarations
浮動小数点演算例外の検出-ffpe-trap=zero-fpe0
標準外機能の警告-std=f95-std

連番のファイル名をつける。

ファイル名をcharacter変数に代入して使う。ファイル名の変更にはwrite文を使う。 逐次計算に使える。

character(len=12) filename
...
do i=1,100
  ...
  write(filename,'(a,i4.4,a)') 'hoge',i,'.dat'
  open(10,file=filename)
  ...
    write(10,*) ...
  ...
  close(10)
end do

処理はmovie参照のこと.

makefileでコンパイル

複数のファイル(サブルーチンetc.)で構成されるプログラムを動かすのに便利. 以下の文を「makefile」という名前で作り,コンパイルしたいファイルと同じディレクトリに置く. (以下,main.f90, modules.f90[モジュールファイル], sub1.f90, sub2.f90をコンパイルする場合)

TARGET = a.out
OBJECTS = modules.o main.o sub1.o sub2.o
F90 = ifort
FLAGS = -check all -warn declarations -CB -fpe0 -traceback
COMMON_MOD = modules.f90 

.SUFFIXES :
.SUFFIXES : .o .f90 
.f90.o:
	${F90}	-c $< ${FFLAGS}

${TARGET} : ${OBJECTS}
	${F90}	-o $@ ${OBJECTS}
clean :
	rm  *.o ${TARGET} *.mod 


${OBJECTS} : ${COMMON_MOD}

あとは,makeコマンドを打てばコンパイル完了.そして実行(上の例では./a.outを打てば良い).

$ make 
$./a.out

また,以下の様にmake cleanで実行ファイル(a.out)及びオブジェクトファイル(*.o)を消去できる.

$ make clean

以下,makefileの変数について簡単に説明する.

TARGET = 実行ファイル名 
OBJECTS = モジュールファイル プログラムファイル (すべて拡張子は.oとする.)
F90 = コンパイラコマンド (gfortranを使うなら「gfortran」)
FLAGS = コンパイラオプション
COMMON_MOD = モジュールファイル (拡張子は.f90)

データファイルの読み込み

データファイルの中に何行あるか分からないときにはiostatかendを使う. iostatの方がスマートなやり方かも.

やり方その1

read文にiostatのオプションを付ける. iostatが正の数を返す場合はエラー,負の値を返す場合は行の終わりを意味するらしい.

program hoge
  implicit none
  real a,b
  integer i,inputstatus
  do i=1,10
     read(*,*,iostat=inputstatus) a,b
     if(inputstatus>0) stop "error"
     if(inputstatus<0) exit
     write(*,*) a,b,a**2-b
  end do
end program hoge

やり方その2

endを使う.

以下サンプル.プログラムの中では10回ループを回すが,読み込むのは5行分だけ.

gfortran hoge.f90
./a.out < hoge.dat

hoge.f90

program hoge
  do i=1,10
     read(*,*,end=999) a,b
     write(*,*) a**2-b
  end do
999 continue
end program hoge

hoge.dat

1. 1.
2. 4.
3. 9.
4. 16.
5. 25.

NaNの検出

浮動小数点演算例外を検出するコンパイラオプションがあるので、それを使用する。

Makefile

保存するためのmakefile

DATE=  `date +%y%m%d%H%M`
TAR = backup/backup${DATE}.tgz
backup :
     tar czvf ${TAR} Makefile *.f90

implicit none

宣言文で宣言した変数以外を利用しないようにする。 長いプログラムを書く場合はミスを避けるためにも使用するべき。 自由形式の場合はuse文の後に使用。

program hoge
  use hoge_lib
  implicit none
  real(8) a,b,c,
  ...

装置番号

write(?,*)やread(?,*)の?に入る番号。 通常、5が標準入力(キーボード)、6が標準出力(ディスプレイ上の端末)に使用されるので、 5と6を使ってopenするのは避けるべき。 slatecのI1MACHを使えば、標準入力、標準出力の番号が調べられる。 装置番号にはcharacterも入る。

連番のファイル名をつける。

ファイル名をcharacter変数に代入して使う。ファイル名の変更にはwrite文を使う。 逐次計算に使える。

character(len=12) filename
...
do i=1,100
  write(filename,'(a,i4.4,a)') 'hoge',i,'.dat'
  open(10,file=filename)
  ...
    write(10,*) ...
  ...
  close(10)
end do

簡単なシェルスクリプト

連続してプログラムを実行したいとき、shファイルが便利。 端末で入力する内容をあらかじめファイルに書いておき、それを実行すれば、上から順に実行してくれる。 windowsで言うバッチファイル。

gfortran hoge.f90
cd case10
../a.out
cd ../case20
../a.out
cd ../case30
../a.out
$ sh hoge.sh
fortran/tips.txt · 最終更新: 2011/10/17 17:14 by saito
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0