commit 2168b2200ab08face41ac68db0c1544f0e455d97 Author: Masha Date: Tue Sep 1 09:57:03 2026 +0300 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..efcefa1 --- /dev/null +++ b/README.md @@ -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 и каталоги сборки намеренно не хранятся в +репозитории.