C++ 中的物理模拟

计算科学 C++ 计算物理学 模拟 参考请求 数值建模
2021-12-14 16:20:47

好的,我知道一点 C++(非常基本的语法),我想用 C++ 进行物理模拟,比如(还有这里提到的东西):

  • 二维表面上的波纹和波浪
  • 振弦/振膜
  • 2d/3d 中的各种电场/磁场(根据我的意愿)
  • 气体分子模拟
  • 牛顿力学的东西(旋转物体,牛顿引力等)

任何人都可以建议一些资源/库(或者所谓的,比如用于 python 的 vpython),以便我可以在哪里学习,以便我可以在我的 PC 上模拟这些东西?

请注意,我不是为了这样做而要求书籍(尽管欢迎推荐)

2个回答

我认为您错过了恰好位于物理和模拟之间的一个非常重要且至关重要的步骤:数学模型。

为了对任何物理建模,必须制定物理现象的数学描述。根据模拟的目标,可以做出不同的近似和假设,从而导致系统的各种复杂性,并且需要或多或少复杂的数值技术来解决它们。

您提到了您对模拟的几个非常不同的物理领域,所以,我想,您的兴趣更多地在于数值方法/可视化,而不是任何特定领域。我将以电磁学(EM)为例:

  • 麦克斯韦方程组涵盖了 EM 的全部荣耀
  • 可以在 1D、2D 和 3D 中求解的各种形式(和近似值)。
  • 有时使用表面离散化(PEC - 完美电导体)是合适的,有时你必须使用体积离散化
  • 可能需要考虑材料的不同特性(非线性、各向异性等)。

我想说的是,要模拟任何物理,您首先必须(在某种程度上)了解其背后的数学模型。

接下来,通常,您需要使用一些数值技术来求解这个模型。根据模型,不同的技术可以适用和更可取。同样,我将使用 EM 常用的字段,但其他字段将类似:

  • 有限差分(有限差分时域)
  • 有限元法 (FEM)
  • 积分方程方法(边界元)
  • 物理/几何光学

...等等。可以使用不同的库(包括 C++ 库)来解决这些问题:deal.ii、FEniCS...

但是,我的建议是从更简单的东西开始,并使用更合适的语言/平台从物理现象的数值模拟开始。比如说,开始使用 Matlab (Octave) 求解一维波动方程并可视化简单的传播。此外,在 PDE、ODE 和特定物理领域使用众多已经可用的工具箱应该会更容易。

我还建议一本书/课程与 C++ 无关,但它是我在计算科学领域的“圣经”:

Fenics可能是最简单的免费软件之一,可用于使用有限元解来模拟波动方程和其他微分方程。它使用 python 接口运行,底层带有 C++ 以提高性能,这使得它比纯 C++ 解决方案更加用户友好。

气体分子模拟通常使用分子动力学进行研究(粗略地,整合牛顿运动方程)。根据粒子交互的逼真程度,有相当多的模拟器可供选择,例如HOOMDLAAMPSGROMACS、CHARMM、AMBER、NAMD ......每个项目都可能带有推荐的可视化。我记得至少 LAAMPS 对 VMD (GUI) 非常友好,我相信 HOOMD 和 LAAMPS 都可以与Ovito一起使用。其中许多也是基于某种 C++ 库的 python 脚本接口。这里的技术门槛也可能低于有限元模拟。