КП: Многочастичный симулятор — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
м (Решение)
м (Команды консоли)
Строка 165: Строка 165:
 
Создать пружину между частицами
 
Создать пружину между частицами
  
* '''addSpring #0 #1''' 50<ref name="optValues" /><ref>Жёсткость пружины по умолчанию равна 5 у. е.</ref><ref name="workWithVisualisation" />, где
+
* '''addSpring #0 #1''' 50<ref name="optValues" /><ref name="workWithVisualisation" /><ref>Жёсткость пружины по умолчанию равна 5 у. е.</ref>, где
  
 
0, 1 - id частиц<ref name="pointsId" />
 
0, 1 - id частиц<ref name="pointsId" />
Строка 250: Строка 250:
 
* '''getHistory''' <ref>Запросы выводятся в всплывающем окне одной цельной командой, для воспроизведения цепочки запросов достаточно ввести выведенную команду в консоль.
 
* '''getHistory''' <ref>Запросы выводятся в всплывающем окне одной цельной командой, для воспроизведения цепочки запросов достаточно ввести выведенную команду в консоль.
 
<br>
 
<br>
'''Внимание!''' Учитываются только запросы, успешно введённые в консоль. Воздействия на систему при помощи кнопки "Move point" будут потеряны.</ref>
+
'''Важно!''' Учитываются только запросы, успешно введённые в консоль. Воздействия на систему при помощи кнопки "Move point" будут потеряны.</ref>
  
  

Версия 23:31, 2 июня 2015

А.М. Кривцов > Теоретическая механика > Курсовые проекты ТМ 2015 > Многочастичный симулятор
IPhone image 2015-4-13-1431495674163 1.jpg

Курсовой проект по Теоретической механике

Исполнитель: Старобинский Егор

Группа: 09 (23604)

Семестр: весна 2015

Аннотация проекта

Формулировка задачи

Цель работы

Создание интернет-сайта, позволяющего пользователю моделировать многоточечную систему онлайн.

Решаемые задачи
  1. решение уравнения движения;
  2. визуализация.

Общие сведения по теме

Уравнение движения

Пусть мы наблюдаем тело в момент времени [math]t[/math].

Хотим знать, где окажется тело через малое изменение времени - [math]\Delta t[/math].

Рассмотрим базовый метод интегрирования Верле:

[math]\vec{x}(t + \Delta t) = 2\vec{x}(t) - \vec{x}(t - \Delta t) +\frac{ \vec{R}(t) \Delta t^2 }m[/math], где

[math]\vec{x}[/math] - позиция точки,

[math]\vec{R}[/math] - равнодействующая всех сил, действующих на тело,

[math]m[/math] - масса тела,

[math]t[/math] - текущий момент времени,

[math]\Delta t[/math] - малое изменение времени.

Метод Верле позволяет вычислять траекторию по упрощённой схеме: зная предыдущее и текущее положения ([math]\vec{x}(t - \Delta t)[/math] и [math]\vec{x}(t)[/math] соответственно)  и мгновенное значение равнодействующей приложенных сил в текущем положении [math]\vec{R}(t)[/math].

Достоинства метода: самокоррекция и бóльшая точность по сравнению с численным методом Эйлера.

Язык реализации: JavaScript.

Визуализация

Язык рализации: pure SCSS.

Обработка событий: JavaScript.

Отказ от WebGL продиктован выбором методов оптимизации для возможности работы с тысячами частиц.

Решение

Результат

Страница решения

Вы можете попробовать возможности симулятора прямо здесь, либо перейдя на полноразмерную страницу решения.

В пункте 4.7 представлен пример готовой команды для создания трёхатомной молекулы.

Нахождение периода в простом движении
Элементы системы
  • Частицы;
  • Стержни и пружины[1];
  • Стенки;
  • Поле сил;
  • Рабочее окно;
  • Сетки разметки;
  • Консоль;
  • Плеер.


Пример вывода консоли
Возможности консоли
  • Конфигурация начальной системы тел;
  • Изменение системы в процессе работы ("на лету");
  • Запуск алгоритмов анализа системы;
  • Распознавание и вывод ошибок в пользовательских запросах и в исходном коде;
  • Распознавание и вывод предупреждений в пользовательских запросах и в исходном коде;
  • Подключение/отключение сеток разметки, в том числе с пользовательскими размерами ячейки;
  • Тетрис.
Команды консоли

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

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

Основные запросы

Очистить поле консоли

  • clrscr


Отобразить статистику элементов системы и чилто тиков:

  • getInfo


Создать частицу

  • addPoint (100,100) (0,10) 80 5[2][3], где

(100,100) - текущие координаты

(0,10) - вектор скорости относительно начала координат

80 - радиус частицы в пикселях

5 - масса частицы в у. е.


Задать вектор скорости (относительно начала координат)

  • setVelocity #0 (10,10), где

0 - id частицы[4]


Переместить частицу (относительно начала координат)

  • movePoint #3 (100,100) saveV[2][5], где

3 - id частицы[4]

(100,100) - новые координаты

saveV - флаг сохранения скорости. Если указан, частица после перемещения сохранит вектор своей скорости.

Задать массу

  • setProps #0 mass 10, где

0 - id частицы[4]

10 - новая масса

  • setProps #0 invmass 0.1, где

0 - id частицы[4]

0.1 - обратное значение новой массы


