4

我正在尝试将球谐函数内插到立方笛卡尔网格。

我的球面伪光谱模拟的输出数据具有介于和之间的Nr径向水平,每个水平都包含一组用于经度和纬度的有限阶球谐函数。球谐函数通过三角截断映射到包含纬度和经度的物理球面网格。rMinrMaxNiNj

域如下:

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

数据数组:

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

我正在寻找一种准确有效的方法来将数据从其光谱表示插入到具有 edge-length 的三次笛卡尔网格中2*rMax,以使球域完全适合内部。我只想在 sphere内插值,但是:对于对应于r<rMinor的点rMax<r,三次网格应该有OUTSIDE_DOMAIN值。

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

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

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

提前致谢!

4

1 回答 1

5

我强烈建议为此使用库;球谐变换很难有效和准确地完成,而且您的第一次尝试不太可能与现有例程一样好。

一位同事高度评价的一个库是SHTns,它既可以为您进行合成(逆变换),又可以在任意点进行插值(对于任何给定的外壳)。它具有 fortran 绑定。您仍然必须以一种或另一种方式自己处理多个径向壳(可能通过做您现在正在做的事情 - 将所有内容转换为球形网格,然后使用标准插值方法进入立方网格),并且虽然这有点棘手,但它比球谐变换部分要简单得多。

于 2014-06-20T22:17:32.033 回答