2015年1月30日金曜日

「配列データを連続的にバイナリ―で書き込み、Gradsでも読み込むことができるデータ形式にするFortran77プログラム」


x、y、zそれぞれの方向に100,100,10格子あるデータで、それを100個続けてバイナリデータで書き込みたい場合(Fortran77のプログラム)この形式はGradsの読み込み形式にも相当

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

    parameter (ia=100,ja=100,ka=10)
    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(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)

    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 件のコメント:

コメントを投稿