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

Posted

技术标签:

【中文标题】如何将(r,球形谐波)空间中表示的数据内插到常规笛卡尔网格(F90)?【英文标题】:How can I interpolate data represented in (r,spherical harmonic) space to a regular cartesian grid (F90)? 【发布时间】:2014-08-11 17:33:05 【问题描述】:

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

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

域名如下:

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

数据数组:

光谱形式: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)),然后在 IDL 中使用QHULL 例程从物理的球形网格到物理的立方体网格 (foo(Nx,Ny,Nz))(注意 Nx==Ny==Nz 用于立方体网格)。

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

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

提前致谢!

【问题讨论】:

忘掉编码吧——如果有人可以提供一种使用高等数学进行这种转换的方法,我可以找出实现它的代码。 :-) 【参考方案1】:

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

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

【讨论】:

我同意——图书馆很棒。特别是如果它们只包含在几个可以用我的代码编译的源文件中。我今晚去看看那个图书馆——谢谢!

以上是关于如何将(r,球形谐波)空间中表示的数据内插到常规笛卡尔网格(F90)?的主要内容,如果未能解决你的问题,请参考以下文章

C语言总谐波失真(THD)实现,从理论到应用分析改进详解

如何使用具有球形几何形状的 MySQL 地理空间扩展

数据结构与算法 顺序表 链表

PySpark - 如何根据 CoordinateMatrix 中表示的相似点获取前 k 个 ID?

如何在 MATLAB 中将指数曲线拟合到阻尼谐波振荡数据?

R假设检验之Bartlett球形检验(Bartlett’s Test of Sphericity)