Paraview:Python Calculator Filter

1.Paraview用户指南关于python calculator部分

5.9.2. Python calculator
在这里插入图片描述

1.1python calculator

在这里插入图片描述

Python Calculator的属性面板
Python Calculat与Calculator的相似之处,在于它根据用户提供的表达式处理一个或多个输入数组以生成新的输出数组。然而,它使用Python(和 NumPy)进行计算。因此,它提供了更具表现力的表达能力。 指定要使用的 Expression 、Array Association指示数组关联 ( Point Data或 Cell Data)、输出数组的名称(Array Name )以及控制是否将输入数组复制到输出的切换开关(Copy Array )。

1.1.1 基础教程

首先创建一个球体源并将其Python Calculator 应用于它。作为第一个表达式,使用以下内容并应用:

5

这应该在输出点数据中创建一个数组名称结果。请注意,这是一个数组,每个点的值为 5。当表达式产生单个值时,计算器会自动生成一个常量数组。接下来,尝试以下操作:

Normals

现在,结果数组应该与输入数组 Normals 相同。如后面详细描述的,通过 计算器可以得到不同的函数. 例如,以下是一个有效的表达式:

sin(Normals) + 5

需要注意的是,Python Calculator 必须根据 Array Association 参数为每​​个点或单元生成一个值。此处描述的大多数函数单独应用于所有点或单元格值,并生成与输入相同维度的数组。但是,其中一些,例如min()和max(),会产生单个值。

常见错误:
在 Programmable Filter中 ,vtk.numpy_interface.algorithms所有函数都是在执行脚本之前都会导入tk.numpy_interface.algorithms。结果,一些内置函数,例如min和max ,被该导入破坏了。要使用内置函数,请导入 builtin 模块并访问这些 函数,例如__builtin__.min和__builtin__.max。

1.1.2 访问数据

有几种方法可以访问表达式中的输入数组。最简单的方法是通过名称访问它:

sin(Normals) + 5

这相当于:

sin(inputs[0].PointData['Normals']) + 5
area(inputs[0])
inputs[0].Points[:,0]

1.1.3 比较多个数据集

inputs[1].PointData['Iterations'] - inputs[0].PointData['Iterations']

1.1.4 基本操作

Normals + 5
Normals + [1,2,3]
(Normals - min(Normals))/(max(Normals) - min(Normals))
Normals[:, 0]
Normals[0, 0]
Normals[0, :]
make_vector(velocity_x, velocity_y, velocity_z)
VolumeOfCell * inputs[0].FieldData['MaterialData'][time_index]

1.1.5 函数

以下是Python Calculator中可用的功能列表 。请注意,这是部分列表,因为大多数 NumPy 和 SciPy 函数都可以在Python Calculator使用 . 其中许多函数可以将单个值或数组作为参数。
abs(x) :返回绝对值.

add(x, y) :返回两个值的总和。 和 可以是单个值或数组。这与x+y相同.

area(dataset) :返回网格中每个单元的表面积。

aspect(dataset) :返回网格中每个单元格的纵横比。

aspect_gamma(dataset) :返回网格中每个单元格的纵横比伽玛。

condition(dataset) :返回网格中每个单元的条件编号。

cross(x, y) :从两个 3D 向量数组中返回两个 3D 向量的叉积。

curl(array) :返回 3D 向量数组的 curl。

divergence(array) :返回 3D 向量数组的散度。

divide(x, y) :逐元素划分。x 和 y可以是单个值或数组。这与数学函数相同:frac{x}{y}。

det(array) :返回二维方阵数组的行列式。

determinant(array) :返回二维方阵数组的行列式。

diagonal(dataset) :返回数据集中每个单元格的对角线长度。

dot(a1, a2) :返回两个标量/向量数组的两个标量/向量的点积。

eigenvalue(array) :返回二维方阵数组的特征值。

eigenvector(array) :返回二维方阵数组的特征向量。

