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_potrfL(const int N, TYPE *A, const int lda) { TYPE *An, *Ar; const size_t lda2=(lda SHIFT); int Nleft, Nright, ierr; #ifdef TREAL #define lda2 lda #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_potrfL(Nleft, A, lda); if (!ierr) { Ar = A + (Nleft SHIFT); An = Ar + lda2 * Nleft; cblas_trsm(CblasColMajor, CblasRight, CblasLower, llt_trans, CblasNonUnit, Nright, Nleft, ONE, A, lda, Ar, lda); llt_syrk(CblasColMajor, CblasLower, CblasNoTrans, Nright, Nleft, ATL_rnone, Ar, lda, ATL_rone, An, lda); ierr = ATL_potrfL(Nright, An, lda); if (ierr) return(ierr+Nleft); } else return(ierr); }