网格上的快速函数评估

计算科学 芬尼克斯
2021-11-27 04:05:18

我正在尝试在大量点上计算 3D 函数 f,例如均匀的立方网格。此外,三次网格点与定义函数 f 的网格顶点不重合。例如:

from dolfin import *
mesh1 = Mesh( meshfile) # A uniform mesh
V1 = FunctionSpace(mesh1, 'CG', 1)
f1 = Function(V1)
f1 = ... # Construct f1 (e.g. by solving a PDE based on mesh1)

mesh2 = UnitCube(100,100,100) # Geometrically, the unit cube domain is a subset of mesh1's domain

现在我想计算mesh2所有顶点的f1值。

我知道我可以使用插值函数:

V2 = FunctionSpace(mesh2, ‘CG', 1)
f2 = interpolate(f1, V2)

然后 f2.vector().array() 给我这些值(尽管我知道顺序与当前版本的网格顶点不同)。

或者我可以显式地循环 mesh2 的所有顶点,并在每一步调用 f1(x, y, z) 来计算该顶点。

问题是这两种方法都非常非常昂贵,并且 interpolate 方法比显式循环更耗时。有谁知道是否有更有效的方法来完成这项工作?

非常感谢,

1个回答

在网格之间移动时会有不可忽略的开销(一些当前的开发将使这比现在更快)。您可以先进行插值,然后使用函数有效地评估顶点值Function::compute_vertex_values对于不连续的空间,它可能会产生一些意想不到的结果。