К основному контенту

О численном решении задачи вычисления звукового поля, отраженного от препятствия

Пусть в пространстве R2 или R3 имеется некоторое препятствие. Допустим, что на это препятствие падает звуковая волна. Возникает отраженная волна.
Требуется вычислить звуковое поле, отраженное от препятствия.
Математически эту задачу можно сформулировать как задачу численного нахождения решения уравнения Гельмгольца с учетом условия излучения Зоммерфельда на бесконечности.

Обычно численные методы применяются для решения задач в ограниченных областях. Поэтому для вычисления отраженного звукового поля нужно свести задачу в неограниченной области к эквивалентной задаче в ограниченной области. Для этого вводится "искусственная" граница, на которой задается нелокальное граничное условие, точно моделирующее условие излучения Зоммерфельда. Подробности можно прочитать здесь.
Далее исходная задача сводится к вариационной формулировке. А затем применяется метод конечных элементов.
В ИПМ ДВО РАН для решения задач методом конечных элементов обычно используется пакет FreeFem++. Но этот пакет в его текущей версии, возможно, нельзя применить для решения данной задачи, поскольку в данной задаче довольно сложная вариационная формулировка, которую не получается записать на языке программирования, встроенного в пакет FreeFem++ (см. подробности здесь).
Я не нашел другого подходящего пакета для решения этой задачи. Пакеты-интерпретаторы типа FreeFem++, как правило, обладают достаточно ограниченным синтаксисом языка программирования. Есть пакеты - библиотеки, - написанные на каком-либо языке программирования, например, C++, Python, Matlab, Fortran (обзор пакетов здесь). Но опять же не все пакеты подходят для решения данной задачи, да и разобраться с такими пакетами бывает очень непросто, у некоторых пакетов не очень удачная документация.
Как вариант - реализовать метод конечных элементов самостоятельно. Однако при реализации метода конечных элементов можно использовать какие-то библиотеки для решения отдельных подзадач.
Триангуляцию области можно сделать в пакете FreeFem++: этот пакет может выдать файл, содержащий триангуляцию в определенном формате, этот файл можно прочитать в другой программе.
Для решения системы линейных алгебраических уравнений можно использовать библиотеку SuperLU. Кстати, сам FreeFem++ использует по умолчанию решатель UMFPACK, который похож на SuperLU. Можно использовать и UMFPACK, но, по-моему, его сложнее установить на компьютер, чем SuperLU. В упомянутых решателях используются прямые методы решения СЛАУ, основанные на нахождении LU-разложения разреженной (sparse) матрицы.
При использовании точного, нелокального граничного условия требуется вычислять функции Ханкеля. Для вычисления специальных функций, в т.ч. функций Ханкеля, в C++ можно использовать библиотеку BOOST.
BOOST - это довольно распространенная библиотека. Однако мною была найдена ошибка в функции, вычисляющей функцию Ханкеля. После обращения к разработчикам они исправили эту ошибку (см. ticket).
Помимо точных, нелокальных граничных условий есть приближенные, локальные граничные условия. При использовании этих граничных условий может ухудшиться точность вычислений, зато в этом случае, возможно, задачу можно решить и в пакете FreeFem++.

Комментарии