# OpticsFEM3D 三维矢量有限元光学电磁仿真程序(一阶 Nedelec 边元)。 ## 支持的问题类型 | FemType | 说明 | 网格 | 状态 | |---------|------|------|------| | 0–3 | 二维问题(本征/散射) | `Mesh_2D` | 遗留接口,与 2D 版相同 | | **4** | **三维一阶散射(SBC)** | **`Mesh_3D`** | **完整:组装 → 求解 → 后处理** | | **5** | **三维一阶本征频率** | **`Mesh_3D`** | **组装 + A/B 矩阵导出(Run/Post 待接)** | 三维主算例共用网格 **`SBCmesh.dat`**,散射与本征分别使用 `sbc3d.json`、`eigen3d.json`。 ## 推荐构建目录 为避免散射与本征互相覆盖 exe 和 OutFile,建议使用**两个独立 CMake 构建目录**: | 目录 | 用途 | 配置文件 | |------|------|----------| | `scat3D/` | FemType=4 散射 | `sbc3d.json` | | `eigen3D/` | FemType=5 本征频率 | `eigen3d.json` | 旧目录 `build/`、`build1/` 为早期本地构建,可保留或删除,**不必上传 Git**。 ## 环境 - Windows 10/11 x64 - Visual Studio 2026(18),工作负载:使用 C++ 的桌面开发 - CMake ≥ 3.8(随 VS 安装) 若 `cmake` 不在 PATH 中: ```powershell $env:Path += ";C:\Program Files\Microsoft Visual Studio\18\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin" ``` ## 编译 ```powershell cd "3D opticsfem-master" # 散射(FemType=4) cmake -B scat3D -G "Visual Studio 18 2026" -A x64 cmake --build scat3D --config Release # 本征频率(FemType=5) cmake -B eigen3D -G "Visual Studio 18 2026" -A x64 cmake --build eigen3D --config Release ``` 产物(每个构建目录各一份): - `scat3D/Release/OpticsFEM.exe` 或 `eigen3D/Release/OpticsFEM.exe` - `*/Release/complex/complexsolver.exe`(FemType=4 散射求解必需,CMake 自动编译) ## 运行散射算例(FemType = 4) 1. 修改 `test/Test_Main.cpp`,确保读取 `sbc3d.json`(当前默认),重新编译 `scat3D`。 2. 部署输入文件: ```powershell Copy-Item sbc3d.json, SBCmesh.dat -Destination scat3D\Release\ cd scat3D\Release .\OpticsFEM.exe ``` 3. 控制台应打印 `OpticsFEM_All returned 4`。 4. 结果在 `OutFile/`:`Ex`、`Ey`、`Ez`、`normE`。 ## 运行本征频率算例(FemType = 5) 1. 修改 `test/Test_Main.cpp` 中 JSON 文件名为 `eigen3d.json`,重新编译 `eigen3D`。 2. 部署输入文件: ```powershell Copy-Item eigen3d.json, SBCmesh.dat -Destination eigen3D\Release\ cd eigen3D\Release .\OpticsFEM.exe ``` 3. 控制台应打印 `OpticsFEM_All returned 5`。 4. 当前输出 `OutFile/` 下 A/B 稀疏矩阵 COO:`Ai/Aj/Av`、`Bi/Bj/Bv`(0-based),供与 MATLAB `eigs(A,B)` 对比验证。 > **说明**:FemType=5 的 `Run()`(特征值求解)与 `Post()`(场重构)尚未接入主流程;矩阵组装与边界处理已完成。 ## 输入文件 | 文件 | FemType | 说明 | |------|---------|------| | `sbc3d.json` | 4 | 散射配置,含 `sbc` 边界块与 `lambda` | | `eigen3d.json` | 5 | 本征频率配置,含 `NbrMode`、`searchValue` 等 | | `SBCmesh.dat` | 4 / 5 | 三维四面体网格(顶点、四面体、边、三角边界等) | ## 物理形式简述 | 问题 | 方程形式 | 矩阵 | |------|----------|------| | 散射 (4) | **A·x = b**(给定 λ/k₀) | A = curl-curl − k₀²ε + SBC;b 来自入射边界 | | 本征 (5) | **A·x = λ·B·x** | A = curl-curl(刚度);B = ε·质量 | 体积分核函数相同,散射将刚度与质量合并进 A 并加边界激励;本征拆成 A、B 求特征值。 ## 详细文档 - [OpticsFEM_完整使用说明与代码介绍.md](./OpticsFEM_完整使用说明与代码介绍.md) — 模块说明、JSON 字段、FemType=4/5 专章 - [compare/README.md](./compare/README.md) — 与 COMSOL 的 normE 切面对比(散射) ## 仓库说明 - 仅上传**源码**与算例 JSON;`scat3D/`、`eigen3D/`、`build/`、`build1/` 为本地 CMake 产物,不上传。 - FemType=4 的 `complexsolver.exe` 由 CMake 从 `complex/complexsolver.cpp` 编译,无需单独 PETSc 版求解器。