を必要とする私のコードFortranの書き込み:Fortranのランタイムエラー:?直接アクセスデータ転送レコードの数
program v3
implicit none
real :: xmin,xmax,ymin,ymax,zmin,zmax,size
integer :: nx,ny,nz,i,j,nodestotal,sizeofinteger
real,dimension(:), allocatable :: v
integer,dimension(:), allocatable :: v1
integer,dimension(:,:), allocatable :: vel
sizeofinteger=2
open(unit=34, file='for.header', status='old')
read(34,115) xmin,xmax,ymin,ymax,zmin,zmax,size,nx,ny,nz
115 format(7f10.3,3i10)
nodestotal=nx*ny*nz
allocate (v(nodestotal))
allocate (v1(nodestotal))
allocate (vel(nx,nz))
open(unit=35, file='vel.txt', status='unknown')
read(35,*)v
v1=nint(v)
vel=reshape(v1,(/ nx, nz /))
write(*,*)vel(:,25)
open(unit=36, file='vel.mod', form='unformatted', access='direct', recl=nx*nz*sizeofinteger)
do i=1,nx
write(36)vel(i,:)
end do
end program
レコード長を指定する方法は、私は長い時間のためにFORTRANバイナリファイルで働いていません。 私は本当にバイナリファイルで601(nx)int 25(nz)回書いています。私はsizeofintegerを32に変更しました.2D配列をバイナリファイルに書きたい、シンプルにする必要があります。 はウラジミールFのアドバイスに続いて、私はaccesssをストリーミングするために変更されましたが、これは私が得たものである OD -f vel.mod
1623500 8.688e-42 0 0 0
1623520 0 0 0 0
*
1625140 8.688e-42 0 0 0
1625160 0 0 0 0
*
1626600 8.688e-42 0 0 0
1626620 0 0 0 0
*
1630240 8.688e-42 0 0 0
1630260 0 0 0 0
*
1631700 8.688e-42 0 0 0
1631720 0 0 0 0
*
1633340 8.688e-42 0 0 0
1633360 0 0 0 0
*
1635000 8.688e-42 0 0 0
1635020 0 0 0 0
*
1636440 8.688e-42 0 0 0
1636460 0 0 0 0
*
1640100 8.688e-42 0 0 0
1640120 0 0 0 0
*
1641540 8.688e-42 0 0 0
1641560 0 0 0 0
*
1643200 8.688e-42 0 0 0
1643220 0 0 0 0
*
1644640 8.688e-42 0 0 0
1644660 0 0 0 0
*
1646300 8.688e-42 0 0 0
1646320 0 0 0 0
*
1647740 8.688e-42 0 0 0
1647760 0 0 0 0
*
1651400 8.688e-42 0 0 0
1651420 0 0 0 0
*
1653040
それは6200.Whyすべきですか?
私はあなたの提案およびsizeof整数32を使用してコンパイルすることができますが、値はvel.modに奇妙です、何か私の質問を編集してください。 –
@RichardRublev格納サイズはビット数です。とにかく直接アクセスではなく、ストリームアクセスのほうが良いでしょう。 –
@VladimirFありがとうございました。私は8で割り切っていませんでした。ストリームと言うのはおそらく行く方法です。 –