Paraview创建具有场跳跃的过滤器

3
我有一个数据集,其中某些表面(目前我正在使用2D,在这种情况下,它们将是1D的线)存在不连续的位移。它作为PVDReader输入(仅在问题上可能会有所区别,我表示怀疑)。 是否可以以编程方式创建一个新源,用于沿着这些线的位移跳跃?请注意,这个新领域可能需要定义在较低维度的域上,请参见上文。 到目前为止,我创建了“PlotOverLine”过滤器,在稍微低于和高于规定线的线上。但我不知道如何将两者相减并将它们放在一条线上的单个字段中。
注:
1. 到目前为止,我正在2D中工作(不连续性定义的域是1D)。我的意思是在3D域上也得到不连续性(不连续性定义的域是2D)。 2. 作为简单的示例(请参见以下内容),我将不连续性域视为x轴,y = 0。实际上,我要有任意线(在2D中)或平面(在3D中)的不连续性。 3. 如果不���续性域是任意曲线(在2D中)或曲面(在3D中),我将提供额外的奖励。
数学描述:
不连续场:u(x,y)
不连续域:x轴,y = 0
领域不连续的一侧的场值:u(x +,0)
领域不连续的另一侧的场值:u(x-,0)
场的跳跃:d(x) = u(x+,0) - u(x-,0)
场u定义在2D域上。字段d定义在1D域(x轴)上。

我不确定你的意思,你是想生成一条不连续的线吗? - Mathieu Westphal
@MathieuWestphal - 这条线不是不连续的。该区域在该线上是不连续的。 - sancho.s ReinstateMonicaCellio
所以你想要使用你提供的数学描述生成一个包含不连续字段的线。 - Mathieu Westphal
@MathieuWestphal - 在二维域(我的原始数据)上,该领域在跨越线时(例如,x变化;y=0),是不连续的。新的领域仅在该线上定义,在该线上是连续的。 - sancho.s ReinstateMonicaCellio
我的回答应该是正确的。 - Mathieu Westphal
3个回答

1
如果我理解正确,您想在2D表面中绘制(x,y)的不连续性作为一条线,并将(x)中的跳跃与d(x)= u(x +,0)- u(x-,0)相关联。
从理论上讲,可以使用可编程过滤器或开发ParaView过滤器来利用您的过滤器PlotOverLine,并将稍微高于和低于线作为其第一个参数,并将输出线用作最后一个参数(或创建它为输出)。
不同的参数在PF脚本中暴露在数组中。关于参数顺序的问题可以通过特殊字段“LineType”来解决,例如指示哪个在上面,哪个在下面。
这样,也许您可以明确计算场(x +,0)(x-,0),然后计算跳跃场(x),最后将其与输出线相关联。
我很清楚这更像是如何完成而不是真正的答案,但我想分享一些想法。

谢谢Guillaume。这些想法基本符合我的期望。如果您能提供更详细的工作流程,并更明确地引用Paraview功能,那就太好了。 - sancho.s ReinstateMonicaCellio

1

据我所理解,使用数据集进行重新采样应该可以解决问题。

  • 首先使用线源生成一条线
  • 打开包含不连续 U 场的二维数据集。
  • 在数据集上使用 ressample with dataset,并将线源作为输入源
  • 现在您有一条包含在数据集中定义场的线

如果需要对其进行计算,则可以使用计算器或可编程过滤器。


这并没有得到预期的结果。我想要获得差分 d(x) = u(x+,0) - u(x-,0)。但这只在某些点上给出了 u(x+,0),而在其他一些点上给出了 u(x-,0)。如果这个滤波器不能做我需要的事情,那我会感到惊讶...它怎么知道我是否想要平均值 (u(x+,0)+u(x-,0))/2 呢?对于连续场景下 d(x)=0 的情况,这个过滤器似乎很有用(但是没有人会对此感兴趣!)。此外,我没有找到如何告诉过滤器我希望在线上获取多少数据点。到目前为止,它只使用了7个点(太稀疏了)。 - sancho.s ReinstateMonicaCellio
你有办法测试一个点是否在不连续点上吗?点的数量由分辨率参数控制。 - Mathieu Westphal
我不明白你所说的测试是什么意思。我清楚哪里是间断线,这可以通过使用WarpByVector过滤器进行确认,该过滤器会产生开口,例如。我没有看到任何分辨率参数。 - sancho.s ReinstateMonicaCellio
在这种情况下,您别无选择,只能使用完全可编程的过滤器。请查看此处:https://www.paraview.org/Wiki/Python_Programmable_Filter,并在出现问题时使用paraview邮件列表。 - Mathieu Westphal
如果您能提供更具体的细节,例如一些代码(当然,不一定是最终形式的代码),对于这种情况会非常有帮助。特别是,我开始处理这个问题的方式是通过两个单独的PlotOverLine源,并且我在将它们组合成可编程过滤器进行减法时没有成功。 - sancho.s ReinstateMonicaCellio
相当困难的任务。我建议您尝试一下,然后向Paraview邮件列表寻求帮助。 - Mathieu Westphal

0

我组装了一个可编程过滤器。 我不知道这是否是最有效的方法,但它可以工作。

programmableFilter1 = ProgrammableFilter(Input=[plotOverLineBot,plotOverLineTop])
programmableFilter1.Script = """
import vtk.util.numpy_support as ns
import numpy as np

input_bot = self.GetInputDataObject(0, 0);
input_top = self.GetInputDataObject(0, 1);
output = self.GetPolyDataOutput()
#output.ShallowCopy(input_bot)

npts_bot = input_bot.GetNumberOfPoints()
npts_top = input_top.GetNumberOfPoints()
if ( npts_bot == npts_top ) :
    print( "Number of points: " + str(npts_bot) )
    u_bot = input_bot.GetPointData().GetArray("displacement")
    u_top = input_top.GetPointData().GetArray("displacement")
    u_bot_np = ns.vtk_to_numpy(u_bot)
    u_top_np = ns.vtk_to_numpy(u_top)
    u_jump_np = np.subtract(u_top_np, u_bot_np)
    u_jump = ns.numpy_to_vtk(u_jump_np)
    u_jump.SetName("displacement jump");
    output.GetPointData().AddArray(u_jump)
else :
    pass
"""

programmableFilter1.RequestInformationScript = ''
programmableFilter1.RequestUpdateExtentScript = ''
programmableFilter1.PythonPath = ''
RenameSource("Programmable Filter - Jumps", programmableFilter1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接