使用Paraview读取CSV文件中记录的矢量数据


总览

我将简要说明如何使用"表格到结构化网格"过滤器,当使用Paraview读取以CSV等简单格式编写的文件时,该方法很方便。

  • 2019年2月6日,更正了整体范围的描述并添加了补充内容。

使用环境

  • Windows 10
  • 预览版5.5.2-64位

视镜

Paraview是用于可视化数值计算结果的开源软件。它支持多种输入格式,并具有非常强大的可视化功能。如果您对此不太了解,则可以使用Paraview完成大多数可视化。但是,Paraview是一款非常容易上瘾的软件,因此您需要习惯一下。

可以保证这样的多功能软件"不能轻易完成非常简单的事情",但是Paraview也不例外。

您想轻松完成的简单操作是什么?如下图所示,将以网格状排列的点显示物理量。
Grid

通过迭代处理输出数组值来保存以这种网格图案排列的点的数据。

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)

Nx,Ny,Nz是在x,y,z方向上的点数(在第一,第二和第三维上的数组元素的数目),而dx,dy,dz是在x上的点的宽度, y,z方向。如果以这种方式保存文件,则将获得具有以下简单格式的文件。

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。

Paraview

读取CSV文件

将CSV文件拖放到Paraview,或使用Paraview的File→Open打开一个窗口,然后从中选择CSV文件。
File Menu
Open Window

设置输入CSV文件的属性

将显示在管道浏览器中加载的CSV文件的名称,您将能够在浏览器底部设置属性。

csv properties

在这里,检查三个设置。

有标题

如果在读取的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(绘图窗口)中。

SpreadSheetView

第一行是给每一列的名称。如果在文件的第一行中描述了每一列的名称,则字段0和字段1 ???的位置是任意名称。请注意,最左列中的行ID是Paraview任意分配的数据号,因此请不要担心。

我能够用它读取数据,但是我无法使用Paraview可视化它。这就是表格到结构化网格过滤器的出现。

将表应用于结构化网格过滤器

在我的环境中,如果我在显示SpreadSheetView的同时应用过滤器,则结果不会显示在RenderView中。因此,在应用过滤器之前,请关闭SpreadSheetView。

从"过滤器"→"字母顺序"中选择"表格到结构化网格"过滤器。按字母顺序以字母顺序显示所有过滤器,因此出现了很多过滤器以填充屏幕。

Filter menu
Alphabetical

表应用于"结构化网格"过滤器时,过滤器属性将显示在"管道浏览器"中。在此处输入用于转换为可视化数据的设置。

Table to Structured Grid

在这里,我们将检查两个设置。

整个范围

此项为一维排列的数据指定x,y和z方向上的数据数。有2 x 3个不友好的文本框,但是第一,第二和第三行分别对应于x,y,z方向,第一,第二和第三行,它显示数据数在不断变化的维度中。左侧基本上可以为0,并且每个方向1上的数据数量都可以在右侧输入。如果您熟悉C语言,则如果将其识别为数组每个维度中的元素数量,可能会更容易理解。

Whole Extent

在输出本文使用的CSV文件的程序中,x和y方向上的数字定义如下。

1
2
integer,parameter :: Nx = 501
integer,parameter :: Ny = 601

因此,在x和y方向上分别有501和601数据。由于是二维的,因此在z方向上只有一个数据。在这种情况下,

<表格>




<身体>

0

500

0

600

0

0


输入

。这意味着在每个方向上都存在501个数据(从0到500),601个数据(从0到600)和1个数据(从0到0)。

X列,Y列,Z列

在这里,从下拉菜单中分配每个方向上数据对应的SpreadSheetView列。这时,如果将每列的名称描述为"标题",则将显示"标题"命名的名称。

<表格>




<身体>

X列

字段0

Y列

字段1

Z列

字段2


如果每个列,列数据及其编号(整体范围)不正确,则显示将与预期不符。

Column

设置完成后,按"应用"按钮完成设置。
如果在RenderView中看到一个灰色方块,则说明

成功

Table to Structured Grid Apply

可视化

由于已将其转换为可以使用Paraview可视化的格式,因此我们将使用Paraview对其进行可视化。
例如,如果更改"着色",则可以检查每个物理量。
您可以看到读取的数据分别命名为字段3,字段4和字段5。

