2016-02-09 3 views
1

я использовал код отправил из StackOverflow и изменил его:двоичный ВТК для Rectilinear_grid из FORtran коды не работало на ParaView

program VTKBinary 

implicit none 

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

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

lf = char(10) ! line feed character 

!open(unit=ivtk,file='test_bin.vtk',form='binary',convert='BIG_ENDIAN') 
open(unit=ivtk,file='test_bin.vtk',access='stream',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 
write(ivtk) (x(i),i=1,size(x)) 
buffer = lf//'Y_COORDINATES '//str2//' float'//lf    ; write(ivtk) trim(buffer) 
!write(ivtk) y 
write(ivtk) (y(i),i=1,size(y)) 
buffer = lf//'Z_COORDINATES '//str3//' float'//lf    ; write(ivtk) trim(buffer) 
!write(ivtk) z 
write(ivtk) (z(i),i=1,size(z)) 

close(ivtk) 

end program VTKBinary 

Этот код компилируется хорошо gfortran и работает хорошо, чтобы сгенерировать файл ВОК.

Проблема: есть ошибка, когда ВТК считывается ParaView следующим образом:

Warning: In C:\DBD\pvs-x64\paraview\src\paraview\VTK\Rendering\Core\vtkRenderer.cxx, line 1029 
vtkOpenGLRenderer (000000000BF00BF0): Resetting view-up since view plane normal is parallel 

Вопрос: Вы можете помочь мне решить эту проблему?

Большое спасибо.

+0

Не могли бы вы разместить ссылку вы взяли код из? –

+0

С каких пор gfortran поддерживает 'convert = 'BIG_ENDIAN''? –

+0

Хорошо, не знаю с тех пор, но https://gcc.gnu.org/onlinedocs/gfortran/CONVERT-specifier.html#CONVERT-specifier –

ответ

0

Основная проблема была указана @AlexanderVoigt. Массивы задаются как [0., 1.], а не как (0., 1.), что было бы комплексным числом, равным одному воображаемому модулю i.

Другой недостаток lf в конце. Просто используйте

buffer = 'X_COORDINATES '//str1//' float'//lf    ; write(ivtk) trim(buffer) 
write(ivtk) x, lf 
buffer = 'Y_COORDINATES '//str2//' float'//lf    ; write(ivtk) trim(buffer) 
write(ivtk) y, lf 
buffer = 'Z_COORDINATES '//str3//' float'//lf    ; write(ivtk) trim(buffer) 
write(ivtk) z, lf 

Лучше всегда ставить lf в конце, так что вы не забудете.

BTW вы не должны помещать строки в буфер, а затем обрезать его, вы можете даже записать их непосредственно:

write(ivtk) 'X_COORDINATES '//str1//' float'//lf 
+0

, возможно, вы захотите изменить и другой ответ ... Проблема с сложной нотой копируется оттуда. –

+0

О, действительно, :(? –

+1

Возможно, они всего лишь дубликаты. –