Open t-sakashita opened 4 years ago
TRILWMIN = 3*N + MAX( NB*( NP+1 ), 3*NB )
LWMIN = MAX( 1+6*N+2*NP*NQ, TRILWMIN ) + 2*N
ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
INFO = -14
http://www.netlib.org/scalapack/explore-html/d6/d75/pdsyevd_8f_source.html
Macにおいて、出力してみた。
int np = 10;
int nq = 64;
int TRILWMIN = 3*n + MAX( 16*( np+1 ), 3*16 );
int LWMIN = MAX( 1+6*n+2*np*nq, TRILWMIN ) + 2*n;
printf("lwork=%d lwmin=%d\n", lwork, LWMIN);
lwork = LWMIN;
m_local=10 n_local=10 lld=10
lwork=754 LWMIN=8273
このLWMINをlworkとしてpdsyevdを呼び出すと、正常終了した。
a6168424d8586056f5cbbff58ec366e3442ab510
mpirun -np 1 --oversubscribe ./minij_mpi scalapack:pdsyevd 10
Eigenvalue decomposition of minij matrix
library:routine = scalapack:pdsyevd
num_procs = 1
num_threads per process = 4
routine = pdsyevd
dimension = 10
{ 0, 0}: On entry to PDORMTR parameter number 16 had an illegal value
largest eigenvalues: 44.766 5.0489 1.873 1 0.6431 0.46523 0.36621 0.30798 0.27379 0.25568
eigenvectors:
0.61864 -0.68391 -0.37025 -0.11031 -0.017417 -0.0012772 -3.3195e-05 1.7211e-07 -3.9385e-11 3.5421e-19
0.52739 0.036235 0.65267 0.51565 0.16766 0.023656 0.0012073 -1.3774e-05 9.4068e-09 -7.881e-16
0.40576 0.33862 0.24631 -0.55972 -0.56221 -0.17412 -0.018553 0.00048115 -9.9793e-07 7.8486e-13
-0.29771 -0.39368 0.15776 0.33283 -0.53625 -0.55959 -0.14118 0.0087992 -5.6954e-05 4.2537e-10
0.2115 0.34342 -0.31931 0.08263 0.33565 -0.58517 -0.51574 0.086429 -0.0018297 1.322e-07
-0.14645 -0.26395 0.32013 -0.2757 0.08377 0.28757 -0.67901 0.42259 -0.032152 2.3227e-05
0.099134 0.18855 -0.25695 0.28897 -0.2605 0.12855 0.18797 0.78049 -0.27607 0.0021351
-0.065004 -0.12693 0.18232 -0.22672 0.25333 -0.24928 0.18407 -0.03749 -0.85213 0.085372
-0.037546 -0.074114 0.10871 -0.1403 0.16766 -0.18912 0.2015 0.19558 0.12479 -0.89627
-0.065047 -0.12864 0.18936 -0.24585 0.29685 -0.34122 0.37796 0.40627 0.42549 0.43522
上記にある、サブルーチンPDORMTRのエラーの解決方法はわからなかった。 だが、実行は途中で止まらないので、とりあえず、問題ない。
メインプログラム
ルーチン
行列サイズ = 10
プロセス数 = 1
Macでのデバッガの出力
enagaでのエラー
sgimptのScaLAPACKが出したエラー
14番目の引数はLWORK 行列サイズがブロックサイズよりも小さい場合の、LWORKの計算法を調べる。