Metadata-Version: 2.4
Name: plate-solver
Version: 0.7.0
Summary: Расчёт изгиба и контактного взаимодействия упругих пластин произвольного очертания (уточнённая теория КТН + R-функции + метод обобщённой реакции).
Author: А. А. Дуркин
License-Expression: MIT
Project-URL: Homepage, https://github.com/AnatoDu/plate-solver
Project-URL: Repository, https://github.com/AnatoDu/plate-solver
Project-URL: Changelog, https://github.com/AnatoDu/plate-solver/blob/main/CHANGELOG.md
Project-URL: Documentation, https://github.com/AnatoDu/plate-solver/tree/main/docs
Keywords: plates,bending,contact-problem,R-functions,generalized-reaction-method,biharmonic,computational-mechanics
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Physics
Classifier: Natural Language :: Russian
Classifier: Operating System :: OS Independent
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: matplotlib>=3.10.9
Requires-Dist: numpy>=1.24
Requires-Dist: scipy>=1.10
Requires-Dist: sympy>=1.12
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: ruff>=0.4; extra == "dev"
Requires-Dist: build>=1.0; extra == "dev"
Requires-Dist: twine>=5.0; extra == "dev"
Provides-Extra: fem
Requires-Dist: scikit-fem>=9; extra == "fem"
Provides-Extra: notebooks
Requires-Dist: jupyter; extra == "notebooks"
Requires-Dist: ipympl; extra == "notebooks"
Dynamic: license-file

# plate-solver

