8.4 KiB
MKSE Elasticity
Исследовательская реализация метода конечных суперэлементов (МКСЭ) для двумерных задач линейной упругости с контактным сопряжением двух тел. Программа строит локальные конечно-элементные модели, формирует базис суперэлементов и связывает несовпадающие контактные сетки mortar-условием с множителями Лагранжа.
Проект не требует сторонних библиотек и собирается компилятором с поддержкой C++20.
Возможности
- декартова и осесимметричная постановки;
- независимые прямоугольные сетки верхнего и нижнего тел;
- граничные условия первого и второго рода;
- три варианта дискретизации контактной границы;
- восстановление перемещений и нормальных контактных напряжений;
- вычисление относительной ошибки на задачах с известным точным решением;
- пакетный запуск нескольких конфигураций из одного текстового файла.
Численная схема
После построения суперэлементных матриц контактная задача записывается как седловая система
| 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
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.
Быстрый запуск
Запускайте программу из корня репозитория, чтобы результаты создавались рядом с проектом:
.\build\msbuild\bin\x64\Release\mkse-elasticity.exe .\input.txt
Путь к конфигурации необязателен. Без аргумента программа читает input.txt.
Если файл не найден, запускаются все встроенные задачи с параметрами по
умолчанию.
Конфигурация расчёта
Файл input.txt имеет простой 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 или другом пакете визуализации.
Структура репозитория
.
├── include/ # модели данных, интерфейсы и контактные схемы
├── src/ # МКЭ, МКСЭ, линейная алгебра и CLI
├── input.txt # воспроизводимый пример расчёта
├── CMakeLists.txt # переносимая сборка
├── mkse-elasticity.sln # решение Visual Studio 2022
└── mkse-elasticity.vcxproj # проект MSBuild
Сгенерированные файлы, кэши IDE и каталоги сборки намеренно не хранятся в репозитории.