⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_bwopt.m

📁 改进的AD算法用于重排节点编号以优化带宽!
💻 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 + -