2014-06-20 10 views
2

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

Выходные данные моей сферической, псевдо-спектрального моделирования имеет 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 (общее количество l, m комбинации)

массивы данных:

  • Спектральный форма: complex*16, dimension(1:nlm, 1:Nr) :: foo_spectral
  • декартова форма: real*8, dimension(1:Nx, 1:Ny, 1:Nz) :: foo_cartesian

I» я ищу acc ураты и эффективный способ интерполирования данных из его спектрального представления в кубическую декартову сетку с длиной края 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.

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

Заранее благодарен!

+0

Забудьте о кодировании - если кто-то может предоставить способ сделать это преобразование с использованием передовой математики, я могу выяснить код, чтобы это произошло. :-) – jvriesem

ответ

3

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

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

+0

Согласен - библиотеки замечательные. Особенно, если они содержатся только в нескольких исходных файлах, которые могут быть скомпилированы с моим кодом. Я проведу эту библиотеку сегодня вечером - спасибо! – jvriesem