53 lines
1.3 KiB
Matlab
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
|