我有一个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文件有什么问题?为什么退出?
答案 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