介绍了已开发的pde ++库的语义,该库用于以操作符样式编程有限差分方法。 该库的主要对象是网格函数,网格单元和网格运算符,它们之间的算术关系使程序代码尽可能接近其数学符号。 pde ++库仅由几个头文件表示,没有外部依赖关系,并使用了惰性计算的概念。
网格方法将大量数学建模问题简化为偏微分方程(PDE)的数值解。 在差异方案理论(Samarsky A.A.)的理论中,相应的网格算子在网格函数上形成了线性空间,对于这些函数,在通用编程语言(例如C ++)中没有直接表示。 结果,使用多维数组或矩阵记录将网格运算符应用于网格函数的结果的实践在软件实现中被广泛使用。
实践表明,上面提到的方法对于掌握实施数字方法的技能非常有用,这主要是因为它在处理索引形式的PDE的预写近似值时具有可见性。 如果要将这种技术扩展到通用的PDE,也不会出现重大问题,如果它打算一次用参数实现差异方案,并在不作进一步修改的情况下重用适当的程序代码。
在一般情况下,可以在不同方向上修改计算程序,因此上述技术将需要编写大量程序代码,而这反过来会增加错别字的可能性以及在不同程序模块中记录相同网格运算符的不一致情况。 还值得注意的是,程序代码具有空间尺寸可变性(1D,2D,3D)和用于近似PDE的方法的重复问题。
因此,另一种选择是开发和使用具有高级域抽象的专用软件库,使程序代码更接近其数学符号。 在Blitz ++库中,这样的抽象是对差异模板的张量计算,该计算基于模板元编程技术的使用而实现。
freePOOMA库通过差
分散度和梯度运算符的差分类似物以及在多处理器计算系统上工作的能力扩展了Blitz ++概念。 不幸的是,这些库已经很长时间没有得到支持,当用于本文所考虑的PDE的相当经典的有限差分近似时,它们具有许多局限性(将在下一部分中讨论)。
作者开发的开源库pde ++受到
freePOOMA库的理想启发,旨在以有限差分方案的形式记录标量和矢量网格函数,这些函数在统一的矩形网格上以2D设置(工作中为1D和3D)定义。
警告:该代码仅在Windows下经过测试。
#include "pdepp.h" double sln_u(double x, double y) { return x * x + y * y; }
#include "pdepp.h" double sln_u(double x, double y) { return x * x + y * y; } double sln_v(double x, double y) { return x * x * x + y * y * y; }