a 2D version
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.9 KiB

3 years ago
%--------------------------------------------------------------------------
% Mesh a L-shape using 4 noded Elements
%--------------------------------------------------------------------------
function [nodes, eles, eleNum, nodeNum,plotIdx, iK, jK] = GenerateL(nelx, nely)
% dbstop if error
% nelx = 20;
% nely = 20;
% left - rec
[nodes1, eles1, eleNum1, nodeNum1] = GenerateMesh(nelx/2, nely, nelx/2, nely);
% right - square
[nodes2, eles2, eleNum2, nodeNum2] = GenerateMesh(nelx/2, nely/2, nelx/2, nely/2);
nodes1(:,3) = 1:nodeNum1;
borderNodes = nodes1(end-nely:end-nely/2,3); % get border nodes index for eles2
% offset + nodes2
nodes2(:,1) = nodes2(:,1)+nelx/2;
nodes2(:,2) = nodes2(:,2)+nely/2;
% eles2(1:nely/2+1) -> borderNodes
[~,cols] = intersect(eles2,1:nely/2+1);
% offset + eles2
eles2 = eles2+nodeNum1-(nely/2+1);
% eles2(1:nely/2+1) -> borderNodes
tempeles2 = eles2(:);
tempeles2(cols,1) = borderNodes;
eles2 = reshape(tempeles2,eleNum2,4);
nodes = [nodes1;nodes2(nely/2+2:end,:)];
eles = [eles1;eles2];
eleNum = eleNum1+eleNum2;
nodeNum = nodeNum1+nodeNum2-(nely/2+1);
nodes(:,3) = 1:nodeNum;
% compute the ele IDX of L shape, include the right-down empty square
plotIdx = 1:(nely*nelx/2); % left - rec
for i = 0:(nelx/2-1)
temp = (i*nely+1) : (nely/2+(i*nely));
plotIdx = [plotIdx,temp+(nely*nelx/2)];
end
edofMat = zeros(eleNum, 8);
for i = 1:eleNum
for j = 1:4
edofMat(i, [2*j-1,2*j]) = [2 * eles(i, j) - 1, 2 * eles(i, j)];
end
end
iK = reshape(kron(edofMat, ones(8, 1)).', 64 * eleNum, 1);
jK = reshape(kron(edofMat, ones(1, 8)).', 64 * eleNum, 1);
% test
% scatter(nodes(:,1),nodes(:,2));
% figure;
% for i = 1:eleNum
% node = eles(i,:);
% scatter(nodes(node,1),nodes(node,2));hold on;
% end
end