56 lines
1.8 KiB
Matlab
56 lines
1.8 KiB
Matlab
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
|