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