XIAN-FEM-2026June/三维matlab代码/matlab 3D一阶基+本征模式-双周期边界/assembly_pbc_double.m

56 lines
1.6 KiB
Matlab

function solver=assembly_pbc_double(mesh,solver)
%查找src和dst中重复值
tempSrc=sort([mesh.PBCIndex(:,1);mesh.PBCIndex2(:,1)]);
tbl = tabulate(tempSrc);%返回三列数组,第一列为数值,第二列为重复次数
ovSrcIndex=find(tbl(:,2)>1);
tempDst=sort([mesh.PBCIndex(:,2);mesh.PBCIndex2(:,2)]);
tbl2 = tabulate(tempDst);%返回三列数组,第一列为数值,第二列为重复次数
ovDstIndex=find(tbl2(:,2)>1);
%确定最终PBCIndex数目
nbr1=length(ovSrcIndex);
nbr2=length(mesh.PBCIndex);
nbr3=length(mesh.PBCIndex2);
nbr=nbr2+nbr3-nbr1;
PBCIndex=zeros(nbr,3);
%在dst2中查找ovDstIndex对应的src2/dst1
[~,index1]=ismember(ovDstIndex,mesh.PBCIndex2(:,2));%PBC2去除的数据
index2=mesh.PBCIndex2(index1,1);%src2/dst1
%在dst1中查找src2/dst1
[~,index3]=ismember(index2,mesh.PBCIndex(:,2));%PBC1去除的数据
index4=mesh.PBCIndex(index3,1);%src1
%存储二次bloch节点数据
PBCIndex(1:nbr1,1)=index4;
PBCIndex(1:nbr1,2)=ovDstIndex;
PBCIndex(1:nbr1,3)=mesh.PBCIndex2(index1,3).*mesh.PBCIndex(index3,3);
%存储PBC1
tempindex=1:nbr2;
tempindex(index3)=[];
PBCIndex(nbr1+1:nbr2,:)=mesh.PBCIndex(tempindex,:);
tempindex=1:nbr3;
tempindex(index1)=[];
PBCIndex(nbr2+1:end,:)=mesh.PBCIndex2(tempindex,:);
P=speye(solver.dof);
phi=PBCIndex(:,3);
phi(1:nbr1)=mesh.PBCphi*mesh.PBCphi2.*phi(1:nbr1);
phi(nbr1+1:nbr2)=mesh.PBCphi.*phi(nbr1+1:nbr2);
phi(nbr2+1:end,:)=mesh.PBCphi2.*phi(nbr2+1:end,:);
nbrPBC=length(phi);
for i=1:nbrPBC
P(PBCIndex(i,2),PBCIndex(i,1))=phi(i);
end
if isempty(mesh.PECIndex)
P(:,PBCIndex(:,2))=[];
else
PECIndex=unique(sort([PBCIndex(:,2);mesh.PECIndex]));
P(:,PECIndex)=[];
end
solver.P=P;
end