XIAN-FEM-2026June/3D opticsfem-master/compare/load_comsol_slice.m

53 lines
1.3 KiB
Matlab

function slice = load_comsol_slice(dataFile, z0, tol)
%LOAD_COMSOL_SLICE Load COMSOL exported slice data.
% Supported formats (header line starting with % is ignored):
% 1) x y normE
% 2) x y z normE
% 3) x y z Ex_re Ex_im Ey_re Ey_im Ez_re Ez_im (normE computed)
if nargin < 3
tol = 1e-3;
end
assert(isfile(dataFile), 'COMSOL data not found: %s', dataFile);
raw = readmatrix(dataFile, 'FileType', 'text', 'CommentStyle', '%');
if size(raw, 2) >= 9
Ex = raw(:, 4) + 1i * raw(:, 5);
Ey = raw(:, 6) + 1i * raw(:, 7);
Ez = raw(:, 8) + 1i * raw(:, 9);
val = sqrt(abs(Ex).^2 + abs(Ey).^2 + abs(Ez).^2);
x = raw(:, 1);
y = raw(:, 2);
z = raw(:, 3);
elseif size(raw, 2) == 4
x = raw(:, 1);
y = raw(:, 2);
z = raw(:, 3);
val = raw(:, 4);
elseif size(raw, 2) == 3
x = raw(:, 1);
y = raw(:, 2);
z = z0 * ones(size(x));
val = raw(:, 3);
else
error('Unsupported COMSOL file format (need 3 or 4+ columns).');
end
if nargin >= 2 && ~isempty(z0)
mask = abs(z - z0) <= tol;
if ~any(mask)
warning('No points with z~=%g in COMSOL file; using all points.', z0);
mask = true(size(x));
end
x = x(mask);
y = y(mask);
val = val(mask);
end
slice.x = x(:);
slice.y = y(:);
slice.val = val(:);
slice.elem = [];
slice.planeAxes = [1 2];
slice.z0 = z0;
end