LINUX.ORG.RU

[C++] а посоветуйте либу для решения 2D эллиптического уравнения

 


0

1

У-е вида \nabla( C(r) \nabla p ) = Q(r)

C(r), Q(r) заданы на равномерной прямоугольной сетке, p надо восстановить на той же сетке. Ситуация усугубляется тем, что гран условия стоят не только на границе области но и внутри ее (p задано в некоторых ячейках). Характерный размер области 10^4-10^5 ячеек (всего), коэффициенты могут гулять на неск порядков. Библиотека (имеется ввиду готовый алгоритм) должна допускать портирование под винду;-(

Производительность весьма критична.

Рекомендации по выбору алгоритма тоже приветствуются - предполагаю, что либы такой не найду, придется делать самому, а вникать в это дело не позволяет цейтнот-с;-(

В общем пожалуйста поделитесь опытом, кому не лень;-)

★★★★★

Ну или средствами всяких scilab'ов.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

ХЗ... я никогда толком с GSL не работал, потому и спрашиваю. Оно такое позволяет и портируемо?

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

И да, эллиптические уравнения никогда не решал (как то умудрялся увертываться, но тут приперло).

AIv ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

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

Скажем я хоть и не спец, но могу предположить что какая нить релаксация может довольно долго сходится. Хочется чего то интегрального... не долбить же в лоб получаемую сист линейных уравнений? 10^5 у-й сколько будет считаться?

В общем хочется уcлышать мнение человека, к-й такие задачи умеет решать;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

При том, что это конечно весьма разреженная матрица 10^5x10^5 (в каждой строке по 5 значений + св член), но плохо обусловленная...

AIv ★★★★★
() автор топика

можно дёргать из С++ функции Mathematica, которая работает под линуксом.

anonymous
()

В общем, ani2d это умеет. А также моя либа это умеет. Но писалось это всё для обсчета довольно нетривиальных вещей, поэтому тривиальные вещи делать будет сложно :) Для обоих библиотек тебе придется написать равномерный триангулятор, а в ani2d еще и потрахаться с фортраном и с внутренними структурами данных в которые сетку заливать :)

Reset ★★★★★
()

Кстати, можно же эту задачу, если особых точек нет, решить тупым интегрированием:

  1. решаем систему M(r) = \int_{x_0}[y_0]^{x_1}[y_1]Q(r)\,dx[dy]
  2. находим p = \int_{x_0}[y_0]^{x_1}[y_1] 1/M(r)\,dx[dy]

Где-то так.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Reset

Тьфу ты, ступил. А ведь и правда, если скобки раскрыть, получим

C\delta p + \nabla C \nabla p = Q
Правда, не совсем классический Пуассон (неоднородность есть).

Но все равно численно его решить проще.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ага, но в частном случае может быть const :)

Reset ★★★★★
()
Ответ на: комментарий от Reset

> В общем, ani2d это умеет.

Будем посмотреть.

А также моя либа это умеет.

Э... нет, я фортран не люблю, хитрые сетки там не задались вообще, и под винту же еще портировать...

А алгоритм порекомендовать можете?

AIv ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

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

AIv ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Да, называется «метод расщепления». Работает только если область прямоугольная и если вырезы из него тоже прямоугольные. Но он несколько геморройный, надо разбивать область на подобласти и на каждой интегрировать отдельно. Для квадрата из которого вырезали квадрат будет 4 области. То есть код будет портянкой из 4х case'ов.

МКЭ как-то универсальней будет. Да и код короче и красивее.

Reset ★★★★★
()
Ответ на: комментарий от AIv

Так в этом случае хитрость - в подборе нормального метода триангуляции.

Лучше, все-таки, взять готовую мат. библиотеку (или вообще использовать какой-нибудь scilab), чем самому придумывать.

// Я, например, уже неделю «велосипежу» методику поиска изолиний - почти «свелосипедил» уже... (правда, я - не программист, и много времени на всякую элементарщину трачу)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> // Я, например, уже неделю «велосипежу» методику поиска изолиний - почти «свелосипедил» уже... (правда, я - не программист, и много времени на всякую элементарщину трачу)

Дык я ж c Вашей подачи его написал, правда на С++ - переложите на С и все дела?

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Я эту страшную портянку как открыл, так и закрыл...

Ну не понимаю я С++... Да и моя уже почти работает (почти - т.к. я пока не довел до ума интерполяцию и не провел нормальных тестов - мало ли, может, где-нибудь «затык» будет).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от AIv

Э... нет, я фортран не люблю

Фортран это ani2d. А у меня либа на жесточайшем C++ с шаблонами и прочими ужасами.

хитрые сетки там не задались вообще

Вот тут я строю равномерную сетку на прямоугольнике. Самым самым тупым generic-алгоритмом.

1. Строим прямоугольник=2 треугольника (функция build_rectangle)

2. Итерируем каждый треугольник (разбиваем на 4 треугольника, функция iterate_mesh)

3. Из получившегося «месива» выделяем граничные точки (make_boundary)

4. Опционально пересортируем, чтобы матрица красивая получалась, а не хаотическая.

В результате получается обычная равномерная сетка на прямоугольнике. Зачем так делал? Чтобы этот же самый метод применять в более сложных ситуациях.

Очевидно, чтобы построить сетку на прямоугольнике с вырезами надо самому построить «грубое» приближение к сетке, а потом проитерировать также как сделал я.

А алгоритм порекомендовать можете?

МКЭ. Ну если нужен совсем совсем классический алгоритм, то «метод расщепления». В книгах Самарского должен он быть описан.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Ок, спасибо большое!

AIv ★★★★★
() автор топика
Ответ на: комментарий от Reset

Вы, кстати, собственные методы триангуляции используете, или какие-нибудь библиотеки?

// я просто тоже этим делом озабочен, т.к. очередным этапом у меня будет добавление в мой велосипед триангуляции и аппроксимации В-сплайнами.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Собственные. Алгоритм я описал. Вообще это универсальный алгоритм, который позволяет триангулировать любые поверхности.

Reset ★★★★★
()

openfoam

Есть хорошее, но тяжелое решение — openfoam. Хорошая лицензия, богатые возможности, инфроструктура но не за пять минут осваивается.

Под windows* ожидаются проблемы.

pru

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.