first commit
This commit is contained in:
@@ -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 и каталоги сборки намеренно не хранятся в
|
||||
репозитории.
|
||||
Reference in New Issue
Block a user