javascript

Magneto Solver: Пишем симулятор магнитных полей на WebGPU и боремся с тензором Максвелла

  • среда, 28 января 2026 г. в 00:00:06
https://habr.com/ru/articles/989380/
maneto solver
maneto solver

Мечта об идеальном двигателе

Мне кажется, я знаю, как должен быть устроен идеальный электродвигатель. Но чтобы это доказать, нужен инструмент.
Существующий софт убивал все желание творить:

  • Ansys Maxwell - мощный, но тяжелый и часто просто отказывается запускаться.

  • FEMM - быстрый, но его интерфейс - пример того, как не надо делать UI в 21 веке.

  • SimScale - удобно, но медленно, и бесплатные лимиты кончаются слишком быстро.

За зимние каникулы (плюс пара дней) мы написали свой солвер.
Почти весь код написан нейросетью. Пару лет назад я бы в это не поверил, но сегодня мы с ней создали сложный инженерный софт.

Про ИИ и ресурсы

Весь проект сделан на бесплатной версии Gemini.
Даже очень щедрых лимитов (спасибо Гуглу) постоянно не хватало. Это показательно: будь у нас больше ресурсов - мы бы сделали намного больше. Миру (и особенно мне) нужно намного больше вычислительных мощностей для ИИ.

Технологии: WebGPU и один файл

Весь софт — это один HTML файл. Никаких серверов, установок и зависимостей.
Чтобы считать быстро, мы используем WebGPU. Все вычисления идут на видеокарте.

  • Разрешение: Спокойно перевариваем сетку 16К (о чем другие реал-тайм солверы могут только мечтать).

  • Сходимость: Экстремально быстрая (потратили уйму времени на тюнинг алгоритмов).

  • Рендер: Визуализация на Three.js, так как обычный Canvas 2D тормозил на таких объемах.

Что умеет солвер

Интерфейс, в котором хочется работать:

  1. Декартова или полярная система координат — сетка строится секторами, что идеально для вращающихся машин.

  2. Sweep (Развертка) — задаем диапазон (угол/позицию), софт прогоняет симуляцию и строит графики.

  3. «Зарядка» магнитов — уникальная фича: можно нарисовать «пустой» магнит в поле катушки, нажать кнопку, и он запомнит намагниченность.

  4. Запись видео — рендер вебмки прямо из браузера.

Расчет поля B
Расчет поля B

Проблема: Силы и Момент

Тут мы сломали немало копий.
Считать силы в реал-тайме через Тензор Максвелла на прямоугольной сетке и получать качественный результат в котором можно быть уверенным - не получилось(

В итоге мы внедрили Метод Виртуальных Перемещений.
Как видно на скриншоте, он дает идеально гладкие графики момента и сил в режиме Sweep. Результат отличный, но ради этого пришлось пожертвовать интерактивностью - силы считаются только в режиме развертки, а не в реальном времени под мышкой. Даже если вам просто нужно посчитать магнитик на холодильник - нужно прогонять sweep

расчет момента методом виртуальных перемещений
расчет момента методом виртуальных перемещений

Ссылки

Проект Open Source.

Планы

В далекой перспективе думаю сделать 3D расчет на GPU с использованием адаптивной сетки (уплотнение вокселей в местах интереса).

А пока — буду рад фидбеку. Какого функционала вам не хватает?