Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
   }