总览
我将简要说明如何使用"表格到结构化网格"过滤器,当使用Paraview读取以CSV等简单格式编写的文件时,该方法很方便。
- 2019年2月6日,更正了整体范围的描述并添加了补充内容。
使用环境
- Windows 10
- 预览版5.5.2-64位
视镜
Paraview是用于可视化数值计算结果的开源软件。它支持多种输入格式,并具有非常强大的可视化功能。如果您对此不太了解,则可以使用Paraview完成大多数可视化。但是,Paraview是一款非常容易上瘾的软件,因此您需要习惯一下。
可以保证这样的多功能软件"不能轻易完成非常简单的事情",但是Paraview也不例外。
您想轻松完成的简单操作是什么?如下图所示,将以网格状排列的点显示物理量。
通过迭代处理输出数组值来保存以这种网格图案排列的点的数据。
1 2 3 4 5 6 7 8 9 10 | integer :: output open(newunit=output, file = "velocity.txt") do k = 1, Nz do j = 1, Ny do i = 1, Nx write(output, '(6F)') dble(i-1)*dx, dble(j-1)*dy, dble(k-1)*dz, u(i,j,k), v(i,j,k), w(i,j,k) end do end do end do close(output) |
1 2 3 4 5 6 7 8 9 10 11 | 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 1.0 0.0 0.0 ... 0.0 0.1 0.0 1.0 0.1 0.0 0.1 0.1 0.0 1.0 0.2 0.0 ... 0.0 0.0 0.1 1.0 0.5 0.5 0.1 0.0 0.1 1.0 0.7 0.2 ... 0.0 0.1 0.1 1.0 0.0 2.5 0.1 0.1 0.1 1.0 0.2 1.0 |
数值是适当的,但是坐标值在文件的第一,第二和第三列中描述,而物理量值在第四,第五和第六列中描述。它只是用空格隔开,但是如果用逗号隔开,它将以CSV文件格式输出。
为了方便起见,这称为CSV文件,但是分隔符可以是空格或逗号。
VTK文件格式
对于这些数据结构,文件格式 1由VTK(可视化工具包)定义,这是Paraview的基础。
- 结构化点(图像数据)
- 直线网格
- 结构化网格
我不会详细介绍,但是这些需要描述文件格式。在VTK方面也提供了模块等,但是当然要求在不使用此类附加模块的情况下输出和可视化CSV格式。这就是本文介绍的"表到结构化网格"过滤器起作用的地方。
表到结构化网格过滤器
我将简要说明如何使用"表格到结构化网格"过滤器。至少需要x,y,z坐标信息才能转换为可以由Paraview使用表格到结构化网格过滤器处理的格式。即使在2D模拟中仅x和y坐标上有信息,也必须在与z坐标 2"对应的位置写入0。
步骤
启动Paraview
启动已安装的Paraview。
读取CSV文件
将CSV文件拖放到Paraview,或使用Paraview的File→Open打开一个窗口,然后从中选择CSV文件。
设置输入CSV文件的属性
将显示在管道浏览器中加载的CSV文件的名称,您将能够在浏览器底部设置属性。
在这里,检查三个设置。
有标题
如果在读取的CSV文件的第一行中描述了每列的名称,请保持选中状态。第二行和后续行被识别为数据。
1 2 3 4 5 6 7 8 9 10 11 12 | x y z u v w 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 1.0 0.0 0.0 ... 0.0 0.1 0.0 1.0 0.1 0.0 0.1 0.1 0.0 1.0 0.2 0.0 ... 0.0 0.0 0.1 1.0 0.5 0.5 0.1 0.0 0.1 1.0 0.7 0.2 ... 0.0 0.1 0.1 1.0 0.0 2.5 0.1 0.1 0.1 1.0 0.2 1.0 |
如果您没有描述这些信息,请取消选中它。
字段分隔符
指定分隔列的字符。在CSV文件中,逗号是定界符,但是如果每列都用空格分隔并输出,则在"字段定界符字符"文本框中输入的逗号将被替换为一个空格。
即使一个字符由多个空格分隔,也只需输入一个字符。
合并连续定界符
当您想将列识别为定界符(如果该列由多个空格分隔)时,将选中此属性。
如果即使此框被多个空格隔开,也未选中该框,则多余的空格将被识别为数值数据。
确认读取数据
如果在检查了这些设置后按"应用"按钮,则名为SpreadSheetView 1的表将出现在Paraview的RenderView(绘图窗口)中。
第一行是给每一列的名称。如果在文件的第一行中描述了每一列的名称,则字段0和字段1 ???的位置是任意名称。请注意,最左列中的行ID是Paraview任意分配的数据号,因此请不要担心。
我能够用它读取数据,但是我无法使用Paraview可视化它。这就是表格到结构化网格过滤器的出现。
将表应用于结构化网格过滤器
在我的环境中,如果我在显示SpreadSheetView的同时应用过滤器,则结果不会显示在RenderView中。因此,在应用过滤器之前,请关闭SpreadSheetView。
从"过滤器"→"字母顺序"中选择"表格到结构化网格"过滤器。按字母顺序以字母顺序显示所有过滤器,因此出现了很多过滤器以填充屏幕。
将
表应用于"结构化网格"过滤器时,过滤器属性将显示在"管道浏览器"中。在此处输入用于转换为可视化数据的设置。
在这里,我们将检查两个设置。
整个范围
此项为一维排列的数据指定x,y和z方向上的数据数。有2 x 3个不友好的文本框,但是第一,第二和第三行分别对应于x,y,z方向 del>,第一,第二和第三行,它显示数据数在不断变化的维度中。左侧基本上可以为0,并且每个方向1上的数据数量都可以在右侧输入。如果您熟悉C语言,则如果将其识别为数组每个维度中的元素数量,可能会更容易理解。
在输出本文使用的CSV文件的程序中,x和y方向上的数字定义如下。
1 2 | integer,parameter :: Nx = 501 integer,parameter :: Ny = 601 |
因此,在x和y方向上分别有501和601数据。由于是二维的,因此在z方向上只有一个数据。在这种情况下,
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tbody>
table>
输入
。这意味着在每个方向上都存在501个数据(从0到500),601个数据(从0到600)和1个数据(从0到0)。
X列,Y列,Z列
在这里,从下拉菜单中分配每个方向上数据对应的SpreadSheetView列。这时,如果将每列的名称描述为"标题",则将显示"标题"命名的名称。
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tbody>
table>
如果每个列,列数据及其编号(整体范围)不正确,则显示将与预期不符。
设置完成后,按"应用"按钮完成设置。
如果在RenderView中看到一个灰色方块,则说明
成功
可视化
由于已将其转换为可以使用Paraview可视化的格式,因此我们将使用Paraview对其进行可视化。
例如,如果更改"着色",则可以检查每个物理量。
您可以看到读取的数据分别命名为字段3,字段4和字段5。
但是,以这种方式读取的数据(字段3,字段4,字段5)不能识别为矢量分量,因此在绘制速度矢量时只能使用一维数据。
我试图用字形绘制速度矢量,但是由于不能将其识别为矢量,因此只能使用字段3(x方向分量的数据)。
读取数据的向量化
由于无法将每个组件的数据与"表到结构化网格"过滤器一起识别为矢量,因此在应用过滤器之后,对数据应用计算器过滤器。您可以使用"计算器"过滤器从多个数据创建向量。
选择
Filer→字母→计算器。
在
计算器过滤器中,进行了两项设置。
结果数组名称
在此处设置创建的矢量的名称。如果标准很好,它将被命名为Result,但是在这里我将其命名为Velocity是因为它很重要。
公式
在Resutl阵列名称的正下方有一个拉长的文本框。在下面输入公式。
1 | Field 3*iHat+Field 4*jHat+Field 5*kHat |
iHat,jHat,kHat是用于创建矢量分量的函数,可以看作是每个轴向方向上的单位矢量。
对于字段3,字段4和字段5,如果已设置,请替换每个列名称。您也可以使用标量从下拉菜单中进行选择。对于iHat和*,即使您按按钮进入也没有问题。
当您按下
应用按钮时,将创建一个名为Velocity的新数据。
和以前一样,我在Glyph中绘制了速度向量。通过将"速度"作为"向量"的选项设置为"无",可以识别每个方向的速度,并且可以看到棱镜尾流的涡流。
Python脚本
Paraview可以使用Python脚本执行所有这些步骤。
Python脚本是从Python Shell执行的。选择查看→Python Shell以启动Python Shell。
您可以逐行执行它,但是可以从"运行脚本"按钮执行现有的Python脚本。
我不知道该写哪种命令。由于可以通过选择工具→启动跟踪将一系列工作记录为Python脚本,因此从记录的文件中删除不必要的描述,仅保留最少的处理。
通过删除录制的脚本中的多余指令,创建了以下脚本。除了与Python相关的模块之外,它与普通的Python(尽管是2系列)相同,因此您可以迭代地编写并逐个读取文件,也可以将文件名排列在数组中并读取多个文件立刻。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | from paraview.simple import * paraview.simple._DisableFirstRenderCameraReset() # 区切りに関係なくCSVファイルとしてファイルを読み込み velocity = CSVReader(FileName=['ここに読み込みたいファイルをフルパスで記述する']) # ヘッダや区切り文字の設定 velocity.HaveHeaders = 0 velocity.MergeConsecutiveDelimiters = 1 # 設定を適用 renderView1 = FindViewOrCreate('RenderView1', viewtype='RenderView') # Table To Structured Gridフィルタの設定 grid = TableToStructuredGrid(Input=velocity) grid.XColumn = 'Field 0' grid.YColumn = 'Field 1' grid.ZColumn = 'Field 2' # Properties modified on grid grid.WholeExtent = [0, 500, 0, 600, 0, 0] # フィルタの適用 gridDisplay = Show(grid, renderView1) # Calculatorフィルタの設定 calc = Calculator(Input=grid) calc.ResultArrayName = 'Velocity' calc.Function = 'Field 3*iHat+Field 4*jHat+Field 5*kHat' # 設定の適用と結果の表示 calcDisplay = Show(calc, renderView1) |
管道浏览器的显示略有变化,但似乎可以正确读取数据。
概要
我简要介绍了如何使用
CSV文件时很方便。
关于标量的数量还有其他解释,但是由于没有写成将标量变成矢量的方法,因此我也提到了
不可能通过拖放来可视化它,但是我认为通过将其与Python脚本结合可以很容易地显示它。
补充:要在整个范围内输入的数字
在整个范围内,
第1,第2和第3行显示更改为第1,第2和第3维的维度中的数据数。
我说
。让我们用合适的程序检查一下。
分别在
x,y和z方向上设置31、21和11点的值,在输出时将计数器从最外面用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | program main implicit none integer,parameter :: Nx = 31 integer,parameter :: Ny = 21 integer,parameter :: Nz = 11 real(8),parameter :: Lx = 1d0 real(8),parameter :: Ly = 1d0 real(8),parameter :: Lz = 1d0 real(8),parameter :: dx = Lx/dble(Nx-1) real(8),parameter :: dy = Ly/dble(Ny-1) real(8),parameter :: dz = Lz/dble(Nz-1) integer :: i,j,k integer :: output real(8) :: u(Nx,Ny,Nz) real(8) :: v(Nx,Ny,Nz) real(8) :: z(Nx,Ny,Nz) do k = 1,Nz do j = 1,Ny do i = 1,Nx u(i,j,k) = (k-1)*(Nx*Ny) + (j-1)*Nx + i end do end do end do open(newunit = output, file = "kji.txt") !k-j-iループ do k = 1,Nz do j = 1,Ny do i = 1,Nx write(output,'(4F)') (i-1)*dx, (j-1)*dy, (k-1)*dz, u(i,j,k) end do end do end do close(output) open(newunit = output, file = "ijk.txt") !i-j-kループ do i = 1,Nx do j = 1,Ny do k = 1,Nz write(output,'(4F)') (i-1)*dx, (j-1)*dy, (k-1)*dz, u(i,j,k) end do end do end do close(output) end program main |
k-j-i回路
在
因此,必须按以下方式设置"整体范围"和"列"。
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tbody>
table>
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tbody>
table>
如果使用此设置将"表"应用于"结构化网格",则可以看到该多维数据集显示在RenderView中并正确加载。
i-j-k循环
在
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tbody>
table>
您可以看到该多维数据集显示在RenderView中并正确加载。
在
https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf?
毕竟,由于它是CSV格式,您可以将其放入Excel等电子表格软件中并添加一列,但是如果有多个文件,则需要花费时间。 ?