x、y、zそれぞれの方向に100,100,10格子あるデータで、それを100個続けてバイナリデータで書き込みたい場合(Fortran77のプログラム)この形式はGradsの読み込み形式にも相当
1)まずFortranのプログラム内でのフォーマットは以下のように記述
parameter (ia=100,ja=100,ka=10)
& '/data/ishizu3/otsuchi/mode/m08/hex1100.grd'
real :: am1(ia,ja,0:ka)
character cf1*100,cir1*3
do ik=1,100
write(cf1,'(a,a,a)')& '/data/ishizu3/otsuchi/mode/m08/hex1100.grd'
open(60,file=cf1,status='old'
& ,form='unformatted',access='direct',recl=ia*ja*(ka+1))
read(60,rec=ik) (((am1(i,j,k),i=1,ia),j=1,ja),k=0,ka)
if(ik.le.9)then
write(cir1,'(a,i1)') '00',ik
elseif(ik.le.99)then
write(cir1,'(a,i2)') '0',ik
else
write(cir1,'(i3)') ik
endif
write(cir1,'(a,i1)') '00',ik
elseif(ik.le.99)then
write(cir1,'(a,i2)') '0',ik
else
write(cir1,'(i3)') ik
endif
write(cf1,'(a,a,a)')
& '/data/mode/m01/hex0',cir1,'.grd'
open(60,file=cf1,status='replace'
& ,form='unformatted',access='direct',recl=ia*ja*(ka+1))
write(60,rec=1) (((am1(i,j,k,0),i=1,ia),j=1,ja),k=0,ka)
& '/data/mode/m01/hex0',cir1,'.grd'
open(60,file=cf1,status='replace'
& ,form='unformatted',access='direct',recl=ia*ja*(ka+1))
write(60,rec=1) (((am1(i,j,k,0),i=1,ia),j=1,ja),k=0,ka)
enddo
end
これでバイナリファイル形式でデータを保存可能。write文のrec=ikは、データの書き込み位置を指定するもの。
------------------------------------------------------------------------------------------------------------------
意外と重要なopen文のstatus !
status の意味とは
status={ ’new’ | ’old’ | ’replace’ |
’unknown’ | ’scratch’ }
new : 出力ファイルに対して指定され、open文が実行された時点でファイルが存在するとエラーになる。既存ファイルを間違って上書きしてしまうのを防ぐために指定。
old: open文が実行された時点でファイルが存在しないとエラーになる。すでにあるファイルに対して使用する。
replace:出力ファイルに対して指定され、open文が実行された時点でファイルが存在しなければ、その名前のファイルを新しく生成し、存在すればそのファイルを消去して上書き。
unknown: ’unknown’ を指定した場合やstatusパラメータを省略した場合、扱いは処理系に依存する。
scratch:一時ファイルに対して指定され、close文が実行されるか、プロセスが終了するとファイルが消去される。私の調べによると、status=’scratch’ を指定した場合、ファイル名を指定してはならないとありましたが、管理者はまだ理解できていない。
0 件のコメント:
コメントを投稿