用于求解自定义方程的有限差分软件

计算科学 有限元 有限差分 计算物理学
2021-12-04 06:57:02

是否有任何好的、易于使用的软件来模拟泛微分方程系统的演化?我知道有针对各种特定情况(例如电动力学)的自定义程序。但是假设我有一些方程,我很快想模拟一些初始状态的演变;无需每次都重新发明轮子,我会喜欢一些即插即用的程序,我可以在其中只陈述方程、初始条件、边界条件、离散化标准等并模拟系统。甚至可能是在不同求解器方法之间轻松切换的选项。

有这样的吗?谢谢 :)

4个回答

既然您提到了电动力学,我将假设您对 PDE 感兴趣。您已经在评论中提到了 FEniCSFEniCS 提供了一种称为 UFL 的领域特定语言 (DSL)。这种语言使得通过有限元方法表达用于离散化的 PDE 的弱形式变得简单。还有另一个名为Firedrake * 的包,它也使用 UFL 来表示 PDE。Firedrake 内置了对拉伸网格的支持,您可以在其中获取 2D 域并将其提升为 3D。我在地球物理科学领域开发应用程序,这个功能对我来说绝对是不可或缺的。另一方面,FEniCS 开发人员在生物学问题上投入更多,因此在解决混合维度问题上做了很多工作(参见本文)。

您提到要使用有限差分法,因此您还应该注意Devito与 FEniCS 和 Firedrake 一样,Devito 也使用嵌入式 DSL 来描述 PDE。例如,您可以查看地震波传播问题的示例代码

使用这些库中的每一个,您都应该摆脱编写低级内核代码以形成与问题离散化相对应的线性或非线性系统的负担。这是可能的,因为它们要么调用骨架化的低级内核并为您的特定问题注入代码,要么它们完全在现场生成低级内核。换句话说,该库自动将您的 PDE 转换为离散线性或非线性系统。

一旦线性或非线性系统形成,该库不会自动决定如何求解该线性或非线性系统。例如,Firedrake 与PETSc紧密集成。您可以通过将选项传递给 PETSc 的线性求解器来选择方法,例如使用 LU、GMRES 或 CG 来求解线性系统。

计算科学家对这些库是否是一件好事的看法各不相同。一方面,它们为您提供了一种方便的方法来设置和解决物理问题,而无需编写一堆低级代码,因此它们非常适合原型设计。有些人认为,如果你想做真正的工作,它们最终会成为障碍,因为(1)当你需要做奇怪或不寻常的事情时,没有足够的逃生口;(2)你放弃了对问题形成方式的所有控制. 就个人而言,我很高兴放弃这种控制,并且避免做奇怪或不寻常的事情,但这是你必须为自己做出的选择。

*我是 Firedrake 的偶尔贡献者,并且我有资助开发基于它的软件。

您可能想查看DifferentialEquations.jl它支持 ODE、PDE、随机方程、延迟方程,以及基本上所有其他的东西。它还具有非常好的自动稀疏检测和在大型系统的 GPU 上工作的能力。DiffEqOperators.jl是具有自动有限差分运算符(带有惰性模板应用程序)的子模块,可轻松进行 PDE 离散化。

BOUT++ 项目http://boutproject.github.io为 PDE 系统的有限差分求解提供了一套工具,主要针对流体动力学和等离子体物理,但不限于这些应用领域。人类可读形式的方程使用高效的并行求解器在空间中自动离散并在时间上集成。

由于您的问题的标题中包含“有限差分”一词,因此我假设您正在寻找用于有限差分法的软件。有限差分方法是限制性的。通常软件是为广泛的情况和问题的范围而制作的。有限体积和有限元方法比有限差分方法提供更大的灵活性。即使这种“灵活性”也受到 PDE 类型和一些实际实施因素的限制。有许多开源代码和软件可用于有限体积和元素方法,仅举几例:OpenFOAM、SU2、Fenics、dealII、Firedrake、pyFR 等。您可以将这些软件用于您的目的,因为在结构化网格上有限体积和有限元方法简化为一些等效的“有限差分方法”。另一种方法是使用一些开源有限差分代码,如 PENCIL(MHD 的天体物理学代码)并将其修改为您的目的。如果这些代码不适合您的目的,而您决定编写自己的代码,您可以查看 PETSc、DUNE 等软件。它们提供了数值环境,旨在为许多具有并行算法的 PDE 提供求解器。