XIAN-FEM-2026June/3d光学fem完整实现_f4164ab1.plan.md

11 KiB
Raw Blame History

name overview todos isProject
3D光学FEM完整实现 基于现有2D C++ OpticsFEM代码框架和MATLAB 3D参考实现修复已有3D代码bug并补全所有缺失模块输出一个商用级别的三维C++光学有限元程序含本征频率、本征模式、散射三大问题类型同时产出完整的API定义文档和示例JSON文件。
id content status
fix-3d-bugs 修复3D Jacobian矩阵、材料域查询、invMur等关键Bug pending
id content status
mesh-3d-reader 实现Mesh_3D::GetMesh() JSON格式3D网格读取器 pending
id content status
eigenfreq-3d 完善3D本征频率PEC/PBC边界处理、Run()、Post() pending
id content status
eigenmode-3d 新增3D本征模式类OpticsFEM_3D_EigenMode完整实现 pending
id content status
scatter-3d-sbc 实现3D SBC散射边界积分参考MATLAB assembly_out/inc pending
id content status
scatter-3d-bc 实现3D PEC/PBC/PML/BELE/MAG/SCD/MPD/EPD边界和激励 pending
id content status
scatter-3d-run-post 实现3D Scatter的Run()和Post()(电场插值+输出) pending
id content status
api-3d-routing 扩展FEM_Interface增加3D路由和JSON参数解析 pending
id content status
post-3d 实现3D后处理边DOF到顶点电场插值、功率计算、文件输出 pending
id content status
second-order 实现二阶Nedelec基函数20 DOF/四面体)和对应组装 pending
id content status
api-doc-json 编写API定义文档和3个问题类型的示例JSON文件 pending
id content status
validation 与MATLAB 3D结果对比验证修正数值问题 pending
false

三维C++光学有限元完整实现方案

一、现状分析

