2

I am having a fortran code to generate a grid in binary VTK format. This code produces a binary VTK file like this one:

# 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
^@^@^@^@^@^@^@^@

When, I try to open it with ParaView it crashes with the following error message:

ERROR: In /home/user/OpenFOAM/ThirdParty-2.3.0/ParaView-4.1.0/VTK/IO/Legacy/vtkRectilinearGridReader.cxx, line 311 vtkRectilinearGridReader (0x379f4b0): Unrecognized keyword: ...

If I write the above file in ASCII instead, then it opens properly in ParaView, that's the ASCII analogous file that opens:

# 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

I am using the following code to generate the grid in binary VTK format (I am giving a minimum working code):

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

What is wrong with the binary VTK file? why it exits?

AlphaBeta
  • 33
  • 1
  • 8

1 Answers1

3

One issue is, that arrays are specified as [0., 1.], not as (0., 1.), that would be a complex number equal to one imaginary unit i. The same way [0.] instead of (0.). Thanks to Alexander Voigt in binary vtk for Rectilinear_grid from fortran code can not worked by paraview, for pointing out the issue.

You state that you use FLOAT, but than you store real*8 there. They are not compatible. Either store real*4 (or a more modern real(real32) ) there, or place the text DOUBLE instead of FLOAT in the file.

Note, the stand conforming access=stream is much better than the non-standard form=binary. Also, convert=BIG_ENDIAN is non-standard and will not work with many compilers (e.g., gfortran, if I recall it correctly). The char(10) is better to be achar(10) but that is a minor issue.

BTW,

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

can just be

write(ivtk) 'DIMENSIONS '//str1//str2//str3//lf
Community
  • 1
  • 1
  • I used "DOUBLE" instead of "FLOAT" and it worked. I kept using "form=binary" and "convert=BIG_ENDIAN" for two reasons: 1) I am using intel fortran compiler, and 2) I don't know when I use "access=stream" if I can have an output file with mixed binary and ASCII data. – AlphaBeta Jun 24 '15 at 11:52
  • access=stream should work exactly the same way you have now. – Vladimir F Героям слава Jun 24 '15 at 12:03
  • `access=stream` makes the file IO work like a file in c. When writing a binary VTK file, there is no need to "mix binary and ASCII data." All data is binary. When you write out characters, such as `DATASET RECTILINEAR_GRID`, you are writing out the binary representation of those characters. The text editor is able to correctly interpret and display those. It is not able to correctly interpret the floating-point data, hence all the `^@` garbage, and the impression you've got "mixed" binary and ASCII data. – dwwork Jun 24 '15 at 14:05