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

标签 fortran representation interpolation 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值(value)观。

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

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

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

    提前致谢!

    最佳答案

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

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

    关于fortran - 如何将(r,球形谐波)空间中表示的数据内插到常规笛卡尔网格(F90)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24336074/

    相关文章:

    matrix - 如何从矩阵中删除几列

    fortran - 意图(inout)和指针虚拟参数之间的区别

    c - C 标准关于 switch 语句的描述

    binary - 对人口计数算法有所了解

    python - 样条滤波和样条插值有什么区别?

    java - 从 java 执行进程并使其保持 Activity 状态以供输入

    c - 使用 IEEE float 表示的最大负实数

    python - 将价目表从较长的长度调整为较小的长度

    scipy - scipy.interpolate.InterpolatedUnivariateSpline.get_coeffs 返回什么?

    fortran - 使用不同的输入参数多次运行 Fortran 代码