XIAN-FEM-2026June/三维matlab代码/matlab 3D二阶基+散射边界条件+单周期边界/_run_compare.m

48 lines
1.8 KiB
Matlab

cd('C:/Users/Administrator/Desktop/西电-合作/三维matlab代码/matlab 3D二阶基+散射边界条件+单周期边界');
[phy, cfg] = case_config();
load(cfg.meshMatFile);
mesh.incIndex=findTri(phy.inc,mesh);
mesh.outIndex=findTri(phy.out,mesh);
[mesh.PBCIndex,mesh.origIndex]=findPBCIndex(phy.src,phy.dst,cfg.pbcAngle,mesh);
mesh.PBCphi=cfg.pbcPhi;
solver.Ai=[];solver.Aj=[];solver.Av=[];
solver.dof=mesh.NbrEdge*2+mesh.NbrFace*2;
solver.b=zeros(solver.dof,1);
solver=assembly_equ(phy,mesh,solver);
solver=assembly_out(phy,mesh,solver);
solver=assembly_inc(phy,mesh,solver);
solver.A=sparse(solver.Ai,solver.Aj,solver.Av);
solver=assembly_rbc(mesh,solver);
solver.A=solver.P'*solver.A*solver.P;
solver.b=solver.P'*solver.b;
r=symamd(solver.A);
solver.A=solver.A(r,r);
solver.b=solver.b(r);
solver.x=solver.A\solver.b;
q=zeros(length(r),1);
for i=1:length(r), q(r(i))=i; end
solver.x=solver.x(q);
solver.x=solver.P*solver.x;
triIndex=findTri([2,5],mesh);
[x,y,z,normE]=get_ele(triIndex,mesh,solver);
fid=fopen('matlab_norme_stats.txt','w');
fprintf(fid,'dof=%d\n',solver.dof);
fprintf(fid,'reduced=%d\n',size(solver.P,2));
fprintf(fid,'max_normE_face25=%.6g\n',max(normE(:)));
fprintf(fid,'mean_normE_face25=%.6g\n',mean(normE(:)));
fprintf(fid,'|x|_max=%.6g\n',max(abs(solver.x)));
fprintf(fid,'|b|_max=%.6g\n',max(abs(solver.b)));
% also vertex field if get_ele_vertices exists
try
[xv,yv,zv,nEv]=get_ele_vertices(mesh,solver);
fprintf(fid,'max_normE_vertices=%.6g\n',max(nEv(:)));
fprintf(fid,'mean_normE_vertices=%.6g\n',mean(nEv(:)));
dlmwrite('matlab_normE_vertices.txt', nEv(:), 'precision', 16);
catch ME
fprintf(fid,'vertex_err=%s\n', ME.message);
end
fclose(fid);
dlmwrite('matlab_x_real.txt', real(solver.x), 'precision', 16);
dlmwrite('matlab_x_imag.txt', imag(solver.x), 'precision', 16);
disp('done');