2009年1月24日土曜日

Fortran備忘録:ファイル名とかいろいろ

数値計算でよくある「繰り返し計算の各回での結果を、第何回目であるかの数字をつけたファイル名にして出力する」とか「あるパラメータでの計算結果をパラメータの数値をファイル名に入れて出力させる」とかのFortranでのやり方まとめ。Fortranは文字列と数値間のキャストの組み込み関数がないのでメンドイ。

1.まず、ファイル名は文字列変数で指定することができる。
2.文字列変数の結合は//で可能
なのでたとえば
character(30) ::param,filename
ていうふうに文字列変数を用意しておいて


open(8,file=param//filename)

なんてのも可能。

3.integer,real,double型の変数を文字列変数に変換やその逆をする場合には内部ファイルを使うとよい。
内部ファイルというのは、入出力先をプログラム中の変数にしたものである。
たとえば

program main
implicit none
integer :: i,j
character(10) :: a,b
i=3
a="5"
!b に i の値を文字列として代入
write(b,*) i
!aの値を数値としてjに代入
read(a,*) j

print*,b
print*,j

end program main

とすれば、3 5てな出力が出てくる。

4.ただ出力を見てもわかるように、bでは3の前にいらん空白が入っているし、これをそのままファイル名で使うと、10文字分の領域を確保しているせいで後ろにも空白が入ってきてなんとも間抜けたファイル名ができる。そんなときには文字列の組み込み関数のTRIMとADJUSTLを組み合わせるといい感じ?TRIMは右側の空白を取り除く、ADJUSTLは文字列を左詰めにする関数。

open(10,file="a"//TRIM(ADJUSTL(dis))//"total")

的な。

5.ファイルに埋め込みたいのが整数ならこれでいいんだが、実数型だと1.000000.txtみたいにいらん長さのファイル名になってしまう。
対策例1
・文字列の部分配列を取り出してくる
文字列は配列のように、1文字目から3文字目みたいに切り出してくることができる。
たとえば
a="abcdefg"
なら
a(1:3)
は"abc"である。
実数を文字列に変換した場合には最初に符号とかを入れる関係で頭に2文字ほど確保されているらしく、a=1.00000000から1.0だけを取り出すという風に切り出す場合にはa(1:5)という風に指定すればいいみたいだ。

対策例2
・何文字目までが有効桁かを探る→切り出し

valはcharacter(30)
nonzero,iはinteger

nonzero=0
do i=1,30
if ( val(i:i) > "0") then
nonzero=i
end if
end do
open(15,file="pot"//TRIM(ADJUSTL(val(1:nonzero))))

0 コメント: