インテルFortranコンパイラでコンパイルするために書かれたFortranコードに問題があります。インテルFortranフォーム= 'バイナリ'の標準同等語
私が持っている具体的な問題はOPEN
ステートメントです。私はフリー・コンパイラ、つまりGNU Fortranでコンパイルできるようにソースコードを書き直そうとしましたが、成功しましたが、いくつか問題があります。
一時ファイル出力はOPEN(access = 'direct', form = 'binary', status = 'replace'...)
ですが、form = 'binary'
は標準ではなく、GNU Fortranコンパイラではサポートされていません。
Webで解決策を探したところ、form = 'unformatted'
は同等でGNU Fortranが対応できることがわかりました。はい、それは本当です、私はコンパイルすることができたとコードが正しく実行されます。しかし、このコードは、このように開いたこれらのファイルに大量のデータを生成する科学的計算です。私の問題は、form = 'unformatted'
がform = 'binary'
の4倍のファイルサイズになるということです。
これでは、フォーマットされていないフォーマットでは正常な実行には十分なハードディスク容量がなく、バイナリでは十分なハードディスク容量がありません。 GNU Fortranで使用可能なインテルFortranのバイナリに相当するファイルがありますか?同様のファイルサイズになりますか?
それは、私は短い、簡略化されたサンプルコードを追加していために頼まれたとおり:
subroutine init
use module params ! contains param1, param2, param3, ... which are inetger or real
common /params2/ maxi, maxj, maxk, limit, recnum ! integers defined elsewhere
real*8, allocatable :: x(:)
... other variables
open (unit = 5, file = 'data.txt', access = 'direct',
* form = 'binary', recl = 16*maxk+8, status = 'replace')
write(5, rec = 1) param1, param2, param3, maxi, maxj, maxk, limit, recnum ...
recnum = 2
do i = 1, maxi
do j = 2, maxj
... do some stuff with x
write(55, rec=recnum) x(0), (xt(k), xt(limit-k), k = 1, maxk)
recnum = recnum + 1
done
done
close(5)
end subroutine init
program xx
common /params2/ maxi, maxj, maxk, limit, recnum
...
call subroutine init
...
open (unit = 5, file = 'data.txt', access = 'direct',
* form = 'binary', recl = 16*maxk+8, status = 'old')
... do some stuff
read(5, rec=1) param1, param2, param3, maxi, maxj, maxk, limit, recnum, ...
... do some stuff
recnum = 1
do i = 1, maxi
do j = 2, maxj
recnum = recnum + 1
... do some stuff
read(5, rec=recnum) x(0), (xt(k), xt(limit-k), k = 1, maxk)
... do some stuff
done
done
close(5)
end program
subroutine init
によって生成されたファイルdata.txt
は、前回の実行から発信私のために最初のレコードの読み取りがprogram xx
必要です(実行するたびにsubroutine init
の呼び出しが発生しないことがあります)、 と、data.txt
のデータを解釈するためにいくつかのパラメータを読み取る必要があります。
このように複数のファイルが生成され、最初のレコードは必ずしも必要ではありません。 私はaccess = stream
が必要ではなくても、最初のレコードが読み込まれても動作すると思っています。
しかし、私はaccess = stream
でaccess = direct
を交換し、WRITE()
またはREAD()
でrecl
とrec =
のすべての発生を削除したとき、私は、ファイルI/Oの間に矛盾のランタイムエラーが発生します。
両方の呼び出しで同じデータ型を保存していますか?実際の書き込みが行われている場所でコードを表示できますか? – Chiel
'binary'と' unformatted'を除いて2つのコードに違いはありません。インテルFortranコンパイラで両方のバージョンをコンパイルしても同じ問題が発生します。 – Balazs
大きなファイルはおそらく多くの書き込みを行い、GNUコンパイラを書き込むたびに、書き込まれたデータのサイズを記述する整数を先頭と末尾に追加することから発生します。 'open'ステートメントに' access = 'stream''を指定すると、あなたはおそらくあなたの問題を解決しました。 – Chiel