Открыв ссылку, вы найдёте написанную мною статью, резюмирующую мой ресёрч по теме метода конченых элементов для моделирования гибких тел в играх. Метод в принципе рилтаймовский, позволяет интегрировать гибкие тела с ригидами в одной системе, однако есть некоторые проблемы со стабильностью, точнее, трейдоф между рилтаймовостью и стабильностью. Также статья даёт зубодробильную математическую базу метода. Читайте на здоровье.
Сей мой адский опус представляется вашему вниманию в формате пдф, ибо руками править форматированеи я затрахался..
Думаю, ты сам понимаешь, что полностью читать ещё одну простыню текста про МКЭ вряд ли кому-то захочется полностью. Хотелось бы:
Увидеть essentials: устойчивость метода, порядок аппроксимации по шагу по координате и времени, как выбирается шаг времени, для моделирвания насколько сложных задач подходит, как обстоят дела с динамикой распространения волн в среде, ну и вообще.
Узнать, что в методе нового, на что стоит обратить внимание: просто статей по просто МКЭ уже, как ты знаешь, есть и очень немало. Что ты хотел сказать своей?
Увидеть скриншоты, узнать прозводительность: собственно, наглядность от статьи отпугивает редко.
Мне хотелось написать именно простыню, потому что "ещё одну" это громко сказано - мне пришлось от попа придумывать многое.
Устойчивость метода всецело зависит от точности решения. При обеспечении достаточной точности решения СЛАУ стабильность, похоже, unconditional. Однако для получения точного решения надо вскрыться же. Если считать гаус-зейделем, то 500 итераций, и ты сам понимаешь, что это. Можно делаеть неточное решение, те же 15 итераций гаус-зейделя, но тогда стабильность начинает зависеть от упругости материала и демпинга. Без демпинга на 15 итерациях ГЗ держит упргугость порядка 100 КПа, при демпинге = 1 до нескольких ГПа. Если же считать систему сопряженными градиентами, 50 итераций с очень маленьким, но ненулевым демпингом, или порядка 90 итераций вообще без демпинга хватает для стабильности на любых материалах, на которых пробовали по крайней мере.
По шагу времени брали 16 мс. Задача была прибилзить параметры к ригид-боди солверам. Дело в том, что самая вкусняшечка - это что ФЕМ предсатвляется просто как специфический джойнт в обычной системе частиц ми ригидов со связями, т.е. каплинг идеальный. Но затыка в том, что для системы тел с контакатми нужно ЛЦП, а ппроективные градиенты его не умеют считать, приходится считать гаусс-зейделем, а его либо надо итерироать до скончания времён, либо возникают проблемы с точностью..
Что касается шага по координатам - это ж партиклевый метод, как партикли поставишь, так и будет. Внутри каждого КЭ все интеполируется линейно. Так что количесвто точек на стабильность эффект оказывать по моему пониманию не должно (ну, кроме очевидной проблемы роста размерности системы и необходимости дольше итерировать солвер СЛАУ для обеспчения достаточной точности), но, понятное дело, от числа точек зависит качество результата.
Про сложность задач - метод хаковый, я смотрел в сторону геймдев-применения. Сам по себе фем там линейный - линейная инетполяция, тензоры с точностью до линейных членов, линейная модель упругости. Всё поведение считается по формулам для окрестности недеформированного состояния, что, как ты понимаешь, физически не точно, а нормальный результат достигается хаковым вращением базиса для каждого КЭ.. Так что задачи - чисто визуальные. Если тебя инетересует размер, то мы на самом деле не особо много статистики не набрали пока что, смотрели на брусках только; нет времени писать загрузчик форм, хотя обязательно сделаем. Щас бьём брусок на пару сотен КЭ примерно и на проективных градиентах оно рилтайм работает.
Про волны ты меня в тупик поставил. Не знаю, чего там с волнами. Если поставить мало итераций в солвере СЛАУ, они начинают распространяться, и через 3-4 секунды всё взрывается :))))
Про скриншоты поговори с Xperiens, я щас на работе занят, и код двигает в основном он.. Там в общем-то виден хуй, т.е. телесного цвета брусок, и его можно пинать :) Не очень впечатляет. Надо бы написать загрузчик форм..
С геймдева я пропал чисто потому, что IRC у меня в районной сети не пашет что-то, а на сайте мало что инетересного для себя вижу.. а время не казённое. Тем более дл последнего времени я занимался программированием финансового ПО, а щас на фоне кризиса я прибился в NVidia, над PhysX работать..
SoRRoW > При обеспечении достаточной точности решения СЛАУ стабильность, похоже, unconditional.
нене. если перед словом "unconditional" стоит какой-то condition, то это уже не unconditional :) серьёзно, это не придирки, на защите это обязательно понадобится
>Без демпинга на 15 итерациях ГЗ держит упргугость порядка 100 КПа, при демпинге = 1 до нескольких ГПа. Если же считать систему сопряженными градиентами, 50 итераций с очень маленьким, но ненулевым демпингом, или порядка 90 итераций вообще без демпинга хватает для стабильности на любых материалах, на которых пробовали по крайней мере.
неплохо, вполне. это в статике? с warmstarting'ом солвера? как в таком случае обстоят дела с ударными нагрузками?
>Дело в том, что самая вкусняшечка - это что ФЕМ предсатвляется просто как специфический джойнт в обычной системе частиц ми ригидов со связями, т.е. каплинг идеальный. Но затыка в том, что для системы тел с контакатми нужно ЛЦП, а ппроективные градиенты его не умеют считать, приходится считать гаусс-зейделем, а его либо надо итерироать до скончания времён, либо возникают проблемы с точностью..
я делал почти так же: система тел одна, а солвера три, все разные: один position based, для частиц, второй - PGS, для твёрдых, impulse-based, а третий - смешанный, для взаимодействия твёрдых с мягкими. наружу двига ничего из этого не торчит, внутри хоть и звучит корявенько, но поперёк горла эта корявость ещё не вставала.
>Что касается шага по координатам - это ж партиклевый метод, как партикли поставишь, так и будет. Внутри каждого КЭ все интеполируется линейно.
в смысле порядок точности по координате? к разностной схеме какого порядка точности сведётся ваш FEM, если ноды расположить в узлах кубической сетки? могу предположить, что первого но это вовсе не очевидно.
>Про сложность задач - метод хаковый, я смотрел в сторону геймдев-применения. Сам по себе фем там линейный - линейная инетполяция
линейная интерполяция, конечно, убъёт любую другую точность солвера, но от неё всегда можно в случае чего избавиться. впрочем, в геймдеве редко когда может пригодиться
>Про волны ты меня в тупик поставил. Не знаю, чего там с волнами. Если поставить мало итераций в солвере СЛАУ, они начинают распространяться, и через 3-4 секунды всё взрывается :))))
может, специфика наших военных, но у них точность волновой динамики - едва ли не первое требование к вычислительному комплексу. на самом деле, посмотрев на распространение волнового фронта можно многое рассказать о методе ;)
>Тем более дл последнего времени я занимался программированием финансового ПО, а щас на фоне кризиса я прибился в NVidia, над PhysX работать..
блин, они посчитали, что я слишком юн :/
Суслик,
я не собираюсь защищаться по этой теме :)) У меня экономическое образование. Мировая экономика и международная политика. Тем более я не имею ничего общего с военными :)
Разностная схема получется первог опорядка, если я правильно понимаю, что ты имеешь ввиду. Показатели были в динамике, с вормстартингом. Импульсы порядка 1000 единиц держит..
SoRRoW > Что именно связано?
Градиентеные методы используют квадратичную апроксимацию искомой функции для поиска минимума. Поэтому им нужно "скармливать" такие задачи, в которых минимум явно выражен.
Гаусс-зейдель плохо сходится еще и в случае отсутствия доминирования околодиагональных элементов в матрице.
Ты здесь геймдевелопер. Наша задача - писать физику, ваша - придумывать, где её применить. ну да, всю физику на FEM'е в обычном экшне вряд ли сделаешь, но, не знаю, пришельца какого-нибудь огромного и мясистого - запросто. Или, к примеру посчитать раскол rigid body.
О. Федор > Градиентеные методы используют квадратичную апроксимацию искомой функции для > поиска минимума. Поэтому им нужно "скармливать" такие задачи, в которых минимум > явно выражен.
А как в этом случае поможет квадратичная интерполяция?
Квадратичная интерполяция потребует пересчета матрицы дифференцирования перемещений, так что даже если квадратичная интерполяция даст нам некоторый буст к сходимости - нужно еще 100 раз подумать, а не дешевле ли просто увеличить количество итераций :)
Насчет производительности, вот некоторые данные:
Прогнал демку на балке (12мx2мx1м) из 288 КЭ (размерность системы n = 1728), солвер - сопряженные градиенты (70 итераций), модуль Юнга для материала 10 ГПа, коэффициент Пуассона 0.35 (эквивалент материала в реальном мире - кость); совсем небольшой демпинг. Балка зафиксирована на одном конце.
При таких параметрах балка стабильна, ок держит приложение к свободному концу сил порядка десятков кН, моделируется в реальном времени (мс на рассчет не замерял, уж извините :) но могу сказать что было ~30 fps на моем PIV 3.0GHz).
Вот скрин, но сделаный при других параметрах (материал - резина, и еще что-то там не такое).
Солвер Гаусс-Зейдель на той же конфигурации лажал уже конкретно, при приложении сил брусок начинало мотать с нарастающей амплитудой, причем даже при увеличении в 2 раза количества итераций (140).
Стоит так же отметить скорость - рендер у нас абсолютное говно, это раз; и сами солверы есть еще много куда оптимизировать (недочищены от мусора и прочее).
Suslik
Ну узлов вообще еще меньше - около 100, потому что несколько КЭ разделяют один узел (узел общий для нескольких тетраэдров). От количества узлов размерность системы напрямую не зависит, а зависит она от количества КЭ, и зависит она так: 6 * N, где N - количество КЭ. Зависимость эта объясняется тем что мы ищем симметричный тензор напряжений для КЭ.