# normE 切面对比（COMSOL vs OpticsFEM）

在 **z = 0.5 m** 平面上对比 COMSOL 与 C++ OpticsFEM 的 |E| 热图（**散射算例 FemType=4**）。

## 目录

| 文件 | 说明 |
|------|------|
| `compare_normE_zslice.m` | **主脚本**，一键出对比图 |
| `export_comsol_slice.m` | 从 `SBC.mph` 导出 COMSOL 切面数据（需 LiveLink） |
| `load_SBCmesh_dat.m` | 读 `SBCmesh.dat` |
| `load_opticsfem_normE.m` | 读 `OutFile/normE` |
| `build_z_slice.m` | 四面体网格 z 平面切割 |
| `load_comsol_slice.m` | 读 COMSOL 导出 txt |
| `plot_compare_heatmaps.m` | 三联热图：COMSOL / OpticsFEM / 差值 |
| `data/comsol_z050.txt` | COMSOL 导出数据（需自行生成） |
| `data/compare_normE_z050.png` | 输出对比图 |

## 使用步骤

### 1. 运行 C++ 散射求解

```powershell
cd "3D opticsfem-master\scat3D\Release"
.\OpticsFEM.exe
```

确认生成 `OutFile/normE`（需已部署 `sbc3d.json` 与 `SBCmesh.dat`，见根目录 README）。

### 2. 导出 COMSOL 切面

**方式 A：MATLAB LiveLink**

```matlab
cd('3D opticsfem-master/compare')
run_export_comsol    % 打开此脚本，点 F5 运行（不要无参调用 export_comsol_slice）
```

前提：本机有 **COMSOL LiveLink**（MATLAB 里能执行 `mphload`），且有 **SBC.mph** 文件（项目里目前只有 `.lock`，需从 COMSOL 另存 `.mph`）。

**方式 B：COMSOL GUI 手动导出**

1. Results → Cut Plane → z = 0.5 m  
2. 表达式：`sqrt(realdot(ewfd.Ex,ewfd.Ex)+realdot(ewfd.Ey,ewfd.Ey)+realdot(ewfd.Ez,ewfd.Ez))`  
3. Export → Data，保存为 `compare/data/comsol_z050.txt`  
4. 格式：每行 `x  y  z  normE`（单位 m, m, m, V/m）

### 3. 运行对比

```matlab
cd('3D opticsfem-master/compare')
compare_normE_zslice
```

输出：

- 图形窗口：COMSOL | OpticsFEM | 差值  
- `data/compare_normE_z050.png`  
- 命令行打印 max|diff| 与相对 L2 误差

## 修改切面位置

编辑 `compare_normE_zslice.m` 中 `cfg.zCut`（默认 0.5）。
