Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 使用Fortran中的原始二进制数据编写.vtu文件(paraview)_Binary_Fortran_Vtk_Paraview - Fatal编程技术网

Binary 使用Fortran中的原始二进制数据编写.vtu文件(paraview)

Binary 使用Fortran中的原始二进制数据编写.vtu文件(paraview),binary,fortran,vtk,paraview,Binary,Fortran,Vtk,Paraview,我试图编写一个Fortran子程序,输出原始二进制数据的.vtu文件。我成功地使用.vtk二进制和.vtu ascii编写了代码,但在这种文件中,我不知道问题出在哪里。下面是我的子程序、生成的.vtu文件和paraview的错误消息 MODULE OUTPUT IMPLICIT NONE CONTAINS function itoa(i) result(res) character(:),ALLOCATABLE :: res INTEGER,intent(in) :: i chara

我试图编写一个Fortran子程序,输出原始二进制数据的.vtu文件。我成功地使用.vtk二进制和.vtu ascii编写了代码,但在这种文件中,我不知道问题出在哪里。下面是我的子程序、生成的.vtu文件和paraview的错误消息

MODULE OUTPUT
IMPLICIT NONE
CONTAINS
function itoa(i) result(res)
  character(:),ALLOCATABLE :: res
  INTEGER,intent(in) :: i
  character(range(i)+2) :: tmp
  write(tmp,'(i0)') i
  res = trim(tmp)
end function
SUBROUTINE print_vtu_binary_appended(step,number_of_particles,system_name,position,velocity,radius)
use iso_fortran_env
implicit none
real(kind=real64), intent(in), dimension(number_of_particles,3) :: position, velocity
real(kind=real64), intent(in), dimension(number_of_particles) :: radius
integer(kind=int32), intent(in) :: step, number_of_particles
integer(kind=int32), dimension(6) :: offset
integer(kind=int32) :: vtu, print_number=0
character(len=*), intent(in) :: system_name

