4

我是一名受过培训的机械工程师,在研究环境中工作,主要扩展现有的 25 岁以上 C 的大型数字代码库。我最近决定要学习如何从头开始设计一个严肃的科学软件。

我曾与大学计算机科学系的一些学者交谈过,似乎人们普遍认为,最有可能构建大规模数值应用程序的人是机械/化学/生物系。同样,大多数编写这些应用程序的人都很少或根本没有接受过软件设计原则的培训。

作为大多数工程师,我是边做边学的,所以我将给自己设定一个任务来完成以下任务:开发一个自适应网格方案,根据任意移动曲线的位置进行局部细化/粗化。穿过这个网格,求解热方程(或其他一些 PDE)

我想包括的东西:

  1. 并行(我对 MPI 有短暂的经验,所以可能会坚持这个)——也许结合在 OpenCL 中(周围没有 Nvidia 卡,所以没有 CUDA)
  2. Python 和 C++ 的结合(Python 中的脚本驱动 UI,C++ 中的执行)
  3. 面向对象,基于设计模式(我很想学的一部分)
  4. 单元测试框架(我使用过 gtest 并且可能会坚持使用它,但不确定单元测试的详细程度,我已经阅读了有关单元测试科学代码的各种不同建议)
  5. 基于Linux——在这个阶段不要太在意可移植性
  6. 也许使用 Boost 库
  7. 使用 HDF5 或 VTK 保存结果(我知道 VTK,但觉得 HDF5 更适合)
  8. 性能分析

我试图回答的一些问题:

  1. 这感觉像是一项艰巨的任务,没关系,但是分解它的一般过程是什么?您是从基本的基础设施(MPI 包装器、矩阵类等)开始,还是从高级交互(主控制器、UI 等)开始,还是从完全不同的地方开始?
  2. Python + C++ 的范例是否适合在集群上启动 MPI?
  3. 我还没有找到任何在科学背景下处理应用程序设计的书籍——是因为它不存在,还是我没有找对地方?
  4. 我很清楚理想的“让它运行然后配置文件”的优化方式,但我认为一开始做出的一些非常基本的设计决策会影响性能。对于数字代码的高级设计,需要注意哪些主要问题?

注意:我不确定这个问题是否符合 stackexchange 格式——如果不符合,我会很乐意重新措辞……

4

0 回答 0