我正在编写一些线性代数代码(在 Fortran 2003 中,但在 Fortran 90 或 C 中将是相同的问题),它需要一些工作向量来进行计算。我处理这个问题的想法是制作一个工作w(:,:)
数组是线性代数模块私有的,即在讨论为什么真正的全局变量很糟糕时定义的“隐藏的全局” 。
我想这是在黑板上有一个大问题要解决,对于问题的每个部分,你选择黑板上的一个区域来解决它。
按照这个类比,我还可以有一堆小白板:定义一个work_array
数据类型并根据需要将它们传递给求解器。(PETSc 通过另一个抽象层有效地使用了这种方法;asolver
是一种数据类型,其中包括一些指向所用方法的过程指针以及一些工作向量。)当从一个求解器到另一个求解器存在嵌套调用时,这会得到有点复杂,所以我更喜欢第一种方式。它也不需要太多的误导。
关于哪种方法有助于更好的编程实践的任何想法?
编辑:当我开始使用 OpenMP 时,我也不认为这会是一个问题,我已经在这段代码的旧版本中完成了。在设置问题后,每个线程仅访问其未知数部分,而不访问其他线程的未知数部分。尽管如此,并发问题可能是一般不使用静态变量的一个很好的理由。
如果每次调用求解器时都必须为临时数组动态分配空间,这通常不会产生很多开销吗?