我想知道一种在两个非结构化网格之间插值数据的好方法,其中一个网格是另一个网格的粗略版本。
效率对我来说非常重要,因为我正在解决一个瞬态PDE问题,在该问题中,我需要在解决方案的每个步骤之间在网格之间传输数据。
我考虑过使用kd-tree搜索给定点的最近节点,然后使用该元素的形状函数(FEM模拟)对数据进行插值。这是一个好的解决方案吗?有更好的吗?
您是否还知道C / C ++中的任何健壮和可靠的库来完成此任务?
*我知道有一个类似的问题,但它要求在结构化网格上使用最准确的方法。
我想知道一种在两个非结构化网格之间插值数据的好方法,其中一个网格是另一个网格的粗略版本。
效率对我来说非常重要,因为我正在解决一个瞬态PDE问题,在该问题中,我需要在解决方案的每个步骤之间在网格之间传输数据。
我考虑过使用kd-tree搜索给定点的最近节点,然后使用该元素的形状函数(FEM模拟)对数据进行插值。这是一个好的解决方案吗?有更好的吗?
您是否还知道C / C ++中的任何健壮和可靠的库来完成此任务?
*我知道有一个类似的问题,但它要求在结构化网格上使用最准确的方法。
Answers:
非结构化网格有其位置。
您可能需要查看地球系统建模框架(ESMF)。他们有一些重新网格化的代码-专门为此目的-并且他们还用并行代码完成了一些漂亮的工作。整个系统旨在耦合模型,因此那里可能还有其他有用的东西。
其他注意事项:
“对于任何数量的积分,都无法有效地做到这一点”
好吧,效率是相对的问题-将网格放在树状结构中之后,您可以在O(logn)中搜索它,虽然不是O(1),但是搜索O(logn)可以很快,就像搜索常规网格一样是。
同样,听起来好像需要在每个时间步进行插值,但是如果网格不适应,则从一个网格到另一个网格的映射将保持不变。因此,您可以通过任何方便的方式来计算该映射关系(即,每个网格中的哪个元素对应于另一个网格中的哪个元素),将其存储起来,然后再也不需要计算它(直到网格改变)。
剩下的就是插值代码-您将希望在精度和性能之间取得平衡-在三角形上进行简单的线性插值速度很快,并且可能足够好。
“我考虑过使用kd-tree搜索给定点的最近节点,然后使用该元素的形状函数”
请记住,最近的节点不会为您提供元素-因此,您需要做更多的工作才能找到所需的元素。一种选择是改用rtree,它通过边界框存储/搜索-每次搜索将获得多个元素,但是您可以直接检查其中哪个是正确的。
如果我理解正确,则希望通过在较粗的网格上进行插值来填充较细的网格的值。在非结构化网格上进行线性插值的一种方法是使用Delaunay三角剖分(这是Matlab的griddata和TriScatteredInterp命令的实现方式)。在构造了网格点的三角剖分之后,插值归结为找到包含目标点的三角形,计算其重心坐标,并使用顶点处的函数值来计算插值。 CGAL可以构造n维三角剖分(对于介质n),并且还具有内置的2d插值模块。
您确实要避免非结构化网格,因为对于任何数量的点都无法有效地执行此操作。您应该考虑使用至少在某种程度上与每个网格相关的网格。例如,如果它们都是从粗网格的分层细化中获得的,则可以相对轻松而有效地找出一个网格的插值点在另一个网格上的位置。