Field3 Surface

但是,以这种方式读取的数据(字段3,字段4,字段5)不能识别为矢量分量,因此在绘制速度矢量时只能使用一维数据。

我试图用字形绘制速度矢量,但是由于不能将其识别为矢量,因此只能使用字段3(x方向分量的数据)。

Glyph_Field3

读取数据的向量化

由于无法将每个组件的数据与"表到结构化网格"过滤器一起识别为矢量,因此在应用过滤器之后,对数据应用计算器过滤器。您可以使用"计算器"过滤器从多个数据创建向量。

选择

Filer→字母→计算器。

Calculator

计算器过滤器中,进行了两项设置。

结果数组名称

在此处设置创建的矢量的名称。如果标准很好,它将被命名为Result,但是在这里我将其命名为Velocity是因为它很重要。

公式

在Resutl阵列名称的正下方有一个拉长的文本框。在下面输入公式。

1
Field 3*iHat+Field 4*jHat+Field 5*kHat

iHat,jHat,kHat是用于创建矢量分量的函数,可以看作是每个轴向方向上的单位矢量。
对于字段3,字段4和字段5,如果已设置,请替换每个列名称。您也可以使用标量从下拉菜单中进行选择。对于iHat和*,即使您按按钮进入也没有问题。

Colculus

当您按下

应用按钮时,将创建一个名为Velocity的新数据。

Calculator Apply

和以前一样,我在Glyph中绘制了速度向量。通过将"速度"作为"向量"的选项设置为"无",可以识别每个方向的速度,并且可以看到棱镜尾流的涡流。

Glyph vector

Python脚本

Paraview可以使用Python脚本执行所有这些步骤。

Python脚本是从Python Shell执行的。选择查看→Python Shell以启动Python Shell。

Pyshell

您可以逐行执行它,但是可以从"运行脚本"按钮执行现有的Python脚本。
我不知道该写哪种命令。由于可以通过选择工具→启动跟踪将一系列工作记录为Python脚本,因此从记录的文件中删除不必要的描述,仅保留最少的处理。

Trace

通过删除录制的脚本中的多余指令,创建了以下脚本。除了与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)

管道浏览器的显示略有变化,但似乎可以正确读取数据。

Script_Result

概要

我简要介绍了如何使用Table to Structured Grid过滤器,这在使用Paraview读取

CSV文件时很方便。
关于标量的数量还有其他解释,但是由于没有写成将标量变成矢量的方法,因此我也提到了Calculator过滤器。

不可能通过拖放来可视化它,但是我认为通过将其与Python脚本结合可以很容易地显示它。

补充:要在整个范围内输入的数字

在整个范围内,

第1,第2和第3行显示更改为第1,第2和第3维的维度中的数据数。

我说

。让我们用合适的程序检查一下。

分别在

x,y和z方向上设置31、21和11点的值,在输出时将计数器从最外面用k-j-ii-j-k替换,输出文件,并与Paraview一起阅读。

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回路

k-j-i循环中,i在三重循环内,因此在输出文件中,坐标按照i,j,k的顺序更改,即x,y,z坐标值。
因此,必须按以下方式设置"整体范围"和"列"。

<表格>




<身体>

0

30

0

20

0

10


<表格>




<身体>

X列

字段0

Y列

字段1

Z列

字段2


如果使用此设置将"表"应用于"结构化网格",则可以看到该多维数据集显示在RenderView中并正确加载。

kji

i-j-k循环

i-j-k循环中,k在三重循环内,因此在输出文件中,坐标按照k,j,i(即z,y,x)坐标值的顺序变化。与"列和字段"匹配时,"整体范围"的值如下。

<表格>




<身体>

0

10

0

20

0

30


您可以看到该多维数据集显示在RenderView中并正确加载。

ijk

i-j-k循环中输出时,如果将在k-j-i循环中输出的值输入到Whole Extent,则在RenderView中将显示一条凌乱的多边形线,表明尚未正确读取它。
ijkkji

  • https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf?

  • 毕竟,由于它是CSV格式,您可以将其放入Excel等电子表格软件中并添加一列,但是如果有多个文件,则需要花费时间。 ?