73 lines
2.2 KiB
Matlab
73 lines
2.2 KiB
Matlab
function main_export(mode)
|
||
%MAIN_EXPORT 导出单/双周期散射的 Ab 矩阵与 normE(OpticsFEM OutFile 格式)。
|
||
%
|
||
% main_export() % 默认单周期 (case_config.m)
|
||
% main_export('single')
|
||
% main_export('double') % 需 doublePBC_mesh.mat 或 doublePBC_mesh.dat
|
||
%
|
||
% 输出 ./OutFile_single/ 或 ./OutFile_double/:
|
||
% Ai.txt, Aj.txt, Av.txt, Bv_real.txt, Bv_imag.txt — PBC 投影后
|
||
% Ex, Ey, Ez, normE
|
||
% 输出 ./OutFile_*_asm/:PBC 投影前的装配矩阵
|
||
|
||
if nargin < 1 || isempty(mode)
|
||
mode = 'single';
|
||
end
|
||
|
||
clc;
|
||
root = fileparts(mfilename('fullpath'));
|
||
|
||
switch lower(mode)
|
||
case 'single'
|
||
[phy, cfg] = case_config();
|
||
outDir = fullfile(root, 'OutFile_single');
|
||
outAsm = fullfile(root, 'OutFile_single_asm');
|
||
pbcFn = @assembly_pbc_single;
|
||
case 'double'
|
||
[phy, cfg] = case_config_doublePBC();
|
||
outDir = fullfile(root, 'OutFile_double');
|
||
outAsm = fullfile(root, 'OutFile_double_asm');
|
||
pbcFn = @assembly_pbc_double;
|
||
otherwise
|
||
error('main_export:BadMode', 'mode 须为 ''single'' 或 ''double''。');
|
||
end
|
||
|
||
mesh = load_case_mesh(cfg, root);
|
||
mesh.incIndex = findTri(phy.inc, mesh);
|
||
mesh.outIndex = findTri(phy.out, mesh);
|
||
mesh.PBCIndex = findPBCIndex(phy.src, phy.dst, cfg.pbcWaveVec, mesh);
|
||
mesh.PBCphi = cfg.pbcPhi;
|
||
|
||
if strcmpi(mode, 'double')
|
||
mesh.PBCIndex2 = findPBCIndex(phy.src2, phy.dst2, cfg.pbcWaveVec2, mesh);
|
||
mesh.PBCphi2 = cfg.pbcPhi2;
|
||
end
|
||
|
||
solver.Ai = [];
|
||
solver.Aj = [];
|
||
solver.Av = [];
|
||
solver.b = zeros(mesh.NbrEdge, 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);
|
||
|
||
export_ab_matrix(solver, outAsm);
|
||
|
||
solver = pbcFn(mesh, solver);
|
||
solver.A = solver.P' * solver.A * solver.P;
|
||
solver.b = solver.P' * solver.b;
|
||
|
||
export_ab_matrix(solver, outDir);
|
||
|
||
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完成 [%s]。\n', mode);
|
||
fprintf(' 投影后 Ab + 场 → %s\n', outDir);
|
||
fprintf(' 装配 Ab(无 PBC)→ %s\n', outAsm);
|
||
end
|