offset(1) = 0
offset(2) = offset(1) + 4 + SIZEOF(position)
offset(3) = offset(2) + 4 + SIZEOF(velocity)
offset(4) = offset(3) + 4 + SIZEOF(radius)
offset(5) = offset(4) + 4
offset(6) = offset(5) + 4
OPEN(newunit=vtu, action='write', access='stream', STATUS='new', form='unformatted', FILE='./'//TRIM(system_name)//itoa(print_number)//'.vtu')
WRITE(vtu)'<?xml version="1.0"?>'//NEW_LINE('A')
WRITE(vtu)'<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">'//NEW_LINE('A')
WRITE(vtu)'<UnstructuredGrid>'//NEW_LINE('A')
WRITE(vtu)'<Piece NumberOfPoints="'//itoa(number_of_particles)//'" NumberOfCells="0">'//NEW_LINE('A')
WRITE(vtu)'<Points>'//NEW_LINE('A')
WRITE(vtu)'<DataArray name="Position" type="Float64" NumberOfComponents="3" format="appended" offset="'//itoa(offset(1))//'">'//NEW_LINE('A')
WRITE(vtu)'</DataArray>'//NEW_LINE('A')
WRITE(vtu)'</Points>'//NEW_LINE('A')
WRITE(vtu)'<PointData>'//NEW_LINE('A')
WRITE(vtu)'<DataArray type="Float64" Name="Velocity" NumberOfComponents="3" format="appended" offset="'//itoa(offset(2))//'">'//NEW_LINE('A')
WRITE(vtu)'</DataArray>'//NEW_LINE('A')
WRITE(vtu)'<DataArray type="Float64" Name="Radius" format="appended" offset="'//itoa(offset(3))//'" >'//NEW_LINE('A')
WRITE(vtu)'</DataArray>'//NEW_LINE('A')
WRITE(vtu)'</PointData>'//NEW_LINE('A')
WRITE(vtu)'<Cells>'//NEW_LINE('A')
WRITE(vtu)'<DataArray type="Int32" Name="connectivity" format="appended" offset="'//itoa(offset(4))//'">'//NEW_LINE('A')
WRITE(vtu)'</DataArray>'//NEW_LINE('A')
WRITE(vtu)'<DataArray type="Int32" Name="offsets" format="appended" offset="'//itoa(offset(5))//'">'//NEW_LINE('A')
WRITE(vtu)'</DataArray>'//NEW_LINE('A')
WRITE(vtu)'<DataArray type="UInt8" Name="types" format="appended" offset="'//itoa(offset(6))//'">'//NEW_LINE('A')
WRITE(vtu)'</DataArray>'//NEW_LINE('A')
WRITE(vtu)'</Cells>'//NEW_LINE('A')
WRITE(vtu)'</Piece>'//NEW_LINE('A')
WRITE(vtu)'</UnstructuredGrid>'//NEW_LINE('A')
WRITE(vtu)'<AppendedData encoding="raw">'//NEW_LINE('A')
WRITE(vtu)char(95),offset(1),position
WRITE(vtu)offset(2),velocity
WRITE(vtu)offset(3),radius
WRITE(vtu)offset(4),offset(5),offset(6)
WRITE(vtu)NEW_LINE('A')//'</AppendedData>'//NEW_LINE('A')
WRITE(vtu)'</VTKFile>'
CLOSE(unit=vtu)
print_number = print_number + 1
END SUBROUTINE print_vtu_binary_appended
END MODULE OUTPUT
program test
use iso_fortran_env
use output
implicit none
integer(kind=int32) :: step=1, number_of_particles=2
real(kind=real64), dimension(2,3) :: position, velocity
real(kind=real64), dimension(2) :: radius
character(len=14) :: system_name='random_numbers'
position = reshape((/ 1.0754_real64, 2.0683_real64, 3.2479_real64, 4.08642_real64, 5.46906_real64, 6.36974_real64 /), shape(position))
velocity = reshape((/ 3.0754_real64, 7.0683_real64, 10.2479_real64, 72.08642_real64, 83.46906_real64, 22.36974_real64 /), shape(velocity))
radius = reshape((/ 0.0000754_real64, 0.00083_real64 /), shape(radius))
CALL print_vtu_binary_appended(step,number_of_particles,system_name,position,velocity,radius)
end program test
模块输出
隐式无
包含
函数itoa(i)结果(res)
字符(:),可分配::res
整数,意图(in)::i
字符(范围(i)+2)::tmp
写入(tmp),(i0)’i
res=微调(tmp)
端函数
附加的子例程打印二进制(步长、粒子数、系统名称、位置、速度、半径)
使用iso_fortran_env
隐式无
真实(种类=真实64)、意图(in)、维度(粒子数,3)::位置、速度
实数(种类=实数64)、意图(in)、维度(粒子数)::半径
整数(种类=int32),意图(in)::步长,粒子数
整数(种类=int32),维度(6)::偏移
整数(种类=int32)::vtu,打印号=0
字符(len=*),意图(in)::系统名称
偏移量(1)=0
偏移量(2)=偏移量(1)+4+尺寸(位置)
偏移量(3)=偏移量(2)+4+尺寸(速度)
偏移量(4)=偏移量(3)+4+尺寸(半径)
偏移量(5)=偏移量(4)+4
偏移量(6)=偏移量(5)+4
打开(newunit=vtu,action='write',access='stream',STATUS='new',form='unformatted',FILE='.//'.//'//修剪(系统名称)//itoa(打印编号)//'.vtu')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
写入(vtu)字符(95)、偏移量(1)、位置
写入(vtu)偏移量(2),速度
写入(vtu)偏移量(3),半径
写入(vtu)偏移量(4)、偏移量(5)、偏移量(6)
写(vtu)新行('A')/“”//新行('A'))
写入(vtu)'
关闭(单位=vtu)
打印号码=打印号码+1
结束子例程打印\u vtu\u二进制\u追加
端模块输出
程序测试
使用iso_fortran_env
使用输出
隐式无
整数(种类=int32)::步长=1,粒子数=2
实数(种类=实数64),尺寸(2,3):位置,速度
实数(种类=实数64),尺寸(2):半径
字符(len=14)::系统名称=“随机数”
位置=重塑(/1.0754_real64,2.0683_real64,3.2479_real64,4.08642_real64,5.46906_real64,6.36974_real64/),形状(位置))
速度=重塑(/3.0754_real64,7.0683_real64,10.2479_real64,72.08642_real64,83.46906_real64,22.36974_real64/),形状(速度))
半径=重塑(0.0000754μreal64,0.00083μreal64/),形状(半径))
调用print_vtu_binary_added(步长、粒子数、系统名称、位置、速度、半径)
结束程序测试
生成的xml文件示例:

