示例#1
0
void Mjoin(Mjoin(PATL,trcopyU2U_N),NM)
#endif
   (const int N, const SCALAR alpha0, const TYPE *A, const int lda, TYPE *C)
/*
 * Copies an Upper matrix to a dense matrix with zeros below the diagonal
 */
{
   int i, j;
   const register TYPE alpha=alpha0;
   const TYPE *Ac = A;

   if (N > 1)
   {
      for (j=0; j != N; j++)
      {
         for (i=0; i != j; i++) C[i] = ATL_MulByALPHA(Ac[i]);
         #ifdef UnitDiag_
            C[j] = alpha;
         #else
            C[j] = ATL_MulByALPHA(Ac[j]);
         #endif
         for (i=j+1; i < N; i++) C[i] = 0.0;
         C += N;
         Ac += lda;
      }
   }
   else if (N == 1)
   {
      #ifdef UnitDiag_
         *C = alpha;
      #else
         *C = ATL_MulByALPHA(*A);
      #endif
   }
}
示例#2
0
void Mjoin(PATL,Mjoin(gemove,NM))
   (const int M0, const int N, const SCALAR alpha0,
    const TYPE *A, const int lda, TYPE *C, const int ldc)
/*
 * C <- alpha * A
 */
{
#ifdef ALPHA0
   Mjoin(PATL,gezero)(M0, N, C, ldc);
#elif defined(ALPHA1)
   Mjoin(PATL,gecopy)(M0, N, A, lda, C, ldc);
#elif defined(TREAL) || defined(ALPHAXI0)
   int i, j;
   const int n = N>>1;
   #ifdef TREAL
      #define M   M0
      const register TYPE alpha = alpha0;
      const int incA = lda<<1, incC = ldc<<1;
   #else
      const register TYPE ralpha = *alpha0;
      const int M = M0<<1, incA = lda<<2, incC = ldc<<2;
   #endif
   const TYPE *A0 = A, *A1 = A+(lda SHIFT);
   TYPE *C0 = C, *C1 = C+(ldc SHIFT);

   for (j=n; j; j--, A0 += incA, A1 += incA, C0 += incC, C1 += incC)
   {
      for (i=0; i != M; i++)
      {
         C0[i] = ATL_MulByALPHA(A0[i]);
         C1[i] = ATL_MulByALPHA(A1[i]);
      }
   }
   if (N != (n<<1)) for (i=0; i != M; i++) C0[i] = ATL_MulByALPHA(A0[i]);

#elif defined(TCPLX)
   const int incA = (lda-M0)<<1, incC = (ldc-M0)<<1;
   int i, j;
   const register TYPE ralpha = *alpha0, ialpha = alpha0[1];
   register TYPE rtmp, itmp;

   for (j=N; j; j--, A += incA, C += incC)
   {
      for(i=M0; i; i--, A += 2, C += 2)
      {
         rtmp = *A;  itmp = A[1];
         *C = rtmp * ralpha - itmp * ialpha;
         C[1] = rtmp * ialpha + itmp * ralpha;
      }
   }
#endif
}
void Mjoin(Mjoin(PATL,pcol2blk),NM)
   (const int M, const int N, const TYPE alpha, const TYPE *A, int lda,
    const int ldainc, TYPE *V)
/*
 * Given a packed matrix A, copies N columns starting at A into
 * block-major column panel
 *    ldainc =  0 : General
 *    ldainc =  1 : Upper
 *    ldainc = -1 : Lower
 * NOTE: specialize to alpha cases after it works!
 */
{
   const int kb = Mmin(M,NB);
   const int nrb = M / kb, mr = M - nrb*kb;
   int i, ib, j, J;
   const int NN = N*kb;
   TYPE *v = V + nrb*NN;

   if (ldainc)
   {
      if (ldainc == -1) lda--;
      ATL_assert(N <= NB);
      for (j=0; j != N; j++)
      {
         for (ib=nrb; ib; ib--)
         {
            for (i=0; i < kb; i++) V[i] = ATL_MulByALPHA(A[i]);
            V += NN;
            A += kb;
         }
         if (mr)
         {
            for (i=0; i < mr; i++) v[i] = ATL_MulByALPHA(A[i]);
            v += mr;
         }
         V += kb - nrb*NN;
         A += lda - nrb*kb;
         lda += ldainc;
      }
   }
   else Mjoin(Mjoin(PATL,col2blk),NM)(M, N, A, lda, V, alpha);
}
示例#4
0
void Mjoin(Mjoin(PATL,prow2blkT),NM)
   (const int M, const int N, const TYPE alpha, const TYPE *A, int lda,
    const int ldainc, TYPE *V)
