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.
 
 
 
 

87 lines
2.9 KiB

%--------------------------
% @Author: Jingqiao Hu
% @Date: 2021-11-27 16:17:24
% @LastEditTime: 2021-12-06 20:10:37
%--------------------------
function [B_1b, seg_num] = bezier_one_edge(microx, addNum)
bdofs_num = 2*(microx+1);
border = round(linspace(1, microx+1, addNum+2));
seg_num = length(border)-1; % segment num divided by added macro dofs
% macro dofs num of ONE boundary, e.g. u_c1,p1,p2,u_b,p3,p4,uc2
% the dofs of u_b belong to seg of [u_c1,p1,p2,u_b] and [u_b,p3,p4,uc2]
% seg_num*6 + 2 could remove duplicated dofs
% if addNum = 0, seg_num = 1, var_num_1b = 8
var_num_1b = seg_num*6 + 2;
var_num_4b = 4 * (var_num_1b - 2);
B_1b = zeros(bdofs_num, var_num_1b);
% for every segment of one boundary, B maybe different
ir = 1; ic = 1;
for i = 1 : seg_num-1
nodes_num = border(i+1) - border(i) + 1;
B = parametric_B_one_boundary(nodes_num); % [2,8,x], x is nodes num of every seg
% reshape B from [2, 8, x+1] to [2(x+1), 8]
B1 = permute(B, [2,1,3]); % [8, 2, x+1]
B2 = reshape(B1, 8, [])'; % [2(x+1), 8]
% remove duplicated nodes caused by u_b
% here 8 is caused by P_num = 2
B_1b(ir:ir + nodes_num*2-2-1, ic:ic+8-1) = B2(1:end-2, :);
ir = ir + nodes_num*2-2;
ic = ic + 8-2;
end
% assemble B_1b with the last seg
i = seg_num;
nodes_num = border(i+1) - border(i) + 1;
B = parametric_B_one_boundary(nodes_num); % [2,8,x], x is nodes num of every seg
B1 = permute(B, [2,1,3]); % [8, 2, x+1]
B2 = reshape(B1, 8, [])'; % [2(x+1), 8]
% The last seg doesn't have duplicated nodes
B_1b(ir:ir + nodes_num*2-1, ic:ic+8-1) = B2;
end
% nodes_num is the num of nodes on this boundary
function B = parametric_B_one_boundary(nodes_num)
B = zeros(2, 8, nodes_num);
for i = 0 : nodes_num-1
t = i / (nodes_num-1); % project to [0,1]
B(:, :, i+1) = Bezier_matrix(t);
end
end
function B = Bezier_matrix(t)
b = [1, t, t^2, t^3] * [1, 0,0,0;
-3,3,0,0;
3,-6,3,0;
-1,3,-3,1]; % 1,4
I = eye(2, 2);
B = kron(b, I); % 2,8
end
% test B
% addNum = 2;
% [~, ~, edofMat_ma1, ~] = macro_edofMat_bezier(nelx, nely, addNum);
% [ref_nodes, ~, ~] = multi_generate_mesh(lx, nelx, nely, addNum);
% U = reshape(ref_nodes', [], 1);
% addNum = microx - 1;
% [~, ~, edofMat_ma2, ~] = macro_edofMat_bezier(nelx, nely, microx-1);
% alldofs = 2*(nelx+1)*(nely+1) + 2 * addNum*nely*(nelx+1) + 2 * addNum*nelx*(nely+1);
% U2 = zeros(alldofs, 1);
% for ele = 1:eleNum_ma
% edof = edofMat_ma1(ele, :);
% ub = bezier_B * U(edof);
% edof = edofMat_ma2(ele, :);
% U2(edof) = ub;
% end
% deform_nodes = reshape(U2, 2, [])';
% figure; clf; scatter(deform_nodes(:,1), deform_nodes(:,2), 'b'); axis equal;
% hold on; scatter(ref_nodes(:,1), ref_nodes(:,2), 'k', 'filled'); axis equal;