Я пытаюсь интерполировать сферические гармоники в кубическую декартову сетку.
Выходные данные моей сферической псевдоспектральной симуляции имеют Nr
радиальные уровни между rMin
и rMax
, каждый из которых содержит набор сферических гармоник конечного порядка для долготы и широты. Сферические гармоники отображаются на физическую сферическую сетку, содержащую Ni
широты и Nj
долготы посредством треугольного усечения.
Домен выглядит следующим образом:
- Радиальные уровни:
rMin <= r(k) <= rMax
, с индексацией1 <= k <= Nr
- Spherical harmonics (triangular truncation, without aliasing from transform):
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)
), а затем использовать QHULL в IDL для интерполяции из физической сферической сетки в физическую кубическую сетку (foo(Nx,Ny,Nz)
) (обратите внимание, что Nx==Ny==Nz
для кубической сетки).
Размер моих данных больше, чем может обработать мой существующий код (написанный на IDL), и преобразование в сферическое пространство не требуется для моих целей. Мне нужен более прямой и автономный метод, не зависящий, например, от IDL.
Есть мысли как это можно сделать? Я готов использовать библиотеки с открытым исходным кодом, но было бы неплохо не делать этого.
Заранее спасибо!