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

2023-12-08

我有一个 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 行 vtkRecti LinearGridReader (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., 1.],不作为(0., 1.),这将是一个等于一个虚数单位的复数i。一样的方法[0.]代替(0.)。感谢亚历山大·沃伊特fortran 代码中的 Rectilinear_grid 的二进制 vtk 无法通过 paraview 工作,指出了这个问题。

您声明您使用FLOAT,但比你存储real*8那里。它们不兼容。任一商店real*4(或更现代的real(real32)) 在那里,或放置文本DOUBLE代替FLOAT在文件中。

注意,支架符合access=stream比非标好很多form=binary. Also, convert=BIG_ENDIAN是非标准的,不能与许多编译器一起工作(例如,gfortran,如果我没记错的话)。这char(10)最好是achar(10)但这是一个小问题。

BTW,

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

可以只是

write(ivtk) 'DIMENSIONS '//str1//str2//str3//lf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Fortran 代码的 RECTILINEAR_GRID 的二进制 VTK 的相关文章

  • 使用 Extendscript 编写二进制文件。文件大小不正确

    进一步我的问题here https stackoverflow com questions 63022178 read binary file with extendscript我正在使用 Extendscript 将十六进制颜色列表从 P
  • 为什么我必须在 Fortran 中隐式指定函数的双精度返回值?

    我是 Fortran 新手 我正在尝试common堵塞 我的代码很简单 program main implicit double precision p real 8 x y common yvalue y x 3d0 y 3d0 prin
  • 如何为 Fortran 95+ 模块库提供显式接口,并隐藏实现

    我正在使用 gfortran 的 95 扩展 我有一个实用程序模块库 我想链接到其他项目 即作为库或共享对象 dll 但是 在 Fortran 中 我不明白如何在不维护模块接口的两个副本的情况下将接口与 Fortran 中的实现分离 在 C
  • 将派生类型中的指针分配给 Fortran 中相同类型中的目标

    我想在包含在同一派生类型中的派生类型中分配一个指针 下面的代码给了我下面的错误 这是怎么回事 我该如何解决这个问题 24 zoos i tigers 1 gt zoos i animals 1 1 1 Error Expected boun
  • 在 Fortran 90 中,是否必须事先声明数组维度?

    是否有必要在任何其他代码之前声明数组维度 例如 我编写了以下简化的示例代码 PROGRAM mytest IMPLICIT NONE INTEGER i j k mysum Let array c be a k by k 2 array D
  • 忽略 doxygen 注释块中的行

    是否可以在 doxygen 注释块中包含将被 doxygen 忽略的内容 换句话说 我们可以在 doxygen 评论块中发表评论吗 背景 我们正在将 Fortran 项目的代码内注释转换为 doxygen 可解析的格式 但是该项目要求代码内
  • Fortran 读取混合字符串和数字数据

    我在读取语句时遇到问题 我更喜欢 Fortran90 尽管如果有帮助的话其他版本也是可能的 我的文件中有一堆数据行 可以描述为 以空格分隔 没有固定的格式 包含一个字符串 后跟 7 个数字 字符串包含正斜杠 这是一个例子 maxele OS
  • 提高由整数商定义的变量的精度

    假设我有以下程序 program derp implicit none integer parameter ikind selected real kind 18 real kind ikind a 2 0 3 0 print a end
  • Fortran 中指数函数的 DEXP 或 EXP?

    我有两个非常简短的问题 1 我刚刚读到DEXP is the archaic的形式EXP 这是否意味着不应再使用它 我一直以为DEXP 双精度等于EXP 2 指数函数的范围是多少 它依赖于编译器吗 问题 1 在现代 Fortran 中 最好
  • Mayavi (Python) 中的 TVTK 错误

    我正在运行 Fedora 17 x64 机器 并且我尝试通过以下方式安装 Mayavi for python yum install mayavi 工作得很好 除了每次我编写调用 mayavi 模块 如 mlab 的代码时 from ent
  • Python/vtk - 在 vtkPolyData 对象中单独设置每个点的大小?

    我使用以下代码来填充点云 如何在vtk中以不同的颜色显示点云 https stackoverflow com questions 7591204 how to display point cloud in vtk in different
  • 如何以编程方式在 qml 中渲染 vtk 项目?

    到目前为止 我了解到我们在 QML 中有两个线程 我们的主应用程序线程和我们的 场景图 线程 http doc qt io qt 5 qtquick visualcanvas scenegraph html http doc qt io q
  • Dependency Walker 未显示所有依赖的 Dll

    我有一个 fortran dll 我想知道它所依赖的程序集再分配目的 http software intel com en us forums showthread php t 73161 我发现的一件事是依赖项步行器没有显示所有依赖项 即
  • 可变格式

    我编写了一个程序来计算平方有限差分矩阵 您可以在其中输入行数 等于列数 gt 这存储在变量矩阵中 该程序运行良好 program fin diff matrix implicit none integer dimension allocat
  • gfortran 未定义的引用

    我正在尝试编译一个依赖很多东西的程序 我使用并修改了提供的 makefile 来代表我的计算机设置 但在编译的最后一步中我不断收到许多未定义的引用 导致问题的命令行是 gfortran o cosmomc ParamNames o Matr
  • 关于for循环中的fortran continue语句的问题

    我正在分析 Fortran 代码并有一个简单的问题 我想知道下面代码中 100 和 200 处的 继续 语句的作用 它会增加 i 和 j 计数器吗 如果是这样的话 不会if not flg 那么条件包含flg循环中 flg 的 最后一个值
  • 用于编译/反编译二进制数据文件的通用实用程序或库?

    我有各种二进制文件格式 我需要将其转储为某种文本格式 编辑然后重新编译 可能是二进制格式的稍微不同的版本 当然 我可以用 C C 编写一堆实用程序代码来完成这种事情 并且可能利用一个库来处理文本方面的事情 XML 或 JSON 或其他 但这
  • 纯 Fortran 过程中的 I/O

    我正在尝试将错误检查合并到我正在编写的纯过程中 我想要这样的东西 pure real function func1 output unit a implicit none integer a output unit if a lt 0 th
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http

随机推荐