Добрый день.Я пишу руководство по программированию метода конечных элементов в 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 степенями свободы на узел.Это также требует программирования не обобщенной анонимной функции, так что это тоже может быть лучше.