关于实施电磁/光子解算器包的问题

计算科学 pde C++ 模拟 电磁学
2021-12-29 08:37:50

我希望开始(非常缓慢地)实施某种形式的计算光子学/电磁学包。我知道诸如 Meep、S4、FDTD++、EMPy 和许多其他专有/免费/闭源工具之类的东西存在,但这更多是希望为自己获得一个可以用作多语言的长期项目,多层次的学习体验。

鉴于此,我有几个问题,按照他们到目前为止让我难过的程度降序排列。非常感谢直接引用可以帮助我深入了解这些问题的库、框架和/或书籍/论文。

  1. 如何实现几何?如何说明我的多边形或圆形、球体等的位置、方向?
  2. 如何进行网格划分?并赋予已网格化的几何对象物理特性?例如,如何将我的介电常数添加到我的对象?不可能都是if-then-else返回 epsilon 的垃圾邮件语句,对吗?如果是,这甚至是如何实现的?if-then-else在我们开始模拟之前,是否所有语句都在最开始处理?
  3. 对于标量有限差分,例如二阶导数,我已经看到它使用稀疏矩阵以及卷积核来应用。一个比另一个有什么好处吗?
  4. 有没有办法使用稀疏矩阵或卷积核来应用向量导数(特别是 curl),或者循环是解决这个问题的唯一方法吗?
  5. 欢迎在此特定领域遇到的任何其他资源。
1个回答

您的问题表明您是为 PDE 实现求解器的新手,并且您不熟悉该领域中使用的常用数据结构和算法。了解其他人如何编写与您尝试编写的代码类似的代码可能对您非常有用,因为您将看到他们如何排列数据,如何表示几何和材料等。

例如,查看所有主要有限元代码附带的教程程序,以获得这种体验。所有的 FEniCS、libMesh 和 deal.II 都有大量的教程程序,可以向您展示许多相关技术。

(免责声明:我是 deal.II 的主要作者之一。)