159 lines
8.4 KiB
Markdown
159 lines
8.4 KiB
Markdown
# 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 и каталоги сборки намеренно не хранятся в
|
||
репозитории.
|