plate-solver
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-функции В. Л. Рвачёва для геометрии, метод Ритца для изгиба, метод обобщённой реакции для контакта со свободной границей, поправки уточнённой теории типа Кармана–Тимошенко–Нагди.
| прогиб w(x, y), L-форма со штампом | напряжения лицевых поверхностей | контактный планшет (МОР) |
Документация: CASE_SCHEMA (схема case-файлов) · THEORY (теория) · API · ARCHITECTURE · FEATURES (матрица возможностей) · NOTES (журнал тонкостей).
Триада «Модель — Алгоритм — Программа» (по Самарскому):
- Модель — изгиб пластины (расщепление бигармоники
D·Δ²w = q̃на две задачи Пуассона) и поправки уточнённой теории типа Кармана–Тимошенко–Нагди (поперечный сдвиг + поперечное обжатие,ktn.py); - Геометрия — граница произвольной области R-функциями В. Л. Рвачёва
(ω(x, y) = 0); структура решения
w = ω·Φудовлетворяет краевым условиям тождественно; - Численный метод — Ритц на базисе
ω·Φ(Φ — полиномы Чебышёва), матрица Ритца факторизуется один раз (Холецкий); - Контакт — метод обобщённой реакции (МОР) для одностороннего контакта
со свободной границей:
r ← max(0, r + β(w − Δ)).
Статус: работает. Изгиб (мягкий шарнир и жёсткое защемление), контакт МОР на неканонических областях (L-форма с входящим углом), поправки КТН, 1D-задел (балка-полоса, штамп) и верификационная лестница — всё покрыто тест-воротами (см. таблицу ниже) и воспроизводится одним прогоном.
Установка
pip install plate-solver
Из исходников (для разработки — тесты и МКЭ-верификация):
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]" # + ".[dev,fem]" для независимой МКЭ-верификации
Быстрый старт через case-файлы
Постановка задачи описывается TOML-файлом (схема — docs/CASE_SCHEMA.md):
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; --out у plate-verify действует только со свипом |
--figures, --fig-format, --surface |
фигуры: форматы и выбор поверхности (mid/top/bottom); только plate-solve — plate-verify их отклоняет (у plate-replot свои --fig-format/--surface) |
--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/ — полные ступени верификации (лестница), cases/ci/ — лёгкие копии, каждая автоматически является CI-тестом. Блок-схема диспетчера — docs/dispatch_flow.md.
Быстрый старт через API: контакт L-формы с жёстким основанием
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}, сошлось: {res.converged}") # ЧИТАТЬ ОБЯЗАТЕЛЬНО
print(f"узлов контакта: {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)
Флаг res.converged в этом примере — False: классический контакт под
жёстким основанием «полусходится» (пик давления у кромки зоны растёт с
бюджетом — особенность решения Кирхгофа, docs/NOTES.md §11), поэтому
смотреть надо на невязку комплементарности и перелёт зазора, а не на
флаг. Тракт case-файла в таком случае пишет предупреждение в
Result.warnings; уточнённые теории (ktn_linear/ktn_full) сходятся
за счёт члена податливости.
Числа ↔ скрипты ↔ тесты
Все эталонные числа получаются ОДНИМ прогоном
python scripts/run_reference.py (из корня; результат —
results/reference/reference_v0.8.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.54; узлы ×1.94; w_max +2.8 % | 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 |
| Лестница случаев (28 ladder-ступеней: кольца, точечные силы, патчи, Леви, свободный край, контакты, пара пластин) | rel ≤ замороженных tol («факт × 3») | run_reference.py |
test_ci_cases.py, big-тесты ступеней |
| Замкнутый контакт круг+основание (фабрика) | w_max 3.9e-3; полная сила 3.1e-3 | — | test_analytic_factory.py |
| Сертификат КТН-контакта (редукция к сертифицированной классике) | пол дискретизации 2.7e-3; поправка гаснет как h² | — | test_contact_ktn_certificate.py |
| Плато реакции при малом зазоре (L-форма) | зона 84 % площади, r/q₀ = 1.06 в глубине, F/Q = 0.80 | — | test_lshape_plateau.py |
Запуск
pytest -m "not big and not fem" # быстрые ворота (~15–20 мин на ядре)
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).
Metadata
Release files for plate-solver 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| plate_solver-0.8.0.tar.gz | 3.4 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| plate_solver-0.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.7 MB
Release files / plate_solver-0.8.0.tar.gz
| Download URL | plate_solver-0.8.0.tar.gz |
|---|---|
| Size | 3.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
103913ae2f5a0f62daeadaf54860d9d7af7056797e89d49c3b145d2593b7ba72
|
|
BLAKE2b-256 checksum How to use checksums |
1933618d37c1f3d527b00fb24f8b966af967cd8bc4a0b0641d7283dabfc96f2b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.
Transparency logRelease files / plate_solver-0.8.0-py3-none-any.whl
| Download URL | plate_solver-0.8.0-py3-none-any.whl |
|---|---|
| Size | 311.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ef6e56b6ecaafbba09b04cc76af2490ad319e00e3108c4dd9458fe08bb1733ec
|
|
BLAKE2b-256 checksum How to use checksums |
c34b6e86f876d8f66d1e51256c9e05f8f1389453d322ad487af7446177f1cb93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.
Transparency log