# OpticsFEM 3D 光学仿真扩展实施计划

> 目标：参照 2D `opticsfem-master` 完整能力，在 `3D opticsfem-master` 中实现全部三维光学问题仿真。  
> 重点：**边界条件** + **本征频率/本征模式**。  
> 验证基准：`三维matlab代码/` 各算例的 JSON + `.dat` + 矩阵/场输出。

---

## 现状摘要（2026-06）

| FemType | 问题 | 2D | 3D C++ |
|---------|------|----|--------|
| 0 | 本征模式 (neff) | ✅ | ❌ 无类 |
| 1 | 本征频率 | ✅ | ⚠️ FemType=5 仅组装+矩阵导出 |
| 2/3 | 散射 | ✅ 全边界 | ⚠️ FemType=4 仅 SBC |
| — | 二阶 Nedelec | — | ❌ MATLAB 有参考 |

3D 散射 DOF：**纯边元**（`NbrEdge`）；2D 散射 DOF：`NbrVertex + NbrEdge`（混合）。

---

## 分阶段计划

### 阶段 0 — 工程基础（并行）

| 序号 | 任务 | 参照 2D | 验证 |
|------|------|---------|------|
| 0.1 | `Test_Main` 支持命令行/环境变量指定 JSON | — | 切换算例无需重编译 |
| 0.2 | 完善 `export_phy_to_json.m`（PBC/PEC 块） | `Test_ReadData.cpp` | JSON 与 C++ 解析一致 |
| 0.3 | 统一 `EnsureOutputDir`、错误码返回 | — | 运行日志可读 |

### 阶段 1 — 本征频率闭环 ⭐ 当前执行

| 序号 | 任务 | 参照 2D 文件 | 验证 |
|------|------|--------------|------|
| 1.1 | `OpticsFEM_3D_EigenFreq::Assemble` 补 P 矩阵投影 `P^T A P` | `Assemble_kernel.cpp` 2D EigenFreq | 与 MATLAB `Av/Bv` 一致（已有） |
| 1.2 | 新增 `Run()` / `Post()` | 2D EigenFreq | `eigen3d.json` + `SBCmesh.dat` |
| 1.3 | `Post_3D_EigenFreq::GetElectric/OutputData` | `Post_3D_Scatter` + 2D EigenFreq | 输出 `freq/Ex/Ey/Ez/normE` |
| 1.4 | `FEM_Interface` FemType=5 完整链路 | FemType=1 | 返回码 5 |

### 阶段 2 — 散射基础边界 ✅ 已完成

| 序号 | 任务 | 参照 2D 文件 | 验证 |
|------|------|--------------|------|
| 2.1 | `Assemble_PEC_ELE()` 3D 实现（边 DOF 消元） | `Assemble_Scatter_2D_Boundary.cpp` | 含 PEC 的散射算例 |
| 2.2 | 接入 `OpticsFEM_3D_Scatter::Assemble()` | 2D Scatter Assemble | — |
| 2.3 | ELE 激励（Dirichlet 边条件） | 2D `Assemble_PEC_ELE` | `ef` JSON 块 |

### 阶段 3 — 周期边界 PBC

| 序号 | 任务 | 参照 | 验证 |
|------|------|------|------|
| 3.1 | `Mesh_3D::GetIndexOfPBC()` 实现 | 2D `Mesh_Find.cpp` | `PBCmesh.dat` |
| 3.2 | 3D 散射 `Assemble_PBC()` | 2D + MATLAB `main_singlePBC.m` | 单周期散射 ✅ |
| 3.3 | 3D 双周期 PBC（散射+本征） | MATLAB `assembly_pbc_double.m` | `doublePBC_scatter.json` ✅ |
| 3.4 | JSON 导出 PBC 块 | `export_phy_to_json.m` | `PBCmesh.json` |

### 阶段 4 — 源项与背景场边界

| 序号 | 任务 | 参照 2D | 验证 |
|------|------|---------|------|
| 4.1 | `Assemble_BELE()` 3D 体积分+ PML 面积分 | `Assemble_Scatter_2D_Boundary.cpp` | bele 类算例 |
| 4.2 | `Assemble_MAG()` | 同上 | mag.json |
| 4.3 | `Assemble_SCD()` | 同上 | scd.json |
| 4.4 | `Assemble_MPD()` / `Assemble_EPD()` | 同上 | mpd/epd.json |
| 4.5 | `Post_GetEb()` 3D 背景场（BELE 后处理） | `Post_GetEb.cpp` | — |

### 阶段 5 — 吸收层与端口

| 序号 | 任务 | 说明 | 验证 |
|------|------|------|------|
| 5.1 | 3D PML 体积分/边界 | 2D PML 拉伸坐标推广到四面体 | pml 算例 |
| 5.2 | 3D Port 散射 | 2D Port 480 行逻辑，3D 面模态 | port 算例 |
| 5.3 | Beam 高斯光束 | 2D beam JSON | — |

### 阶段 6 — 本征模式 & 高阶（扩展）

| 序号 | 任务 | 说明 |
|------|------|------|
| 6.1 | `OpticsFEM_3D_EigenMode` 新类 | 3D 波导 neff，参照 2D EigenMode |
| 6.2 | 二阶 Nedelec 基函数 | 参照 MATLAB `3D二阶基+散射边界条件` |
| 6.3 | 棱柱/四边形边界网格读取 | `Mesh_Interface.cpp` 补全 |

---

## FemType 路由规划（目标态）

| FemType | 问题 | 网格 |
|---------|------|------|
| 0 | 2D 本征模式 | Mesh_2D |
| 1 | 2D 本征频率 | Mesh_2D |
| 2/3 | 2D 散射 | Mesh_2D |
| **4** | **3D 散射** | Mesh_3D |
| **5** | **3D 本征频率** | Mesh_3D |
| **6** | **3D 本征模式**（规划） | Mesh_3D |

---

## 执行顺序与依赖

```
阶段1 本征频率闭环
    ↓
阶段2 PEC/ELE ──→ 阶段3 PBC ──→ 阶段4 BELE/源项
                                    ↓
                              阶段5 PML/Port
                                    ↓
                              阶段6 本征模式/二阶
```

---

## 文档修订

| 版本 | 日期 | 内容 |
|------|------|------|
| v1.0 | 2026-06-18 | 初版计划，启动阶段1 |
