int ATL_potrf(const enum ATLAS_ORDER Order, const enum ATLAS_UPLO Uplo, const int N, TYPE *A, const int lda0) { int ierr=0; size_t lda = lda0; if (N) { if (Order == AtlasColMajor) { if (Uplo == AtlasUpper) ierr = ATL_potrfU(N, A, lda); else ierr = ATL_potrfL(N, A, lda); } else { #ifdef TREAL if (Uplo == AtlasUpper) ierr = ATL_potrfL(N, A, lda); else ierr = ATL_potrfU(N, A, lda); #else if (Uplo == AtlasUpper) ierr = Mjoin(PATL,potrfRU)(N, A, lda); else ierr = Mjoin(PATL,potrfRL)(N, A, lda); #endif } } return(ierr); }
int ATL_potrfU(const int N, TYPE *A, const int lda) { TYPE *An, *Ac; int Nleft, Nright, ierr; const size_t lda2 = lda SHIFT; #ifdef TREAL #define ONE ATL_rone #else static const TYPE ONE[2] = {ATL_rone, ATL_rzero}; #endif #ifdef TREAL if (N > 4) #else if (N > 1) #endif { Nleft = N >> 1; #ifdef NB if (Nleft > NB<<1) Nleft = ATL_MulByNB(ATL_DivByNB(Nleft)); #endif Nright = N - Nleft; ierr = ATL_potrfU(Nleft, A, lda); if (!ierr) { Ac = A + lda2 * Nleft; An = Ac + (Nleft SHIFT); cblas_trsm(CblasColMajor, CblasLeft, CblasUpper, llt_trans, CblasNonUnit, Nleft, Nright, ONE, A, lda, Ac, lda); llt_syrk(CblasColMajor, CblasUpper, llt_trans, Nright, Nleft, ATL_rnone, Ac, lda, ATL_rone, An, lda); ierr = ATL_potrfU(Nright, An, lda); if (ierr) return(ierr+Nleft); } else return(ierr); }