Как стать автором
Обновить

Комментарии 31

А вы сравнивали, какое ускорение дает MPI версия? Я не вчитывался в код, но кажется что объем обменов и вычислений одного порядка, не понятно, почему вы пишете что задача CPU bound. Использование Scatter / Gather в вашем случае скорее всего убивает всю производительность.

Пример для 3D не удачный - ППП не применяют для 3D, так как она теряет свойство безусловной устойчивости.

Уравнение теплопроводности с переменным коэффициентом записывается как

u_t = \mathrm{div}\, (\lambda \nabla u)

В вашем случае нарушается условие непрерывности теплового потока через поверхность где коэффициент теплопроводности меняется. Но численный метод у вас как раз для правильной формы записан.

Да, в данном случае ускорение бы дало использование SIMD.
Видимо, использование MPI было просто требованием к курсовой.

На самом деле и прогонку можно распараллелить с помощью MPI. Просто это делается не тривиально.

Есть же PETSC.

А еще OpenFoam, Ansys, Fluent, Comsol, etc.

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

И все равно делая Scatter / Gather на нулевой процесс каждый шаг, хорошего распараллеливания не получить

То же самое можно написать интегральным тождеством. Построить ортогональную сетку, каждый четырехугольник согласованно с остальными разбить на два треугольника (с сохранением конформности), применить МКЭ на полилинейном базисе и получить то же самое.

Отмечу еще, что в реальности нет никакой константы теплопроводности для материала, да и плотности, впрочем. Они зависят от температуры и, еще более существенно, - от агрегатного состояния вещества. Но это неважно в данном контексте ,)

Недавно хотел применить уравнение теплопроводности для объяснения факта, который заметил в процессе приготовления оладьев (посмотрел, что нужно писать «оладий», но в такой форме слово меня раздражает) специального вида. Речь об оладьях с яблоками, которые получаются, когда целое яблочное кольцо (цилиндр с дыркой) окунается в тесто и поджаривается
Оладьи с яблоками, исходные материалы
image

Обнаружилось, что у таких оладьев серединка пропекается недостаточно, тесто там остается сырым
Оладьи с яблоками, непропеченная серединка
image

Хотелось свести объяснение к решению краевой задачи для обыкновенного дифференциального уравнения, но не получилось, а более сложные методы использовать было лень. Понятно, что решать нужно в цилиндрических координатах и что решения — это функции Бесселя. Понятно также, что теплопроводность у яблока и теста разная, хотя, возможно, даже без яблока серединка пропекается хуже, чем края

я думаю что это не только теплопроводность и теплоемкость, но и наличие избытка воды в яблоке. Вы не пробовали резать их на тонкие кольца, подсушивать, а потом печь оладьи из сушеных колец ?

Не пробовал, этот вид оладьев и так достаточно трудоёмкий в изготовлении. Тем не менее, оставлять тесто сырым тоже не хочется, поэтому приходится проковыривать дырочку в уже прожаренной стороне, немного выжимать сырое тесто, а затем снова переворачивать на уже прожаренную сторону, получается что-то вроде «заплатки» в центре

у меня мама делает оладьи с яблоками - но она режет их на тонкие (почти прозрачные) дольки и перемешивает с тестом. тесто запекается отлично.

Или вам важно, чтобы они были именно такой формы ?

Я не очень большой специалист по именно оладьям. Естественно, есть несколько разных вариантов приготовления оладьев с яблоками. Можно, например, яблоко просто потереть на терке и добавить в тесто, но так можно и не догадаться, что в оладьях есть яблоки (проводил эксперимент и опрос среди родственников). Рецепт с дисками мне нравится тем, что в нём яблоко чувствуется явно и при этом не раскисает.

Кажется, что единственный вариант, при котором уравнение теплопроводности может объяснить эффект - это если температуропроводность яблок сильно выше температуропроводности теста. Тогда яблоко "втягивает" в себя линии тока тепла, прямо как ферромагнетик втягивает в себя линии напряженности магнитного поля.

Другая гипотеза - что яблоко представляет собой по большей части воду, из-за чего нагреть его выше 100С становится проблематично вплоть до состояния, когда большая часть воды испарится / свяжется с чем-то. А тесту такой температуры недостаточно для застывания, вот тесто вблизи яблок не пропекается.

Но возможно тут существенен еще переход теста из жидкого состояния в твердое с изменением физических характеристик, тогда это уже ближе к задаче Стефана.

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

А в тесте нет воды?

есть, но ИМХО - значительно меньше чем в свежем яблоке

Осталось дело за малом и conjugate heat transfer можно будет решать. ;)

Сетка ортогональная? График сходимости не строили?

Сетка ортогональная. График сходимости не строил

Вопрос, Вам нужно было задачу решить или написать что-то типа курсовой работы, диплома, etc.?

Что-то типа курсовой работы

А метод решения был задан?

Метод продольно-поперечной прогонки с неявной схемой

Данная задача не CPU-bound, а memory-bandwidth bound. И, частично, эта проблема может решаеться путем использования MPI и работе на нескольких кластерах. Однако, это не делает ее CPU-bound. Больший эффект при меньших ресурсах даст увеличение локальности данных и оптимизация порядка доступа в кэш\память.

Однако, если задачей было, распараллеливая через MPI, написать код для теплопроводности - отл.

В этой схеме расщепления по-хорошему, надо еще поитерировать на одном временном слое. Вообще, в докладах Нижегородского университета одно время часто возникала их метод распараллеливания прогонки (в том числе для блочно-диагональных матриц). Нашел ссылку на методичку. Стр. 13 http://www.unn.ru/pages/e-library/methodmaterial/files/9.pdf

К.Р.Ф., отличная методичка, вовремя, как раз хотел что-то такое поискать, спасибо!

for (int i = 0; i < length; ++i) {
    A[i] = - avg(lambda[i + 1], lambda[i]) / 2 * coefficient;
    B[i] = - avg(lambda[i + 1], lambda[i + 2]) / 2 * coefficient;
    C[i] = 1 / timeStep - A[i] - B[i];
}


Похоже у вас тут выход за пределы массива для двух последних i.

Это размажется по всей сетке, если NaN-ов не встретится ,)

Но ведь так можно испортить «чужие» данные. Можно ли быть уверенным в конечном результате?
Да и не все языки относятся выходу за пределы массива так же халатно, как C++.

Там же чтение "вылезает", так что испортить вряд ли получится. Я вовсе не говорю, что это не ошибка! Я к тому, что найти эту ошибку просто по результатам вычислений может быть сложно в этой конкретной задаче.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации