在 Paraview 中计算张量的转置

Calculating transpose of a tensor in Paraview

我需要在 Paraview 中计算以下内容:

如何计算上述公式中使用的转置?基本上我想知道如何在 Paraview 中计算矩阵的转置。

正如@Nico Vuaille 所建议的,您应该在 ParaView 中使用 Numpy 支持。只需将可编程过滤器应用于感兴趣的数据集,并提供类似于以下内容的脚本。

import numpy as np
u = inputs[0].PointData['Velocity']
# Calculate gradient here, say uGrad
output.PointData.append(uGrad, 'Gradient')

编辑:实际上,我已经尝试用我的一个数据集生成您的计算,并意识到我的回答和评论并没有太大帮助。因此,这就是我现在的建议,它应该有效:

  • 在 ParaView 中加载您的数据集
  • 在您的数据集上应用梯度/非结构化数据集梯度过滤器,select 速度场作为输入场(我使用了 Gradient Of Unstructured Dataset,您也可以从中直接计算出发散场和涡度场)。
  • 将 Programmable Filter 过滤器应用于您从上一步获得的结果数据集,并提供以下代码。

脚本

import numpy as np
grad = inputs[0].PointData['Gradients']
omega = (grad - np.transpose(grad, axes=(0, 2, 1))) / 2
output.PointData.append(omega, 'Omega')

您应该在 ParaView 管道中得到另一个仅包含预期 Omega 的项目。

编辑 2:输入文件使用 XMDF 格式。当加载到 ParaView 中时,它被解释为块的多块数据集。因此,提供给 Programmable Filter 的 Script 参数的代码片段必须更新为:

import paraview.vtk.numpy_interface.dataset_adapter as dsa
for i in range(inputs[0].GetNumberOfBlocks()):
    data = dsa.WrapDataObject(inputs[0].GetBlock(i))
    grad = data.PointData['Gradients']
    omega = (grad - np.transpose(grad, axes=(0, 2, 1))) / 2
    data.PointData.append(omega, 'Omega')
    output.SetBlock(i, data.VTKObject)