Самый простой способ симулировать базовую диффузию по трехмерной матрице?

В настоящее время я пишу программу, которая будет симулировать в самых общих чертах диффузию и давление газа в трехмерном объеме с границами по всему — вспомним, например, пещеру муравьев.
Эффекты, которые я хочу достичь:
1. Газ рассеивается во всей окружающей среде с течением времени, уважая стены.
2. Я хотел бы измерить давление или сжатие газа в каждой точке сетки. Эффект этого должен состоять в том, что, если комната открыта, газ будет диффундировать из отверстия со скоростью, которая отражает перепад давления.

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

Я напишу эту программу на OpenCL, но с радостью приму любой пример кода, будь то C или псевдокод.

Я думаю, что я должен передать 3 трехмерных массива — один для газа, один, который определяет стены (например, 1 в xyz = wall), и один для хранения давления.
В настоящее время я предполагаю, что проверить стену достаточно просто. Один просто проверяет каждую соседнюю ячейку и учитывает ячейку, если это не стена:

For each grid point,
is wallmatrix[x+1] a wall?
[diffusion math here]
is wallmatrix[x-1] a wall?
[diffusion math here]
is wallmatrix[y+1] a wall?
[diffusion math here]
etc...

Но я просто не уверен, что делать с диффузионной математикой, и как бы я включил давление во все это?

0

Решение

Диффузия — одна из самых простых вещей для симуляции, потому что она сглаживает себя.

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

Есть и другие способы, например, вы можете сделать подход, основанный на сетке, где изменить количество частиц в каждом месте сетки.

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

2

Другие решения

Ну, это не простая задача!

Прежде всего: вы хотите смоделировать базовую диффузию ИЛИ полное движение газа? Второй случай совсем не прост, но вы можете понять Вот.

Если вы просто хотите распространить газ в статической среде, все проще, но вы не можете измерить
общее давление, ваша единственная переменная будет локальной концентрацией газа.

Это явление регулируется Фик законы; второй, вероятно, то, что вы ищете.

Читать для конечная разница методы, чтобы понять, как дискретизировать уравнение диффузии.
Тема довольно большая, чтобы написать полный ответ здесь.

1

По вопросам рекламы [email protected]