int ATL_trtriRL(const enum ATLAS_DIAG Diag, const int N, TYPE *A, const int lda) { int ierr = 0; TYPE *Age, *Atr; TYPE tmp; int Nleft, Nright; #ifdef TREAL #define one ATL_rone #define mone -ATL_rone #define none ATL_rnone #else static const TYPE one[2] = {ATL_rone, ATL_rzero}; static const TYPE mone[2] = {-ATL_rone, ATL_rzero}; static const TYPE none[2] = {ATL_rnone, ATL_rzero}; #endif #ifdef TREAL if (N > REAL_RECURSE_LIMIT) #else if (N > 1) #endif { Nleft = N >> 1; #ifdef NB if (Nleft > NB) Nleft = ATL_MulByNB(ATL_DivByNB(Nleft)); #endif Nright = N - Nleft; Age = A + ((Nleft*lda) SHIFT); Atr = A + (Nleft * (lda+1) SHIFT); cblas_trsm(AtlasRowMajor, AtlasRight, AtlasLower, AtlasNoTrans, Diag, Nright, Nleft, one, A, lda, Age, lda); cblas_trsm(AtlasRowMajor, AtlasLeft, AtlasLower, AtlasNoTrans, Diag, Nright, Nleft, mone, Atr, lda, Age, lda); ierr = ATL_trtriRL(Diag, Nleft, A, lda); if (ierr!=0) return(ierr); ierr = ATL_trtriRL(Diag, Nright, Atr, lda); if (ierr!=0) return(ierr+Nleft); }
int ATL_trtri(const enum ATLAS_ORDER Order, const enum ATLAS_UPLO Uplo, const enum ATLAS_DIAG Diag, const int N, TYPE *A, const int lda) { const int ldap1 = (lda+1)SHIFT; int i; if (N > 0) { /* * Check for singularity if nonunit */ if (Diag == AtlasNonUnit) { for (i=0; i != N; i++, A += ldap1) { #ifdef TREAL if (*A == ATL_rzero) return(i+1); #else if (*A == ATL_rzero && A[1] == ATL_rzero) return(i+1); #endif } A -= N*ldap1; } if (Uplo == AtlasUpper) { if (Order == AtlasColMajor) return(ATL_trtriCU(Diag, N, A, lda)); else return(ATL_trtriRU(Diag, N, A, lda)); } else { if (Order == AtlasColMajor) return(ATL_trtriCL(Diag, N, A, lda)); else return(ATL_trtriRL(Diag, N, A, lda)); } } return(0); }