2016-06-14 12 views
0

を必要とする私のコード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すべきですか?

答えて

0

openステートメント(recl引数)にレコード長を指定しました。エラーは実際にwriteステートメントについて不平を言っています。あなたのwrite声明の中で、あなたはあなたがunformattedを使用しているようrecl引数は、レコードあたりのバイト数を指定し、

do i=1,nx 
    write(36,rec=i)vel(i,:) 
end do 

別に

注意を使用することができますので、あなたが書いているどのレコードを指定する必要があります。

整数あたりのバイト数は

sizeofinteger = storage_size(i)/8 

を使用して見つけることができますし、あなたのレコード長は、recl=sizeofinteger*nzだろう。

更新

recl引数は常にバイト数ではありません@IanHによるコメントで指摘したように、それは実際にコンパイラに依存しています。 @ VladimirFの回答に記されているように、を使用してreclの長さと実行時間を決定すると、iolengthが得られます。

+0

私はあなたの提案およびsizeof整数32を使用してコンパイルすることができますが、値はvel.modに奇妙です、何か私の質問を編集してください。 –

+0

@RichardRublev格納サイズはビット数です。とにかく直接アクセスではなく、ストリームアクセスのほうが良いでしょう。 –

+0

@VladimirFありがとうございました。私は8で割り切っていませんでした。ストリームと言うのはおそらく行く方法です。 –

2

は、ごく最近、私は...人々が直接RECLを指定するが、それでも非常に多くのことを行うべきではない答えで述べて

https://stackoverflow.com/a/37784431/721644そのリンクのように使用inquire(iolength=myrecl)、あなたがはるかに移植可能になります。

とにかく、あなたのコードは、ストリーム・アクセス(結果のファイルが同じである)とはるかに簡単になります:

open(unit=36, file='vel.mod', form='unformatted', access='stream') 
do i=1,nx 
    write(36) vel(i,:) 
end do 
close(36) 
+0

ストリームアクセスでコードをコンパイルしましたが、まだ動作していません。もう一度編集してください。 –

+0

コードを見ずに誰も何が間違っていると言うことができません。あなたはファイルダンプが何を意味するのか、またあなたが期待する価値が期待される理由を述べるべきです。 –

関連する問題