【问题标题】:Algorithm [preferably fortran] to interpolate data from a 2D unstructured grid to form a cartesian grid算法 [最好是 fortran] 从 2D 非结构化网格中插入数据以形成笛卡尔网格
【发布时间】:2012-11-26 03:47:29
【问题描述】:

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

非常感谢!

【问题讨论】:

标签: grid fortran interpolation cartesian


【解决方案1】:

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

http://www.earthsystemmodeling.org/

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

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

【讨论】:

  • 非常感谢您的建议。 ESMF 似乎是一个很好的参考!
【解决方案2】:

尽管有些参考文献很棒(例如 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)。 Square 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. 然后,您可以使用三角形中的双线性插值法(使用重心法)在背景网格的每个节点处进行插值。

此方法运行良好且速度非常快(用于工程目的)。

【讨论】:

  • +1 重新发明简单的东西有时是件好事,让您了解它的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2013-07-15
  • 2020-08-11
相关资源
最近更新 更多