文件
em3d-mt/bin/RMT3d/GetInterpMatrix.m
刘明宏 1e31390ba6 code
Signed-off-by: 刘明宏 <liuminghong@mail.sdu.edu.cn>
2025-04-29 07:11:41 +00:00

85 行
2.6 KiB
Matlab

function Q = GetInterpMatrix(rec,mesh,indelem2)
%% Field interpolation function
% rec = [0 0 0.20];
% rec = randn(1000,3);
t = tic;
mu0 = 4*pi*1e-7 ; % V·s/ (A·m)
nrec = size(rec,1);
if nargin==2
TR = triangulation(mesh.elem2node,mesh.node2coord);
ID = pointLocation(TR,rec);
elseif nargin==3
ID = indelem2;
end
a = mesh.abcd(ID,[1 2 3 4]);
b = mesh.abcd(ID,[5 6 7 8]);
c = mesh.abcd(ID,[9 10 11 12]);
d = mesh.abcd(ID,[13 14 15 16]);
ve = mesh.vol(ID,1);
Sign = mesh.sign(ID,:);
elem2edge = mesh.elem2edge(ID,:);
elemEdgeLength = mesh.elemEdgeLength(ID,:);
local_i = [1 2;1 3;1 4;2 3;4 2;3 4];
[Nie, CurlNie] = getEit1(rec(:,1),rec(:,2),rec(:,3),a,b,c,d,ve,local_i,Sign,elemEdgeLength);
Q.Ex=sparse(nrec,mesh.nedge);
Q.Ey=sparse(nrec,mesh.nedge);
Q.Ez=sparse(nrec,mesh.nedge);
Q.Hx=sparse(nrec,mesh.nedge);
Q.Hy=sparse(nrec,mesh.nedge);
Q.Hz=sparse(nrec,mesh.nedge);
ii=repmat((1:nrec)',1,6);
Q.Ex=sparse(ii,elem2edge,squeeze(Nie(:,1,:)),nrec,mesh.nedge);
Q.Ey=sparse(ii,elem2edge,squeeze(Nie(:,2,:)),nrec,mesh.nedge);
Q.Ez=sparse(ii,elem2edge,squeeze(Nie(:,3,:)),nrec,mesh.nedge);
Q.Hx=sparse(ii,elem2edge,squeeze(CurlNie(:,1,:)),nrec,mesh.nedge);
Q.Hy=sparse(ii,elem2edge,squeeze(CurlNie(:,2,:)),nrec,mesh.nedge);
Q.Hz=sparse(ii,elem2edge,squeeze(CurlNie(:,3,:)),nrec,mesh.nedge);
Q.Hx = -Q.Hx;
Q.Hy = -Q.Hy;
Q.Hz = -Q.Hz;
Q.Hx=Q.Hx/mu0;
Q.Hy=Q.Hy/mu0;
Q.Hz=Q.Hz/mu0;
GetInterpMatrixTime = toc(t)
end
function [Nie, CurlNie]=getEit1(xc,yc,zc,a,b,c,d,ve,local_i,TE_Sign,TE_length)
Ne = size(xc,1);
Nie = zeros(Ne,3,6);
CurlNie = zeros(Ne,3,6);
for kt1 = 1:6
i1 = local_i(kt1,1);
i2 = local_i(kt1,2);
Sign_i = TE_Sign(:,kt1);
ai1 = a(:,i1);
ai2 = a(:,i2);
bi1 = b(:,i1);
bi2 = b(:,i2);
ci1 = c(:,i1);
ci2 = c(:,i2);
di1 = d(:,i1);
di2 = d(:,i2);
l = TE_length(:,kt1);
Li1 = (ai1 + bi1.*xc + ci1.*yc + di1.*zc)./(6*ve);
Li2 = (ai2 + bi2.*xc + ci2.*yc + di2.*zc)./(6*ve);
GradLi1 = [bi1,ci1,di1]./repmat(6*ve,1,3);
GradLi2 = [bi2,ci2,di2]./repmat(6*ve,1,3);
Nie(:,:,kt1) = repmat(Sign_i,1,3).*(repmat(Li1,1,3).*GradLi2 - repmat(Li2,1,3).*GradLi1).*repmat(l,1,3);
CurlNie(:,:,kt1) = repmat(Sign_i,1,3).*[ci1.*di2-di1.*ci2, di1.*bi2-bi1.*di2, bi1.*ci2-ci1.*bi2].*[2*l./((6*ve).^2),2*l./((6*ve).^2),2*l./((6*ve).^2)];
end
end