153 lines
4.4 KiB
Matlab
153 lines
4.4 KiB
Matlab
function [A,B,EdgesOfElements,PECInd,Dof,r]=EigenModeMatrixAssembly...
|
|
(Nodes,Elements,Domain,lam0,epsilonr,mur)
|
|
%Description:Assembling matrices of finite element method for mode analysis
|
|
|
|
%Gauss quadrature points
|
|
[xt,yt,pt,IntegralOrder]=Get2DGuassPoints(2);
|
|
|
|
%Processsing mesh
|
|
el2no=Elements';
|
|
n1=el2no([1 1 2],:);
|
|
n2=el2no([2 3 3],:);
|
|
el_ed2no_array=[n1(:) n2(:)];
|
|
[Edges,~,EdgesOfElements]=unique(el_ed2no_array,'rows');
|
|
NbrEdges=length(Edges);
|
|
NbrNodes=length(Nodes);
|
|
NbrElement=max(size(Elements));
|
|
|
|
%PEC Boundary conditions
|
|
NumEdges=zeros(NbrEdges,1);
|
|
for i=1:length(EdgesOfElements)
|
|
temp=EdgesOfElements(i);
|
|
NumEdges(temp)=NumEdges(temp)+1;
|
|
end
|
|
PECEdge=find(NumEdges==1);
|
|
PECEdges=Edges(PECEdge,:);
|
|
PECNode=[PECEdges(:,1);PECEdges(:,2)];
|
|
PECNode=unique(PECNode);
|
|
PECNode=sort(PECNode);
|
|
PECInd=[PECNode;PECEdge+NbrNodes];
|
|
|
|
%variable initialization
|
|
k0=2*pi/lam0;
|
|
Dof=NbrEdges+NbrNodes;
|
|
NbrNonZero=NbrElement*9;
|
|
NumA=0;
|
|
Ai=zeros(NbrNonZero,1);
|
|
Aj=zeros(NbrNonZero,1);
|
|
Av=complex(zeros(NbrNonZero,1));
|
|
NumB=0;
|
|
Bi=zeros(NbrNonZero*4,1);
|
|
Bj=zeros(NbrNonZero*4,1);
|
|
Bv=complex(zeros(NbrNonZero*4,1));
|
|
|
|
%Loop over meshes
|
|
for n=1:NbrElement
|
|
%coordinate of nodes
|
|
x=zeros(3,1);y=zeros(3,1);l=ones(3,1);
|
|
x(1)=Nodes(Elements(n,1),1);y(1)=Nodes(Elements(n,1),2);
|
|
x(2)=Nodes(Elements(n,2),1);y(2)=Nodes(Elements(n,2),2);
|
|
x(3)=Nodes(Elements(n,3),1);y(3)=Nodes(Elements(n,3),2);
|
|
l(1)=sqrt((x(1)-x(2))*(x(1)-x(2))+(y(1)-y(2))*(y(1)-y(2)));
|
|
l(2)=sqrt((x(1)-x(3))*(x(1)-x(3))+(y(1)-y(3))*(y(1)-y(3)));
|
|
l(3)=sqrt((x(3)-x(2))*(x(3)-x(2))+(y(3)-y(2))*(y(3)-y(2)));
|
|
|
|
%Jac matrics
|
|
Jac=zeros(3,3);
|
|
Jac(1,1)=x(2)-x(1);Jac(1,2)=y(2)-y(1);
|
|
Jac(2,1)=x(3)-x(1);Jac(2,2)=y(3)-y(1);Jac(3,3)=1;
|
|
InvJac=inv(Jac);
|
|
DetJac=abs(det(Jac));
|
|
TJac=Jac'/det(Jac);
|
|
|
|
%basis functions
|
|
Et=zeros(3,3,IntegralOrder);curlEt=zeros(3,3,IntegralOrder);
|
|
Ez=zeros(3,3,IntegralOrder);gradEz=zeros(3,3,IntegralOrder);
|
|
temp=zeros(3,1);
|
|
for i=1:IntegralOrder
|
|
for j=1:3
|
|
[temp(1),temp(2)]=BF_Et(j,xt(i),yt(i));temp(3)=0;
|
|
Et(j,:,i)=InvJac*temp*l(j);
|
|
temp(3)=BF_curlEt(j,xt(i),yt(i));temp(1)=0;temp(2)=0;
|
|
curlEt(j,:,i)=TJac*temp*l(j);
|
|
temp(3)=BF_Ez(j,xt(i),yt(i));temp(1)=0;temp(2)=0;
|
|
Ez(j,:,i)=temp;
|
|
[temp(1),temp(2)]=BF_gradEz(j,xt(i),yt(i));temp(3)=0;
|
|
gradEz(j,:,i)=InvJac*temp;
|
|
end
|
|
end
|
|
|
|
%material
|
|
domain=Domain(n);
|
|
mu=mur(domain);
|
|
epsilon=epsilonr(domain);
|
|
|
|
%Submatrix
|
|
St=zeros(3,3);Tte=zeros(3,3);
|
|
Sz=zeros(3,3);Tz=zeros(3,3);
|
|
G=zeros(3,3);Ttu=zeros(3,3);
|
|
for i=1:3
|
|
for j=1:3
|
|
for k=1:IntegralOrder
|
|
St(i,j)=St(i,j)+pt(k)*DetJac/mu*dot(curlEt(i,:,k),curlEt(j,:,k));
|
|
Tte(i,j)=Tte(i,j)+pt(k)*DetJac*k0*k0*epsilon*dot(Et(i,:,k),Et(j,:,k));
|
|
Sz(i,j)=Sz(i,j)+pt(k)*DetJac/mu*dot(gradEz(i,:,k),gradEz(j,:,k));
|
|
Tz(i,j)=Tz(i,j)+pt(k)*DetJac*k0*k0*epsilon*dot(Ez(i,:,k),Ez(j,:,k));
|
|
G(i,j)=G(i,j)+pt(k)*DetJac/mu*dot(Et(i,:,k),gradEz(j,:,k));
|
|
Ttu(i,j)=Ttu(i,j)+pt(k)*DetJac/mu*dot(Et(i,:,k),Et(j,:,k));
|
|
end
|
|
end
|
|
end
|
|
Gt=G';
|
|
|
|
for i=1:3
|
|
for j=1:3
|
|
MappingIndexSi=Elements(n,i);
|
|
MappingIndexSj=Elements(n,j);
|
|
MappingIndexVi=EdgesOfElements((n-1)*3+i)+NbrNodes;
|
|
MappingIndexVj=EdgesOfElements((n-1)*3+j)+NbrNodes;
|
|
|
|
NumA=NumA+1;
|
|
Ai(NumA)=MappingIndexVi;
|
|
Aj(NumA)=MappingIndexVj;
|
|
Av(NumA)=St(i,j)-Tte(i,j);
|
|
|
|
NumB=NumB+1;
|
|
Bi(NumB)=MappingIndexVi;
|
|
Bj(NumB)=MappingIndexVj;
|
|
Bv(NumB)=Ttu(i,j);
|
|
|
|
NumB=NumB+1;
|
|
Bi(NumB)=MappingIndexSi;
|
|
Bj(NumB)=MappingIndexSj;
|
|
Bv(NumB)=Sz(i,j)-Tz(i,j);
|
|
|
|
NumB=NumB+1;
|
|
Bi(NumB)=MappingIndexVi;
|
|
Bj(NumB)=MappingIndexSj;
|
|
Bv(NumB)=G(i,j);
|
|
|
|
NumB=NumB+1;
|
|
Bi(NumB)=MappingIndexSi;
|
|
Bj(NumB)=MappingIndexVj;
|
|
Bv(NumB)=Gt(i,j);
|
|
end
|
|
end
|
|
end
|
|
|
|
%Assembling matrices
|
|
A = sparse(Ai,Aj,Av);
|
|
B = sparse(Bi,Bj,Bv);
|
|
|
|
%Processing PEC
|
|
Free_ind=1:Dof;
|
|
Free_ind(PECInd)=[];
|
|
A=A(Free_ind,Free_ind);
|
|
B=B(Free_ind,Free_ind);
|
|
|
|
%Matrix reordering
|
|
r=symrcm(B);
|
|
B=B(r,r);
|
|
A=A(r,r);
|
|
|
|
end |