算法[最好是fortran]来插入来自2D非结构化网格的数据以形成笛卡尔网格

时间:2012-12-07 22:25:55

标签: grid fortran interpolation cartesian

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

非常感谢!

2 个答案:

答案 0 :(得分:3)

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

http://www.earthsystemmodeling.org/

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

上次我调查过,ESMF提供了双线性,双三次和quatitity保留的重新划分方法。

答案 1 :(得分: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)。 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. 然后,您可以使用三角形中的双线性插值法(使用重心法)在背景网格的每个节点处进行插值。
  7. 这种方法工作正常,速度非常快(适用于工程师)。