first commit

This commit is contained in:
Masha
2026-09-01 09:57:03 +03:00
commit 2168b2200a
+158
View File
@@ -0,0 +1,158 @@
# 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 и каталоги сборки намеренно не хранятся в
репозитории.