Pull to refresh

Comments 32

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

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

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

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

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

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

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

Вообще говоря, 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++.

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

\lambda^2

это коэффициент температуропроводности, а не теплопроводности.

Sign up to leave a comment.

Articles