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 <noreply@anthropic.com>
This commit is contained in:
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.egg-info/
|
||||||
|
.pytest_cache/
|
||||||
|
.venv/
|
||||||
|
venv/
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
*.sqlite3
|
||||||
|
*.sqlite3-wal
|
||||||
|
*.sqlite3-shm
|
||||||
|
out/
|
||||||
|
.DS_Store
|
||||||
34
PLAN.md
Normal file
34
PLAN.md
Normal file
@@ -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, финальный отчёт (КПД, скорость, стоимость, сравнение датчиков) с разделом ограничений.
|
||||||
20
README.md
Normal file
20
README.md
Normal file
@@ -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
|
||||||
|
```
|
||||||
29
pyproject.toml
Normal file
29
pyproject.toml
Normal file
@@ -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"]
|
||||||
0
src/gausse/__init__.py
Normal file
0
src/gausse/__init__.py
Normal file
18
src/gausse/cli.py
Normal file
18
src/gausse/cli.py
Normal file
@@ -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())
|
||||||
0
src/gausse/components/__init__.py
Normal file
0
src/gausse/components/__init__.py
Normal file
0
src/gausse/optim/__init__.py
Normal file
0
src/gausse/optim/__init__.py
Normal file
0
src/gausse/physics/__init__.py
Normal file
0
src/gausse/physics/__init__.py
Normal file
0
src/gausse/report/__init__.py
Normal file
0
src/gausse/report/__init__.py
Normal file
0
src/gausse/sim/__init__.py
Normal file
0
src/gausse/sim/__init__.py
Normal file
0
src/gausse/storage/__init__.py
Normal file
0
src/gausse/storage/__init__.py
Normal file
Reference in New Issue
Block a user