Fortran 2003 で、スパース行列を使用して多くの線形代数を実行するコードを書いています。私は、新しい標準のより抽象的な機能のいくつかを活用しようとしているので、コードをあまり繰り返さずに、より単純なプログラムを作成できます。
solver
行列、いくつかのベクトル、使用される反復メソッドの許容値などを受け取るプロシージャがあります。呼び出されたプロシージャへのポインタを渡していmatvec
ます。matvec
行列とベクトルの乗算に使用するサブルーチンです。
問題は、このプロシージャに送信される通常のmatvec
引数よりも余分な引数を受け取るプロシージャがある場合があることです。colorlist, color1, color2
これに対処する方法はいくつか考えられます。
最初のアイデア: 2 つの異なる抽象インターフェースと 2 つの異なるソルバーを定義しmatvec1
ますmatvec2
。これは機能しますが、一部のコードを複製することを意味します。これは、私が避けようとしているものです。
別のアイデア: 同じ抽象インターフェースmatvec
を維持し、追加の引数colorlist
, color1
, をcolor2
オプションにします。つまり、すべての matvec ルーチンでオプションにすることを意味します。実際にはオプションではないルーチンや、まったく使用されないルーチンでも同様です。こんなことしたら確実に地獄に落ちます。
最適ではない解決策は他にもたくさん考えられます。これについて何か意見が欲しいです - それを行うためのエレガントな方法があると確信していますが、それが何であるかはわかりません。