exp(x) : 返回.

gradient(array) :返回标量或向量数组的梯度。

inv(array) :返回二维方阵的逆数组。

inverse(array) :返回二维方阵数组的逆矩阵。

jacobian(dataset) :返回二维方阵数组的雅可比。

laplacian(array) :返回标量数组的雅可比。

ln(array) :返回标量/向量/张量数组的自然对数。

log(array) :返回标量/向量/张量数组的自然对数。

log10(array) :返回标量/向量/张量数组的以 10 为底的对数。

1.1.6 三角函数

以下是支持的三角函数列表:

sin(x) arccos(x) cosh(x) arctanh(x)
cos(x) arctan(x) tanh(x)
tan(x) hypot(x1,x2) arcsinh(x)
arcsin(x) sinh(x) arccosh(x)

2.Paraview参看手册中关于python calculator filter部分

4.3. Recipes for Programmable Filter
在这里插入图片描述

2.1可编程过滤器的配方

the Programmable Sourcethe Programmable Filter之间的区别之一, 是后者需要至少 1 个输入。当然, the Programmable Filter中的代码可以完全忽略输入并完全按照 Programmable Source。Programmable Filter旨在自定义数据转换。例如,当您想要使用python calculator和calculator无法直接使用表达式计算派生量 时 , 或者当您想要使用其他 Python 包甚至未在ParaView中公开的 VTK 过滤器来处理输入时,它很有用。
在本节中,我们将了解 Programmable Filter 的各种配方。

2.1.1基于输入数组添加新的点/单元数据数组

Python Calculator 提供了一种计算派生变量的简单机制。您也可以使用Programmable Filter。 通常,对于此类情况,请确保将Output DataSet Type 设置为Same as Input 。

# Code for 'Script'

# 'inputs' is set to an array with data objects produced by inputs to
# this filter.

# Get the first input.
input0 = inputs[0]

# compute a value.
dataArray = input0.PointData["V"] / 2.0

# To access cell data, you can use input0.CellData.

# 'output' is a variable set to the output dataset.
output.PointData.append(dataArray, "V_half")

关于此代码需要注意的是,即使输入数据集是复合数据集,例如多块数据集(第 3.1.10 节),它也会按预期工作。有关其工作原理的详细信息,请参阅第 5 节 。但是,在某些情况下,您可能希望显式迭代输入多块数据集中的块。为此,您可以使用以下代码段。

input0 = inputs[0]
if input0.IsA("vtkCompositeDataSet"):
    # iterate over all non-empty blocks in the input
    # composite dataset, including multiblock and AMR datasets.
    for block in input0:
        processBlock(block)
else:
    processBlock(input0)

2.1.2 计算四面体的体积

此配方计算输入数据集中每个四面体单元的体积。您总是可以简单地使用Python Calculator使用表达式volume(inputs[0])来计算单元体积。提供此配方是为了说明 API。
确保输出类型设置为Same as Input ,并且此过滤器假定输入是非结构化网格(第 3.1.7 节)。

# Code for 'Script'.

import numpy as np

# This filter computes the volume of the tetrahedra in an unstructured mesh.
# Note, this is just an illustration and not  the most efficient way for
# computing cell volume. You should use 'Python Calculator' instead.
input0 = inputs[0]

numTets = input0.GetNumberOfCells()

volumeArray = np.empty(numTets, dtype=np.float64)
for i in xrange(numTets):
       cell = input0.GetCell(i)
       p1 = input0.GetPoint(cell.GetPointId(0))
       p2 = input0.GetPoint(cell.GetPointId(1))
       p3 = input0.GetPoint(cell.GetPointId(2))
       p4 = input0.GetPoint(cell.GetPointId(3))
       volumeArray[i] = vtk.vtkTetra.ComputeVolume(p1,p2,p3,p4)

output.CellData.append(volumeArray, "Volume")

2.1.3 标记两个数据集之间的共同点

