Задача с виду простая - смоделировать колебание струны и волны на струне. рассматриваются струны двух видов - непрерывная и дискретная.
Непрерывная струна
Это обычная струна в нашем представлении. Некоторая тонкая нить, жестко закреплённая на концах. Колебания описываются волновым уравнением. В условиях задачи решение его получается методом Фурье. Краевые условия подобраны так: это две прямые, которые "скругляются параболой", а начальная скорость всех точек считает равным нулю.
С этим видимо колебаний почти не возникло проблем: получается решение в виде ряда, коэффициенты которого просто высчитываются (параллельный подсчёт коэффициентов Фурье я описывал раньше).
Дискретная струна
Это тонкая невесомая нить, на которой закреплены грузы равной массы. через равное расстояние. Начальное положение высчитывается так же, однако, чтобы хоть как-то облегчить задачу, "потянуть" струну можно только за груз.
Колебание такой струны описывается системой из k уравнений следующего вида:
N - сила натяжения нити, m - масса груза, Δl - расстояние между грузами, а un - искомые функции.
Метод Эйлера решить эту систему не сильно помог.
Расспараллеленный на OpenMP, метод Рунге-Кутт, при нужной погрешности очень тормозил (тестирование проводилось при k=13, m =4кг, l =20м), однако, убрав параллельные области, я избавился от тормозов.
Сейчас обе модели работают, и дают верные(точнее, похожие на верные) результаты. Итог: использование параллельного программирование не всегда даёт прирост в скорости. Иногда на создание/уничтожение потоков(или пересылку сообщений) затрачивается больше времени, чем выигрывается на ускорение вычислений. Это тоже надо учитывать.
На очереди две соединённые непрерывные струны разной плотности. После проверки выложу примерный код(или сам код), реализующий описанные мой системы.
Комментариев нет:
Отправить комментарий