Я пытаюсь реализовать метод Clavet для моделирования жидкостей в JavaScript, поэтому отладка - это кошмар, поэтому я спрашиваю здесь, надеясь, что кто-то, кто прошел через то же самое, скажет мне, что я делаю неправильно.
У меня сейчас работает OKAY:
Но у меня две проблемы:
1) Так как в этом методе все делается "смещением" на полшага, я не уверен, как правильно отскочить частицы от стен. Прямо сейчас я беру положение частицы и предыдущее положение и переворачиваю их вокруг пересеченной стены, затем масштабирую вокруг точки пересечения коэффициентом отказов.
Моя логика подсказывает мне, что это должно сработать. Следующим шагом в алгоритме является обновление скоростей частиц, поэтому я также отражу предыдущую позицию. Но на практике это дает мне результат, который я не понимаю:
Это показывает "силы" на частицах. Стены отражают слишком сильную силу, которая держит все в постоянном движении.
Формула 4.58 в в этой статье, по-видимому, показывает способ предотвратить это, но я не смог заставить его работать.
Также есть материал, который я не получаю, например, что "мы хотим отразить только ту скорость, которая была опущена при столкновении". Зачем? Может кто-то ELI5 этот материал мне понравится?
2) Даже когда стены не задействованы, симуляция "взрывается" периодически. Это происходит чаще при более высоком давлении:
Это JavaScript, так что это, но я перешел кодекс и нет никаких делений на ноль или ситуаций, где я могу представить, как происходит NaN.
Я видел некоторые разговоры в газетах о сильной нестабильности, и мне интересно, так ли это. Большая часть того, что в этой литературе находится вне меня.
Из того, что я понял (я думаю), одним из способов устранения неустойчивости является вязкость, но я добавил ее, и это не помогло с взрывами:
Я могу опубликовать код, но на этапе get-it-to-work-first его трудно читать прямо сейчас.
Один последний вопрос: как мне понять, как преобразовать из псевдопотенциалов в этот метод в физические единицы?
Изменить: я обнаружил, что sim зависает изредка, похоже, что он создает NaN где-то, но Chrome ловит его слишком поздно.