Как я могу интерполировать данные, представленные в (r, сферическом гармоническом) пространстве, в обычную декартову сетку (F90)?

Я пытаюсь интерполировать сферические гармоники в кубическую декартову сетку.

Выходные данные моей сферической псевдоспектральной симуляции имеют 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.

Есть мысли как это можно сделать? Я готов использовать библиотеки с открытым исходным кодом, но было бы неплохо не делать этого.

Заранее спасибо!


person jvriesem    schedule 20.06.2014    source источник
comment
Забудьте о кодировании — если кто-то может предоставить способ сделать такое преобразование с помощью продвинутой математики, я смогу вычислить код, чтобы это произошло. :-)   -  person jvriesem    schedule 05.07.2014


Ответы (1)


Я бы настоятельно рекомендовал использовать для этого библиотеки; сферическое гармоническое преобразование трудно выполнить эффективно и точно, и маловероятно, что ваши первые попытки будут такими же хорошими, как существующие процедуры.

Коллега высоко оценивает одну библиотеку — SHTns, которая одновременно выполняет синтез (обратное преобразование ) для вас и сделать интерполяцию (для любой заданной оболочки) в произвольной точке. Он имеет привязки к фортрану. Вам все равно придется обрабатывать несколько радиальных оболочек самостоятельно, так или иначе (вероятно, делая то, что вы делаете сейчас - преобразуйте все в сферическую сетку, а затем используйте стандартные методы интерполяции, чтобы попасть в кубическую сетку), и хотя это немного сложно сделать правильно, это гораздо проще, чем часть сферического гармонического преобразования.

person Jonathan Dursi    schedule 20.06.2014
comment
Я согласен - библиотеки великолепны. Особенно, если они содержатся всего в нескольких исходных файлах, которые можно скомпилировать с моим кодом. Я проверю эту библиотеку сегодня вечером - спасибо! - person jvriesem; 21.06.2014