XIAN-FEM-2026June/三维matlab代码/2023-2-端口激励问题(四面体网格)/波束包络/PhysicMatrixAssembly2.m

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