%-------------------------- % @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