int ATL_getrfR(const int M, const int N, TYPE *A, const int lda, int *ipiv) /* * Row-major factorization of form * A = L * U * P * where P is a column-permutation matrix, L is lower triangular (lower * trapazoidal if M > N), and U is upper triangular with unit diagonals (upper * trapazoidal if M < N). This is the recursive Level 3 BLAS version. */ { const int MN = Mmin(M, N); int Nup, Ndown, i, ierr=0; #ifdef TCPLX const TYPE one[2] = {ATL_rone, ATL_rzero}; const TYPE none[2] = {ATL_rnone, ATL_rzero}; TYPE inv[2], tmp[2]; #else #define one ATL_rone #define none ATL_rnone TYPE tmp; #endif TYPE *Ar, *Ac, *An; if (MN > 1) { Nup = MN >> 1; #ifdef NB if (Nup > NB) Nup = ATL_MulByNB(ATL_DivByNB(Nup)); #endif Ndown = M - Nup; i = ATL_getrfR(Nup, N, A, lda, ipiv); if (i) if (!ierr) ierr = i; Ar = A + (Nup * lda SHIFT); Ac = A + (Nup SHIFT); An = Ar + (Nup SHIFT); ATL_laswp(Ndown, Ar, lda, 0, Nup, ipiv, 1); /* apply pivots */ cblas_trsm(CblasRowMajor, CblasRight, CblasUpper, CblasNoTrans, CblasUnit, Ndown, Nup, one, A, lda, Ar, lda); cblas_gemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Ndown, N-Nup, Nup, none, Ar, lda, Ac, lda, one, An, lda); i = ATL_getrfR(Ndown, N-Nup, An, lda, ipiv+Nup); if (i) if (!ierr) ierr = Nup + i; for (i=Nup; i != MN; i++) ipiv[i] += Nup; ATL_laswp(Nup, A, lda, Nup, MN, ipiv, 1); /* apply pivots */ }
int ATL_getrf(const enum CBLAS_ORDER Order, const int M, const int N, TYPE *A, const int lda, int *ipiv) { if (Order == CblasColMajor) return(ATL_getrfC(M, N, A, lda, ipiv)); else return(ATL_getrfR(M, N, A, lda, ipiv)); }