5

我正在使用 2D 动态非结构化网格对裂缝扩展进行建模。随着裂缝随着时间的推移而扩展,元件也会相应地移动。对于给定的时间步,我想对我的非结构化网格 zi=f(xi,yi) 的数据进行插值(其中 (xi,yi) 是非结构化三角形的节点)以获得函数 z 在笛卡尔网格(x 和 y 规则间隔)。我的网格大小约为 100x100 个节点。有很多方法可以执行此插值方案,但我对该主题的了解不足,无法确定哪种方案足够健壮和简单。我正在使用 Fortran 90(不要问为什么......)。有没有可用的开源算法?我不想重新发明轮子。

非常感谢!

4

2 回答 2

3

您可能对地球系统建模框架 (ESMF) 感兴趣:

http://www.earthsystemmodeling.org/

它带有 Fortran、C 和最近的 Python(功能有限)API 和出色的文档。它通常用于地球物理模型中的数据抽象对象及其耦合,但它也提供结构化和非结构化网格之间重新网格化的例程,可用于离线(独立命令行实用程序)或在线(通过子例程调用)插值权重一代。

上次我研究它时,ESMF 提供了双线性、双三次和数量守恒的重新网格化方法。

于 2012-12-07T23:38:31.367 回答
1

尽管有些参考文献很棒(例如 ESMF),但我找不到一个容易获得的简单算法。所以有时更容易“重新发明”轮子!如果你们中的一些人感兴趣,这里是我推导出的简单方法:

  1. 生成背景笛卡尔网格:节点 P 位于 l=j+Nbx(i-1),i=1:Nbx 和 j=1:Nby。
  2. 为每个背景方块设置节点编号。有 Nbx*Nby 个节点和 (Nbx-1) (Nby-1) 个方格。对于 i=1:Nbx-1 和 j=1:Nby-1 ,正方形标记为 s=j+(i-1) (Nby-1)。正方形 S 由 4 个节点组成:j+Nby(i-1)、j+1+Nby(i-1)、j+1+Nby*i 和 j+Nby*i
  3. 对于非结构化网格的每个三角形,找到最小和最大 x 和 y 来描述包含三角形的框。然后,确定对应的imin,imax,jmin,jmax。
  4. 对于给定的框,遍历该框中包含的笛卡尔节点 (i=imin:imax, j=jmin:jmax) 并执行“Point_Inclusion_in_Triangle”测试(使用重心方法)以查看该节点是否在感兴趣的三角形内. 这样做时,请进行额外测试以查看节点是否位于其中一个顶点上。
  5. 如果测试是肯定的,则背景笛卡尔网格的相应节点从潜在节点列表中删除(一个节点不能是多个三角形的一部分)。这使得我们通过三角形列表的过程更快。
  6. 然后,您可以使用三角形中的双线性插值法(使用重心法)在背景网格的每个节点处进行插值。

这种方法工作得很好并且非常快(出于工程目的)。

于 2012-12-12T17:23:08.787 回答