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

jvr*_*sem 4 interpolation fortran representation spectral qhull

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

我的球面伪光谱模拟的输出数据的Nr径向水平介于rMin和之间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)/2(的总数lm组合)

数据数组:

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

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

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

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

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

提前致谢!

Jon*_*rsi 5

我强烈建议为此使用库;球形谐波变换很难高效,准确地完成,并且您的初次尝试不可能像现有例程一样好。

一位同事非常看重的一个库是SHTns,它既可以为您进行综合(逆变换),也可以在任意点进行内插(对于任何给定的外壳)。它具有fortran绑定。您仍然必须自己以一种或另一种方式处理多个径向壳(可能通过执行当前操作-将所有内容转换为球形网格,然后使用标准插值方法获得立方网格),并且虽然这样做有些棘手,但比球谐变换部分要简单得多。