我在 Fortran 2003 中编写了一些代码,这些代码用稀疏矩阵做了很多线性代数。我正在尝试利用新标准的一些更抽象的特性,这样我就有了更简单的程序,而没有太多重复的代码。
我有一个过程solver
,它接受一个矩阵、一些向量、所使用的迭代方法的容差等。我将一个指针传递给一个调用matvec
它的过程;matvec
是我们用于矩阵向量乘法的子程序。
问题是,有时一个过程会在发送到该过程的通常matvec
参数之上接受额外的参数。colorlist, color1, color2
我可以想到几种处理方法。
第一个想法:定义两个不同的抽象接口matvec1
和matvec2
两个不同的求解器。这可行,但这意味着复制一些代码,这正是我试图避免的。
另一个想法:保持相同的抽象接口matvec
,并使额外的参数colorlist
, color1
,color2
可选。这意味着在每个 matvec 例程中使它们成为可选的——即使是那些它们不是真正可选的,以及它们甚至根本不使用的例程。如果我这样做,我肯定会下地狱的。
我能想到很多其他不是最佳的解决方案。我想对此提出一些意见——我确信有一些优雅的方法可以做到这一点,我只是不确定它是什么。