Заголовок сообщения: Точечная модель газов и жидкостей
Добавлено: 06 дек 2022, 23:36
Одарённый
Зарегистрирован: 25 окт 2022, 19:47 Сообщений: 113 Cпасибо сказано: 2 Спасибо получено: 5 раз в 5 сообщениях Очков репутации: 5
Представляю вашему вниманию базовый алгоритм моделирования газов и жидкостей, состоящих от молекул-точек. Хотелось бы ознакомиться с вашими замечаниями, возможно допущены ошибки или существуют лучшие алгоритмы. Программа не проверялась в действии, буду рад, если кто-то протестирует и расскажет о результатах.
Далее выложена заготовка для простейших программ моделирования газов и жидкостей на основе движения отдельных молекул-точек. Написано на языке С без использования характерных для С++ объектных особенностей. Не рассматриваются вопросы ввода-вывода информации, в том числе изображения точек на экране, представлено лишь основное ядро вычислений. При необходимости возможна дополнительная коррекция облака молекул: изменить кинетическую энергию системы (изначально не нулевую) можно путём умножения всех скоростей точек на квадратный корень из соотношения желаемой энергии и фактической. Для обнуления суммарного импульса по какой-то координате необходимо от соответствующих скоростей каждой молекулы отнять сумму импульсов по данной координате делённую на сумму масс (кинетическая энергия или температура при этом тоже изменится). Более-менее локально точное сохранение энергии с учётом потенциальной при дискретном моделировании практически невозможно. При высоких требованиях к постоянству температуры и импульса системы поправки приходится вводить с каждым шагом времени.
Константа molecules определяет количество молекул в массиве. Массив или список пригоден для небольшого количества молекул. При увеличении числа точек требуется дерево с эффективным "отсечением" явно далёких участков, не участвующих во взаимодействиях с текущей точкой. Или карта с отдельным списком для каждой области и поиском близких точек только в своём или соседних регионах. Перестройка дерева или карты занимает определённое время, но в итоге программа выполняется быстрее, чем при расчёте взаимодействия всех молекул со всеми.
Структура molecule содержит координаты и скорости точек в трёх измерениях. Также массу, которая может различаться (например, смесь азота с кислородом). Если используются не условные "игровые" или "экранные" единицы, лучше использовать атомные вместо единиц системы СИ, избегая слишком больших или малых по модулю величин в арифметических операциях. Для физического моделирования подходят как минимум 64-битные числа с плавающей точкой, точности 32-битных недостаточно. Следует учитывать, что 64 бита (double) обрабатываются процессором как единое целое, что значительно быстрее, чем при использовании составных чисел повышенной точности.
Глобальные данные:
xmin,xmax,ymin,ymax,zmin,zmax определяют минимальные и максимальные пределы "ёмкости", в которой происходят перемещения молекул. Если пределы должны отсутствовать, следует задать эти величины очень малыми (для минимальных пределов) и очень большими (для максимальных пределов) по отношению к центру происходящих событий.
Шаг времени dt должен быть >= 0, программа не рассчитана на обратный ход времени.
Величина mindist обозначает условно "очень малое" расстояние, при расчётах взаимодействий на расстояниях меньших или равных которому могут возникать большие численные ошибки при вычислениях или деление на ноль. Не следует делать эту величину слишком малой, так как сравниваемые с ней расстояния могут ещё возводиться в квадрат или куб, приводя к появлению нулевых или недопустимо малых чисел при вычислениях.
При сближении точек на расстояние colldist или меньшее осуществляется расчёт отталкивания между молекулами. Если colldist > 0, используется схема упругих столкновений, реалистичная при моделировании газов. Если colldist <= 0, используется схема потенциальных энергий и сил на основе симметричных кубических сплайнов, применимая к жидкостям. Формулы для расчётов следующие: epot = потенциальная энергия, fpot = сила, обе величины положительные для отталкивания, отрицательные для притяжения. fpot = - производная от epot по расстоянию, расстояние s варьирует от 0 до максимального smax, используется симметричный кубический сплайн со свойствами: epot(0) = epot0, epot(smax) = 0, fpot(0) = 0, fpot(smax) = 0 epot = epot0 + e2 * s^2 + e3 * s^3 fpot = 2 * e2 * s + 3 * e3 * s^2 epot0 + e2 * smax^2 + e3 * smax^3 = 0 2 * e2 * smax + 3 * e3 * smax^2 = 0 e2 = - 3 * epot0 / smax^2 e3 = 2 * epot0 / smax^3 epot = epot0 * (1 - 3 / smax^2 * s^2 + 2 / smax^3 * s^3) fpot = epot0 * (6 / smax^2 * s - 6 / smax^3 * s^2) Величина repepot0 >= 0 обозначает потенциальную энергию отталкивания молекул при нулевом расстоянии. Величина attrepot0 <= 0 обозначает потенциальную энергию притяжения двух молекул при нулевом расстоянии. Величина repdist обозначает smax для отталкивания, attrdist аналог для притяжения. Рекомендуется делать repepot0 в разы большей по модулю, чем attrepot0, а repdist в разы меньшей, чем attrdist.
Параметр direction показывает, вдоль какой оси координат будут принудительно разнесены на расстояние около 2 * mindist точки, оказавшиеся слишком близко. Используется как примитивная замена более сложных генераторов случайных чисел.
Внешние силы fx,fy,fz (например, гравитационные) действуют на все точки в одном направлении.
Постоянная gconstant (по умолчанию нулевая) используется в случаях, когда облако молекул обладает собственной гравитацией. Проводится упрощённый расчёт с воздействием сил, направленных к центру масс. Для притяжения gconstant < 0, при > 0 можно моделировать отталкивание.
В массиве molarray находятся молекулы, участвующие во взаимодействиях.
Глобальные функции:
void interact(molecule* p1,molecule* p2) рассчитывает взаимодействие между двумя молекулами
void process() запускается через каждый шаг времени, рассчитывает скорости и расположение точек
Заголовок сообщения: Re: Точечная модель газов и жидкостей
Добавлено: 29 дек 2022, 14:11
Одарённый
Зарегистрирован: 25 окт 2022, 19:47 Сообщений: 113 Cпасибо сказано: 2 Спасибо получено: 5 раз в 5 сообщениях Очков репутации: 5
Выкладываю программу на Javascript для моделирования небольшого объёма идеального газа. Предполагаемые алгоритмы из первых постов темы пришлось существенно пересмотреть. Почти все возможности скрипта мной протестированы, но если обнаружите баги, прошу сообщать об этом. Прямые рудименты HTML и CSS были минимизированы до небольшой "заглушки", через которую запускается скрипт, можно её оформить как файл gasideal.htm или gasideal.html
Остальной код содержится в файле gasideal.txt (также можно использовать расширение .js), который должен находиться в той же папке. Как оказалось, консервативный Яваскрипт, без использования Canvas, вполне успевает обрабатывать движение сотен точек. Главное замедление происходит потому, что это всё же сложные объекты, и взаимодействует каждый с каждым без использования методов отсечения заведомо далёких участов от данной точки (вычисления растут квдратично). Проблема не в компьютерной графике.
Пояснения по поводу интерфейса: Целочисленные width и height определяют ширину и высоту модельного поля в пикселах. Поля x,y,z minimum и maximum задают границы реального объёма. Отмеченные чекбоксы x,y,z closed показывают замкнутость пространства отдельно по каждому измерению, в замкнутом вместо отталкивания от "стенок" точка переходит на другую сторону модельного объёма. Радио переключатели view along показывают, вдоль какой оси пользователем наблюдается модельный объём, по умолчанию вдоль z, остальные оси всегда направлены вправо и вниз (используется правая система координат). Поле min positive обозначает минимальную положительную величину, допустимую в расчётах, в частности, для деления, чтобы знаменатель не был равным нулю. Поле min distance (требует осторожности) показывает на каком расстоянии (или меньшем) начинают взаимодействовать точки между собой. Величина point size обозначает размеры точки (квадратика) в пикселах. Целочисленные red, green, blue points показывают количество точек каждого вида, всего возможно три вида: красные, зелёные и синие. Далее идут массы точки (mass) по каждому виду, и дополнительные силы, действующие вдоль каждого измерения, если например, задать небольшую положительную (скажем, 0.1) вдоль y, то видно как "атмосфера" оседает вниз, при этом не происходит особенного разделения на цветам, видимо вымывание водорода и гелия из реальной земной атмосферы процесс длительный. Поле velocity mul это множитель для скоростей, задаваемых при создании рандомной модели. Поле kinetic mul используется при нажатии кнопки mul Ekin, чтобы умножить кинетическую энергию системы на заданное число, то есть фактически уменьшить или увеличить скорость движения точек и условную "температуру". Поле step msecs показывает как часто (в миллисекундах) вызывается шаг симуляции. Поле time step это шаг времени, величина для использования в расчётах обновления реальных скоростей и положений точек в системе координат. Кнопка one step делает один шаг в симуляции. Кнопка run model запускает регулярно повторяемую симуляцию. Кнопка pause останавливает исполнение. Кнопка create создаёт рандомную модель с заданными выше настройками. Кнопки load и save нужны для загрузки и сохранения модели через текстовое поле внизу панели управления, в формате "буква цвета" + 3 числа для положений x,y,z + 3 числа для скоростей x,y,z, числа разделяются одним или многоми white-space символами, к которым относится пробел, табуляция (горизонтальная), перевод на новую строку и возврат каретки. Кнопка 0 impulse обнуляет суммарный импульс системы по всем измерениям, чтобы не было общего дрейфа точек в какую-то сторону. Кнопка mul Ekin, как написано выше, использует множитель для кинетической энергии системы точек, изменяет "температуру".
Кода получилось многовато, но не вижу возможности прикрепить целиком текстовый файл, буду выкладывать дальше прямо в теме.
Заголовок сообщения: Re: Точечная модель газов и жидкостей
Добавлено: 03 янв 2023, 11:05
Одарённый
Зарегистрирован: 25 окт 2022, 19:47 Сообщений: 113 Cпасибо сказано: 2 Спасибо получено: 5 раз в 5 сообщениях Очков репутации: 5
Обнаруженные баги и мелкие поправки в скрипте gasideal: 1. наименование d_offset нужно заменить именем d_left 2. вместо d_button = document.createElement("button"); лучше написать var d_button = document.createElement("button"); 3. вместо d_button.id = "d_id"; нужно написать d_button.id = d_id; 4. в начале функции f_create вместо var d_area,d_check; лучше написать var d_area,d_check,d_radio; 5. вместо this.value = d_newreds; нужно написать this.value = d_reds;
Заново не выкладываю скрипт, так как написал более совершенный для газов и жидкостей. Использование отдельных объектов вместо аттрибутов элементов "DIV" с вызовами функций радикально ускорило исполнение программы, точек может быть и тысяча с хорошей скоростью обработки взаимодействий. Также внесены многие другие улучшения, и главное разнообразные алгоритмы движения и взаимодействия. Проблем тоже много, крайне трудно подобрать адекватные настройки параметров для алгоритмов, и особенно адекватный шаг времени. Начальное расположение и скорости точек тоже серьёзно влияют. Точки двух видов, красные и синие, пока различаются только массой, взаимодействуют по одинаковым законам.
В файле gasliq.txt, который должен быть в той же папке, содержится остальной код.
Пояснения к интерфейсу: Целочисленные width и height определяют ширину и высоту модельного поля в пикселах. Поля x,y,z minimum и maximum задают границы реального объёма. Отмеченные чекбоксы x,y,z closed показывают замкнутость пространства отдельно по каждому измерению, в замкнутом вместо отталкивания от "стенок" точка переходит на другую сторону модельного объёма. Радио переключатели view along показывают, вдоль какой оси пользователем наблюдается модельный объём, по умолчанию вдоль z, остальные оси всегда направлены вправо и вниз (используется правая система координат). Кнопка methods вызывает интерфейс с настройками взаимодействий, скрывается он при повторном нажатии этой же кнопки или кнопки hide settings на самом интерфейсе. Следует учитывать, что текстовые поля реально изменяются не после нажатия клавиши enter, а после клика мышкой в другом месте. Поле min positive обозначает минимальную положительную величину, допустимую в расчётах, в частности, для деления, чтобы знаменатель не был равным нулю. Поле min distance (требует осторожности) показывает на каком расстоянии (или меньшем) начинают взаимодействовать точки между собой при упругом отталкивании. Поля force along x,y,z задают дополнительные силы, действующие вдоль каждого измерения, если например, задать небольшую положительную (скажем, 0.1) вдоль y, то видно как "атмосфера" оседает вниз. Величина point size обозначает размеры точки (квадратика) в пикселах. Целочисленные red, blue points показывают количество точек каждого вида, всего возможно два вида: красные и синие. Далее идут массы точки (mass) по каждому виду. Поле velocity mul это множитель для скоростей, задаваемых при создании рандомной модели. Поле kinetic mul используется при нажатии кнопки mul Ekin, чтобы умножить кинетическую энергию системы на заданное число, то есть фактически уменьшить или увеличить скорость движения точек и условную "температуру". Поле msecs показывает как часто (в миллисекундах) вызывается шаг симуляции. Поле time step это шаг времени, это величина для использования в расчётах обновления реальных скоростей и положений точек в системе координат. Кнопка one step делает один шаг в симуляции. Кнопка run model запускает регулярно повторяемую симуляцию. Кнопка pause останавливает исполнение. Кнопка create создаёт рандомную модель с заданными выше настройками. Кнопки load и save нужны для загрузки и сохранения модели через текстовое поле внизу панели управления, в формате "буква цвета" + 3 числа для положений x,y,z + 3 числа для скоростей x,y,z, числа разделяются одним или многими white-space символами, к которым относится пробел, табуляция (горизонтальная), перевод на новую строку и возврат каретки. Кнопка 0 impulse обнуляет суммарный импульс системы по всем измерениям, чтобы не было общего дрейфа точек в какую-то сторону. Кнопка mul Ekin, как написано выше, использует множитель для кинетической энергии системы точек, изменяет "температуру". Кнопка get Ekin получает суммарную кинетическую энергию в поле справа. Кнопка set Ekin загружает из этого поля кинетическую энергию, с соответствующим уножением скоростей точек, если это математически возможно. Кнопка get Epot получает суммарную кинетическую энергию в поле справа.
Интерфейс дополнительной панели настроек (вызывается и скрывается кнопкой methods или скрывается hide settings): Радио переключатели motion выбирают, используется ли схема Верле, или перемещение точки зависит от силы, делённой на массу с умножением на квадрат шага времени и множитель 1 или 1/2. Кстати, по моим наблюдениям, схема Верле даже ухудшает движение точек, растёт разброс кинетической энергии при осцилляции. Но при всех вариантах энергия осциллирует, нет безудержного роста или уменьшения (по крайней мере при упругом отталкивании с дополнительными силами). Радио переключатели action выбирают упругое отталкивание, схему Леннарда-Джонса, Букингэма или Морзе. Поля Johns Emin и Rmin задают минимум энергии в схеме Леннарда-Джонса (значение энергии положительное, хотя потом по факту будет отрицательное), и расстояние, на котором энергия взаимодействия минимальная. Чекбоксы Johns cut и splines показывают, используется ли "отрезание" потенциала на больших расстояниях, с нулём на расстоянии 2.5 сигмы, и сплайны для приближения. Поля Buckingham A,B,C задают коэффициенты для exp-6. Поля Morse Emin и Rmin задают минимум энергии в схеме Морзе и расстояние, на котором энергия взаимодействия минимальная. Morse a(exp) множитель для экспоненты.
Заголовок сообщения: Re: Точечная модель газов и жидкостей
Добавлено: 04 янв 2023, 09:52
Одарённый
Зарегистрирован: 25 окт 2022, 19:47 Сообщений: 113 Cпасибо сказано: 2 Спасибо получено: 5 раз в 5 сообщениях Очков репутации: 5
Очень разочаровала схема Верле. По размаху осцилляций кинетической энергии системы мало отличается от расчётов с использованием скорости. Провёл тесты с настройками по умолчанию + дополнительная сила 0.01 вдоль оси y. Лучшие результаты (минимум колебаний энергии) получены при схеме s = s + v * dt + f / m * dt^2, второе место у схемы Верле, наихудшая s = s + v * dt + f / m * dt^2 / 2. Схема с прогнозом и коррекцией реализована не была, так как очень требовательна к ресурсам, пришлось бы повторно проходить взаимодействие всех точек со всеми. Но вряд ли была бы радикально лучше при резком изменении потенциала и сил отталкивания точек вблизи друг друга. Эдакая средняя температура по палате, и достаточно чуть увеличить шаг времени, чтобы система пошла вразнос. А если делать движение слишком медленным, долго придётся ждать результатов. Кажется вообще не стоит использовать схемы с силами как градиентами потенциала, лучше использовать сам потенциал с более строгим сохранением энергии, а о сохранении имульса меньше заботиться.
Заголовок сообщения: Re: Точечная модель газов и жидкостей
Добавлено: 11 янв 2023, 12:34
Одарённый
Зарегистрирован: 25 окт 2022, 19:47 Сообщений: 113 Cпасибо сказано: 2 Спасибо получено: 5 раз в 5 сообщениях Очков репутации: 5
В следующей версии внесены радикальные изменения, налажено хорошее сохранение энергии.
Выкладываю программу на Javascript для моделирования движения точек, представляющих собой молекулы газа или жидкости. Скрипт запускается следующим образом (эти строки можно поместить в файл с расширением .htm или .html):
В файле gasliq3.txt, который должен быть в той же папке, содержится остальной код.
Пояснения к интерфейсу: Целочисленные width и height определяют ширину и высоту модельного поля в пикселах. Поля x,y,z minimum и maximum задают границы реального объёма. Отмеченные чекбоксы x,y,z closed показывают замкнутость пространства отдельно по каждому измерению (работает не во всех режимах), в замкнутом вместо отталкивания от "стенок" точка переходит на другую сторону модельного объёма. Радио переключатели view along показывают, вдоль какой оси пользователь наблюдает модельный объём, по умолчанию вдоль z, остальные оси всегда направлены вправо и вниз (используется правая система координат). Кнопка methods вызывает интерфейс с настройками взаимодействий, скрывается он при повторном нажатии этой же кнопки или кнопки hide settings на самом интерфейсе. Следует учитывать, что текстовые поля реально изменяются не после нажатия клавиши enter, а после клика мышкой в другом месте. Поле min positive обозначает минимальную положительную величину, допустимую в расчётах, в частности, для деления, чтобы знаменатель не был равным нулю. Поле min distance (требует осторожности) показывает на каком расстоянии (или меньшем) начинают взаимодействовать точки между собой при упругом отталкивании. Поля force along x,y,z задают дополнительные силы, действующие вдоль каждого измерения, если например, задать небольшую положительную (скажем, 0.1) вдоль y, то видно как "атмосфера" оседает вниз. Энергия системы при этом может значительно колебаться. Величина point size обозначает размеры точки (квадратика) в пикселах. Целочисленные red, blue points показывают количество точек каждого вида, всего два вида: красные и синие, различаются только массой, взаимодействуют по одинаковым законам. Далее идут массы точки (mass) по каждому виду. Поле velocity mul это множитель для скоростей, задаваемых при создании рандомной модели. Поле kinetic mul используется при нажатии кнопки mul Ekin, чтобы умножить кинетическую энергию системы на заданное число, то есть фактически уменьшить или увеличить скорость движения точек и условную "температуру". Поле msecs показывает как часто (в миллисекундах) вызывается шаг симуляции. Поле time step это шаг времени, это величина для использования в расчётах обновления реальных скоростей и положений точек в системе координат. Кнопка one step делает один шаг в симуляции. Кнопка run model запускает регулярно повторяемую симуляцию. Кнопка pause останавливает исполнение. Кнопка create создаёт рандомную модель с заданными выше настройками. Кнопки load и save нужны для загрузки и сохранения модели через текстовое поле внизу панели управления, в формате "буква цвета" + 3 числа для положений x,y,z + 3 числа для скоростей x,y,z, числа разделяются одним или многими white-space символами, к которым относится пробел, табуляция (горизонтальная), перевод на новую строку и возврат каретки. Кнопка 0 impulse обнуляет суммарный импульс системы по всем измерениям, чтобы не было общего дрейфа точек в какую-то сторону. Кнопка mul Ekin, как написано выше, использует множитель для кинетической энергии системы точек, изменяет "температуру". Кнопка get Ekin получает суммарную кинетическую энергию в поле справа. Кнопка set Ekin загружает из этого поля кинетическую энергию, с соответствующим уножением скоростей точек, если это математически возможно. Кнопка get Epot получает суммарную потенциальную энергию в поле справа. Кнопка get energy получает суммарную энергию в поле справа.
Интерфейс дополнительной панели настроек (вызывается и скрывается кнопкой methods или скрывается hide settings): Радио переключатели выбирают упругое отталкивание, схему Леннарда-Джонса, Букингэма или Морзе. Поля Johns Emin и Rmin задают минимум энергии в схеме Леннарда-Джонса (значение энергии положительное, хотя потом по факту будет отрицательное), и расстояние, на котором энергия взаимодействия минимальная. Чекбоксы Johns cut и splines показывают, используется ли "отрезание" потенциала на больших расстояниях, с нулём на расстоянии 2.5 сигмы, и сплайны для приближения. Поля Buckingham A,B,C задают коэффициенты для exp-6. Поля Morse Emin и Rmin задают минимум энергии в схеме Морзе и расстояние, на котором энергия взаимодействия минимальная. Morse a(exp) множитель для экспоненты.
Настройки по умолчанию могут быть не лучшими, экспериментируйте.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения