如何将(r,球谐波)空间中表示的数据插值到常规笛卡尔网格(F90)?

时间:2014-06-20 21:41:33

标签: fortran representation interpolation spectral qhull

我试图将球面谐波插入到立方笛卡尔网格中。

我的球面伪谱模拟的输出数据在NrrMin之间具有rMax个径向水平,每个包含一组经度和纬度的有限阶球谐函数。球面谐波通过三角形截断映射到包含Ni纬度和Nj经度的物理球面网格。

域名如下:

  • 径向级别:rMin <= r(k) <= rMax,索引为1 <= k <= Nr
  • 球面谐波(三角形截断,没有变换混叠):
    • Nm = (Nj-1)/3
    • 0 <= m <= Nm
    • m <= l <= Nm
    • nlm == (nm+1)*(nm+2)/2lm组合的总数)

数据阵列:

  • 光谱形式:complex*16, dimension( 1:nlm, 1:Nr ) :: foo_spectral
  • 笛卡尔形式:real*8, dimension( 1:Nx, 1:Ny, 1:Nz ) :: foo_cartesian

我正在寻找一种准确有效的方法,将数据从其光谱表示插入到边长2*rMax的立方笛卡尔网格中,这样球形域完全适合内部。我只想在球体内插入 ,但是:对于与r<rMinrMax<r对应的点,立方网格应具有OUTSIDE_DOMAIN值。

目前,我必须将数据从其频谱表示(球面谐波:foo(Nr,nlm))转换为物理表示(球面网格:foo(Nr,Ni,Nj)),然后使用QHULL例程在IDL中,从物理球形网格插入物理立方网格(foo(Nx,Ny,Nz))(注意立方网格为Nx==Ny==Nz)。

我的数据大小比我现有的代码(用IDL编写)可以处理,并且为了我的目的,转换为球形空间是不必要的。我想要一种独立的更直接的方法 - 例如,不依赖于IDL。

有关如何做到这一点的任何想法?我愿意使用开源库,但不必这样做会很好。

提前致谢!

1 个答案:

答案 0 :(得分:4)

我强烈建议使用库;球谐函数变换难以高效准确地完成,并且您的第一次尝试不太可能像现有的例程一样好。

一位同事高度评价的图书馆是SHTns,它将为你做综合(逆变换)并在任意点进行插值(对于任何给定的shell)。它有fortran绑定。你仍然需要自己处理多个径向壳,不管怎么样(可能通过做你现在正在做的事情 - 将所有内容转换为球形网格,然后使用标准插值方法进入立方网格),以及虽然这样做有点棘手,但它比球谐调换部分要简单得多。