[![CI](https://github.com/AnatoDu/plate-solver/actions/workflows/ci.yml/badge.svg)](https://github.com/AnatoDu/plate-solver/actions)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/AnatoDu/plate-solver/blob/main/LICENSE)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21218627.svg)](https://doi.org/10.5281/zenodo.21218627)

*plate-solver computes bending and unilateral (Signorini) contact of thin
elastic plates of arbitrary planform: R-functions (Rvachev) describe the
geometry, a spectral Ritz method solves the bending, the generalized
reaction method resolves contact with a free boundary, and refined-theory
corrections (Karman–Timoshenko–Naghdi type) account for transverse shear
and compression. Every shipped number is defended by test gates; every
canonical reference solution is self-certified. Documentation is in
Russian.*

Комплекс программ для расчёта **изгиба и одностороннего контакта упругих
пластин произвольного очертания**: R-функции В. Л. Рвачёва для геометрии,
метод Ритца для изгиба, метод обобщённой реакции для контакта со свободной
границей, поправки уточнённой теории типа Кармана–Тимошенко–Нагди.

| | | |
|---|---|---|
| ![Прогиб](https://raw.githubusercontent.com/AnatoDu/plate-solver/main/docs/img/lshape_stamp_w.png) | ![Напряжения](https://raw.githubusercontent.com/AnatoDu/plate-solver/main/docs/img/lshape_stamp_stress.png) | ![Контакт](https://raw.githubusercontent.com/AnatoDu/plate-solver/main/docs/img/lshape_stamp_contact.png) |
| прогиб w(x, y), L-форма со штампом | напряжения лицевых поверхностей | контактный планшет (МОР) |

Документация: [CASE_SCHEMA](https://github.com/AnatoDu/plate-solver/blob/main/docs/CASE_SCHEMA.md) (схема case-файлов) ·
[THEORY](https://github.com/AnatoDu/plate-solver/blob/main/docs/THEORY.md) (теория) · [API](https://github.com/AnatoDu/plate-solver/blob/main/docs/API.md) ·
[ARCHITECTURE](https://github.com/AnatoDu/plate-solver/blob/main/docs/ARCHITECTURE.md) · [FEATURES](https://github.com/AnatoDu/plate-solver/blob/main/docs/FEATURES.md)
(матрица возможностей) · [NOTES](https://github.com/AnatoDu/plate-solver/blob/main/docs/NOTES.md) (журнал тонкостей).

Триада «Модель — Алгоритм — Программа» (по Самарскому):

- **Модель** — изгиб пластины (расщепление бигармоники `D·Δ²w = q̃` на две
  задачи Пуассона) и поправки уточнённой теории типа Кармана–Тимошенко–Нагди
  (поперечный сдвиг + поперечное обжатие, `ktn.py`);
- **Геометрия** — граница произвольной области R-функциями В. Л. Рвачёва
  (ω(x, y) = 0); структура решения `w = ω·Φ` удовлетворяет краевым условиям
  тождественно;
- **Численный метод** — Ритц на базисе `ω·Φ` (Φ — полиномы Чебышёва),
  матрица Ритца факторизуется один раз (Холецкий);
- **Контакт** — метод обобщённой реакции (МОР) для одностороннего контакта
  со свободной границей: `r ← max(0, r + β(w − Δ))`.

Статус: **работает**. Изгиб (мягкий шарнир и жёсткое защемление), контакт
МОР на неканонических областях (L-форма с входящим углом), поправки КТН,
1D-задел (балка-полоса, штамп) и верификационная лестница — всё покрыто
тест-воротами (см. таблицу ниже) и воспроизводится одним прогоном.

## Установка

```bash
pip install plate-solver
```

Из исходников (для разработки — тесты и МКЭ-верификация):

```bash
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"        # + ".[dev,fem]" для независимой МКЭ-верификации
```

## Быстрый старт через case-файлы

Постановка задачи описывается TOML-файлом (схема — [docs/CASE_SCHEMA.md](https://github.com/AnatoDu/plate-solver/blob/main/docs/CASE_SCHEMA.md)):

```bash
plate-solve --new annulus        # шаблон annulus.toml (закомментирован)
plate-solve annulus.toml         # решить: result.json + фигуры
plate-verify annulus.toml        # таблица «эталон | значение | rel | статус», exit 0/1
plate-verify annulus.toml --sweep p=2:12:2   # сходимость: md + csv + png
plate-ladder cases/ci            # каталог случаев → сводный md с провенансом
```

| Команда | Что делает |
|---|---|
| `plate-solve case.toml` | решает постановку, пишет `result.json` (+фигуры) |
| `plate-solve --new KIND` | шаблон case-файла (circle/rectangle/L/annulus/ellipse/compose) |
| `plate-verify case.toml` | сверка с эталонами `[verify]`, exit 0/1 по tol |
| `plate-solve --check case.toml` | только валидация постановки (для CI), exit 0/1 |
| `plate-solve --report …` | одностраничный md-отчёт по кейсу |
| `plate-replot dir/` | перерисовать фигуры из `fields.npz` без пересчёта |
| `plate-profile dir/ --key w --from x0,y0 --to x1,y1` | профиль поля вдоль сечения (+CSV, наложения) |
| `--sweep p=2:12:2`, `Q=…` | свип дискретизации (md+csv+png), в solve и verify |
| `--figures`, `--fig-format`, `--surface` | фигуры: форматы и выбор поверхности (mid/top/bottom) |
| `--grid N` | сетка вывода полей/фигур (на числа решения не влияет); после расчёта — `result.regrid(N)` |
| `plate-ladder КАТАЛОГ` | прогон реестра случаев, сводка с провенансом |
| `--version` | версия пакета (все пять команд) |
| `--help` | справка по команде с примерами внизу (все пять команд) |

Нагрузки в схеме: `uniform` (q0), `patch` (q0 + зона тем же геометрическим
языком), `gaussian` (гладкая локализованная, аналитический Δq для КТН),
`point` (P, x0, y0 — регуляризованное пятно eps; `exact = true` — ИСТИННАЯ
δ там, где функционал ограничен: classic clamped и karman, v0.7.0 — см.
docs/NOTES.md §18), `expr` (произвольная гладкая q0·g(x, y) выражением за
токен-оградой, v0.7.0) и `line` (погонная вдоль отрезка, v0.7.0); плюс
`thermal_moment` (термоизгиб) при uniform. Произвольное поле доступно и
через API (`f_values` в узлах квадратуры, пример в CASE_SCHEMA).

Реестры: [cases/ladder/](https://github.com/AnatoDu/plate-solver/tree/main/cases/ladder) — полные ступени верификации
(лестница), [cases/ci/](https://github.com/AnatoDu/plate-solver/tree/main/cases/ci) — лёгкие копии, каждая автоматически
является CI-тестом. Блок-схема диспетчера — [docs/dispatch_flow.md](https://github.com/AnatoDu/plate-solver/blob/main/docs/dispatch_flow.md).

## Быстрый старт через API: контакт L-формы с жёстким основанием

```python
from plate_solver import Config, viz
from plate_solver.contact import solve_contact
from plate_solver.geometry import make_L

cfg = Config(h=0.06, p=10, Q=120, Delta=5.0e-5, max_iter=8000)
res = solve_contact(cfg, make_L(side=1.0, cut=0.5))  # изгиб + односторонний контакт (МОР)
print(f"итераций МОР: {res.iters}, узлов контакта: {int((res.r_nodes > 0).sum())}")
print(f"комплементарность: {res.comp_residual:.1e}, перелёт зазора: {res.gap_overshoot:.1e}")
viz.plot_contact_summary(cfg, res).savefig("contact_L.png", dpi=150)
```

## Числа ↔ скрипты ↔ тесты

Все эталонные числа получаются ОДНИМ прогоном
`python scripts/run_reference.py` (из корня; результат —
`results/reference/reference_v0.6.md` + csv, заморожен SHA-256:
`tests/test_reference_hash.py`) и защищены тест-воротами:

| Результат | Ключевые числа | Скрипт | Тест-ворота |
|---|---|---|---|
| Верификация на круге | ошибка < 0.1 %; модельный разрыв мягкого шарнира 26.42 % | `run_circle.py` | `test_plate_circle.py` |
| Верификация L-формы (МКЭ) | RFM↔FEM-Marcus 2.64 %; парадокс Сапонджяна 54.86 % | `run_lshape_verify.py` | `test_lshape.py` |
| Контакт МОР на L-форме | 8000 итер.; 67/10800 узлов; r_max = 112.58; комплементарность 8.59e-2 | `run_lshape_contact.py` | `test_contact.py` |
| Поправки КТН (классика ↔ КТН) | пик реакции ×0.095; узлы ×7.75; w_max +22.3 % | `run_ktn.py` | `test_ktn.py` |
| 1D-штамп (эталон Maple) | согласие 2.4 % (L²) | `run_stamp_1d.py` | `test_stamp.py` |
| Верификация 1D↔2D (круг) | 1D↔2D↔аналитика, 0.1 % | `run_circle_1d_2d.py` | `test_circle_1d_2d.py` |
| Вклад R-функций (vs штраф) | 1 % при N=9 против N=25; лучше cond | `run_rvachev_vs_penalty.py` | `test_rvachev_vs_penalty.py` |
| Лестница верификации изгиба | машинная точность → эталоны | `run_ladder_*.py` | `test_ladder.py` |
| Лестница случаев (24 ladder-ступени: кольца, точечные силы, патчи, Леви, свободный край, контакты, пара пластин) | rel ≤ замороженных tol («факт × 3») | `run_reference.py` | `test_ci_cases.py`, big-тесты ступеней |
| Замкнутый контакт круг+основание (фабрика) | w_max 3.9e-3; полная сила 3.1e-3 | — | `test_analytic_factory.py` |

## Запуск

```bash
pytest -m "not big and not fem"     # быстрые ворота (~1 мин)
pytest                              # все ворота (big: Q≥1024; fem: scikit-fem)
python examples/circular_plate.py   # минимальный пример (аналитика)
python scripts/run_reference.py     # единый эталонный прогон (из корня)
ruff check .                        # стиль
```

`pytest` работает и без установки пакета: пути `src/` и `scripts/` прописаны
в `pyproject.toml`.

Снимок исходников одной командой: `git archive -o plate-solver.zip HEAD`
(войдёт ровно отслеживаемое дерево — с docs/, cases/, notebooks/).

## Структура

```
src/plate_solver/    модули плоско:
  problem, dispatch, cli, config           case-файлы: схема, диспетчер, CLI
  geometry, basis, quadrature, assembler   область (R-функции) и дискретизация
  poisson, plate, clamped, radial          решатели изгиба (Ритц)
  membrane, ktn_full, theory, ktn_solver   нелинейные теории (Карман, полная КТН)
  contact, contact_nl, contact_face, ktn   контакт (МОР) и поправки КТН
  eigenmodes, faces, diagnostics, export   собств. задачи, лицевые, поля/VTK
  exprfield                                безопасные выражения f(x, y) схемы
  mor1d, green1d, stamp, stamp_ritz        1D-задел (балка-полоса, штамп)
  analytic, analytic_auto, benchmarks      эталоны (аналитика, Карман)
  ladder, penalty, verify_fem              лестница верификации, МКЭ-дублёр
  radial_ktn, fd_contact                   верификационные кирпичи (1D КТН, КР+МОР)
  viz                                      графика
  data/                                    эталон Maple (см. data/README.md)
cases/               ci/ — быстрые case-файлы (каждый — CI-тест); ladder/ — тяжёлые
notebooks/           обучающая цепочка 01–09 (см. notebooks/README.md)
scripts/             run_*.py — расчётные серии; run_reference.py — эталонный отчёт;
                     reproduce_all.py — конвейер воспроизводимости
tests/               тест-ворота (маркеры big и fem — см. pyproject)
examples/            минимальные воспроизводимые примеры
docs/NOTES.md        тонкости и подводные камни (журнал заметок)
```

## Оценка качества и провенанс верификации

Комплекс сопровождается по трём независимым осям оценки научно-исследовательского
расчётного ПО — добротность (инженерное качество), достоверность (верификация
и валидация), доступность (FAIR4RS):

* **добротность** — тест-ворота на каждый метод, CI (несколько версий Python +
  ruff в конвейере), зафиксированные зависимости, вычисляемая матрица
  возможностей (`docs/FEATURES.md`), эталонный прогон под SHA-контролем,
  систематические негативные тесты входного языка схемы
  (`tests/test_negative_schema.py`);
* **достоверность** — верификационная лестница возрастающей сложности:
  аналитические эталоны (в т.ч. самосертифицирующийся генератор), MMS,
  перекрёстные проверки независимыми методами и программами (МКЭ scikit-fem,
  конечно-разностный дублёр контакта, 1D-оракул КТН), редукционная
  верификация единой параметрической модели; межмодельные расхождения
  фиксируются означенным статусом, а не выдаются за дефект. Методология
  следует практике V&V вычислительной механики (ASME V&V 10; семейство
  ГОСТ Р 57700), валидация модели — унаследованная, с явным источником;
* **доступность** — архивная запись с concept- и version-DOI, двуязычные
  машиночитаемые метаданные (CITATION.cff, .zenodo.json, codemeta.json),
  квалифицированные связи с публикациями и **машиночитаемый провенанс
  верификации**: блок `vvprov:verification` в `codemeta.json` перечисляет
  верификационные акты (эталон, тип проверки, метрика, достигнутая величина,
  статус, версия, воспроизводящий артефакт); блок самопроверяем —
  `tests/test_vvprov.py` сверяет записи с репозиторием и версией.

## Цитирование

При использовании комплекса просьба ссылаться на архивную запись
Zenodo. Для ссылки на проект в целом используйте concept DOI
(всегда указывает на последнюю версию):
**https://doi.org/10.5281/zenodo.21218627**

DOI конкретной версии выдаётся Zenodo на каждый релиз — см. раздел
«Versions» на странице записи (concept DOI выше всегда ведёт на
последнюю). Полные метаданные цитирования — в `CITATION.cff`
(машиночитаемо; `codemeta.json` — то же в схеме CodeMeta/schema.org).

## Лицензия

MIT (см. `LICENSE`).
