Files
2026-09-01 09:57:03 +03:00

159 lines
8.4 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.
# MKSE Elasticity
Исследовательская реализация метода конечных суперэлементов (МКСЭ) для
двумерных задач линейной упругости с контактным сопряжением двух тел.
Программа строит локальные конечно-элементные модели, формирует базис
суперэлементов и связывает несовпадающие контактные сетки mortar-условием с
множителями Лагранжа.
Проект не требует сторонних библиотек и собирается компилятором с поддержкой
C++20.
## Возможности
- декартова и осесимметричная постановки;
- независимые прямоугольные сетки верхнего и нижнего тел;
- граничные условия первого и второго рода;
- три варианта дискретизации контактной границы;
- восстановление перемещений и нормальных контактных напряжений;
- вычисление относительной ошибки на задачах с известным точным решением;
- пакетный запуск нескольких конфигураций из одного текстового файла.
## Численная схема
После построения суперэлементных матриц контактная задача записывается как
седловая система
```text
| K_bottom 0 M_bottom | | u_bottom | | f_bottom |
| 0 K_top -M_top | | u_top | = | f_top |
| M_bottom^T -M_top^T 0 | | lambda | | 0 |
```
где `lambda` — коэффициенты множителей Лагранжа на контактной границе.
Система решается LU-разложением с перестановками. В осесимметричной постановке
при интегрировании учитывается вес `2*pi*r`.
Поддерживаются следующие контактные разбиения:
| Значение `contact` | Метод | Описание |
| --- | --- | --- |
| `s` / `slave` | Slave nodes | Множители размещаются в активных узлах пассивного тела. |
| `d` / `uniform_lambda` | Uniform lambda | Независимая равномерная сетка множителей задаёт также интервалы интегрирования. |
| `u` / `uniform_union` | Uniform union | Равномерная сетка множителей интегрируется по объединённому разбиению обеих контактных трасс. |
## Требования
- CMake 3.20 или новее;
- компилятор C++20: MSVC 19.3+, GCC 10+ или Clang 12+.
Для Windows также включено готовое решение Visual Studio 2022 с toolset `v143`.
## Сборка
### CMake
```bash
cmake -S . -B build
cmake --build build --config Release
```
Для многоконфигурационных генераторов исполняемый файл появится в
`build/Release/`, для одноконфигурационных — непосредственно в `build/`.
### Visual Studio
Откройте `mkse-elasticity.sln`, выберите конфигурацию `Release` и платформу
`x64`, затем выполните **Build Solution**. Результат будет сохранён в
`build/msbuild/bin/x64/Release/mkse-elasticity.exe`.
## Быстрый запуск
Запускайте программу из корня репозитория, чтобы результаты создавались рядом с
проектом:
```powershell
.\build\msbuild\bin\x64\Release\mkse-elasticity.exe .\input.txt
```
Путь к конфигурации необязателен. Без аргумента программа читает `input.txt`.
Если файл не найден, запускаются все встроенные задачи с параметрами по
умолчанию.
## Конфигурация расчёта
Файл `input.txt` имеет простой INI-подобный формат. Глобальные параметры
задаются до секций, каждая секция описывает отдельный запуск:
```ini
# a/axisymmetric или c/cartesian
coordinate = a
# s/slave, d/uniform_lambda или u/uniform_union
contact = u
# используется только при contact=slave
passive = top
[axisymmetric_inverse_r]
bottom_x = 5
bottom_y = 5
top_x = 9
top_y = 9
lambda = 5
```
Параметры сетки означают количество узлов суперэлемента по каждой координате.
Для равномерных контактных методов `lambda` задаёт количество узлов сетки
множителей Лагранжа и должен быть не меньше двух.
В исходный код включены четыре проверочные задачи с точным решением:
| Имя секции | Постановка | Точное поле перемещений |
| --- | --- | --- |
| `axisymmetric_inverse_r` | Осесимметричная | `u_r = 5/r`, `u_z = 0` |
| `axisymmetric_linear` | Осесимметричная | `u_r = 2r + 5/r`, `u_z = 34z` |
| `cartesian_exp` | Декартова | `u_x = exp(x) cos(y - 0.5)`, `u_y = -exp(x) sin(y - 0.5)` |
| `cartesian_linear` | Декартова | `u_x = -21x`, `u_y = 13y` |
Материал, геометрия, граничные условия и параметры сеток по умолчанию находятся
в `include/TestCases.h`. Строка `tests = all` запускает все встроенные задачи;
также поддерживается краткая запись вида
`test cartesian_linear bottom_x=8 bottom_y=8`.
## Результаты
Каждый запуск создаёт отдельный каталог
`res/<имя-задачи>/<параметры-запуска>/`. Каталог `res/` исключён из Git, поэтому
повторные расчёты не загрязняют историю репозитория.
| Файл | Содержимое столбцов |
| --- | --- |
| `bottom_displacement.txt`, `top_displacement.txt` | `x y u_x u_y` или `r z u_r u_z` |
| `*_displacement_x.txt`, `*_displacement_y.txt` | `x y u` для выбранной компоненты |
| `*_displacement_r.txt`, `*_displacement_z.txt` | `r z u` для выбранной компоненты |
| `contact_normal_stress.txt` | координата, напряжение снизу, напряжение сверху |
| `contact_normal_displacement.txt` | координата, перемещение снизу, перемещение сверху, разность |
| `lagrange_multipliers.txt` | координата, множитель Лагранжа |
| `error.txt` | относительная ошибка для каждого тела |
| `parameters.txt` | полная конфигурация запуска |
Текстовые результаты записываются с высокой точностью и подходят для
дальнейшей обработки в Python, MATLAB, Mathematica или другом пакете
визуализации.
## Структура репозитория
```text
.
├── include/ # модели данных, интерфейсы и контактные схемы
├── src/ # МКЭ, МКСЭ, линейная алгебра и CLI
├── input.txt # воспроизводимый пример расчёта
├── CMakeLists.txt # переносимая сборка
├── mkse-elasticity.sln # решение Visual Studio 2022
└── mkse-elasticity.vcxproj # проект MSBuild
```
Сгенерированные файлы, кэши IDE и каталоги сборки намеренно не хранятся в
репозитории.