Дисциплина Computational fluid dynamics(CFD) или, на русском языке, Вычислительная гидродинамика изучает поведение различных потоков, в том числе вихревых. Это и моделирование цунами, и лавовых потоков, и выбрасываемых из жерла вулкана камней вместе с лавой и газами и многое другое. Посмотрим, как можно использовать совместно MantaFlow и ParaView, реализовав на встроенном в MantaFlow языке Python необходимые функции конвертации данных. Как обычно, исходный код смотрите в моем GitHub репозитории: MantaFlow-ParaView.
Визуализация шлейфа извержения вулкана. Мы уже видели эту картинку в серии статей про визуализацию в ParaView Как визуализировать и анимировать (геофизические) модели, обсуждали создание геологических моделей в статье Методы компьютерного зрения для решения обратной задачи геофизики, а теперь поговорим и о моделировании дыма.
Введение
Для визуализационного моделирования зачастую используются упрощенные методы, пренебрегающие трением, в то время как для физического моделирования необходимо моделирование уравнений Навье-Стокса, учитывающих трение. Конечно, результаты физического моделирования могут быть использованы и просто для визуализации, хотя их получение более ресурсоемкое. В то же время, многие физические процессы не могут моделироваться без учета трения, к примеру, пирокластический поток. К счастью, за последние несколько лет физическое моделирование потоков стало доступнее, в том числе, за счет методов машинного обучения — стало возможным точную модель низкой детализации дополнительно детализировать с помощью соответствующих методов (на мой взгляд, благодаря самоподобию процессов на разных масштабах, это вообще одно из самых удачных применений техник машинного обучения). Теперь и в открытой программе трехмерной графики Blender используется именно физическое моделирование на основе открытого фреймфорка MantaFlow.
Как и в случае с методами спутниковой интерферометрии, см. предыдущую статью Геология XXI века как наука данных о Земле, методы моделирования потоков позволяют узнать многое о происходивших процессах — именно узнать, а не предположить. Действительно, моделируя лавовые потоки на палеорельефе (построенным, к примеру, путем решения обратной задачи геофизики), мы можем сравнить полученную модель с реально существующими [застывшими] лавовыми потоками и полями, поскольку они достаточно прочные и могут хорошо сохраняться многие и многие миллионы лет. Построенная модель позволяет изучить залегание различных слоев там, где у нас нет геологической информации, — зачастую, один и то же вулкан извергался многократно из разных жерл, при этом потоки лавы разных извержений [и разного состава] могут перекрываться. Кроме того, эта же модель покажет неувязки между используемой моделью палеорельефа и существующими лавовыми проявлениями — и позволит внести уточнения. То есть, вместо сложно формализуемой геологической интуиции, мы можем работать с моделью — в том числе, изменять параметры и оценивать, насколько разные геологические предположения вообще разумны. Поскольку я сам не геолог, а физик, для меня путь моделирования представляет вполне понятный интерес. В результате, геолог может точнее оценить возможные области залегания полезных ископаемых и их потенциал — разумеется, в геологическом исследовании вовсе не ставится задача обойтись без геолога, но, как и везде, ценность результатов согласуется с известным принципом информатики: "Мусор на входе — мусор на выходе", поэтому каждая возможность уточнить, заверить и дополнить имеющиеся данные в буквальном смысле на вес золота (или нефти, или воды,...).
MantaFlow
Как уже сказано выше, MantaFlow это хорошо известный и поддерживаемый программный пакет, а также, на его основе есть несколько интересных производных проектов: с большим акцентом на использование машинного обучения PhiFlow, с возможностью вычисления параметров процесса по набору снимков reconstructScalarFlows и другие.
MantaFlow позволяет моделировать ламинарные и турбулентные потоки, в том числе, пламя и клубы дыма и потоки воды и многое другое. Для примера я построил несколько моделей, чтобы оценить качество моделирования. Например, эта модель потока воды выглядит отлично и даже видны формирование и разрыв воздушных пузырей в потоке:
А это модель заполнения потоком воды заданного рельефа:
В репозитории вы найдете еще скрипт для модели пирокластического потока, с визуализированной в псевдоцветах плотностью выброса вулканического вещества (еще обычно нужны давление и скорости частиц, они в примере также вычисляются, но, для простоты, не сохраняются в скрипте — это можно добавить буквально в пару строк кода по аналогии с сохранением данных плотности).
Добавим рельеф в MantaFlow
Для меня самый удобный вариант это использование ParaView с моим расширением N-Cube ParaView plugin for 3D/4D GIS Data Visualization для построения 3D модели рельефа в ParaView на основе NetCDF или GeoTIFF данных и сохранение нужного участка в формате OBJ для его использования в MantaFlow. Поскольку MantaFlow умеет этот формат загружать и работать с ним в безразмерных координатах, нам потребуется лишь указать нужный размер в безразмерных координатах (скажем, 100% по горизонтальным координатам и 25% по вертикальной — чтобы было достаточно места для моделирования столба дыма) и сохранить параметры преобразования для экспорта результатов в физических координатах. Вот скрипт репозитория с реализацией соответствующей функции: mesh2manta.py
Сохраним результаты моделирования в MantaFlow для ParaView
Поскольку мы задаем исходное пространство моделирования в физических координатах (файл OBJ и коэффициенты его масштабирования), у нас есть все необходимое, чтобы и результаты сохранить в физических координатах. По умолчанию, MantaFlow сохраняет безразмерные результаты в формате сжатых массивов Numpy, поэтому мы добавим сохранение в формат с поддержкой физических координат (VTK), см. скрипт репозитория npz2vtk.py. Добавлю, что в скрипте создается массив xarray: N-D labeled arrays and datasets in Python, из которого одной командой можно сохранить данные в формате NetCDF и некоторых других.
Визуализация в ParaView
Как мы уже рассмотрели в предыдущих статьях (с примерами), ParaView поддерживает работу с сериями данных, так что мы можем работать с 4D данными — например, в виде 3D анимации. Вот пример анимации вулканического дыма из серии файлов VTK, экспортированных из MantaFlow:
Модели высокой детализации
Увеличение детальности моделей требует и больше ресурсов для их построения. Если модели на сетке 64х64х64 вычисляются за несколько минут на ноутбуке, то при удвоении разрешения по каждой координате время увеличивается в 8 раз (третья степень двойки).
Ниже показана намного более детальная модель на примере турбулентного торнадо с сайта проекта MantaFlow:
Мне эта модель показалась интересной и я попытался найти, как она построена. Не нашел и обратился к авторам, но они не смогли ответить на вопрос, сообщили лишь, что вычисления требуют мощностей компьютерного кластера. Вероятно, построение модели можно значительно ускорить с помощью библиотеки машинного обучения TensorFlow, поддержка которой встроена в MantaFlow (в официальном репозитории есть примеры).
Заключение
Хотя именно о построении моделей мне и хотелось написать ранее, но пришлось начинать с серии статей про визуализацию данных и потом постепенно переходить уже непосредственно к моделированию. В самом деле, если не рассказать заранее, как хотя бы посмотреть результаты, получится не интересно. Хотя и можно использовать MantaFlow в Blender, но с последним я сам не работаю и не уверен, многие ли из читателей с ним достаточно знакомы. Так что пусть будет как есть — знакомство с ParaView ранее и рассказ про MantaFlow и ParaView, а те читатели, кому этого захочется — смогут попробовать MantaFlow и Blender.
Спасибо всем за внимание, думаю, на этом пока все с геофизическим моделированием, поскольку далее потребовалось бы переходить к более сложным вещам (например, растровому роутингу, о котором я уже ранее упоминал при обработке данных спутниковой интерферометрии — а еще это вероятностный подход к моделированию потоков и многое другое), и останется у меня, в лучшем случае, четверть читателя — голова какого-нибудь любителя поспать на клавиатуре. Если вам интересно — смотрите мои репозитории на GitHub и публикации на LinkedIn и подсказывайте, о чем, на ваш взгляд, стоит рассказывать.
Javian
off С недавнего интересуюсь вопросом моделированием воздушных потоков в городе. Оказалось, что эти потоки большая проблема для мультикоптеров в проектах курьерской доставки — есть места, где дрон не может преодолеть ветер между зданиями.
N-Cube Автор
Спасибо за пример, интересно. Видимо, у вас сложность с размером модели? Если задать размер типового здания один пиксел на несколько в горизонтальном сечении, результат хоть как-то приближен к реальности? Тут вариант с tensorflow для улучшения детальности выглядит как раз подходящим.
Javian
Да, размер модели — для меня проблема. Чисто личный интерес проверить моделированием утверждение, что на больших плоских мысах, бриз создает кумулятивную струю.
N-Cube Автор
Посмотрите примеры MantaFlow, они по умолчанию на сетке 64х64х64, у вас можно попробовать по вертикали снизить разрешение и увеличить по горизонтали, к примеру, для задания сетки 128х128х16:
Будет считаться быстро и, думаю, хватит для проверки гипотезы.
Andy_U
А что на счет проверки сеточной сходимости?
N-Cube Автор
Да как всегда — считаете то же самое на двойном и половинном масштабе и оцениваете сходимость. То есть будет ли результат при увеличении детализации постепенно уточняться (сходиться) или получится нечто совсем другое. Это же не проверка корректности, тут чисто технически все просто оценить.
splav_asv
Увы, может получиться что в некотором диапазоне будет наблюдаться сходимость, а потом перестанет. Лучше попробовать оценить сразу характерные толщины слоёв и масштабы вихрей. Уж больно грубые сетки…
N-Cube Автор
Так и возьмите потом сетку поболее, если сходимость есть и результат физически адекватный. Сетки 256х256х64 и 50-100 шагов по времени за несколько часов на ноутбуке 2014 года считаются, а если убедились, что параметры модели годные — на Amazon AWS EC2 или где вам удобно считаете уже на нужной сетке. Просто не стоит начинать сразу с долгих вычислений, пока вы не уверены в том, что у вас вообще получится.
Kpa6e
Проблема не только для коптеров — часто, отраженные от массивных фасадов потоки, имеют у основания скорости значительно превышающие значения комфортности для пешеходных зон. У нас в стране это никак не регламентируется. Помню только модель москва-сити изготавливали физическую для обдувки, но больше для правильного учета влияния потоков между сооружениями друг на друга. Знаю еще в ansys собирают такие модели.
N-Cube Автор
Интересно, не хотите для MantaFlow такую модель сделать, если разбираетесь в предметной области? Там много примеров есть, возможно, и для данной задачи найдется подходящий, чтобы с нуля не разбираться.
Kpa6e
Образование строительное, в гидро/газодинамике я — ноль, к сожалению.
grudnichek
классная статья, спасибо автору
Genofox
интересно получилось, успехов автору
DimaTheGreat
Автор, расскажете в следующий раз про Blender.
Paraview я знаю, в связкe с OpenFoam =)
P.S: Спасибо за статью.
N-Cube Автор
Так про Blender я, кроме названия, и не знаю ничего:)