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.
83 lines
3.1 KiB
83 lines
3.1 KiB
%--------------------------
|
|
% @Author: Jingqiao Hu
|
|
% @Date: 2021-02-26 13:51:19
|
|
% @LastEditTime: 2021-03-04 21:38:32
|
|
|
|
% the order is sorted as noedenrs, from small to big
|
|
%--------------------------
|
|
function [iK, jK, edofMat] = assemble_bezier(nelx, nely, nelz, num_b)
|
|
|
|
% STEP.1 construct global surface nodes
|
|
new_nelx = nelx * (num_b + 1);
|
|
new_nely = nely * (num_b + 1);
|
|
new_nelz = nelz * (num_b + 1);
|
|
Num_node = (1+new_nelx) * (new_nely+1) * (new_nelz+1);
|
|
nodenrs = reshape(1:Num_node, 1+new_nely, 1+new_nelx, 1+new_nelz);
|
|
|
|
[up, front, down, back, left, right, dofs_num] = surface_dofs_id(num_b+1);
|
|
surface_nodes = zeros(nelx, nely, nelz, dofs_num/3);
|
|
|
|
parfor i = 1 : nelx
|
|
for j = 1 : nely
|
|
for k = 1 : nelz
|
|
nodes_ele = nodenrs((j-1)*(num_b+1)+1 : j*(num_b+1)+1, ...
|
|
(i-1)*(num_b+1)+1 : i*(num_b+1)+1, ...
|
|
(k-1)*(num_b+1)+1 : k*(num_b+1)+1);
|
|
inner = nodes_ele(2:end-1, 2:end-1, 2:end-1);
|
|
surface_nodes(i,j,k,:) = setdiff(nodes_ele(:), inner(:));
|
|
end
|
|
end
|
|
end
|
|
global_nodes = unique(surface_nodes(:)); % remove interior nodes of every macro-ele
|
|
|
|
% STEP.2 using local surface_id to get global surface dofs
|
|
edofMat = zeros(nelx*nely*nelz, dofs_num);
|
|
|
|
for i = 1 : nelx
|
|
for j = 1 : nely
|
|
for k = 1 : nelz
|
|
sn = squeeze(surface_nodes(i,j,k,:));
|
|
|
|
up_id = get_dofs_id(global_nodes, sn, up);
|
|
front_id = get_dofs_id(global_nodes, sn, front);
|
|
down_id = get_dofs_id(global_nodes, sn, down);
|
|
back_id = get_dofs_id(global_nodes, sn, back);
|
|
left_id = get_dofs_id(global_nodes, sn, left);
|
|
right_id = get_dofs_id(global_nodes, sn, right);
|
|
|
|
% remove dofs on duplicated edges
|
|
% NOTE: there is a sorting
|
|
nid1 = unique([up_id, front_id, down_id, back_id, left_id, right_id]);
|
|
dofs_id = [3*nid1(:)-2, 3*nid1(:)-1, 3*nid1(:)]';
|
|
dofs_id = dofs_id(:);
|
|
|
|
ele = (k-1)*nelx*nely + (i-1)*nely + j;
|
|
edofMat(ele, :) = dofs_id;
|
|
end
|
|
end
|
|
end
|
|
|
|
iK = reshape(kron(edofMat,ones(dofs_num,1)).', dofs_num^2*nelx*nely*nelz, 1);
|
|
jK = reshape(kron(edofMat,ones(1,dofs_num)).', dofs_num^2*nelx*nely*nelz, 1);
|
|
|
|
EleNodesID = edofMat(:, 3:3:end)./3;
|
|
|
|
% test
|
|
% tmp = ref_nodes';
|
|
% tmp = tmp(:);
|
|
% figure;
|
|
% for ele = 1: nelx*nely*nelz
|
|
% edof = edofMat(ele, :);
|
|
% nodes_e = reshape(tmp(edof), 3, [])';
|
|
% scatter3(nodes_e(:,1), nodes_e(:,2), nodes_e(:,3),'filled'); axis equal; hold on;
|
|
% end
|
|
end
|
|
|
|
function nid1 = get_dofs_id(global_nodes, surface_nodes, local_dofs_id)
|
|
local_nodes_id = local_dofs_id(3:3:end)/3;
|
|
nodes = surface_nodes(local_nodes_id);
|
|
[nid1,~] = find(global_nodes(:)==nodes(:)'); % global nodes id
|
|
|
|
% dofs_id = [3*nid1(:)-2, 3*nid1(:)-1, 3*nid1(:)]';
|
|
% dofs_id = dofs_id(:);
|
|
end
|