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

86 lines
2.6 KiB
Matlab

function export_ab_matrix(solver, outDir)
%EXPORT_AB_MATRIX Export assembled A and B (COO) for 3D eigen FEM.
%
% export_ab_matrix(solver)
% export_ab_matrix(solver, outDir)
%
% Compatible with OpticsFEM3D FemType=5 Test_OutputMatrix format:
% Ai.txt, Aj.txt, Av.txt, Bi.txt, Bj.txt, Bv.txt
% Row/column indices are 0-based (MATLAB edge IDs minus 1).
% One value per line; real matrices use Av.txt / Bv.txt.
if nargin < 2 || isempty(outDir)
outDir = fullfile(fileparts(mfilename('fullpath')), 'OutFile');
end
if ~exist(outDir, 'dir')
mkdir(outDir);
end
required = {'Ai','Aj','Av','Bi','Bj','Bv'};
for k = 1:numel(required)
if ~isfield(solver, required{k})
error('export_ab_matrix:MissingField', ...
'solver.%s is missing. Run assembly_equ first.', required{k});
end
end
Ai = solver.Ai(:) - 1;
Aj = solver.Aj(:) - 1;
Av = complex(solver.Av(:));
Bi = solver.Bi(:) - 1;
Bj = solver.Bj(:) - 1;
Bv = complex(solver.Bv(:));
isReal = all(abs(imag(Av)) < 1e-15) && all(abs(imag(Bv)) < 1e-15);
fidAi = fopen(fullfile(outDir, 'Ai.txt'), 'w');
fidAj = fopen(fullfile(outDir, 'Aj.txt'), 'w');
fidBi = fopen(fullfile(outDir, 'Bi.txt'), 'w');
fidBj = fopen(fullfile(outDir, 'Bj.txt'), 'w');
if isReal
fidAv = fopen(fullfile(outDir, 'Av.txt'), 'w');
fidBv = fopen(fullfile(outDir, 'Bv.txt'), 'w');
cleanup = onCleanup(@() closeOpenFiles({fidAi, fidAj, fidAv, fidBi, fidBj, fidBv}));
fprintf(fidAi, '%d\n', Ai);
fprintf(fidAj, '%d\n', Aj);
fprintf(fidAv, '%.12g\n', real(Av));
fprintf(fidBi, '%d\n', Bi);
fprintf(fidBj, '%d\n', Bj);
fprintf(fidBv, '%.12g\n', real(Bv));
else
fidAvR = fopen(fullfile(outDir, 'Av_real.txt'), 'w');
fidAvI = fopen(fullfile(outDir, 'Av_imag.txt'), 'w');
fidBvR = fopen(fullfile(outDir, 'Bv_real.txt'), 'w');
fidBvI = fopen(fullfile(outDir, 'Bv_imag.txt'), 'w');
cleanup = onCleanup(@() closeOpenFiles( ...
{fidAi, fidAj, fidAvR, fidAvI, fidBi, fidBj, fidBvR, fidBvI}));
fprintf(fidAi, '%d\n', Ai);
fprintf(fidAj, '%d\n', Aj);
fprintf(fidAvR, '%.12g\n', real(Av));
fprintf(fidAvI, '%.12g\n', imag(Av));
fprintf(fidBi, '%d\n', Bi);
fprintf(fidBj, '%d\n', Bj);
fprintf(fidBvR, '%.12g\n', real(Bv));
fprintf(fidBvI, '%.12g\n', imag(Bv));
end
fprintf('Exported A/B to %s\n', outDir);
fprintf(' nnz(A)=%d, nnz(B)=%d, 0-based COO\n', numel(Ai), numel(Bi));
if isReal
fprintf(' format: Av.txt, Bv.txt (real)\n');
else
fprintf(' format: Av_real/imag, Bv_real/imag\n');
end
end
function closeOpenFiles(fids)
for k = 1:numel(fids)
if fids{k} > 0
fclose(fids{k});
end
end
end