Задать радиус

  • setProps #0 radius 100, где

0 - id частицы[4]

100 - радиус частицы


Создать пружину между частицами

0, 1 - id частиц[4]

50 - жёсткость пружины


Изменить жёсткость пружины

  • changeSpring #5 10, где

5 - id пружины[4]

10 - новая жёсткость


Изменить жёсткость одинаковых пружин

  • changeSprings 10->15, где

10 - текущая жёсткость

15 - новая жёсткость


Изменить жёсткость всех пружин

  • changeSprings all->20, где

20 - новая жёсткость


Создать стержень между частицами

  • addStick #2 #1[5], где

2, 1 - id частиц[4]


Отключение гравитации

  • gravy disable


Задать вектор ускорения свободного падения (относительно начала координат)

  • gravy (0,10)


Отобразить сетку

  • showGrid type 0
  • showGrid type 1
  • showGrid type 2


Спрятать сетку

  • hideGrid


Запустить симуляцию

  • play


Остановить симуляцию

  • stop


"Промотать" симуляцию

  • step(100), где

100 - число пропускаемых отрисовкой тиков


Исполнить внутренний метод

  • execute nameMethod(params), где

nameMethod - название метода

params - сообщаемые параметры


Посмотреть историю запросов

  • getHistory [7]


Объединить команды в одном запросе

  • commandOne---commandTwo, где

commandOne, commandTwo - команды консоли, могут также состоять из объединённых команд

Кнопки интерфейса
  • Кнопка Get point's id

После нажатия на кнопку, а затем на частицу выводит id последней в консоль.

  • Кнопка Move point[5]

Эквивалентна команде консоли movePoint без флага saveV.

После нажатия на кнопку, а затем на частицу закрепляет управление положением последним за курсором мыши.

Дальнейшие нажатия на свободные участки поля переносят эту частицу в точку нажатия, при этом её скорость считается нулевой.

Для прекращения управления следует вновь нажать кнопку.

  • Клавиша клавиатуры ~ (также `, ё, Ё)

Эквивалентна командам консоли play/stop и крайней левой кнопке плеера.

  • Кнопки плеера

Слева направо:

Воспроизведение/остановка симуляции (эквивалентно командам консоли play/step), переход на тик вперёд (эквивалентно команде консоли step(1))переход на 50 тиков вперёд (эквивалентно команде консоли step(50)), переход на 100 тиков вперёд (эквивалентно команде консоли step(100)).

Возможности плеера
  • Воспроизведение/пауза симуляции с заданным [math]\Delta t[/math];
  • Скачок вперёд на кратное [math]\Delta t[/math] время;
  • "Замедление времени"[8].
Пример системы

Смоделируем молекулу из трёх атомов (подобную молекуле углекислого газа, рассматриваемой в курсовом проекте А. Смирнова).

PhenCO2Example.png

Для создания такой системы необходимо последовательно выполнить следующие команды:

Создаём атомы кислорода, углерода и кислорода соответственно.

  • addPoint (100,100) (0,0) 40 5
  • addPoint (250,100) (0,0) 50 10
  • addPoint (400,100) (0,0) 40 5

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

  • addSpring #0 #2 10
  • addSpring #0 #1 20
  • addSpring #1 #2 20

Дополнительно можем задать скорости у атомов кислорода для создания колебаний.

  • setVelocity #0 (1,0)
  • setVelocity #2 (-1,0)

Итоговый код (одна строка):

addPoint (100,100) (0,0) 40 5---addPoint (250,100) (0,0) 50 10---addPoint (400,100) (0,0) 40 5---addSpring #0 #2 10---addSpring #0 #1 20---addSpring #1 #2 20---setVelocity #0 (1,0)---setVelocity #2 (-1,0)

Обсуждение результатов и выводы


Скачать отчет:
Скачать презентацию:

Ссылки по теме

T, Jakobsen. "Advanced Character Physics", 2003. (перевод статьи )

Л. Ландау, Е. Лифшиц, "Теоретическая физика", том первый, "Механика", 2001.

А, Смирнов. "Курсовой проект: молекула углекислого газа", 2015. (страница проекта)

См. также

Примечания

  1. Стержни рассчитываются на расстяжение/сжатие методом коррекции координат.
    Действие пружин учитывается как действие силы упругости.
  2. 2,0 2,1 2,2 Без выделения жирным написаны необязательные параметры. При желании указать необязательный параметр все значения слева от него следует считать обязательными (во избежание путаницы при парсинге безразмерных величин в команде).
  3. Значения по умолчанию: вектор скорости нулевой, радиус равен 50 пикселям, масса равна 5 у. е.
  4. 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы, для стенок, стержней, пружин и частиц. Для частиц значение id можно найти нажатием сначала на кнопку "Get point's id", а затем на частицу: тогда Id отобразится в консоли.
  5. 5,0 5,1 5,2 5,3 Важно! Визуально действие этой команды применится только при перерисовке кадра.
  6. Жёсткость пружины по умолчанию равна 5 у. е.
  7. Запросы выводятся в всплывающем окне одной цельной командой, для воспроизведения цепочки запросов достаточно ввести выведенную команду в консоль.
    Важно! Учитываются только запросы, успешно введённые в консоль. Воздействия на систему при помощи кнопки "Move point" будут потеряны.
  8. При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управлятся через консоль.