📄 ad_bwopt.m
字号:
% RCM算法优化稀疏矩阵带宽
enum1=size(elem1,1);
ennum1=size(elem1,2);
enum2=size(elem2,1);
ennum2=size(elem2,2);
enum3=size(elem3,1);
ennum3=size(elem3,2);
nn=sparse(nnum,nnum); %初始化节点相连关系矩阵
ne=zeros(nnum,1);
% 将二次六面体单元(包括退化单元)所有节点相邻关系代入关系矩阵
for i=1:enum1
for j=2:ennum1
if elem1(i,j)~=0
for k=2:ennum1
if elem1(i,k)~=0
nn( elem1(i,j),elem1(i,k) )=1;
end
end
ne(elem1(i,j),1)=ne(elem1(i,j),1)+1;
end
end
end
% 将二次四面体单元所有节点相邻关系代入关系矩阵
for i=1:enum2
for j=2:ennum2
if elem2(i,j)~=0
for k=2:ennum2
if elem2(i,k)~=0
nn( elem2(i,j),elem2(i,k) )=1;
end
end
ne(elem2(i,j),1)=ne(elem2(i,j),1)+1;
end
end
end
% 将一次六面体单元所有节点相邻关系代入关系矩阵
for i=1:enum3
for j=2:ennum3
for k=2:ennum3
nn( elem3(i,j),elem3(i,k) )=1;
end
ne(elem3(i,j),1)=ne(elem3(i,j),1)+1;
end
end
nn_origin=nn;
nn_adopt=nn;
uplimit=getappdata(handles.apply_push,'uplimit'); %限定迭代次数的上限
k=1;
[i,j]=find(nn);
bw=max(i-j)+1;
bw0=bw;
while k<=uplimit
ndm=Cal_ndm(nn,ne,nnum);
refsh=ndsort(ndm,nnum);
nntemp=nn(refsh,refsh);
netemp=ne(refsh);
[i,j]=find(nntemp);
bw1=max(i-j)+1;
if bw>bw1
bw=bw1;
nn_opt=nntemp;
node=node(refsh,:);
end
nn=nntemp;
ne=netemp;
k=k+1;
if sort(refsh)==refsh
break;
end
end
%~~~~~~~~~~~调整节点编号优化后的节点、单元及边界载荷矩阵~~~~~~~~~~~~
p=node(:,1);
for i=1:nnum
node(i,1)=i;
end
%~~~~~~~~~~调整单元里的节点编号~~~~~~~~~~~~~~~~~~~~
for i=1:enum1
for j=2:ennum1
if elem1(i,j)~=0
elem1(i,j)=find( p==elem1(i,j) );
end
end
end
for i=1:enum2
for j=2:ennum2
if elem2(i,j)~=0
elem2(i,j)=find( p==elem2(i,j) );
end
end
end
for i=1:enum3
for j=2:ennum3
if elem3(i,j)~=0
elem3(i,j)=find( p==elem3(i,j) );
end
end
end
%~~~~~~~~~~调整边界载荷矩阵~~~~~~~~~~~~~~~~~~~~
disps=disps(p,:);
force=force(p,:);
for i=1:nnum
disps(i,1)=i;
force(i,1)=i;
end
%~~~~~~~~~~~调整节点编号优化后的节点、单元及边界载荷矩阵结束~~~~~~~~~~~~
setappdata(handles.apply_push,'nn_adopt',[nn_opt]);
setappdata(handles.apply_push,'nn_origin',[nn_origin]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -