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

75 lines
2.8 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%COMPARE_NORME_ZSLICE Compare |E| on z=const plane: COMSOL vs OpticsFEM.
%
% Usage (in MATLAB):
% cd('.../3D opticsfem-master/compare')
% compare_normE_zslice
%
% Before first run, export COMSOL slice once:
% run_export_comsol % 一键导出(需 LiveLink + SBC.mph
%
% Or manually export from COMSOL GUI to data/comsol_z050.txt
% with columns: x y z normE (tab/space separated).
clear; clc; close all;
thisDir = fileparts(mfilename('fullpath'));
projDir = fileparts(thisDir);
cfg = struct();
cfg.zCut = 0.5;
cfg.meshFile = fullfile(projDir, 'build', 'Release', 'SBCmesh.dat');
cfg.outFileDir = fullfile(projDir, 'build', 'Release', 'OutFile');
cfg.comsolFile = fullfile(thisDir, 'data', 'comsol_z050.txt');
cfg.outPng = fullfile(thisDir, 'data', 'compare_normE_z050.png');
cfg.gridN = 121;
if ~isfile(cfg.meshFile)
cfg.meshFile = fullfile(projDir, 'SBCmesh.dat');
end
assert(isfile(cfg.meshFile), 'Mesh not found: %s', cfg.meshFile);
assert(isfile(fullfile(cfg.outFileDir, 'normE')), ...
'OpticsFEM normE not found. Run OpticsFEM.exe first.');
if ~isfile(cfg.comsolFile)
mphPath = fullfile(projDir, '..', '三维matlab代码', 'matlab 3D一阶散射问题', 'SBC.mph');
if isfile(mphPath) && exist('mphload', 'file') == 2
fprintf('COMSOL data missing, exporting from mph ...\n');
export_comsol_slice(mphPath, cfg.comsolFile, cfg.zCut, cfg.gridN, cfg.gridN);
else
error(['COMSOL 切面数据不存在: %s\n\n' ...
'请先任选一种方式生成该文件:\n' ...
' 1) 运行 run_export_comsol.m需 LiveLink + SBC.mph\n' ...
' 2) COMSOL GUI: Cut Plane z=0.5 → Export → 保存到上述路径\n\n' ...
'说明:项目里只有 SBC.mph.lock没有 mph 本体,需在本机 COMSOL 里打开/保存模型。'], ...
cfg.comsolFile);
end
end
fprintf('Loading mesh: %s\n', cfg.meshFile);
mesh = load_SBCmesh_dat(cfg.meshFile);
fprintf('Loading OpticsFEM normE: %s\n', cfg.outFileDir);
normE = load_opticsfem_normE(cfg.outFileDir);
assert(numel(normE) == mesh.NbrVertex, ...
'normE length (%d) != NbrVertex (%d)', numel(normE), mesh.NbrVertex);
fprintf('Building OpticsFEM z=%.2f slice ...\n', cfg.zCut);
sliceOpt = build_z_slice(mesh, normE, cfg.zCut, 3);
fprintf('Loading COMSOL slice: %s\n', cfg.comsolFile);
sliceCom = load_comsol_slice(cfg.comsolFile, cfg.zCut, 1e-3);
xg = linspace(-0.5, 0.5, cfg.gridN);
yg = linspace(-0.5, 0.5, cfg.gridN);
gridCom = interp_slice_to_grid(sliceCom, xg, yg);
gridOpt = interp_slice_to_grid(sliceOpt, xg, yg);
fprintf('Plotting comparison ...\n');
stats = plot_compare_heatmaps(gridCom, gridOpt, cfg.zCut, cfg.outPng);
assignin('base', 'compareStats', stats);
assignin('base', 'sliceOpt', sliceOpt);
assignin('base', 'sliceCom', sliceCom);
fprintf('Done.\n');