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

56 lines
1.8 KiB
Matlab
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function main_export()
%MAIN_EXPORT 一阶单周期散射:导出 Ab 矩阵与 normE格式同 3D 一阶散射 OutFile
%
% 输出 ./OutFile/
% Ai.txt, Aj.txt, Av.txt, Bv_real.txt, Bv_imag.txt — PBC 投影后 P'*A*P, P'*b
% Ex, Ey, Ez, normE — 求解后全场
%
% 输出 ./OutFile_asm/PBC 投影前的装配矩阵(与一阶散射 main.m 导出时机一致)。
%
% 网格:优先 c6.mat否则读同目录 PBCmesh.dat。
clc;
[phy, cfg] = case_config();
root = fileparts(mfilename('fullpath'));
outDir = fullfile(root, 'OutFile');
outAsm = fullfile(root, 'OutFile_asm');
mesh = load_case_mesh(cfg, root);
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;
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);
% 装配矩阵(无 PBC与一阶散射 main.m 一致
export_ab_matrix(solver, outAsm);
% Bloch 单周期边界
solver = assembly_pbc_single(mesh, solver);
solver.A = solver.P' * solver.A * solver.P;
solver.b = solver.P' * solver.b;
% 投影后线性系统(与 C++ pbc3d_sbc.json 对应)
export_ab_matrix(solver, outDir);
% 求解(与 main_singlePBC.m 一致)
solver.x = solver.A \ solver.b;
solver.x = solver.P * solver.x;
[Ex, Ey, Ez, normE] = get_ele_vertices(mesh, solver);
export_fields(Ex, Ey, Ez, normE, outDir);
fprintf('\n完成。\n');
fprintf(' 投影后 Ab + 场 → %s\n', outDir);
fprintf(' 装配 Ab无 PBC→ %s\n', outAsm);
end