| @@ -29,15 +29,16 @@ void RELAPACK_dgetrf( | |||||
| return; | return; | ||||
| } | } | ||||
| const blasint sn = MIN(*m, *n); | |||||
| if (*m == 0 || *n == 0) return; | |||||
| const blasint sn = MIN(*m, *n); | |||||
| RELAPACK_dgetrf_rec(m, &sn, A, ldA, ipiv, info); | RELAPACK_dgetrf_rec(m, &sn, A, ldA, ipiv, info); | ||||
| // Right remainder | // Right remainder | ||||
| if (*m < *n) { | if (*m < *n) { | ||||
| // Constants | // Constants | ||||
| const double ONE[] = { 1. }; | const double ONE[] = { 1. }; | ||||
| const blasint iONE[] = { 1. }; | |||||
| const blasint iONE[] = { 1 }; | |||||
| // Splitting | // Splitting | ||||
| const blasint rn = *n - *m; | const blasint rn = *n - *m; | ||||
| @@ -60,13 +61,11 @@ static void RELAPACK_dgetrf_rec( | |||||
| double *A, const blasint *ldA, blasint *ipiv, | double *A, const blasint *ldA, blasint *ipiv, | ||||
| blasint *info | blasint *info | ||||
| ) { | ) { | ||||
| if (*n <= MAX(CROSSOVER_DGETRF, 1)) { | |||||
| if ( *n <= MAX(CROSSOVER_DGETRF, 1)) { | |||||
| // Unblocked | // Unblocked | ||||
| LAPACK(dgetf2)(m, n, A, ldA, ipiv, info); | |||||
| LAPACK(dgetrf2)(m, n, A, ldA, ipiv, info); | |||||
| return; | return; | ||||
| } | } | ||||
| // Constants | // Constants | ||||
| const double ONE[] = { 1. }; | const double ONE[] = { 1. }; | ||||
| const double MONE[] = { -1. }; | const double MONE[] = { -1. }; | ||||
| @@ -95,6 +94,7 @@ static void RELAPACK_dgetrf_rec( | |||||
| // recursion(A_L, ipiv_T) | // recursion(A_L, ipiv_T) | ||||
| RELAPACK_dgetrf_rec(m, &n1, A_L, ldA, ipiv_T, info); | RELAPACK_dgetrf_rec(m, &n1, A_L, ldA, ipiv_T, info); | ||||
| if (*info) return; | |||||
| // apply pivots to A_R | // apply pivots to A_R | ||||
| LAPACK(dlaswp)(&n2, A_R, ldA, iONE, &n1, ipiv_T, iONE); | LAPACK(dlaswp)(&n2, A_R, ldA, iONE, &n1, ipiv_T, iONE); | ||||
| @@ -36,7 +36,7 @@ void RELAPACK_dsytrf( | |||||
| *info = -2; | *info = -2; | ||||
| else if (*ldA < MAX(1, *n)) | else if (*ldA < MAX(1, *n)) | ||||
| *info = -4; | *info = -4; | ||||
| else if (*lWork < minlWork && *lWork != -1) | |||||
| else if ((*lWork < 1 || *lWork < minlWork) && *lWork != -1) | |||||
| *info = -7; | *info = -7; | ||||
| else if (*lWork == -1) { | else if (*lWork == -1) { | ||||
| // Work size query | // Work size query | ||||
| @@ -67,6 +67,7 @@ void RELAPACK_dsytrf( | |||||
| blasint nout; | blasint nout; | ||||
| // Recursive kernel | // Recursive kernel | ||||
| if (*n != 0) | |||||
| RELAPACK_dsytrf_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info); | RELAPACK_dsytrf_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info); | ||||
| #if XSYTRF_ALLOW_MALLOC | #if XSYTRF_ALLOW_MALLOC | ||||
| @@ -36,7 +36,7 @@ void RELAPACK_dsytrf_rook( | |||||
| *info = -2; | *info = -2; | ||||
| else if (*ldA < MAX(1, *n)) | else if (*ldA < MAX(1, *n)) | ||||
| *info = -4; | *info = -4; | ||||
| else if (*lWork < minlWork && *lWork != -1) | |||||
| else if ((*lWork <1 || *lWork < minlWork) && *lWork != -1) | |||||
| *info = -7; | *info = -7; | ||||
| else if (*lWork == -1) { | else if (*lWork == -1) { | ||||
| // Work size query | // Work size query | ||||
| @@ -56,7 +56,7 @@ void RELAPACK_dsytrf_rook( | |||||
| if (*info) { | if (*info) { | ||||
| const blasint minfo = -*info; | const blasint minfo = -*info; | ||||
| LAPACK(xerbla)("DSYTRF", &minfo, strlen("DSYTRF")); | |||||
| LAPACK(xerbla)("DSYTRF_ROOK", &minfo, strlen("DSYTRF_ROOK")); | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -49,6 +49,11 @@ void RELAPACK_dtrsyl( | |||||
| return; | return; | ||||
| } | } | ||||
| if (*m == 0 || *n == 0) { | |||||
| *scale = 1.; | |||||
| return; | |||||
| } | |||||
| // Clean char * arguments | // Clean char * arguments | ||||
| const char cleantranA = notransA ? 'N' : (transA ? 'T' : 'C'); | const char cleantranA = notransA ? 'N' : (transA ? 'T' : 'C'); | ||||
| const char cleantranB = notransB ? 'N' : (transB ? 'T' : 'C'); | const char cleantranB = notransB ? 'N' : (transB ? 'T' : 'C'); | ||||
| @@ -30,6 +30,7 @@ void RELAPACK_zgetrf( | |||||
| return; | return; | ||||
| } | } | ||||
| if (*m == 0 || *n == 0) return; | |||||
| const blasint sn = MIN(*m, *n); | const blasint sn = MIN(*m, *n); | ||||
| RELAPACK_zgetrf_rec(m, &sn, A, ldA, ipiv, info); | RELAPACK_zgetrf_rec(m, &sn, A, ldA, ipiv, info); | ||||
| @@ -62,9 +63,11 @@ static void RELAPACK_zgetrf_rec( | |||||
| blasint *info | blasint *info | ||||
| ) { | ) { | ||||
| if (*n <= MAX(CROSSOVER_ZGETRF, 1)) { | |||||
| if (*m == 0 || *n == 0) return; | |||||
| if ( *n <= MAX(CROSSOVER_ZGETRF, 1)) { | |||||
| // Unblocked | // Unblocked | ||||
| LAPACK(zgetf2)(m, n, A, ldA, ipiv, info); | |||||
| LAPACK(zgetrf2)(m, n, A, ldA, ipiv, info); | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -96,6 +99,8 @@ static void RELAPACK_zgetrf_rec( | |||||
| // recursion(A_L, ipiv_T) | // recursion(A_L, ipiv_T) | ||||
| RELAPACK_zgetrf_rec(m, &n1, A_L, ldA, ipiv_T, info); | RELAPACK_zgetrf_rec(m, &n1, A_L, ldA, ipiv_T, info); | ||||
| if (*info) return; | |||||
| // apply pivots to A_R | // apply pivots to A_R | ||||
| LAPACK(zlaswp)(&n2, A_R, ldA, iONE, &n1, ipiv_T, iONE); | LAPACK(zlaswp)(&n2, A_R, ldA, iONE, &n1, ipiv_T, iONE); | ||||
| @@ -36,7 +36,7 @@ void RELAPACK_zhetrf_rook( | |||||
| *info = -2; | *info = -2; | ||||
| else if (*ldA < MAX(1, *n)) | else if (*ldA < MAX(1, *n)) | ||||
| *info = -4; | *info = -4; | ||||
| else if (*lWork < minlWork && *lWork != -1) | |||||
| else if ((*lWork < 1 || *lWork < minlWork) && *lWork != -1) | |||||
| *info = -7; | *info = -7; | ||||
| else if (*lWork == -1) { | else if (*lWork == -1) { | ||||
| // Work size query | // Work size query | ||||
| @@ -56,7 +56,7 @@ void RELAPACK_zhetrf_rook( | |||||
| if (*info) { | if (*info) { | ||||
| const blasint minfo = -*info; | const blasint minfo = -*info; | ||||
| LAPACK(xerbla)("ZHETRF", &minfo, strlen("ZHETRF")); | |||||
| LAPACK(xerbla)("ZHETRF_ROOK", &minfo, strlen("ZHETRF_ROOK")); | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -36,7 +36,7 @@ void RELAPACK_zsytrf( | |||||
| *info = -2; | *info = -2; | ||||
| else if (*ldA < MAX(1, *n)) | else if (*ldA < MAX(1, *n)) | ||||
| *info = -4; | *info = -4; | ||||
| else if (*lWork < minlWork && *lWork != -1) | |||||
| else if ((*lWork < 1 || *lWork < minlWork) && *lWork != -1) | |||||
| *info = -7; | *info = -7; | ||||
| else if (*lWork == -1) { | else if (*lWork == -1) { | ||||
| // Work size query | // Work size query | ||||
| @@ -67,6 +67,7 @@ void RELAPACK_zsytrf( | |||||
| blasint nout; | blasint nout; | ||||
| // Recursive kernel | // Recursive kernel | ||||
| if (*n != 0) | |||||
| RELAPACK_zsytrf_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info); | RELAPACK_zsytrf_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info); | ||||
| #if XSYTRF_ALLOW_MALLOC | #if XSYTRF_ALLOW_MALLOC | ||||
| @@ -36,7 +36,7 @@ void RELAPACK_zsytrf_rook( | |||||
| *info = -2; | *info = -2; | ||||
| else if (*ldA < MAX(1, *n)) | else if (*ldA < MAX(1, *n)) | ||||
| *info = -4; | *info = -4; | ||||
| else if (*lWork < minlWork && *lWork != -1) | |||||
| else if ((*lWork < 1 || *lWork < minlWork) && *lWork != -1) | |||||
| *info = -7; | *info = -7; | ||||
| else if (*lWork == -1) { | else if (*lWork == -1) { | ||||
| // Work size query | // Work size query | ||||
| @@ -56,7 +56,7 @@ void RELAPACK_zsytrf_rook( | |||||
| if (*info) { | if (*info) { | ||||
| const blasint minfo = -*info; | const blasint minfo = -*info; | ||||
| LAPACK(xerbla)("ZSYTRF", &minfo, strlen("ZSYTRF")); | |||||
| LAPACK(xerbla)("ZSYTRF_ROOK", &minfo, strlen("ZSYTRF_ROOK")); | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -67,6 +67,7 @@ void RELAPACK_zsytrf_rook( | |||||
| blasint nout; | blasint nout; | ||||
| // Recursive kernel | // Recursive kernel | ||||
| if (*n != 0) | |||||
| RELAPACK_zsytrf_rook_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info); | RELAPACK_zsytrf_rook_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info); | ||||
| #if XSYTRF_ALLOW_MALLOC | #if XSYTRF_ALLOW_MALLOC | ||||
| @@ -47,6 +47,11 @@ void RELAPACK_ztrsyl( | |||||
| return; | return; | ||||
| } | } | ||||
| if (*m == 0 || *n == 0) { | |||||
| *scale = 1.; | |||||
| return; | |||||
| } | |||||
| // Clean char * arguments | // Clean char * arguments | ||||
| const char cleantranA = notransA ? 'N' : 'C'; | const char cleantranA = notransA ? 'N' : 'C'; | ||||
| const char cleantranB = notransB ? 'N' : 'C'; | const char cleantranB = notransB ? 'N' : 'C'; | ||||
| @@ -69,8 +69,8 @@ static void RELAPACK_ztrtri_rec( | |||||
| } | } | ||||
| // Constants | // Constants | ||||
| const double ONE[] = { 1. }; | |||||
| const double MONE[] = { -1. }; | |||||
| const double ONE[] = { 1., 0. }; | |||||
| const double MONE[] = { -1. , 0. }; | |||||
| // Splitting | // Splitting | ||||
| const blasint n1 = ZREC_SPLIT(*n); | const blasint n1 = ZREC_SPLIT(*n); | ||||