101 lines
3.0 KiB
Matlab
101 lines
3.0 KiB
Matlab
function [A,Edges,EdgesOfElements,Dof]=PhysicMatrixAssembly2(Nodes,Elements,Domains,lam0,epsilonr,mur,gamma)
|
|
%description: Assembly matrix of maxwell's equation
|
|
%beam wave
|
|
|
|
%physical variable
|
|
k0=2*pi/lam0;
|
|
|
|
%gauss quadracture points
|
|
[xvt,yvt,zvt,pvt,Integral3DOrder]=Get3DGuassPoints(1,2);
|
|
|
|
%process mesh
|
|
el2no=Elements';
|
|
n1=el2no([1 1 1 2 2 3],:);
|
|
n2=el2no([2 3 4 3 4 4],:);
|
|
el_ed2no_array=[n1(:) n2(:)];
|
|
[Edges,~,EdgesOfElements]=unique(el_ed2no_array,'rows');
|
|
NbrEdges=length(Edges);
|
|
NbrElements=length(Elements);
|
|
|
|
%Initialization of matrix assembly variables
|
|
Dof=NbrEdges;
|
|
NbrNonZers=NbrElements*6*6;
|
|
NumA=0;
|
|
Ai=zeros(NbrNonZers,1);
|
|
Aj=zeros(NbrNonZers,1);
|
|
Av=complex(zeros(NbrNonZers,1));
|
|
|
|
%loop over all elements
|
|
for n=1:NbrElements
|
|
%coordinate of nodes
|
|
x=Nodes(Elements(n,:),1);
|
|
y=Nodes(Elements(n,:),2);
|
|
z=Nodes(Elements(n,:),3);
|
|
%length of edge
|
|
l=zeros(6,1);
|
|
l(1)=sqrt((x(1)-x(2))*(x(1)-x(2))+(y(1)-y(2))*(y(1)-y(2))+(z(1)-z(2))*(z(1)-z(2)));
|
|
l(2)=sqrt((x(1)-x(3))*(x(1)-x(3))+(y(1)-y(3))*(y(1)-y(3))+(z(1)-z(3))*(z(1)-z(3)));
|
|
l(3)=sqrt((x(1)-x(4))*(x(1)-x(4))+(y(1)-y(4))*(y(1)-y(4))+(z(1)-z(4))*(z(1)-z(4)));
|
|
l(4)=sqrt((x(2)-x(3))*(x(2)-x(3))+(y(2)-y(3))*(y(2)-y(3))+(z(2)-z(3))*(z(2)-z(3)));
|
|
l(5)=sqrt((x(2)-x(4))*(x(2)-x(4))+(y(2)-y(4))*(y(2)-y(4))+(z(2)-z(4))*(z(2)-z(4)));
|
|
l(6)=sqrt((x(3)-x(4))*(x(3)-x(4))+(y(3)-y(4))*(y(3)-y(4))+(z(3)-z(4))*(z(3)-z(4)));
|
|
|
|
%Jac matrix
|
|
Jac=zeros(3,3);
|
|
Jac(1,1)=x(1)-x(4);Jac(1,2)=y(1)-y(4);Jac(1,3)=z(1)-z(4);
|
|
Jac(2,1)=x(2)-x(4);Jac(2,2)=y(2)-y(4);Jac(2,3)=z(2)-z(4);
|
|
Jac(3,1)=x(3)-x(4);Jac(3,2)=y(3)-y(4);Jac(3,3)=z(3)-z(4);
|
|
InvJac=inv(Jac);
|
|
TJac=Jac'/det(Jac);
|
|
DetJac=abs(det(Jac));
|
|
|
|
%basis function
|
|
Ne=zeros(3,6,Integral3DOrder);curlNe=zeros(3,6,Integral3DOrder);
|
|
curlNei=complex(zeros(3,6,Integral3DOrder));curlNej=complex(zeros(3,6,Integral3DOrder));
|
|
for i=1:6
|
|
for k=1:Integral3DOrder
|
|
temp=BF_Edge(1,i,xvt(k),yvt(k),zvt(k));
|
|
Ne(:,i,k)=InvJac*temp*l(i);
|
|
temp=BF_curlEdge(1,i,xvt(k),yvt(k),zvt(k));
|
|
curlNe(:,i,k)=TJac*temp*l(i);
|
|
curlNei(:,i,k)=curlNe(:,i,k)+cross([0;0;gamma],Ne(:,i,k));
|
|
curlNej(:,i,k)=curlNe(:,i,k)-cross([0;0;gamma],Ne(:,i,k));
|
|
end
|
|
end
|
|
|
|
%material
|
|
domain=Domains(n);
|
|
mu=1/mur(domain);
|
|
epsilon=epsilonr(domain);
|
|
|
|
%submatrix
|
|
Ae=complex(zeros(6,6));
|
|
for i=1:6
|
|
for j=1:6
|
|
for k=1:Integral3DOrder
|
|
Ae(i,j)=Ae(i,j)+pvt(k)*DetJac*mu*sum(curlNei(:,i,k).*curlNej(:,j,k));
|
|
Ae(i,j)=Ae(i,j)-pvt(k)*DetJac*k0*k0*epsilon*dot(Ne(:,i,k),Ne(:,j,k));
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
%adding to matrix sequence
|
|
for i=1:6
|
|
for j=1:6
|
|
MappingIndexi=EdgesOfElements((n-1)*6+i);
|
|
MappingIndexj=EdgesOfElements((n-1)*6+j);
|
|
NumA=NumA+1;
|
|
Ai(NumA)=MappingIndexi;
|
|
Aj(NumA)=MappingIndexj;
|
|
Av(NumA)=Ae(i,j);
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
%matrix assembly
|
|
A=sparse(Ai,Aj,Av);
|
|
|
|
|
|
end |