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