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.
 
 
 
 

249 lines
7.6 KiB

%--------------------------
% @Author: Jingqiao Hu
% @Date: 2022-01-23 14:35:37
% @LastEditTime: 2022-04-27 20:30:45
% 1. find the global-id for each surface
% 2. build B for each surface
% 3. for current surface: remove duplicated dofs with previous surfaces
%--------------------------
function c_B = parametric_B_cvt_free(c_polygon, c_nodeFine, c_bnid, c_bnidSaved, ...
c_bnidSavedID, c_edofMat, c_nid, c_dupB, nbnidFine, nodes, c_nodeCoarse, )
ncell = size(c_polygon, 1);
c_B = cell(ncell, 1);
% figure;
for ele = 1 : ncell
edof = c_edofMat{ele};
c_poly = c_polygon{ele};
nodeFine = c_nodeFine{ele};
c_bnid_e = c_bnid{ele};
c_bnidSavedID_e = c_bnidSavedID{ele};
c_bnidSaved_e = c_bnidSaved{ele};
c_nid_e = c_nid{ele};
c_B{ele} = B_one_cell(c_poly, c_bnid_e, c_bnidSaved_e, c_bnidSavedID_e, ...
nodeFine, edof, c_nid_e, c_dupB{ele}, nbnidFine(ele), nodes, c_nodeCoarse{ele});
end
% % test
% figure;
% nc = reshape(cbns', 3, []);
% for ele = 1:npnts
% edof = c_edofMat{ele};
% ue = nc(edof);
% nb = ue;
% nb = c_phi{ele} * ue(:);
% nb = reshape(nb, 3, [])';
% scatter3(nb(:,1), nb(:,2), nb(:,3), 'filled'); hold on; axis equal;
% end
end
function B = B_one_cell(c_poly, c_bnid, c_bnidSaved, c_bnidSavedID, nodeFine, ...
edof, c_nid, c_dupB, nbnid, nodes, nodesCoarse)
ndofs = length(edof); % number of coarse edof
B = zeros(3*nbnid, ndofs);
nface = size(c_poly, 1);
nc = reshape(nodes', 3, []);
nb = nc(edof);
nb = reshape(nb, 3, [])';
% scatter3(nb(:,1), nb(:,2), nb(:,3), 'filled'); hold on;
for i = 1 : nface
segsPerFace = c_poly{i}; % [n,6]
bnid = c_bnid{i};
bnidSavedID = c_bnidSavedID{i}(:)';
bnidSaved = c_bnidSaved{i}(:)';
nid = c_nid{i}(:)';
c_dupB_f = c_dupB{i};
% bdofs-id in this cell
bGlobal = [3*bnidSaved-2; 3*bnidSaved-1; 3*bnidSaved];
nGlobal = [3*nid-2; 3*nid-1; 3*nid];
bnodes = nodeFine(bnid, :);
Bf = B_one_face(segsPerFace, bnodes);
% sum the dofs in Bf for the duplicated nodes
Bf1 = zeros(length(bnidSavedID(:)), length(nid(:)));
for j = 1 : length(nid)
idx = c_dupB_f{j};
Bf1(:, j) = sum(Bf(bnidSavedID(:), idx), 2);
end
Bf1 = kron(Bf1, eye(3));
% nid must be whole, since it needs sum on all control points
B(bGlobal(:), nGlobal(:)) = Bf1;
% x = segsPerFace(:,[1,4]);
% y = segsPerFace(:,[2,5]);
% z = segsPerFace(:,[3,6]);
% plot3(x',y',z','LineWidth',2); hold on;
end
% nc = reshape(nodes', 3, []);
% ue = nc(edof);
% nb = B * ue;
% % nc = reshape(nodesCoarse', 3, []);
% % nb = B * nc(:);
% nb = reshape(nb, 3, [])';
% scatter3(nb(:,1), nb(:,2), nb(:,3), 'filled'); hold on;
end
function B = B_one_face(segsPerFace, bnodes)
% detect end vertex polygon
vertex = segsPerFace(:, 1:3);
nseg = size(segsPerFace, 1);
if nseg>7 && nseg~=10
error("Side of Polygon > 7 or != 10 !");
end
tol = 1e-4;
% compute generalized barycentric basis w
nb = size(bnodes, 1);
w = zeros(nb, nseg);
for i = 1:nb
ni = bnodes(i, :);
[idx, ~] = find(abs(vertex(:,1) - ni(1)) < tol & ...
abs(vertex(:,2) - ni(2)) < tol & ...
abs(vertex(:,3) - ni(3)) < tol);
if isempty(idx)
w(i,:) = compute_barycentric(vertex, ni);
else
w(i,:) = 0;
w(i, idx) = 1;
end
end
% s-patch
switch nseg
case 3
% 200,101,002,011,020,110
nvar = 6;
B = zeros(nb, nvar);
B(:,1) = w(:, 1) .^ 2;
B(:,2) = 2 * w(:, 1) .* w(:, 2);
B(:,3) = 2 * w(:, 1) .* w(:, 3);
B(:,4) = w(:, 2) .^ 2;
B(:,5) = 2 * w(:, 2) .* w(:, 3);
B(:,6) = w(:, 3) .^ 2;
case 4
% 2000,1100,0200,0110,0020,
% 0011,0002,1001,0101,1010
nvar = 10;
B = zeros(nb, nvar);
B(:,1) = w(:, 1) .^ 2;
B(:,2) = 2 * w(:, 1) .* w(:, 2);
B(:,3) = 2 * w(:, 1) .* w(:, 3);
B(:,4) = 2 * w(:, 1) .* w(:, 4);
B(:,5) = w(:, 2) .^ 2;
B(:,6) = 2 * w(:, 2) .* w(:, 3);
B(:,7) = 2 * w(:, 2) .* w(:, 4);
B(:,8) = w(:, 3) .^ 2;
B(:,9) = 2 * w(:, 3) .* w(:, 4);
B(:,10) = w(:, 4) .^ 2;
case 5
% 20000,11000,10100,10010,10001,
% 02000,01100,01010,01001,00200,
% 00110,00101,00020,00011,00002
nvar = 15;
B = zeros(nb, nvar);
B(:,1) = w(:, 1) .^ 2;
B(:,2) = 2 * w(:, 1) .* w(:, 2);
B(:,3) = 2 * w(:, 1) .* w(:, 3);
B(:,4) = 2 * w(:, 1) .* w(:, 4);
B(:,5) = 2 * w(:, 1) .* w(:, 5);
B(:,6) = w(:, 2) .^ 2;
B(:,7) = 2 * w(:, 2) .* w(:, 3);
B(:,8) = 2 * w(:, 2) .* w(:, 4);
B(:,9) = 2 * w(:, 2) .* w(:, 5);
B(:,10) = w(:, 3) .^ 2;
B(:,11) = 2 * w(:, 3) .* w(:, 4);
B(:,12) = 2 * w(:, 3) .* w(:, 5);
B(:,13) = w(:, 4) .^ 2;
B(:,14) = 2 * w(:, 4) .* w(:, 5);
B(:,15) = w(:, 5) .^ 2;
case 6
nvar = 21;
B = zeros(nb, nvar);
B(:,1) = w(:, 1) .^ 2;
B(:,2) = 2 * w(:, 1) .* w(:, 2);
B(:,3) = 2 * w(:, 1) .* w(:, 3);
B(:,4) = 2 * w(:, 1) .* w(:, 4);
B(:,5) = 2 * w(:, 1) .* w(:, 5);
B(:,6) = 2 * w(:, 1) .* w(:, 6);
B(:,7) = w(:, 2) .^ 2;
B(:,8) = 2 * w(:, 2) .* w(:, 3);
B(:,9) = 2 * w(:, 2) .* w(:, 4);
B(:,10) = 2 * w(:, 2) .* w(:, 5);
B(:,11) = 2 * w(:, 2) .* w(:, 6);
B(:,12) = w(:, 3) .^ 2;
B(:,13) = 2 * w(:, 3) .* w(:, 4);
B(:,14) = 2 * w(:, 3) .* w(:, 5);
B(:,15) = 2 * w(:, 3) .* w(:, 6);
B(:,16) = w(:, 4) .^ 2;
B(:,17) = 2 * w(:, 4) .* w(:, 5);
B(:,18) = 2 * w(:, 4) .* w(:, 6);
B(:,19) = w(:, 5) .^ 2;
B(:,20) = 2 * w(:, 5) .* w(:, 6);
B(:,21) = w(:, 6) .^ 2;
case 7
nvar = 28;
B = zeros(nb, nvar);
B(:,1) = w(:, 1) .^ 2;
B(:,2) = 2 * w(:, 1) .* w(:, 2);
B(:,3) = 2 * w(:, 1) .* w(:, 3);
B(:,4) = 2 * w(:, 1) .* w(:, 4);
B(:,5) = 2 * w(:, 1) .* w(:, 5);
B(:,6) = 2 * w(:, 1) .* w(:, 6);
B(:,7) = 2 * w(:, 1) .* w(:, 7);
B(:,8) = w(:, 2) .^ 2;
B(:,9) = 2 * w(:, 2) .* w(:, 3);
B(:,10) = 2 * w(:, 2) .* w(:, 4);
B(:,11) = 2 * w(:, 2) .* w(:, 5);
B(:,12) = 2 * w(:, 2) .* w(:, 6);
B(:,13) = 2 * w(:, 2) .* w(:, 7);
B(:,14) = w(:, 3) .^ 2;
B(:,15) = 2 * w(:, 3) .* w(:, 4);
B(:,16) = 2 * w(:, 3) .* w(:, 5);
B(:,17) = 2 * w(:, 3) .* w(:, 6);
B(:,18) = 2 * w(:, 3) .* w(:, 7);
B(:,19) = w(:, 4) .^ 2;
B(:,20) = 2 * w(:, 4) .* w(:, 5);
B(:,21) = 2 * w(:, 4) .* w(:, 6);
B(:,22) = 2 * w(:, 4) .* w(:, 7);
B(:,23) = w(:, 5) .^ 2;
B(:,24) = 2 * w(:, 5) .* w(:, 6);
B(:,25) = 2 * w(:, 5) .* w(:, 7);
B(:,26) = w(:, 6) .^ 2;
B(:,27) = 2 * w(:, 6) .* w(:, 7);
B(:,28) = w(:, 7) .^ 2;
case 10
idx = 1;
B = zeros(nb, 55);
for i = 1:10
scalar = 1;
for j = i:10
B(:,idx) = w(:, i) .* w(:, j) * scalar;
scalar = 2;
idx = idx + 1;
end
end
end
% B = kron(B, eye(3));
end