# 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 |