fortranで書式なしダイレクトアクセスするとき、例えば4バイト×n要素を読み込みたいときは、
real a(n) open(11, file='hoge.bin', access='direct', form='unformatted', recl=4*n) read(11) a close(11)とするものだと思っていたらifortでは4倍のバイト数になってしまう。ifortは(古いバージョンはこれでいいらしいが)ダイレクトアクセスのときはバイト単位ではなくword単位になっている。つまりこれだと4バイト×(4×n要素)だと解釈されてしまう。ifortで上記の操作をしたい場合は、
real a(n) open(11, file='hoge.bin', access='direct', form='unformatted', recl=n) read(11) a close(11)とするか、コンパイル時に-assume bytereclオプションをつける。
$ ifort -assume byterecl hoge.f90互換性のためには-assume bytereclオプションで対応するのがいいか。grads形式のバイナリの読み書きの際に注意が必要。
gfortran -W -Wall -pedantic-errors -Wunderflow -O -fbacktrace -ffpe-trap=zero,overflow,underflow,invalid -fbounds-check -g mod_hoge.f90 hoge.f90
-W | |
---|---|
-Wall | |
-pedantic-errors | |
-Wunderflow | |
-O | |
-fbacktrace | |
-ffpe-trap | |
-fbounds-check |
gfortran | ifort | pgf90 | |
---|---|---|---|
エンディアン変換 | -fconvert=big-endian/little-endian | -convert big_endian/little_endian | -byteswapio |
-fdefault-integer-8 | -i8 | -i8 | |
-fdefault-real-8 | -r8 | -r8 |
最新コメント