Алгоритм [предпочтительно Фортран] для интерполяции данных из 2D неструктурированной сетки для формирования декартовой сетки

Я моделирую распространение трещины, используя 2D динамическую неструктурированную сетку. По мере распространения трещины во времени элементы перемещаются соответствующим образом. Для заданного временного шага я хотел бы интерполировать данные моей неструктурированной сетки zi=f(xi,yi) (где (xi,yi) — узлы неструктурированных треугольников), чтобы получить значение функции z на Декартова сетка (где x и y расположены через равные промежутки). Размер моей сетки составляет около 100x100 узлов. Есть много способов сделать эту схему интерполяции, но я недостаточно знаю эту тему, чтобы решить, какая схема надежна и достаточно проста. Я использую Fortran 90 (не спрашивайте, почему...). Есть ли доступный алгоритм с открытым исходным кодом? Я не хочу изобретать велосипед.

Большое спасибо!


person RoLio    schedule 07.12.2012    source источник
comment
Возможно, для таких вопросов больше подходит сайт Computational Science.   -  person Hristo Iliev    schedule 08.12.2012


Ответы (2)


Структура моделирования системы Земли (ESMF) может вас заинтересовать:

http://www.earthsystemmodeling.org/

Он поставляется с API-интерфейсами Fortran, C и, в последнее время, Python (ограниченная функциональность) и отличной документацией. Он обычно используется для объектов абстракции данных в геофизических моделях и их связи, но также предоставляет подпрограммы для повторного построения сетки между структурированными и неструктурированными сетками, которые можно использовать для автономной (автономная утилита командной строки) или онлайновой (через вызовы подпрограммы) интерполяции веса. поколение.

В прошлый раз, когда я изучал это, ESMF предоставил билинейные, бикубические и сохраняющие качество методы повторной сетки.

person milancurcic    schedule 07.12.2012
comment
Большое спасибо за предложение. ESMF кажется отличным эталоном! - person RoLio; 10.12.2012

Несмотря на то, что некоторые ссылки были отличными (например, ESMF), я не мог найти простой доступный алгоритм. Так что иногда проще «изобрести» велосипед! Если кому-то из вас интересно, вот простой метод, который я вывел:

  1. Создайте фоновую декартову сетку: узел P находится в точке l=j+Nbx(i-1) для i=1:Nbx и j=1:Nby.
  2. Настройте нумерацию узлов для каждого фонового квадрата. Имеется Nbx*Nby узлов и (Nbx-1)(Nby-1) квадратов. Квадраты помечены как s=j+(i-1)(Nby-1) для i=1:Nbx-1 и j=1:Nby-1. Квадрат S состоит из 4 узлов: j+Nby(i-1), j+1+Nby(i-1), j+1+Nby*i и j+Nby*i.
  3. Для каждого треугольника неструктурированной сетки найдите минимальные и максимальные x и y, чтобы описать блок, включающий треугольник. Затем определите соответствующие imin,imax,jmin,jmax.
  4. Для данного поля просмотрите декартовы узлы, включенные в это поле (i = imin: imax, j = jmin: jmax), и выполните тест «Point_Inclusion_in_Triangle» (используя барицентрический метод), чтобы увидеть, находится ли узел внутри интересующего треугольника. . При этом выполните дополнительный тест, чтобы увидеть, находится ли узел в одной из вершин.
  5. Если тест положительный, соответствующий узел фоновой декартовой сетки исключается из списка потенциальных узлов (узел не может быть частью нескольких треугольников). Это ускоряет процесс, мы проходим по списку треугольников.
  6. Затем вы можете сделать интерполяцию в каждом узле фоновой сетки, используя метод билинейной интерполяции в треугольнике (используя барицентрический метод).

Этот метод отлично работает и довольно быстр (для инженерных целей).

person RoLio    schedule 12.12.2012
comment
+1 Иногда полезно заново изобретать простые вещи, чтобы понять, как это работает. - person milancurcic; 12.12.2012