57 lines
1.7 KiB
Matlab
57 lines
1.7 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)
|
|
%
|
|
% Accepts either COO fields (solver.Ai/Aj/Av) or sparse solver.A + solver.b.
|
|
% Writes Ai.txt, Aj.txt, Av.txt, Bv_real.txt, Bv_imag.txt.
|
|
% Row/column indices are 0-based.
|
|
|
|
if nargin < 2 || isempty(outDir)
|
|
outDir = fullfile(fileparts(mfilename('fullpath')), 'OutFile');
|
|
end
|
|
if ~exist(outDir, 'dir')
|
|
mkdir(outDir);
|
|
end
|
|
|
|
if isfield(solver, 'A') && ~isempty(solver.A)
|
|
[ii, jj, vv] = find(solver.A);
|
|
Ai = ii(:) - 1;
|
|
Aj = jj(:) - 1;
|
|
Av = complex(vv(:));
|
|
b = complex(solver.b(:));
|
|
elseif isfield(solver, 'Ai') && ~isempty(solver.Ai)
|
|
Ai = solver.Ai(:) - 1;
|
|
Aj = solver.Aj(:) - 1;
|
|
Av = complex(solver.Av(:));
|
|
b = complex(solver.b(:));
|
|
else
|
|
error('export_ab_matrix:NeedA', 'solver must provide sparse A or Ai/Aj/Av.');
|
|
end
|
|
|
|
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(' n=%d, nnz=%d, b length=%d\n', size(solver.A, 1), numel(Ai), numel(b));
|
|
end
|
|
|
|
function closeOpenFiles(fids)
|
|
for k = 1:numel(fids)
|
|
if fids{k} > 0
|
|
fclose(fids{k});
|
|
end
|
|
end
|
|
end
|