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

66 lines
2.5 KiB
Matlab

function [Ex,Ey,Ez,normE]=GetExEyEz2(type,Nodes,Elements,EdgesOfElements,xx)
%有求解的x计算电场Ex,Ey,Ez及normE
NbrElements=length(Elements);
if type==1
NbrReference=4;
NbrBF=6;
u=[1 0 0 0]';
v=[0 1 0 0]';
w=[0 0 1 0]';
elseif type==2
NbrReference=6;
NbrBF=9;
u=[0 1 0 0 1 0]';
v=[0 0 1 0 0 1]';
w=[-1 -1 -1 1 1 1]';
end
Ex=complex(zeros(NbrElements,NbrReference));
Ey=complex(zeros(NbrElements,NbrReference));
Ez=complex(zeros(NbrElements,NbrReference));
normE=zeros(NbrElements,NbrReference);
for n=1:NbrElements
%网格坐标
if type==1
x=zeros(4,1);y=zeros(4,1);z=zeros(4,1);
x(1)=Nodes(Elements(n,1),1);y(1)=Nodes(Elements(n,1),2);z(1)=Nodes(Elements(n,1),3);
x(2)=Nodes(Elements(n,2),1);y(2)=Nodes(Elements(n,2),2);z(2)=Nodes(Elements(n,2),3);
x(3)=Nodes(Elements(n,3),1);y(3)=Nodes(Elements(n,3),2);z(3)=Nodes(Elements(n,3),3);
x(4)=Nodes(Elements(n,4),1);y(4)=Nodes(Elements(n,4),2);z(4)=Nodes(Elements(n,4),3);
%边长度
l=ones(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=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);
end
%基函数计算
Ne=zeros(3,NbrBF,NbrReference);%3个分量 * n个基函数 * m个顶点数
for i=1:NbrBF %基函数
for k=1:NbrReference %顶点
temp=BF_Edge(type,i,u(k),v(k),w(k));
Ne(:,i,k)=InvJac*temp*l(i);
end
end
%计算顶点值
for k=1: NbrReference %顶点
for i=1:NbrBF %基函数
MappingIndex=EdgesOfElements((n-1)*NbrBF+i);
Ex(n,k)=Ex(n,k)+Ne(1,i,k)*xx(MappingIndex);
Ey(n,k)=Ey(n,k)+Ne(2,i,k)*xx(MappingIndex);
Ez(n,k)=Ez(n,k)+Ne(3,i,k)*xx(MappingIndex);
end
normE(n,k)=sqrt(abs(Ex(n,k)*Ex(n,k))+abs(Ey(n,k)*Ey(n,k))+abs(Ez(n,k)*Ez(n,k)));
end
end