在此示例中, Programmable Filter需要两个输入数据集:A 和 B。它输出数据集 B,一个新的标量数组,该数组标记在B中也在A中的点。您应该在管道浏览器中选择两个数据集,然后应用可编程过滤器。

# Code for 'Script'

# Get the two inputs
A = inputs[0]
B = inputs[1]
# use len(inputs) to determine now many inputs are connected
# to this filter.

# We use numpy.in1d to test all which point coordinate components
# in  B are present in A as well.
maskX = np.in1d(B.Points[:,0], A.Points[:,0])
maskY = np.in1d(B.Points[:,1], A.Points[:,1])
maskZ = np.in1d(B.Points[:,2], A.Points[:,2])

# Combining each component mask, we get the mask for point
# itself.
mask = maskX & maskY & maskZ

# Now convert it to uint8, since bool arrays
# cannot be passed back to the VTK pipeline.
mask = np.asarray(mask, dtype=np.uint8)

# Initialize the output and add the labels array

# This ShallowCopy is needed since by default the output is
# initialized to be a shallow copy of the first input (inputs[0]),
# but we want it to be a description of the second input.
output.ShallowCopy(B.VTKObject)
output.PointData.append(mask, "labels")

请注意,在上面的脚本中,两个输入定义在一个 inputs 数组中。此数组中元素的顺序由在Pipeline Browser 中选择数据源的顺序决定 。因此,inputs[0] 是选择的第一个数据源,inputs[1]是第二个。

3.python calculator使用案例

python calculator过滤器

4.python 脚本调用python Calculator filter

from paraview.simple import *
connection = servermanager.Connect('localhost',11111)
er = servermanager.sources.EnSightreader(CaseFileName='/.../data.case')
er.PointArrays =
['x_velocity','1','y_velocity','1','z_velocity','1','cp','1']
er.UpdatePipeline()

calc1 = servermanager.filters.Calculator(Input=er,
ResultArrayName='Velocity')
calc1.ScalarVariable = ['x_velocity','x_velocity','0'] calc1.ScalarVariable
= ['y_velocity','y_velocity','0'] #This overwrites previous declaration
calc1.ScalarVariable = ['z_velocity','z_velocity','0'] #This overwrites
previous declaration calc1.Function = '(x_velocity)*iHat + (y_velocity)*jHat
+ (z_velocity)*kHat'
#Produces an error... Variable does not exist
calc1.UpdatePipeline()

我一直在尝试编写一个简单的Python脚本,它使用计算器过滤器获取三个标量,并使用ParaView3.6 Python 包装生成一个向量。
通过GUI计算器过滤器,这是微不足道的,但我在脚本中将多个标量添加到计算器对象时遇到问题。
从浏览此处的帖子和C++ doxygen,我注意到使用AddVectorVariable和AddScalarVariable来实现这一点,但是这些看起来不再通过Python接口获得。有人能告诉我我错过了什么吗?
好的,我找到了我所缺少的。ScalarVariable 应该接受一个列表
每个变量的三个属性,即:

calc1.ScalarVariable =
['x_velocity','x_velocity','0','y_velocity','y_velocity','0','z_velocity','z
_velocity','0']

但是,这样做还是有语法错误。下面是全部代码:

from paraview.simple import *
connection = servermanager.Connect('localhost',11111)
er = servermanager.sources.EnSightreader(CaseFileName='/.../data.case')
er.PointArrays =['x_velocity','1','y_velocity','1','z_velocity','1','cp','1']
er.UpdatePipeline()

calc1 = servermanager.filters.Calculator(Input=er,
ResultArrayName='Velocity')
calc1.ScalarVariable =
['x_velocity','x_velocity','0','y_velocity','y_velocity','0','z_velocity','z
_velocity','0']
calc1.Function = 'x_velocity*iHat + y_velocity*jHat + z_velocity*kHat'
calc1.UpdatePipeline()

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片