已有基础(可复用)

  • 2D完整程序EigenMode / EigenFreq / Scatter含完整API、JSON输入、后处理输出
  • 3D类骨架已定义OpticsFEM_3D_EigenFreqOpticsFEM_3D_ScatterOpticsFEM_3D_Scatter2Assemble_Base.h L157-261
  • 3D网格数据结构Mesh_3D 支持四面体+棱柱(Mesh_Base.h L61-128
  • 3D基函数一阶Nedelec四面体(6 DOF)和棱柱(9 DOF)已实现(BF_Tetrahedron.cppBF_Prism.cpp
  • 3D体积方程组装EigenFreq和Scatter的WaveEquation已实现Assemble_EigenFreq_Equation.cpp L229-345、Assemble_Scatter_Equation.cpp L284-573
  • 3D高斯积分四面体和棱柱积分点已有

必须修复的Bug

  1. Jacobian矩阵错误3D EigenFreq/Scatter的Jac计算用了2D模式z分量硬编码0/1应为完整3x3:
// 当前错误写法 (Assemble_EigenFreq_Equation.cpp L269-271):
Jac(0, 2) = 0.; Jac(1, 2) = 0.; Jac(2, 2) = 1.;

// 正确写法参考MATLAB:
Jac(0, 0) = vertex[0](0)-vertex[3](0); Jac(0, 1) = vertex[0](1)-vertex[3](1); Jac(0, 2) = vertex[0](2)-vertex[3](2);
Jac(1, 0) = vertex[1](0)-vertex[3](0); Jac(1, 1) = vertex[1](1)-vertex[3](1); Jac(1, 2) = vertex[1](2)-vertex[3](2);
Jac(2, 0) = vertex[2](0)-vertex[3](0); Jac(2, 1) = vertex[2](1)-vertex[3](1); Jac(2, 2) = vertex[2](2)-vertex[3](2);
  1. 材料域查询错误3D组装中调用 GetDomainOfTri(n) 应改为 GetDomainOfTet(n)
  2. EigenFreq中 GetEpsr 误用为 invMurL291 invMur = GetEpsr(domain).inverse() 应为 GetMur(domain).inverse()

需要新增的模块

  • 3D网格文件读取器JSON格式
  • 3D EigenMode本征模式/有效折射率)
  • 3D SBC散射边界组装
  • 3D PEC/PBC/PML边界条件
  • 3D BELE/MAG/SCD/MPD/EPD激励源
  • 3D Port端口边界
  • 3D求解器集成Run方法
  • 3D后处理电场插值、输出
  • 3D API路由和JSON接口
  • 二阶Nedelec基函数可选增强

二、架构设计

整体架构对标2D扩展到3D

flowchart TB
    subgraph API [API层]
        APIEntry["OpticsFEM_API::OpticsFEM_All()"]
        JSONParser["JSON解析"]
    end
    
    subgraph FEM3D [3D FEM核心]
        EM3D["OpticsFEM_3D_EigenMode"]
        EF3D["OpticsFEM_3D_EigenFreq"]
        SC3D["OpticsFEM_3D_Scatter"]
    end
    
    subgraph Modules [功能模块]
        Mesh3D["Mesh_3D\n四面体+棱柱"]
        Mat["MaterialLib\n各向同性/n-k/各向异性"]
        Phy["Phy_WaveOpticsModel\nPEC/PMC/PBC/SBC/PML/Port"]
        BF["BF 基函数\n一阶/二阶Nedelec"]
        Gauss["Gauss积分\n四面体/三角形/棱柱"]
    end
    
    subgraph Solver [求解器]
        EigenSolver["Solver_EigenMode\nSolver_EigenFreq"]
        LinearSolver["Solver_LdaDom"]
    end
    
    subgraph Post [后处理]
        Post3DEF["Post_3D_EigenFreq"]
        Post3DEM["Post_3D_EigenMode"]
        Post3DSC["Post_3D_Scatter"]
    end
    
    APIEntry --> JSONParser
    JSONParser --> FEM3D
    FEM3D --> Modules
    FEM3D --> Solver
    FEM3D --> Post

3D DOF编号方案

  • 一阶NedelecDOF = NbrEdge每条边1个DOF
  • 二阶Nedelec后续扩展DOF = 2NbrEdge + 2NbrFace
  • 无顶点DOF纯矢量FEM区别于2D的Lagrange+Nedelec混合

3D网格JSON格式设计

{
  "NbrVertex": 100,
  "Vertex": [[x1,y1,z1], [x2,y2,z2], ...],
  "NbrEdge": 500,
  "Edge": [[v1,v2], ...],
  "NbrTet": 300,
  "Tet": [[v1,v2,v3,v4], ...],
  "EdgeOfTet": [[e1,e2,e3,e4,e5,e6], ...],
  "DomainOfTet": [1, 2, ...],
  "NbrTri": 200,
  "Tri": [[v1,v2,v3], ...],
  "DomainOfTri": [1, 2, ...],
  "ConnOfTri": [[meshType, tetIdx, faceIdx], ...],
  "NormOfFace": [[nx,ny,nz], ...],
  "CopyOfEdges": [[src, dst], ...],
  "FaceOfTet": [[f1,f2,f3,f4], ...]
}

3D FEM设置JSON格式设计

{
  "FemType": 4,
  "Dimension": 3,
  "NbrDomain": 3,
  "matType": [0, 0, 1],
  "epsilonrR": [1.0, 2.25, 0], "epsilonrI": [0, 0, 0],
  "murR": [1.0, 1.0, 0], "murI": [0, 0, 0],
  "n": [0, 0, 1.5], "k": [0, 0, 0],
  "sigma": [0, 0, 0],
  "NbrBoundary": 3,
  "BoundaryFlag": [1, 0, 2],
  "lambda": 1.55e-6,
  "MeshFile": "mesh_3d.json",
  "OutFile": "result/",
  "NbrMode": 5,
  "searchType": 0,
  "searchValue": 1.45,
  "solverType": 0,
  "ElementOrder": 1,
  "sbc": { "SBCType": 0, "Index": [2], "E0x": "1", "E0y": "0", "E0z": "0", "kx": "0", "ky": "0", "kz": "k0" },
  "pbc": { "srcIndex": [3], "dstIndex": [4], "phiR": [1.0], "phiI": [0.0] },
  "pml": { "index": [5], "PMLType": 0, "PMLData": [0,1e-6,0,1e-6,0,1e-6] }
}

三、分阶段实施计划

阶段1修复Bug + 基础设施1-2天

  • 修复3D Jacobian矩阵EigenFreq和Scatter的WaveEquation
  • 修复材料域查询(GetDomainOfTri -> GetDomainOfTet
  • 修复 invMur = GetEpsr().inverse() -> GetMur().inverse()
  • 实现 Mesh_3D::GetMesh() 从JSON读取3D网格
  • 补全3D EigenFreq稀疏矩阵尺寸初始化

阶段23D本征频率完善2-3天

  • 完善 OpticsFEM_3D_EigenFreq::Assemble() -- PEC/PBC约束矩阵P构建
  • 实现 OpticsFEM_3D_EigenFreq::Run() -- 调用本征值求解器
  • 实现 Post_3D_EigenFreq -- 3D电场插值边DOF到顶点、输出

阶段33D本征模式新增2-3天

  • 新增 OpticsFEM_3D_EigenMode类比2D EigenMode但纯矢量FEM
  • 实现3D本征模式方程组装A-lambda*B形式
  • 实现Run和Post
  • 支持搜索有效折射率

阶段43D散射问题完善3-5天

  • 实现 OpticsFEM_3D_Scatter::Assemble_SBC() -- 参考MATLAB的 assembly_out.massembly_inc.m
    • 三角面上的边界积分:ik0*n * N_i . (n_hat x (n_hat x N_j))
    • 入射场右端向量
  • 实现 OpticsFEM_3D_Scatter::Assemble_PEC_ELE() -- 构建约束矩阵P
  • 实现 OpticsFEM_3D_Scatter::Assemble_PBC() -- 参考MATLAB的 assembly_pbc_double.m
  • 实现BELE/MAG/SCD/MPD/EPD激励
  • 实现PML3D各向异性坐标拉伸
  • 实现 Run()Post()

阶段5API接口+JSON1-2天

  • 扩展 FEM_Interface.cpp 增加3D路由FemType=4/5/6 对应3D EigenMode/EigenFreq/Scatter或用 Dimension 字段区分)
  • 扩展 Test_ReadData.cpp 支持3D特有参数ElementOrder、3D PML数据等
  • 编写3D网格JSON格式规范
  • 编写3D FEM设置JSON格式规范
  • 提供3D示例JSON本征频率、本征模式、散射各一个

阶段6商用增强3-5天

  • 二阶Nedelec基函数实现20 DOF/四面体12边+8面
  • Port端口边界条件2D本征模式 + 3D耦合
  • 性能优化稀疏矩阵预分配、OpenMP并行组装
  • 错误处理与日志
  • 内存管理改进(替换裸指针为智能指针/RAII
  • 波长扫描支持

阶段7验证与文档2-3天

  • 与MATLAB结果对比验证本征频率、散射场
  • API定义文档输出Markdown格式
  • 示例JSON文件覆盖全部问题类型和边界条件组合
  • README更新

四、关键技术要点

3D SBC边界积分参考MATLAB assembly_out.m

  • 在三角面上积分使用2D Gauss积分点
  • 基函数需要从四面体边DOF映射到三角面上
  • 通过 ConnOfTri 找到所属四面体和面号
  • 面上的Nedelec基函数通过参考坐标映射

3D PBC周期边界参考MATLAB assembly_pbc_double.m

  • 匹配源/目标面上的边
  • 约束矩阵PP(dst_edge, src_edge) = exp(i*k*d)
  • 删除目标面的DOF列
  • 角域边的特殊处理

3D电场后处理参考MATLAB get_ele.m

  • 对每个边界三角面,通过 ConnOfTri 定位到四面体
  • 在四面体顶点处用参考坐标计算Nedelec基函数值
  • E = sum(N_j * x_j)其中x_j为边DOF解向量

五、文件修改/新增清单

修改文件

新增文件

  • opticsfem-master/mesh/Mesh_3D_Interface.cpp -- 3D JSON网格读取
  • opticsfem-master/kernel/Assemble_EigenMode_3D_Equation.cpp -- 3D本征模式体积组装
  • opticsfem-master/kernel/Assemble_EigenMode_3D_Boundary.cpp -- 3D本征模式边界
  • opticsfem-master/kernel/Assemble_EigenFreq_3D_Boundary.cpp -- 3D本征频率边界
  • opticsfem-master/post/Post_3D_CalElectric.cpp -- 3D电场计算
  • opticsfem-master/post/Post_3D_Output.cpp -- 3D结果输出
  • opticsfem-master/function/BF_Tetrahedron_2nd.cpp -- 二阶基函数阶段6
  • docs/API_3D_FEM.md -- API定义文档
  • examples/eigenfreq_3d.json -- 本征频率示例
  • examples/eigenmode_3d.json -- 本征模式示例
  • examples/scatter_3d.json -- 散射示例
  • examples/mesh_3d.json -- 3D网格示例