RokkoParametersToSolvers - t-sakashita/rokko GitHub Wiki
固有値ソルバに渡すパラメータに共通事項
パラメータの取得
固有値ソルバに渡すparamtersクラス
- params (入力引数)
- ソルバへのオプションパラメータがない場合、省略可能。その場合、空のparrametersクラスがソルバラッパーに渡される。
- params_out (出力引数があるソルバの場合)←まだ実装してない
- 与えられない場合は、出力引数は捨てられる。
charや文字列で登録したパラメータの取得
- LAPACKのrange='A'が該当
get_string
関数を用いて、std::string型で取り出す。- メリット:
- char型か文字列かによるヌル文字の有無を分けて処理する必要がなくなる。
- テンプレートパラメータ等で元の型を指定しなくて良い。
固有値を収める型
- localized_vector
- std::vector
- double*
各ソルバライブラリのインターフェース(lapack/core.hppなど)での処理
- まず、paramtersから、routineを取り出す。
- 各ソルバのcore.hppは、routineを見て、if分岐により、呼び出す関数を判断
- ルーチン名が、routine引数とparametersの中の両方が与えられた場合は、routine引数の方が使われる。
ソルバラッパーの引数
各ソルバのラッパーでは、以下の基本形のみを用意する。
基本形
- 固有値・固有ベクトル
template<typename MATRIX_MAJOR, typename VEC>
void diagonalize(std::string const& routine, localized_matrix<double, MATRIX_MAJOR>& mat, VEC& eigvals,
localized_matrix<double, MATRIX_MAJOR>& eigvecs,
rokko::parameters const& params, timer& timer = *global_timer::instance()) {
- 固有値のみ
template<typename MATRIX_MAJOR, typename VEC>
int diagonalize(localized_matrix<double, MATRIX_MAJOR>& mat, double* eigvals,
localized_matrix<double, MATRIX_MAJOR>& eigvecs,
rokko::parameters const& params, timer& timer = *global_timer::instance())
派生型
- diagonalize関数をオーバーロードする。コーディングを簡単にするため、できるだけ上位のインターフェースのクラス(serial_dense_solverなど)で、オーバーロードする。
- 派生型の中から、上記の「基本形」を呼び出すようにする。
- 引数のある・なしで、LAPACKに渡すパラメータを自動判別し、ユーザが渡す入力パラメータを減らせる。
diagonalize関数の戻り値
- void型とする。
- LAPACKのソルバが返すint型のinfoは返さない。
- infoが0でない場合は、エラーメッセージとともに例外を発生させる。ユーザはこれを補足することでinfoを受け取れるようにする。
Todo
-
直前に使ったroutineを、使い回したい事があるか?
-
ソルバライブラリごとに、直前に使ったroutine名をクラスのプライベート引数に記録しておく?
-
initialize関数のオーバーロード
-
インターフェースクラスのinitialize関数は、ソルバライブラリがパースできるようにコマンドライン引数argc, argvをとる。
-
とらないバージョンも作る。(serial_dense_solverは、コマンドライン引数をパースしないため。)
-
デフォルトのソルバライブラリ
-
ソルバライブラリの名前を与えないとき、priorityの数字が高いものを選択する。
-
serial_dense_solverでは、LAPACK
-
parallel_dense_solverでは、EigenExa
-
parallel_sparse_solverでは、Anasazi?
-
出力パラメータは、ユーザから
diagonalize
関数の引数で渡されるparams_outに登録して返す。 -
行列や固有値・固有ベクトルを収める行列も、ポインタでparametersで渡せるようにもしたい。すると、diagonalize関数は、入力と(出力)のパラメータクラス(とtimerクラス)だけを渡せばよいことになる!
-
ルーチン名は、eigen_exa:eigen_sxだけでなく、eigen_sxでも良いとするか。そうするには、各ライブラリごとに持っているルーチン名のリストを作っておく必要がある。(さらに、それらのルーチンでコンパイルが通るかをRokkoのCMake時にチェックする?)
-
ユーザの環境でのデフォルト(priorityの値が最大)のソルバ・ルーチン名を返す仕組み