Войти
ПрограммированиеФорумФизика

Навье-стокс. Опять.

Страницы: 1 2 Следующая »
#0
5:47, 24 фев. 2018

Требуется решить уравнение динамики несжимаемой жидкости на регулярной прямоугольной сетке в 2д с нормальными граничными условиями. Есть каноничный пейпер от nvidia, в котором очень доступно изложена суть projection-based pressure-free solver'ов http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_ch38.html и его продолжение: https://www.cs.cmu.edu/~kmcrane/Projects/GPUFluid/paper.pdf. На основе этой штуки лет 10 назад я писал свой первый солвер https://gamedev.ru/code/forum/?id=77024, который недавно повторил на GPU:

сегодня, набравшись опыта, пишу новый солвер со следующими отличительными особенностями:
1) более корректные граничные условия
2) более точная адвекция для моделирования мелкой турбулентности

Пункт 1) теоретически решается staggered grid'ом, в котором граничные условия накладываются только на скорость, потому что именно граничные условия на скорость фигурируют в оригинальном уравнении навье-стокса, условия же на давление, которые используется в методах вроде gpugems — это их неявное следствие. Теоретически — потому что есть сложности. А именно, при использовании широкого конечно-разностного шаблона, нужно ставить граничные условия на всю его ширину. Пункт 2) очень интересно послушать от тех, кто в курсе, как это делается.

Я уверен, на сайте есть ребята, кто с моделированием течений имеет больше опыта, чем я, потому что тема на самом деле тема популярная и глубокая, но обошла меня стороной. Хотелось бы с ними поговорить.

#1
9:00, 24 фев. 2018

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

#2
10:56, 24 фев. 2018

Suslik
> Я уверен, на сайте есть ребята, кто с моделированием течений имеет больше
> опыта, чем я,

я уверен в обратном

#3
14:41, 24 фев. 2018

подписался.

#4
16:24, 24 фев. 2018

откопал кое-что интересное: https://www.duo.uio.no/bitstream/handle/10852/9752/Moastuen.pdf?sequence=1
в пейпере есть сразу две очень интересные идеи:
1) использовать gauss-seidel вместо jacobi при расчёте давления. мало того, что ему не нужен дополнительный буффер для хранения промежуточного давления, так ещё и сходится быстрее. на CPU элементарно реализуется, используя шахматный порядок обхода ячеек.
2) использовать vorticity confinement — немного хак для сохранения мелких турбулентностей.

реализовал обе штуки, сделал видос со сравнением без vorticity confinement и с ним:

к сожалению, метод — не самый физичный в мире и иногда создаёт лишние турбулентности где попало.

#5
20:38, 24 фев. 2018

Suslik
> 1) использовать gauss-seidel вместо jacobi при расчёте давления. мало того, что ему не нужен дополнительный буффер для хранения промежуточного давления, так ещё и сходится быстрее. на CPU элементарно реализуется, используя шахматный порядок обхода ячеек.
У тебя идеальные условия для использования мультигрида и нелокальные уравнения, типа того, что для давления, выигрывают от его использования больше всего.
По идее, ничего сложного с реализацией на GPU быть не должно, так что советую попробовать мультигрид.

#6
20:44, 24 фев. 2018

}:+()___ [Smile]
да, мультигрид в случае вроде предыдущего видоса очень круто затащит, но я его не реализую по двум причинам:
1) основная проблема в адвекции
2) на видосе — просто тестбед. в реальности я применяю солвер для очень хитрых граничных условий вроде сети тонких труб, где мультигрид выигрыша вообще не даст. по крайней мере мне так кажется.

но может всё-таки накатаю мультигрид, если не будет лень, там прогать-то на полчаса.

тем временем накатал более продвинутую адвекцию в духе "Back and Forth Error Compensation and Correction
" : https://www.cc.gatech.edu/~jarek/papers/Advect.pdf , результат офигенный. завтра сделаю видос.

#7
21:41, 24 фев. 2018

Suslik
Так про vorticity confinement и в нвидиевском пепере есть

#8
22:19, 24 фев. 2018

Suslik
> я применяю солвер для очень хитрых граничных условий вроде сети тонких труб, где мультигрид выигрыша вообще не даст. по крайней мере мне так кажется.
По идее, мультигрид рулит во всех случаях, где есть нелокальное влияние. Другое дело, что для сложных случаев надо будет специально считать коэффициенты.

> основная проблема в адвекции
Лично я, когда интересовался этой темой, вынес несколько мыслей:
1) задача переноса чего-либо во внешнем поле скоростей и задача самопереноса поля скорости — это, вообще говоря, принципиально разные задачи, причем вторая на порядок сложнее;
2) идеальных решений нет даже для первой задачи, везде приходится выбирать, чем пожертвовать;
3) неплохо работает метод построения схем на основе симметрий (законов сохранения).

#9
4:58, 25 фев. 2018

Андрей5000
> Так про vorticity confinement и в нвидиевском пепере есть
не говори, сам не понял, как я так затупланил и пропустил. энивей, vorticity confinement мне всё равно кажется хаком, потому что основан на нефизичных силах

}:+()___ [Smile]
очень много пейперов советуют использовать staggered grid, в котором давление задаётся в центре узлов, а скорости — на гранях. но при такой схеме у аппроксиации дивергенции скорости и градиента давления получается точность O(h), а не O(h^2), поэтому я никак не пойму, с чего резултат должен быть лучше. более того, у меня такая схема получается нестабильной при малом количестве итераций projection solver'а. ЧЯДНТ?

#10
5:23, 25 фев. 2018

Suslik
> давление задаётся в центре узлов, а скорости — на гранях.
В смысле, давление в центрах ячеек, а скорость — как поток через грани для 3D?
Я предпочитаю дуальный вариант: давление в узлах, скорость — в проекциях на ребра.
Но вроде везде хорошие центральные разности получаются, для равномерной сетки.

#11
6:53, 25 фев. 2018

}:+()___ [Smile]
> Я предпочитаю дуальный вариант: давление в узлах, скорость — в проекциях на
> ребра.
и такой я тоже делал, работает лучше, чем если задавать на гранях.

но почему-то все нахваливают именно задавание скорости на гранях, хотя у меня этот метод почему-то разваливается, если делать мало итераций projection solver'а. и, внимание, почему-то также разваливается, если делать нечётное количество итераций jacobi. wtf?

#12
7:42, 25 фев. 2018

написал несколько вариантов адвекции более высокого порядка:


обратите внимание на сопутствующие осцилляции, если не использовать ограничитель на 0:47

#13
19:29, 25 фев. 2018

Suslik
> но почему-то все нахваливают именно задавание скорости на гранях
В случае равномерной квадратной сетки эти варианты одинаковы, т. е. это ты где-то накосячил, либо со схемой, либо с граничным условием.

> обратите внимание на сопутствующие осцилляции, если не использовать ограничитель на 0:47
Эта чересстрочная рябь там кое-где есть и с ограничителем. Но даже если ее не видно, не факт, что схема не выдает полный бред.
Я бы посоветовал поуменьшать шаг по времени и размер сетки в разных комбинациях и сравнить с тем что есть.

#14
1:34, 26 фев. 2018

}:+()___ [Smile]
думаю о мультигриде. скорее всего я что-то не понимаю, но как мультигрид может помочь в случае со сложными границами? как при усреднении ячеек усреднять ячейки на границе? как интерполировать ячейки на границе при переходе к более мелкой сетке?

Страницы: 1 2 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.