<?xml version="1.0"?>
<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">
<UnstructuredGrid>
<Piece NumberOfPoints="8" NumberOfCells="0">
<Points>
<DataArray name="Position" type="Float64" NumberOfComponents="3" format="appended" offset="0">
</DataArray>
</Points>
<PointData>
<DataArray type="Float64" Name="Velocity" NumberOfComponents="3" format="appended" offset="196">
</DataArray>
<DataArray type="Float64" Name="Radius" format="appended" offset="392" >
</DataArray>
</PointData>
<Cells>
<DataArray type="Int32" Name="connectivity" format="appended" offset="460">
</DataArray>
<DataArray type="Int32" Name="offsets" format="appended" offset="464">
</DataArray>
<DataArray type="UInt8" Name="types" format="appended" offset="468">
</DataArray>
</Cells>
</Piece>
</UnstructuredGrid>
<AppendedData encoding="raw">
...
</AppendedData>
</VTKFile>

...
Paraview中的错误:

错误:在C:\bbd\ecd338f\build\superbuild\paraview\src\VTK\IO\XML\vtkxmlnunstructureddatareader.cxx第466行 vtkXMLUnstructuredGridReader(000001DDC1DD5090):无法从工件0中的点读取点数组。元素中的数据数组可能太短


我猜问题可能是由结束记录引起的,我建议使用“char(10)”而不是固有的“new_line”

在我的库()中,我使用

字符(1),参数::end_rec=char(10)!<二进制记录完成的结束字符。

编辑

很抱歉猜错了,我认为“char(10)”更安全,因为有了“new_line”,你可以选择那种类型,因此我假设了不同的字节数终止,我的错

读取代码时,您使用“偏移量”来跟踪附加的数据偏移量和附加部分中每个dataarray的字节数。我认为这是不安全的:如果您将偏移量定义从int64更改为int32,那么您的测试将在我当前的体系结构(GNU Fortran 9.3.0、Linux 4.19.0-6-amd64、paraview 5.8.0)中工作

还要注意,itao函数没有传递参数“i”的种类定义,但传递的是int64和int32


我建议将偏移量和字节数的定义分开,但对于将偏移量定义为int32的小文件,似乎对我有用

我猜问题可能是由结束记录引起的,我建议使用“char(10)”而不是固有的“new_line”

在我的库()中,我使用

字符(1),参数::end_rec=char(10)!<二进制记录完成的结束字符。

编辑

很抱歉猜错了,我认为“char(10)”更安全,因为有了“new_line”,你可以选择那种类型,因此我假设了不同的字节数终止,我的错

读取代码时,您使用“偏移量”来跟踪附加的数据偏移量和附加部分中每个dataarray的字节数。我认为这是不安全的:如果您将偏移量定义从int64更改为int32,那么您的测试将在我当前的体系结构(GNU Fortran 9.3.0、Linux 4.19.0-6-amd64、paraview 5.8.0)中工作

还要注意,itao函数没有传递参数“i”的种类定义,但传递的是int64和int32


我建议将偏移量和字节数的定义分开,但对于将偏移量定义为int32的小文件,似乎对我有用

请添加一些调用子例程的代码(尽可能简单),以便我们可以实际测试它。似乎我们可以选择一些随机数作为参数。对吗?哪一个最简单?是的,它们是随机数。我更新了代码,现在可以测试了。我可以重现这个问题。t的确切含义是什么