From 04233aefd78aaecc637e88ef6114285a5602b308 Mon Sep 17 00:00:00 2001 From: jze9 Date: Mon, 6 Jul 2026 19:38:06 +0500 Subject: [PATCH] Scaffold gausse coilgun simulator project src-layout Python package with CLI stub (sweep/evolve/simulate/report subcommands), pyproject.toml pinned to numpy/scipy/matplotlib, and PLAN.md tracking the implementation roadmap. Co-Authored-By: Claude Sonnet 5 --- .gitignore | 13 ++++++++++++ PLAN.md | 34 +++++++++++++++++++++++++++++++ README.md | 20 ++++++++++++++++++ pyproject.toml | 29 ++++++++++++++++++++++++++ src/gausse/__init__.py | 0 src/gausse/cli.py | 18 ++++++++++++++++ src/gausse/components/__init__.py | 0 src/gausse/optim/__init__.py | 0 src/gausse/physics/__init__.py | 0 src/gausse/report/__init__.py | 0 src/gausse/sim/__init__.py | 0 src/gausse/storage/__init__.py | 0 12 files changed, 114 insertions(+) create mode 100644 .gitignore create mode 100644 PLAN.md create mode 100644 README.md create mode 100644 pyproject.toml create mode 100644 src/gausse/__init__.py create mode 100644 src/gausse/cli.py create mode 100644 src/gausse/components/__init__.py create mode 100644 src/gausse/optim/__init__.py create mode 100644 src/gausse/physics/__init__.py create mode 100644 src/gausse/report/__init__.py create mode 100644 src/gausse/sim/__init__.py create mode 100644 src/gausse/storage/__init__.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..55e7099 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +__pycache__/ +*.py[cod] +*.egg-info/ +.pytest_cache/ +.venv/ +venv/ +build/ +dist/ +*.sqlite3 +*.sqlite3-wal +*.sqlite3-shm +out/ +.DS_Store diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000..a2fe970 --- /dev/null +++ b/PLAN.md @@ -0,0 +1,34 @@ +# План: Gauss-ускоритель — симулятор и оптимизатор + +Многоступенчатый электромагнитный ускоритель ферромагнитного цилиндра (coilgun). +Каждая ступень: разгонная катушка (Cu/Al провод на пластиковой трубке) + батарея +конденсаторов через тиристор/MOSFET, и датчик прохода снаряда перед катушкой +(компенсация задержки включения ключа). Датчик — два конкурирующих варианта: +индукционная катушка (сигнал ~ скорости снаряда, слаб на медленных ступенях) и +оптопара/датчик Холла (не зависит от скорости) — оптимизатор сравнивает оба. + +Цель поиска — КПД (кинетическая энергия снаряда на выходе / энергия во всех +конденсаторах). Скорость и стоимость — вторичные метрики. Число ступеней N, +геометрия/материал снаряда, все компоненты — часть пространства поиска, а не +фиксированные входы. Компоненты — реальные, розничные (Проконтакт/procontact74.ru, +ChipDip, Cable.ru и др.). + +Требование: миллионы прогонов (Monte Carlo/LHS sweep + эволюционный поиск), +**все** результаты — успешные и неудачные, с честной причиной отказа — пишутся +в SQLite. Никаких приукрашенных цифр — если модель показывает низкий КПД или +нереализуемость, это тоже результат. + +Полный план архитектуры: см. историю обсуждения / `physics`, `sim`, `optim`, +`storage`, `report` модули ниже. + +## Чек-лист этапов + +- [x] **Этап 0 — Скелет проекта**: `pyproject.toml`, `README.md`, `.gitignore`, пакеты `src/gausse/*`, этот файл, первый коммит. +- [ ] **Этап 1 — База реальных компонентов**: провод Cu/Al (сечения, сопротивление, цена/м), конденсаторы (ёмкость/напряжение/ESR/цена, фотовспышечные электролитические как бюджетный вариант), тиристоры (КУ202 и аналоги) и MOSFET/IGBT, датчики (индукционная катушка vs оптопара/Холл), материалы снаряда (сталь/железо: μr, B_sat, плотность, цена/кг) → `components/data/*.json`. +- [ ] **Этап 2 — Физическое ядро**: `physics/constants.py`, `inductance.py` (Уилер + ферромагнитный сердечник + размагничивание), `force.py` (с насыщением), `circuit.py` (ОДУ RLC). Юнит-тесты: аналитическое RLC-решение, согласованность dL/dx. +- [ ] **Этап 3 — Датчики и одна ступень**: `physics/sensors.py` (оба типа как события solve_ivp), `sim/stage.py` (полёт → триггер → разряд → энергобаланс). Тест на сохранение энергии. +- [ ] **Этап 4 — Многоступенчатая цепочка**: `sim/coilgun.py` — сквозная координата, отбраковка нереализуемых конфигураций. +- [ ] **Этап 5 — Хранилище результатов**: `storage/schema.py` + `database.py` — SQLite (WAL), таблица `runs` со всеми прогонами (успех/провал + честная причина), однопроцессный писатель поверх многопроцессной очереди. +- [ ] **Этап 6 — Поиск и оптимизация**: `optim/search_space.py` (геном переменной длины), `objective.py` (КПД), дешёвый квазистатический предфильтр, `optim/sweep.py` (Monte Carlo/LHS, миллионы прогонов), `optim/evolutionary.py` (ГА + coordinate-descent полировка) — всё пишется в общую таблицу `runs`. +- [ ] **Этап 7 — Отчётность**: `report/plots.py`, `summary.py`, `bom.py`, раздел "ограничения модели", `cli.py` (`gausse sweep/evolve/simulate/report`). +- [ ] **Этап 8 — Сквозная проверка**: резюмируемый прогон на реальной базе компонентов, проверка честной записи в SQLite, финальный отчёт (КПД, скорость, стоимость, сравнение датчиков) с разделом ограничений. diff --git a/README.md b/README.md new file mode 100644 index 0000000..76b7f4d --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# gausse + +Симулятор и оптимизатор многоступенчатого электромагнитного ускорителя +(coilgun) на реальных, доступных в рознице компонентах. + +Полный план и чек-лист этапов — в [PLAN.md](PLAN.md). + +## Установка + +```bash +python3 -m venv .venv +source .venv/bin/activate +pip install -e ".[dev]" +``` + +## Тесты + +```bash +pytest +``` diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..1d459b8 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "gausse" +version = "0.1.0" +description = "Симулятор и оптимизатор многоступенчатого электромагнитного ускорителя (coilgun)" +requires-python = ">=3.11" +dependencies = [ + "numpy>=1.26", + "scipy>=1.11", + "matplotlib>=3.8", +] + +[project.optional-dependencies] +dev = ["pytest>=8.0"] + +[project.scripts] +gausse = "gausse.cli:main" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +gausse = ["components/data/*.json"] + +[tool.pytest.ini_options] +testpaths = ["tests"] diff --git a/src/gausse/__init__.py b/src/gausse/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gausse/cli.py b/src/gausse/cli.py new file mode 100644 index 0000000..8f95bf3 --- /dev/null +++ b/src/gausse/cli.py @@ -0,0 +1,18 @@ +import argparse + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(prog="gausse") + subparsers = parser.add_subparsers(dest="command", required=True) + subparsers.add_parser("sweep", help="массовый Monte Carlo/LHS перебор конфигураций") + subparsers.add_parser("evolve", help="эволюционный поиск поверх базы прогонов") + subparsers.add_parser("simulate", help="прогнать одну конфигурацию") + subparsers.add_parser("report", help="построить отчёт по сохранённым результатам") + + args = parser.parse_args(argv) + parser.error(f"команда '{args.command}' ещё не реализована") + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/gausse/components/__init__.py b/src/gausse/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gausse/optim/__init__.py b/src/gausse/optim/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gausse/physics/__init__.py b/src/gausse/physics/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gausse/report/__init__.py b/src/gausse/report/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gausse/sim/__init__.py b/src/gausse/sim/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gausse/storage/__init__.py b/src/gausse/storage/__init__.py new file mode 100644 index 0000000..e69de29