Files
gausse/README.md

90 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# gausse
Симулятор и оптимизатор многоступенчатого электромагнитного ускорителя
(coilgun / пушка Гаусса) на реальных, доступных в рознице компонентах
(ChipDip, procontact74.ru, cable.ru — у каждой детали в базе ссылка на
магазин).
Главный принцип — **честность**: все прогоны (включая нереализуемые, с
причиной отказа) пишутся в SQLite; физическая модель не приукрашивается ради
красивых цифр, а каждое известное упрощение задокументировано. История
проекта — это в том числе история найденных и исправленных завышений КПД
(80%+ → реалистичные единицы процентов), см. [PLAN.md](PLAN.md).
## Что умеет
- **Физика** (`src/gausse/physics/`): RLC-разряд конденсаторной банки через
катушку с ферромагнитным снарядом; насыщение железа через единое
потокосцепление λ(x,I) (энергия сохраняется); вихревые потери в снаряде;
коэффициент заполнения (тонкий снаряд не усиливает весь поток) и
диффузия поля (за импульс намагничивается только скин-кольцо);
скин-эффект + эффект близости обмотки (метод Доуэлла); трение о трубку и
сопротивление воздуха; одиночный импульс (тиристор не перезапускается);
паспортные импульсные токи ключей (ITSM/IDM/ICM из даташитов).
- **Ступени** (`src/gausse/sim/`): у каждой катушки свой датчик
(оптика/Холл/индукционный) на своём расстоянии; подлёт → триггер →
задержки датчика и ключа → разряд → энергобаланс; цепочка до 10 ступеней.
- **Поиск** (`src/gausse/optim/`): геном переменной длины (число ступеней
эволюционирует), Monte-Carlo sweep и (μ+λ)-эволюция с Nelder-Mead
полировкой; всё в одну SQLite-базу (WAL, писатель поверх очереди).
- **GPU** (`src/gausse/gpu/`): батч-интегратор RK4 (numpy/cupy), весь шаг
слит в одно cupy.fuse-ядро — на GTX 1070 ~3.8x к CPU; многоступенчатый
GPU-sweep раунд-за-раундом И GPU-эволюция (use_gpu=True: всё поколение —
один батч, ~150 геномов/с на 1070); сверено с CPU-эталоном (<0.1%).
- **Отчёты** (`src/gausse/report/`, `src/gausse/web/`): веб-дашборд с
drill-down до каждой детали и энергобаланса ступени, графики ток/поле/
скорость, GIF-анимация выстрела (равномерное физическое время, результат
эксперимента в кадре), BOM с ценами и ссылками «купить».
## Запуск (Docker — основной способ)
```bash
docker compose build
docker compose run --rm --entrypoint pytest gausse -q # тесты
docker compose up -d web # дашборд :8000
docker compose run --rm gausse sweep --n 100000 --db /app/results/gausse.sqlite3
docker compose run --rm gausse evolve --generations 80 --population 300 \
--db /app/results/gausse.sqlite3
docker compose run --rm gausse report --top 3 --animate --db /app/results/gausse.sqlite3
```
GPU-режим (нужны NVIDIA-драйвер и `pip install cupy-cuda12x[ctk]`, вне Docker):
```bash
gausse sweep --gpu --n 1000000 --db results/gausse.sqlite3
```
Результаты (SQLite + лог хода эксперимента `<db>.log`) живут в `./results`,
примонтированном в контейнер, и переживают пересборку образа.
## Установка без Docker (локальная разработка)
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
```
## Автономная работа на сервере
Эволюция оформлена как systemd-сервис `gausse-evolve` (вечный цикл: 120
поколений × 1000 особей на GPU, по окончании новый цикл со свежей
случайной популяцией; `Restart=always`, автозапуск при загрузке). Дашборд Docker-
сервис `web` на :8000, читает ту же базу. Счётчик «запланировано» на
дашборде план **текущего цикла**, а не всего поиска: поиск бесконечен.
## Ограничения модели (честно)
- Индуктивность инженерная модель (Уилер + размагничивание сфероида +
tanh-перекрытие), не МКЭ; точная картина поля требует FEA.
- Вихревые потери снаряда сосредоточенный виток; диффузия поля в снаряд
одночастотная оценка скин-кольца, а не решение уравнения диффузии.
- Доуэлл берёт одну характерную частоту ω=1/√(LC), без спектра импульса.
- Воздух лобовое сопротивление; поршневой эффект столба воздуха в трубе
не учтён. Трение константа 0.35 (сталь-пластик), не измерено.
- Гистерезис снаряда посчитан и сознательно не включён в динамику (<0.1%).
- Нагрев провода за импульс и от серии выстрелов не моделируется.
Версия физики пишется в каждую запись (`model_version`, сейчас `gausse-physics-v4`) прогоны разных моделей не смешиваются.