如何开始用 Trilinos 或 PETSC 风格的 C++ 编写科学代码?

计算科学 pde C++ 正则 高性能计算
2021-11-27 02:22:41

我的背景:我在攻读博士学位期间学习了一些数值分析课程,并阅读了一些关于该主题的书籍。我主要研究低雷诺数流体力学,并使用边界元法求解非结构化网格上的斯托克斯方程。我主要阅读数学方程式并在 Fortran 90 中编写自己的代码。

我很少使用大型线性代数包。如果我需要一些东西,那么我会编写自己的代码。我已经意识到这是非常不可持续和不可扩展的。我需要在 Trilinos 或 PETSc 等优化的线性代数包之上开始编写代码。不利用这些优化的软件包似乎很愚蠢。

但是,由于我没有 C++ 或 C 的背景,我发现很难理解如何编写这些大型代码背后的哲学。例如,如何制作类和模板。我发现很难仅阅读 PETSc 或 Trilinos 中的代码并理解它们为什么以某种方式编写/组织。目前,我正在阅读 Karniadakis 和 Kirby 所著的《C++ 和 MPI 中的并行科学计算》一书以获取一些想法,但我需要查看具有大量描述的示例。

请向我提供一些建议或想法,以指导如何开始编写甚至考虑编写如此大型的软件库。你有什么特别推荐的书或视频讲座吗?

考虑到我在 FORTRAN 的经验,我也不确定我将如何从使用 C++ 类中受益。只是为了更好地组织代码吗?我如何开始考虑在 C++ 中实现数学对象?

3个回答

Ed Bueler 刚刚为您写了一本完美的书:“PETSc for Partial Differential Equations: Numerical Solutions in C and Python”

https://epubs.siam.org/isbn/978-1-61197-630-4

评论太长了

我也是 MPI 的初学者,我也在使用那本书。但在我看来,它只是致力于 MPI 方法。它只是通过一两个示例对类进行了简要介绍,甚至没有谈论模板,这是您在大多数科学代码中都能找到的东西。

这就是我现在正在学习的内容:

  • 为了理解最重要的结构,我从 Stroustrup 的经典“原理与实践……”开始,这对我仍然是初学者来说非常有用。

  • 并行计算部分的 MPI

  • Numerical Recipes,在 C++ 中有第三版。我认为这是关于数值算法的最重要的 C++ 书籍。

对此持保留态度,因为我只是 C++ 科学编程的初学者,肯定会有人比我有更好的建议。

是的,我认为您所说的“更好地组织代码”是使用 C++ 和更普遍的面向对象编程 (OOP) 的重要原因。由于更好的代码组织,OOP 可以更有效地重用代码。重用代码意味着更少的代码意味着更少的错误需要修复。

在我看来,另一个原因是 OOP 允许我们更清楚地表达事物。如果 A,B,C 是矩阵,则更清楚:

for (ii = 0; ii < n; ii++){
    for (jj = 0; jj < n; jj++){
      C[ii][jj] = A[ii][jj] + B[ii][jj]
  }
} 

要么

C = A + B

当然,后者更清楚。通过支持运算符重载,OOP 允许我们编写更清晰的第二个代码。另一个例子是将元素 rhs 向量组装成全局 rhs 向量。

OOP 允许我们做

GlobalRhsVector += ElementRhsVector

当我们定义“+”运算符的行为方式时,所有将本地索引转换为全局索引的包袱都得到了处理。