在gnuplot上查看fortran的二进制输出



所以,我用fortran创建了一个二进制文件,使用了类似的东西:

open (3,file=filename,form="unformatted",access="sequential")
write(3) matrix(i,:)

按照我的理解,fortran在文件的两端加上4个字节,剩下的就是我想要的数据(在本例中,是1000个双字节的列表)。

我想用gnuplot来读这篇文章,但是,我不知道如何让gnuplot跳过第一个和最后4个字节,并将其余部分作为双字节来读。文档在这方面帮助不大。

感谢

Andrew:我认为没有理由让gnuplot处理数据前后的额外字节。要么Fortran不做这种填充,要么它做了,gnuplot可以轻松地处理它。

我也遇到过类似的问题,谷歌搜索总是让我回到这里。我想我最好发布我的解决方案,以防其他人也遇到同样的情况。

我一直在尝试使用gnuplot的"plot'file.dat'matrixwithimage"命令绘制2D颜色图。我的ASCII输出文件太大,所以我想使用二进制文件。我所做的事情如下:

在fortran中:

implicit none
real, dimension(128,128) :: array
integer :: irec
! ... initialize array ...
inquire( iolength=irec ) array
open( 36, 'out.dat', form='unformatted', access='direct', recl=irec )
write( 36, rec=1 ) array
close( 36, status='keep' )

在gnuplot中:

plot 'out.dat' binary array=128x128 format="%float" with image

注:

  • 默认情况下,gnuplot在二进制文件中采用单精度。如果您fortran程序以双精度输出,只需更改"%float"至"%加倍"。

  • 我的程序在数组中使用了双精度数据,但输出文件太大了。由于基于双精度或单精度的图像肉眼无法分辨,并且双精度数据文件大,我将双精度数据转换为单精度数据在将其写入文件之前。

  • 您可能需要调整gnuplot命令,具体取决于你想处理矩阵,但这会加载它并绘制它好这做到了我需要它做的事情,我希望它能帮助任何人
    其他有类似问题的人。

  • 如您所见,如果Fortran在数据之前/之后添加额外的字节,gnuplot似乎可以读取数据,而不需要额外的数据字节。

使用直接I/O而不是顺序I/O可能更容易:

inquire (iolength = irec) matrix(1,:) !total record length for a row
open (3, file=filename, form="unformatted", access="direct", recl=irec)
write(3, rec=1) matrix(i,:)

inquire语句以"recl"为单位提供输出列表的长度。因此,整个列表适合于长度为irec的一个记录。

对于按列将矩阵写入文件,您可以执行以下操作:

inquire (iolength = irec) matrix(:,1)
open (3, file=filename, form="unformatted", access="direct", recl=irec)
do i=1,ncol
    write(3, rec=i) matrix(:,i)
end do

或按行:

inquire (iolength = irec) matrix(1,:)
open (3, file=filename, form="unformatted", access="direct", recl=irec)
do i=1,nrow
    write(3, rec=i) matrix(i,:)
end do

或元素:

inquire (iolength = irec) matrix(1,1)
open (3, file=filename, form="unformatted", access="direct", recl=irec)
do j=1,ncol
    do i=1,nrow
        write(3, rec=j+(ncol-1)*i) matrix(i,j)
    end do
end do

或者转储整个矩阵:

inquire (iolength = irec) matrix
open (3, file=filename, form="unformatted", access="direct", recl=irec)
write(3, rec=1) matrix

使用gnuplot 5.0测试,以下是大小为N、的双数组x的fortran非格式化数据写入

open(FID,file='binaryfile')
do k = 1, N
  write(FID) x(k)
end do 
close(FID)

可以通过gnuplot理解为:

plot 'binaryfile' binary format="%*1int%double%*1int"

%*1int的意思是,跳过一个四字节整数,有效地跳过了环绕输出的页眉和页脚数据。

有关更复杂数据的更多信息和外推,请参阅二进制的gnuplot 5.0文档,并参阅show datafile binary datasizes的格式大小。然而,请注意,多列数据(即每次写入N倍)可以用与上述相同的格式访问,但访问方式为%Ndoubles,其中N是整数。然后以using 1:3为例,绘制第一列与第三列的对比图。

相关内容

  • 没有找到相关文章

最新更新