/*
 * Given a packed Upper matrix A, copies & transposes M rows starting at A into
 * block-major row panel
 *    ldainc =  0 : General rectangular
 *    ldainc =  1 : Upper
 *    ldainc = -1 : Lower
 * NOTE: specialize to alpha cases after it works!
 */
{
   const int kb = Mmin(NB,N);
   const int ncb = N / kb, nr = N - ncb*kb;
   const int incV = kb*M - kb;
   int jb, i, j;
   TYPE *v;

   if (ldainc)
   {
      if (ldainc == -1) lda--;
      for (jb=ncb; jb; jb--)
      {
         for (j=kb; j; j--)
         {
            v = V++;
            for (i=0; i != M; i++, v += kb) *v = ATL_MulByALPHA(A[i]);
            A += lda;
            lda += ldainc;
         }
         V += incV;
      }
      for (j=nr; j; j--)
      {
         v = V++;
         for (i=0; i != M; i++, v += nr) *v = ATL_MulByALPHA(A[i]);
         A += lda;
         lda += ldainc;
      }
   }
   else Mjoin(Mjoin(PATL,row2blkT),NM)(N, M, A, lda, V, alpha);
}
示例#5
0
   void Mjoin(Mjoin(PATL,trcopyU2L_N),NM)
   #endif
      (const int N, const SCALAR alpha0, const TYPE *A, const int lda, TYPE *C)
#endif
/*
 * Takes an Upper matrix, transposes it, and copies it to a dense matrix with
 * zeroes above the diagonal (i.e., lower form)
 */
{
   int i, j;
   const int ldap1 = lda+1;
   const register TYPE alpha=alpha0;
   const TYPE *Ac = A, *Ar;
   TYPE *rC, *cC=C;

   if (N > 1)
   {
      for (j=0; j != N; j++)
      {
         for (i=0; i != j; i++) C[i] = 0.0;
         #ifdef UnitDiag_
            C[j] = alpha;
         #else
            C[j] = ATL_MulByALPHA(*Ac);
         #endif
         Ar = Ac + lda;
         for (i=j+1; i < N; i++, Ar += lda) C[i] = ATL_MulByALPHA(*Ar);
         C += N;
         Ac += ldap1;
      }
   }
   else if (N == 1)
   {
      #ifdef UnitDiag_
         *C = alpha;
      #else
         *C = ATL_MulByALPHA(*A);
      #endif
   }
}
示例#6
0
void Mjoin(Mjoin(PATL,sycopyU),NM)
   (const int N, const SCALAR alpha0, const TYPE *A, const int lda, TYPE *C)
/*
 * Copies a symmetric matrix stored in Upper format to a dense matrix
 */
{
   int i, j;
   const register TYPE alpha=alpha0;
   const TYPE *Ar, *Ac = A;
   TYPE *rC, *cC=C;

   if (N > 1)
   {
      for (j=0; j != N; j++)
      {
         for (i=0; i <= j; i++) C[i] = ATL_MulByALPHA(Ac[i]);
         Ar = Ac + j + lda;
         for (i=j+1; i < N; i++, Ar += lda) C[i] = ATL_MulByALPHA(*Ar);
         C += N;
         Ac += lda;
      }
   }
   else if (N == 1) *C = ATL_MulByALPHA(*A);
}