来自fortran代码的RECTILINEAR_GRID的二进制VTK

时间:2015-06-24 09:48:59

标签: fortran binaryfiles vtk paraview

我有一个fortran代码来生成二进制VTK格式的网格。此代码生成一个二进制VTK文件,如下所示:

# vtk DataFile Version 3.0
vtk output
BINARY
DATASET RECTILINEAR_GRID
DIMENSIONS        2       2       1
X_COORDINATES        2  float
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
Y_COORDINATES        2  float
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
Z_COORDINATES        1  float
^@^@^@^@^@^@^@^@

当我尝试使用ParaView打开它时,它会崩溃,并显示以下错误消息:

  

错误:在   /home/user/OpenFOAM/ThirdParty-2.3.0/ParaView-4.1.0/VTK/IO/Legacy/vtkRectilinearGridReader.cxx,   第311行vtkRectilinearGridReader(0x379f4b0):无法识别的关键字:   ...

如果我用ASCII编写上述文件,那么它会在ParaView中正确打开,这是打开的ASCII类似文件:

# vtk DataFile Version 3.0
vtk output
ASCII
DATASET RECTILINEAR_GRID
DIMENSIONS 2 2 1
X_COORDINATES 2 float
0 1
Y_COORDINATES 2 float
0 1
Z_COORDINATES 1 float
0

我使用以下代码以二进制VTK格式生成网格(我给出了最小工作代码):

program VTKBinary

implicit none

real*8    :: x(2) = (0., 1.)
real*8    :: y(2) = (0., 1.)
real*8    :: z(1) = (0.)

character :: buffer*80, lf*1, str1*8, str2*8, str3*8
integer   :: ivtk = 9, int

lf = char(10) ! line feed character

open(unit=ivtk,file='test_bin.vtk',form='binary',convert='BIG_ENDIAN')

buffer = '# vtk DataFile Version 3.0'//lf  ; write(ivtk) trim(buffer)
buffer = 'vtk output'//lf                  ; write(ivtk) trim(buffer)
buffer = 'BINARY'//lf                      ; write(ivtk) trim(buffer)
buffer = 'DATASET RECTILINEAR_GRID'//lf    ; write(ivtk) trim(buffer)

! WRITE GRID
write(str1(1:8),'(i8)') size(x)
write(str2(1:8),'(i8)') size(y)
write(str3(1:8),'(i8)') size(z)
buffer = 'DIMENSIONS '//str1//str2//str3//lf  ; write(ivtk) trim(buffer)
buffer = 'X_COORDINATES '//str1//'  float'//lf ; write(ivtk) trim(buffer)
write(ivtk) x
buffer = lf//'Y_COORDINATES '//str2//'  float'//lf  ; write(ivtk) trim(buffer)
write(ivtk) y
buffer = lf//'Z_COORDINATES '//str3//'  float'//lf  ; write(ivtk) trim(buffer)
write(ivtk) z

close(ivtk)

end program VTKBinary

二进制VTK文件有什么问题?为什么退出?

1 个答案:

答案 0 :(得分:3)

一个问题是,数组被指定为[0., 1.],而不是(0., 1.),它将是一个等于一个虚数单位 i 的复数。同样的方式[0.]代替(0.)。感谢Alexander Voigt在binary vtk for Rectilinear_grid from fortran code can not worked by paraview中指出了这个问题。

您声明使用的是FLOAT,而不是存储real*8。它们不兼容。在那里存储real*4(或更现代的real(real32)),或将文本DOUBLE而不是FLOAT放在文件中。

请注意,符合access=stream的展台要比非标准form=binary好得多。此外,convert=BIG_ENDIAN是非标准的,不适用于许多编译器(例如,gfortran,如果我没记错的话)。 char(10)最好是achar(10),但这是一个小问题。

顺便说一句,

buffer = 'DIMENSIONS '//str1//str2//str3//lf  ; write(ivtk) trim(buffer)

可以

write(ivtk) 'DIMENSIONS '//str1//str2//str3//lf