Fortran 2003で、疎行列の線形代数を行うコードをいくつか書いています。私は新しい標準のより抽象的な機能のいくつかを悪用しようとしているので、コードをあまり繰り返さずに単純なプログラムを持っています。fortran 2003のランタイム多形性
私はというプロシージャへのポインタを渡しています。これは、行列、いくつかのベクトル、使用される反復メソッドの許容差などを取ります。 matvec
は、行列ベクトルの乗算に使用するサブルーチンです。
問題は時々matvec
がこの手順に送られた通常のものよりも余分な引数colorlist, color1, color2
を取る手順です。私はこれを扱ういくつかの方法を考えることができます。
最初のアイデア:2つの異なる抽象インターフェイスmatvec1
,matvec2
と2つの異なるソルバーを定義します。これは機能しますが、コードを複製することを意味します。これは私が避けようとしているものです。
もう一つのアイデア:同じ抽象インタフェースmatvec
を維持し、余分な引数は、color1
、color2
オプション作ります。これは、すべてのmatvecルーチン(たとえ実際にはオプションではないものであっても)と、まったく使用されていないルーチンではオプションにすることを意味します。もしそうすれば、私は地獄に行くだろうと確信している。
私は他の多くの最適なソリューションよりも少ないと考えることができます。私はこれについていくつかの情報を入力したいと思います - 私はそれを行うためのエレガントな方法があると確信しています、私はそれが何であるか分かりません。