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.
 
 
 
 

82 lines
2.5 KiB

%--------------------------
% @Author: Jingqiao Hu
% @Date: 2021-11-30 11:16:16
% @LastEditTime: 2022-01-08 22:36:10
%--------------------------
function [edofMat, nvar, nodes] = assembleInfo_cvt(c_vedges, nbridge_each, nbnodes_cell)
ncvt = size(c_vedges, 1);
nodes0 = [];
cbns_cell = cell(ncvt, 1);
% step.1 transverse all nodes, generate unique nodes
% generate bezier control nodes for the following step
for ele = 1 : ncvt
vedges = c_vedges{ele};
cbns = [];
nbele = nbnodes_cell{ele} - 1; % for those three situations
for i = 1 : size(vedges, 1)
n1 = vedges(i, 1:2);
n2 = vedges(i, 3:4);
step = (n2 - n1) / (nbridge_each + 1);
if i == 1
cbns = [cbns; n1];
end
nb_edge = nbele(i);
% 1. nb_edge = 1, without additional nodes
% 2. nb_edge = 2, add one control node
if nb_edge == 2
n11 = (n1+n2) / 2;
cbns = [cbns; n11];
elseif nb_edge > 2
% 3. nb_edge = 3, add control nodes as usual
% TODO: update in the future
assert(nbridge_each + 1 <= nb_edge);
for j = 1 : nbridge_each + 1 % the segment num of one edge
% the two control pnts
n11 = step * 1/3 + n1 + step * (j-1);
n12 = step * 2/3 + n1 + step * (j-1);
% additional bridge nodes
if j==nbridge_each+1
nbnode = [];
else
nbnode = j * step + n1;
end
% add these nodes
cbns = [cbns; n11; n12; nbnode];
end
end
if i < size(vedges, 1)
cbns = [cbns; n2];
end
end
cbns_cell{ele} = cbns;
nodes0 = [nodes0; cbns];
% figure; scatter(cbns(:,1), cbns(:,2));
end
nodes = unique(nodes0, 'rows'); % NOTE: the order changed
nvar = size(nodes,1) * 2;
% figure; hold on; scatter(nodes(:,1), nodes(:,2));
% figure;
% step.2 each cvt-i, check each nodes on global
edofMat = cell(ncvt, 1);
for ele = 1 : ncvt
cbns_local = cbns_cell{ele};
[~, idx] = ismember(cbns_local, nodes, 'rows');
% NOTE: the sequence must conforms to Ke
edof0 = [2*idx-1, 2*idx]';
edofMat{ele} = edof0(:);
end
end