如何将(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 【问题描述】:我正在尝试将球谐函数内插到立方笛卡尔网格。
我的球面伪光谱模拟的输出数据在rMin
和rMax
之间具有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)/2
(l
,m
组合的总数)
数据数组:
光谱形式: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。
对如何做到这一点有任何想法吗?我愿意使用开源库,但不必这样做会很好。
提前致谢!
【问题讨论】:
忘掉编码吧——如果有人可以提供一种使用高等数学进行这种转换的方法,我可以找出实现它的代码。 :-) 【参考方案1】:我强烈建议为此使用库;球谐变换很难有效和准确地进行,而且您的第一次尝试不太可能与现有例程一样好。
一位同事高度评价的库是SHTns,它既可以为您进行合成(逆变换),也可以在任意点进行插值(对于任何给定的外壳)。它具有 fortran 绑定。您仍然必须以一种或另一种方式自己处理多个径向壳(可能通过做您现在正在做的事情 - 将所有内容转换为球形网格,然后使用标准插值方法进入立方网格),并且虽然这有点棘手,但它比球谐变换部分要简单得多。
【讨论】:
我同意——图书馆很棒。特别是如果它们只包含在几个可以用我的代码编译的源文件中。我今晚去看看那个图书馆——谢谢!以上是关于如何将(r,球形谐波)空间中表示的数据内插到常规笛卡尔网格(F90)?的主要内容,如果未能解决你的问题,请参考以下文章