XIAN-FEM-2026June/三维matlab代码/matlab 3D一阶散射问题/export_ab_matrix.m

48 lines
1.3 KiB
Matlab

function export_ab_matrix(solver, outDir)
%EXPORT_AB_MATRIX Export assembled A (COO) and b in OpticsFEM3D text format.
%
% export_ab_matrix(solver)
% export_ab_matrix(solver, outDir)
%
% Writes Ai.txt, Aj.txt, Av.txt, Bv_real.txt, Bv_imag.txt compatible with
% 3D opticsfem-master/build/Release/OutFile/ layout.
% Row/column indices are 0-based (MATLAB edge IDs minus 1).
if nargin < 2 || isempty(outDir)
outDir = fileparts(mfilename('fullpath'));
end
if ~exist(outDir, 'dir')
mkdir(outDir);
end
Ai = solver.Ai(:) - 1;
Aj = solver.Aj(:) - 1;
Av = complex(solver.Av(:));
b = complex(solver.b(:));
fidAi = fopen(fullfile(outDir, 'Ai.txt'), 'w');
fidAj = fopen(fullfile(outDir, 'Aj.txt'), 'w');
fidAv = fopen(fullfile(outDir, 'Av.txt'), 'w');
fidBr = fopen(fullfile(outDir, 'Bv_real.txt'), 'w');
fidBi = fopen(fullfile(outDir, 'Bv_imag.txt'), 'w');
cleanup = onCleanup(@() closeOpenFiles({fidAi, fidAj, fidAv, fidBr, fidBi}));
fprintf(fidAi, '%d\n', Ai);
fprintf(fidAj, '%d\n', Aj);
fprintf(fidAv, '(%g,%g)\n', [real(Av), imag(Av)].');
fprintf(fidBr, '%.12g\n', real(b));
fprintf(fidBi, '%.12g\n', imag(b));
fprintf('Exported A/b to %s\n', outDir);
fprintf(' nnz=%d, b length=%d\n', numel(Ai), numel(b));
end
function closeOpenFiles(fids)
for k = 1:numel(fids)
if fids{k} > 0
fclose(fids{k});
end
end
end