非结构化网格的有效插值方法?


12

我想知道一种在两个非结构化网格之间插值数据的好方法,其中一个网格是另一个网格的粗略版本。

效率对我来说非常重要,因为我正在解决一个瞬态PDE问题,在该问题中,我需要在解决方案的每个步骤之间在网格之间传输数据。

我考虑过使用kd-tree搜索给定点的最近节点,然后使用该元素的形状函数(FEM模拟)对数据进行插值。这是一个好的解决方案吗?有更好的吗?

您是否还知道C / C ++中的任何健壮和可靠的库来完成此任务?

*我知道有一个类似的问题,但它要求在结构化网格上使用最准确的方法。


看到这个Q&A,我收集的开源方法一堆此:scicomp.stackexchange.com/questions/19137/...
denfromufa

Answers:


6

非结构化网格有其位置。

您可能需要查看地球系统建模框架(ESMF)。他们有一些重新网格化的代码-专门为此目的-并且他们还用并行代码完成了一些漂亮的工作。整个系统旨在耦合模型,因此那里可能还有其他有用的东西。

其他注意事项:

“对于任何数量的积分,都无法有效地做到这一点”

好吧,效率是相对的问题-将网格放在树状结构中之后,您可以在O(logn)中搜索它,虽然不是O(1),但是搜索O(logn)可以很快,就像搜索常规网格一样是。

同样,听起来好像需要在每个时间步进行插值,但是如果网格不适应,则从一个网格到另一个网格的映射将保持不变。因此,您可以通过任何方便的方式来计算该映射关系(即,每个网格中的哪个元素对应于另一个网格中的哪个元素),将其存储起来,然后再也不需要计算它(直到网格改变)。

剩下的就是插值代码-您将希望在精度和性能之间取得平衡-在三角形上进行简单的线性插值速度很快,并且可能足够好。

“我考虑过使用kd-tree搜索给定点的最近节点,然后使用该元素的形状函数”

请记住,最近的节点不会为您提供元素-因此,您需要做更多的工作才能找到所需的元素。一种选择是改用rtree,它通过边界框存储/搜索-每次搜索将获得多个元素,但是您可以直接检查其中哪个是正确的。


看起来不错 我不需要调整网格,因此从一个网格到另一个网格的映射将只进行一次。感谢您提供有关r树数据结构的技巧。
Bernardo MR

1
O(N)O(logN)

7

如果我理解正确,则希望通过在较粗的网格上进行插值来填充较细的网格的值。在非结构化网格上进行线性插值的一种方法是使用Delaunay三角剖分(这是Matlab的griddata和TriScatteredInterp命令的实现方式)。在构造了网格点的三角剖分之后,插值归结为找到包含目标点的三角形,计算其重心坐标,并使用顶点处的函数值来计算插值。 CGAL可以构造n维三角剖分(对于介质n),并且还具有内置的2d插值模块。


是。但是我也想将细网格中的值也“注入”到粗网格中,这就是我所说的转移的原因。
Bernardo MR

3

这是我目前正在做的事情,除了要在正交点而不是节点上传递函数值。我正在实施在针对我的问题的所选答案中说明的技术:找出中的三角形点

ABAB

  1. BpiA
  2. pi
  3. AA
  4. Ap1p2p3A

NMAO(NM)O(max(N,M))


2

您确实要避免非结构化网格,因为对于任何数量的点都无法有效地执行此操作。您应该考虑使用至少在某种程度上与每个网格相关的网格。例如,如果它们都是从粗网格的分层细化中获得的,则可以相对轻松而有效地找出一个网格的插值点在另一个网格上的位置。


我认为这可能是最好的选择(网格层次结构)。如果是这样,您是否知道任何良好的数据结构或使用的特定方法?
Bernardo MR

是的,所有层次网格都存储为四叉树/八叉树(如果它们从单个粗单元开始)或此类树的森林(如果粗网格具有多个单元)。
Wolfgang Bangerth 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.