Сам я на c++ только учусь программировать, но сегодня в голову мне пришла идея которую наверно кто то из вас захочет реализовать в виде демки.
массив 16*16*16
В элементах массива есть воздух, вода, твёрдая порода. То есть 3 вида элементов. Температурой можно пренебречь.
На верхние блоки действует обычное атмосферное давление, условно 1. В виду незначительности разниц давления воздуха, во всей открытой атмосфере оно предположим равное.
Каждый блок воды обладает 2 параметрами, давление и наполненность. наполненность это количество воды которое есть в блоке, если в блоке более 100% воды, то она вытесняется вверх образуя новый блок, но только при условии, что вверху воздух с меньшим давлением.
Каждый блок воздуха, обладает давлением и плотностью, давление напрямую вытекает из плотности, поэтому можно сказать что этот параметр фиктивный и нужный лишь для упрощения расчётов.
Алгоритм трассировки:
Верхние блоки воздуха получают давление.
Каждый открытый блок воды получает давление.
По ходу итерации вниз, каждый блок воды прибавляет n давления блоку который ниже. При итерации каждый блок, присваивает своё давление блокам которые находятся по сторонам, при условии что давление в них ниже, величина цикла присваивания 16*16.
Если давление воды выше давления воздуха в соседнем блоке, то блок воздуха вытесняться, его количество распределяется по соседним блокам. поровну.
Если давление воздуха выше, то воздух вытесняет воду, алгоритм ищет связанный блок воды (методом заливки) контактирующий с воздухом меньшего давления и присваивает вытесненную воду ему. Если алгоритм не находит связанного блока с меньшим давлением, то он присваивает всем связанным блокам флаг «изолированные» и в дальнейшем в пределах данного кванта времени воздух в считает их условно твёрдым телом и не пытается их вытеснить. При новом цикле флаги снимаются. Как вариант использовать не логическую переменную, а числовую с номером цикла.
Если в 2х соприкасающихся блоках воздуха разное количество воздуха, то оно приходит к среднему арифметическому. Таковым образом становиться возможным что то вроде ударной волны.