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 = tbl2(find(tbl2(:,2)>1), 1); %确定最终PBCIndex数目 nbr1=length(ovDstIndex); 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 P(:,PBCIndex(:,2))=[]; solver.P=P; end