Debugger's Process
132 subscribers
130 photos
78 videos
3 files
70 links
Download Telegram
Channel created
Channel photo updated
This media is not supported in your browser
VIEW IN TELEGRAM
Симуляция 30 000 частиц в потенциале Леннарда-Джонса.
На левую половину действует внешняя сила, направленная вниз, справа - направленная вверх.
This media is not supported in your browser
VIEW IN TELEGRAM
Допилил другой вариант рендера и управление с клавиатуры. Внезапно оказалось очень залипательно разгоняться и врезаться. Цвет частицы зависит от ее скорости.
This media is not supported in your browser
VIEW IN TELEGRAM
Как такового размера у частиц в этой модели нет.
Вместо этого есть пара параметров потенциала. Первый - позиция потенциальной ямы, по сути - расстояние между центрами частиц, на котором им энергетически максимально выгодно находиться.
Все частицы в этой симуляции изначально расположены на расстоянии 1.0 друг от друга. Там, где этот параметр меньше единицы (верхняя ячейка, r=0.7), частицы слабо притягиваются друг к другу до тех пор, пока не расположатся на расстоянии, задаваемым этим параметром, собираясь в более плотную субстанцию. С продвижением по ячейкам сверху вниз и слева направо, r увеличивается до значения 2.0 (нижняя правая ячейка). В тех ячейках, где r > 1.0 частицы обладают положительной потенциальной энергией, отчего и разлетаются. Потенциальной энергии частиц в нижних ячейках хватает на то, чтобы чтобы часть вещества испарилась, разорвав связи частиц с соседями.
This media is not supported in your browser
VIEW IN TELEGRAM
Второй параметр задает глубину потенциальной ямы - то, насколько крепко частицы оказываются связаны друг с другом, когда расположены на максимально энергетически выгодном расстоянии r.
Сверху вниз, слева направо увеличиваем этот параметр, зафиксировав r=1 и получаем пару ячеек с газом, который моментально конденсировался в жидкость, потому что был очень холодным (частицы изначально были в потенциальных ямах), несколько ячеек, в которых присутствует и жидкость и ее пары. В последней ячейке жидкость начала застывать, потенциальной энергии гравитации не хватает на то, чтобы ее растопить.
This media is not supported in your browser
VIEW IN TELEGRAM
Этим такие симуляции и притягательны - простая модель покрывает широкий спектр явлений
This media is not supported in your browser
VIEW IN TELEGRAM
В смысле, этим же кодом можно промоделить испарение и конденсацию, например. Как вот тут. Сначала греем установку виртуальным термостатом, пока леннард-джонзиум не начнет испаряться, потом справа начинаем охлаждать. И он конденсируется)
This media is not supported in your browser
VIEW IN TELEGRAM
Забыл поменять параметры после вчерашних экспериментов перед тем, как запустил интерактивный сим. Удивился, когда группа частиц захватила меня и не отпускала, пока не поднял температуру всей симуляции)
This media is not supported in your browser
VIEW IN TELEGRAM
А что-то в этом есть. Довольно прикольно собирать эти "капли" и пытаться разогнать. Или самому разгоняться и врезаться в них. Приходится следить за температурой в симуляции, при слишком низкой не разогнать "каплю", при слишком высокой она испаряется - частицы легко преодолевают притяжение и разлетаются, не поспевая за мной.
This media is not supported in your browser
VIEW IN TELEGRAM
Начал реализовывать динамический размер шага интегрирования.
С динамическим шагом можно разгоняться до больших скоростей и красиво врезаться.
This media is not supported in your browser
VIEW IN TELEGRAM
В принципе, разгоняться до больших скоростей и врезаться можно и со статическим шагом. Но если он подобран неправильно, то частицы туннелируют друг через друга. Но самое печальное, что в процессе туннелирования они разгоняются, так что достаточно одной частице набрать скорость выше критической и врезаться в другую, чтобы появилось уже две частицы с такими скоростями. Начинается цепная реакция.
Вообще, это очень занятно: у нас есть состояние системы в момент времени t0, нужно получить состояние в момент t1, потому что в момент t1 мы делаем всякие полезные вещи - рисуем частицы, определяем пользовательское воздействие, вот это всё.
При этом интегрируем диффуры движения мы, понятное дело, численно, по алгоритму Вереле (Verelet) - по сути просто говорим "ок, мы будем считать, что во время шага интегрирования все тела движутся равноускорено, сила действующая на них не меняется". Разумеется, это не так - потенциал непрерывный, так еще и зависит от 12 (!) степени расстояния между частицами - даже смещение на очень маленькое расстояние в таком поле полностью меняет действующие на частицу силы.

В итоге приходим к задачке оптимизации - разбить интервал t0-t1 на N кусов, в течение каждого из которых будем считать все силы постоянными, но при этом нужно минимизировать N одновременно с отклонением полной энергии системы от начального состояния - т.о. мы ищем решение с минимальным количеством итераций и с минимальным же колебанием полной энергии, которая должна быть постоянной (потому что симулируемая система замкнутая).

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