Генерация индексной матрицы DOF в Matlab для анализа методом конечных элементов - PullRequest
0 голосов
/ 19 сентября 2019

Добрый день.Я пишу руководство по программированию метода конечных элементов в Matlab, и у меня было много шансов найти различные способы генерирования матрицы DOF, связанной с элементами, сейчас мы назовем это elemDOF.

Что это за elemDOF матрица?Что ж, начнем с основ!Каждая модель FEM начинается с набора узлов в пространстве ( узлов на плоскости ).Эти узлы позже объединяются набором элементов .Каждый элемент имеет набор узлов, связанных с ним.В зависимости от домена узлы могут иметь одну или несколько степеней свободы.Степени свободы, или DOF представляют переменную, которую мы хотим найти в узлах, а затем интерполируем внутри элемента, это может быть температура, смещение или даже напряжение.

Но этоsidenote, я перейду к погоне.elemDOF - это матрица, в которой столько строк, сколько элементов в модели.Каждая строка содержит упорядоченный DOF, соответствующий элементу.elemDOF должно быть получено из матрицы elements и Num_DOF_per_node, или числа степеней свободы на узел.Для простоты мы предполагаем, что все узлы имеют одинаковое количество степеней свободы.

elements содержит столбец для каждого узла, связанного с элементом (столько столбцов, сколько имеется узлов в элементе).Если вещи по-прежнему не имеют особого смысла, вот пример: Пример дискретизации!

Видя, как квадратные серые прямоугольники содержат метки элементов, а остальное - нумерация узлов: elementsматрица будет

elements = [1 2 5 4
        2 3 6 5
        5 6 8 7
        6 9 10 8]; % Clockwise numbering

Моя матрица elemDOF будет зависеть от количества степеней свободы.Предположим, что Num_DOF_per_node=3, elemDOF отобразит DOF, связанный с элементами, следующим образом:

Num_DOF_per_node=3; % Ergo:
elemDOF = [  1     2     3     4     9    10     7     8
             3     4     5     6    11    12     9    10
             9    10    11    12    15    16    13    14
            11    12    17    18    19    20    15    16 ];

Можно создать цикл for и перебрать элементы и узлы элементов ... это не моя чашка чая.Можно также утверждать, что какое-то кустарное использование bsxfun могло бы решить проблему, но я еще не нашел способ, который не позволил бы начинающим пользователям чесать голову.

Это лучшее, что я придумалс на данный момент: (прекрасно работает с 1D элементами и 2D с 2 степенями свободы на узел и выбирает 3D элементы)

node2dof = @(n) [n*3 - 2; n*3-1; n*3]; % 3 DOF per node example
aux = node2dof(reshape(elements',[],1)');
elemDOF = reshape(aux,size(aux'))';

Проблема с ним в том, что он не работает в приведенном выше примере с 3 степенями свободы на узел.Это также требует программирования не обобщенной анонимной функции, так что это тоже может быть лучше.

...