67 lines
1.6 KiB
Matlab
67 lines
1.6 KiB
Matlab
function solver=assembly_equ(phy,mesh,solver)
|
|
|
|
solver.dof=mesh.NbrEdge;
|
|
k0=2*pi/phy.lda0;
|
|
|
|
%四面体积分节点
|
|
[u,v,w,weight,nbrGP]=getGaussPoints(1);
|
|
|
|
Ai=zeros(mesh.NbrTet*36,1);
|
|
Aj=zeros(mesh.NbrTet*36,1);
|
|
Av=zeros(mesh.NbrTet*36,1);
|
|
for n=1:mesh.NbrTet
|
|
%vertex
|
|
x=mesh.Vertex(mesh.Tet(n,:),1);
|
|
y=mesh.Vertex(mesh.Tet(n,:),2);
|
|
z=mesh.Vertex(mesh.Tet(n,:),3);
|
|
|
|
%jac
|
|
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);
|
|
DetJac=abs(det(Jac));
|
|
TJac=Jac'/det(Jac);
|
|
|
|
%BF
|
|
E=zeros(3,6,nbrGP);curlE=zeros(3,6,nbrGP);
|
|
for i=1:nbrGP
|
|
for j=1:6
|
|
E(:,j,i)=getBF(1,j,u(i),v(i),w(i));
|
|
E(:,j,i)=Jac\E(:,j,i);
|
|
curlE(:,j,i)=getBF(2,j,u(i),v(i),w(i));
|
|
curlE(:,j,i)=TJac*curlE(:,j,i);
|
|
end
|
|
end
|
|
|
|
%matrix
|
|
mur=phy.mur(mesh.DomainOfTet(n));
|
|
eps=phy.eps(mesh.DomainOfTet(n));
|
|
|
|
%submatrix
|
|
Ae=zeros(6,6);
|
|
for i=1:6
|
|
for j=1:6
|
|
for k=1:nbrGP
|
|
Ae(i,j)=Ae(i,j)+weight(k)*DetJac*sum(curlE(:,i,k).*curlE(:,j,k))...
|
|
-weight(k)*DetJac*k0*k0*sum(E(:,i,k).*(eps*E(:,j,k)));
|
|
end
|
|
end
|
|
end
|
|
|
|
%put in matrix
|
|
for i=1:6
|
|
for j=1:6
|
|
index=(n-1)*36+(i-1)*6+j;
|
|
Ai(index)=mesh.EdgeOfTet(n,i);
|
|
Aj(index)=mesh.EdgeOfTet(n,j);
|
|
Av(index)=Ae(i,j);
|
|
end
|
|
end
|
|
end
|
|
|
|
solver.Ai=[solver.Ai;Ai];
|
|
solver.Aj=[solver.Aj;Aj];
|
|
solver.Av=[solver.Av;Av];
|
|
|
|
end |