Home | History | Annotate | Download | only in testing
      1 /*
      2  *     Written by D.P. Manley, Digital Equipment Corporation.
      3  *     Prefixed "C_" to BLAS routines and their declarations.
      4  *
      5  *     Modified by T. H. Do, 2/19/98, SGI/CRAY Research.
      6  */
      7 #include <stdlib.h>
      8 #include "cblas.h"
      9 #include "cblas_test.h"
     10 #define  TEST_COL_MJR	0
     11 #define  TEST_ROW_MJR	1
     12 #define  UNDEFINED     -1
     13 
     14 void F77_dgemm(int *order, char *transpa, char *transpb, int *m, int *n,
     15               int *k, double *alpha, double *a, int *lda, double *b, int *ldb,
     16               double *beta, double *c, int *ldc ) {
     17 
     18   double *A, *B, *C;
     19   int i,j,LDA, LDB, LDC;
     20   enum CBLAS_TRANSPOSE transa, transb;
     21 
     22   get_transpose_type(transpa, &transa);
     23   get_transpose_type(transpb, &transb);
     24 
     25   if (*order == TEST_ROW_MJR) {
     26      if (transa == CblasNoTrans) {
     27         LDA = *k+1;
     28         A = (double *)malloc( (*m)*LDA*sizeof( double ) );
     29         for( i=0; i<*m; i++ )
     30            for( j=0; j<*k; j++ )
     31               A[i*LDA+j]=a[j*(*lda)+i];
     32      }
     33      else {
     34         LDA = *m+1;
     35         A   = ( double* )malloc( LDA*(*k)*sizeof( double ) );
     36         for( i=0; i<*k; i++ )
     37            for( j=0; j<*m; j++ )
     38               A[i*LDA+j]=a[j*(*lda)+i];
     39      }
     40      if (transb == CblasNoTrans) {
     41         LDB = *n+1;
     42         B   = ( double* )malloc( (*k)*LDB*sizeof( double ) );
     43         for( i=0; i<*k; i++ )
     44            for( j=0; j<*n; j++ )
     45               B[i*LDB+j]=b[j*(*ldb)+i];
     46      }
     47      else {
     48         LDB = *k+1;
     49         B   = ( double* )malloc( LDB*(*n)*sizeof( double ) );
     50         for( i=0; i<*n; i++ )
     51            for( j=0; j<*k; j++ )
     52               B[i*LDB+j]=b[j*(*ldb)+i];
     53      }
     54      LDC = *n+1;
     55      C   = ( double* )malloc( (*m)*LDC*sizeof( double ) );
     56      for( j=0; j<*n; j++ )
     57         for( i=0; i<*m; i++ )
     58            C[i*LDC+j]=c[j*(*ldc)+i];
     59 
     60      cblas_dgemm( CblasRowMajor, transa, transb, *m, *n, *k, *alpha, A, LDA,
     61                   B, LDB, *beta, C, LDC );
     62      for( j=0; j<*n; j++ )
     63         for( i=0; i<*m; i++ )
     64            c[j*(*ldc)+i]=C[i*LDC+j];
     65      free(A);
     66      free(B);
     67      free(C);
     68   }
     69   else if (*order == TEST_COL_MJR)
     70      cblas_dgemm( CblasColMajor, transa, transb, *m, *n, *k, *alpha, a, *lda,
     71                   b, *ldb, *beta, c, *ldc );
     72   else
     73      cblas_dgemm( UNDEFINED, transa, transb, *m, *n, *k, *alpha, a, *lda,
     74                   b, *ldb, *beta, c, *ldc );
     75 }
     76 void F77_dsymm(int *order, char *rtlf, char *uplow, int *m, int *n,
     77               double *alpha, double *a, int *lda, double *b, int *ldb,
     78               double *beta, double *c, int *ldc ) {
     79 
     80   double *A, *B, *C;
     81   int i,j,LDA, LDB, LDC;
     82   enum CBLAS_UPLO uplo;
     83   enum CBLAS_SIDE side;
     84 
     85   get_uplo_type(uplow,&uplo);
     86   get_side_type(rtlf,&side);
     87 
     88   if (*order == TEST_ROW_MJR) {
     89      if (side == CblasLeft) {
     90         LDA = *m+1;
     91         A   = ( double* )malloc( (*m)*LDA*sizeof( double ) );
     92         for( i=0; i<*m; i++ )
     93            for( j=0; j<*m; j++ )
     94               A[i*LDA+j]=a[j*(*lda)+i];
     95      }
     96      else{
     97         LDA = *n+1;
     98         A   = ( double* )malloc( (*n)*LDA*sizeof( double ) );
     99         for( i=0; i<*n; i++ )
    100            for( j=0; j<*n; j++ )
    101               A[i*LDA+j]=a[j*(*lda)+i];
    102      }
    103      LDB = *n+1;
    104      B   = ( double* )malloc( (*m)*LDB*sizeof( double ) );
    105      for( i=0; i<*m; i++ )
    106         for( j=0; j<*n; j++ )
    107            B[i*LDB+j]=b[j*(*ldb)+i];
    108      LDC = *n+1;
    109      C   = ( double* )malloc( (*m)*LDC*sizeof( double ) );
    110      for( j=0; j<*n; j++ )
    111         for( i=0; i<*m; i++ )
    112            C[i*LDC+j]=c[j*(*ldc)+i];
    113      cblas_dsymm( CblasRowMajor, side, uplo, *m, *n, *alpha, A, LDA, B, LDB,
    114                   *beta, C, LDC );
    115      for( j=0; j<*n; j++ )
    116         for( i=0; i<*m; i++ )
    117            c[j*(*ldc)+i]=C[i*LDC+j];
    118      free(A);
    119      free(B);
    120      free(C);
    121   }
    122   else if (*order == TEST_COL_MJR)
    123      cblas_dsymm( CblasColMajor, side, uplo, *m, *n, *alpha, a, *lda, b, *ldb,
    124                   *beta, c, *ldc );
    125   else
    126      cblas_dsymm( UNDEFINED, side, uplo, *m, *n, *alpha, a, *lda, b, *ldb,
    127                   *beta, c, *ldc );
    128 }
    129 
    130 void F77_dsyrk(int *order, char *uplow, char *transp, int *n, int *k,
    131               double *alpha, double *a, int *lda,
    132               double *beta, double *c, int *ldc ) {
    133 
    134   int i,j,LDA,LDC;
    135   double *A, *C;
    136   enum CBLAS_UPLO uplo;
    137   enum CBLAS_TRANSPOSE trans;
    138 
    139   get_uplo_type(uplow,&uplo);
    140   get_transpose_type(transp,&trans);
    141 
    142   if (*order == TEST_ROW_MJR) {
    143      if (trans == CblasNoTrans) {
    144         LDA = *k+1;
    145         A   = ( double* )malloc( (*n)*LDA*sizeof( double ) );
    146         for( i=0; i<*n; i++ )
    147            for( j=0; j<*k; j++ )
    148               A[i*LDA+j]=a[j*(*lda)+i];
    149      }
    150      else{
    151         LDA = *n+1;
    152         A   = ( double* )malloc( (*k)*LDA*sizeof( double ) );
    153         for( i=0; i<*k; i++ )
    154            for( j=0; j<*n; j++ )
    155               A[i*LDA+j]=a[j*(*lda)+i];
    156      }
    157      LDC = *n+1;
    158      C   = ( double* )malloc( (*n)*LDC*sizeof( double ) );
    159      for( i=0; i<*n; i++ )
    160         for( j=0; j<*n; j++ )
    161            C[i*LDC+j]=c[j*(*ldc)+i];
    162      cblas_dsyrk(CblasRowMajor, uplo, trans, *n, *k, *alpha, A, LDA, *beta,
    163 	         C, LDC );
    164      for( j=0; j<*n; j++ )
    165         for( i=0; i<*n; i++ )
    166            c[j*(*ldc)+i]=C[i*LDC+j];
    167      free(A);
    168      free(C);
    169   }
    170   else if (*order == TEST_COL_MJR)
    171      cblas_dsyrk(CblasColMajor, uplo, trans, *n, *k, *alpha, a, *lda, *beta,
    172 	         c, *ldc );
    173   else
    174      cblas_dsyrk(UNDEFINED, uplo, trans, *n, *k, *alpha, a, *lda, *beta,
    175 	         c, *ldc );
    176 }
    177 
    178 void F77_dsyr2k(int *order, char *uplow, char *transp, int *n, int *k,
    179                double *alpha, double *a, int *lda, double *b, int *ldb,
    180                double *beta, double *c, int *ldc ) {
    181   int i,j,LDA,LDB,LDC;
    182   double *A, *B, *C;
    183   enum CBLAS_UPLO uplo;
    184   enum CBLAS_TRANSPOSE trans;
    185 
    186   get_uplo_type(uplow,&uplo);
    187   get_transpose_type(transp,&trans);
    188 
    189   if (*order == TEST_ROW_MJR) {
    190      if (trans == CblasNoTrans) {
    191         LDA = *k+1;
    192         LDB = *k+1;
    193         A   = ( double* )malloc( (*n)*LDA*sizeof( double ) );
    194         B   = ( double* )malloc( (*n)*LDB*sizeof( double ) );
    195         for( i=0; i<*n; i++ )
    196            for( j=0; j<*k; j++ ) {
    197               A[i*LDA+j]=a[j*(*lda)+i];
    198               B[i*LDB+j]=b[j*(*ldb)+i];
    199            }
    200      }
    201      else {
    202         LDA = *n+1;
    203         LDB = *n+1;
    204         A   = ( double* )malloc( LDA*(*k)*sizeof( double ) );
    205         B   = ( double* )malloc( LDB*(*k)*sizeof( double ) );
    206         for( i=0; i<*k; i++ )
    207            for( j=0; j<*n; j++ ){
    208               A[i*LDA+j]=a[j*(*lda)+i];
    209               B[i*LDB+j]=b[j*(*ldb)+i];
    210            }
    211      }
    212      LDC = *n+1;
    213      C   = ( double* )malloc( (*n)*LDC*sizeof( double ) );
    214      for( i=0; i<*n; i++ )
    215         for( j=0; j<*n; j++ )
    216            C[i*LDC+j]=c[j*(*ldc)+i];
    217      cblas_dsyr2k(CblasRowMajor, uplo, trans, *n, *k, *alpha, A, LDA,
    218 		  B, LDB, *beta, C, LDC );
    219      for( j=0; j<*n; j++ )
    220         for( i=0; i<*n; i++ )
    221            c[j*(*ldc)+i]=C[i*LDC+j];
    222      free(A);
    223      free(B);
    224      free(C);
    225   }
    226   else if (*order == TEST_COL_MJR)
    227      cblas_dsyr2k(CblasColMajor, uplo, trans, *n, *k, *alpha, a, *lda,
    228 		   b, *ldb, *beta, c, *ldc );
    229   else
    230      cblas_dsyr2k(UNDEFINED, uplo, trans, *n, *k, *alpha, a, *lda,
    231 		   b, *ldb, *beta, c, *ldc );
    232 }
    233 void F77_dtrmm(int *order, char *rtlf, char *uplow, char *transp, char *diagn,
    234               int *m, int *n, double *alpha, double *a, int *lda, double *b,
    235               int *ldb) {
    236   int i,j,LDA,LDB;
    237   double *A, *B;
    238   enum CBLAS_SIDE side;
    239   enum CBLAS_DIAG diag;
    240   enum CBLAS_UPLO uplo;
    241   enum CBLAS_TRANSPOSE trans;
    242 
    243   get_uplo_type(uplow,&uplo);
    244   get_transpose_type(transp,&trans);
    245   get_diag_type(diagn,&diag);
    246   get_side_type(rtlf,&side);
    247 
    248   if (*order == TEST_ROW_MJR) {
    249      if (side == CblasLeft) {
    250         LDA = *m+1;
    251         A   = ( double* )malloc( (*m)*LDA*sizeof( double ) );
    252         for( i=0; i<*m; i++ )
    253            for( j=0; j<*m; j++ )
    254               A[i*LDA+j]=a[j*(*lda)+i];
    255      }
    256      else{
    257         LDA = *n+1;
    258         A   = ( double* )malloc( (*n)*LDA*sizeof( double ) );
    259         for( i=0; i<*n; i++ )
    260            for( j=0; j<*n; j++ )
    261               A[i*LDA+j]=a[j*(*lda)+i];
    262      }
    263      LDB = *n+1;
    264      B   = ( double* )malloc( (*m)*LDB*sizeof( double ) );
    265      for( i=0; i<*m; i++ )
    266         for( j=0; j<*n; j++ )
    267            B[i*LDB+j]=b[j*(*ldb)+i];
    268      cblas_dtrmm(CblasRowMajor, side, uplo, trans, diag, *m, *n, *alpha,
    269 		 A, LDA, B, LDB );
    270      for( j=0; j<*n; j++ )
    271         for( i=0; i<*m; i++ )
    272            b[j*(*ldb)+i]=B[i*LDB+j];
    273      free(A);
    274      free(B);
    275   }
    276   else if (*order == TEST_COL_MJR)
    277      cblas_dtrmm(CblasColMajor, side, uplo, trans, diag, *m, *n, *alpha,
    278 		   a, *lda, b, *ldb);
    279   else
    280      cblas_dtrmm(UNDEFINED, side, uplo, trans, diag, *m, *n, *alpha,
    281 		   a, *lda, b, *ldb);
    282 }
    283 
    284 void F77_dtrsm(int *order, char *rtlf, char *uplow, char *transp, char *diagn,
    285               int *m, int *n, double *alpha, double *a, int *lda, double *b,
    286               int *ldb) {
    287   int i,j,LDA,LDB;
    288   double *A, *B;
    289   enum CBLAS_SIDE side;
    290   enum CBLAS_DIAG diag;
    291   enum CBLAS_UPLO uplo;
    292   enum CBLAS_TRANSPOSE trans;
    293 
    294   get_uplo_type(uplow,&uplo);
    295   get_transpose_type(transp,&trans);
    296   get_diag_type(diagn,&diag);
    297   get_side_type(rtlf,&side);
    298 
    299   if (*order == TEST_ROW_MJR) {
    300      if (side == CblasLeft) {
    301         LDA = *m+1;
    302         A   = ( double* )malloc( (*m)*LDA*sizeof( double ) );
    303         for( i=0; i<*m; i++ )
    304            for( j=0; j<*m; j++ )
    305               A[i*LDA+j]=a[j*(*lda)+i];
    306      }
    307      else{
    308         LDA = *n+1;
    309         A   = ( double* )malloc( (*n)*LDA*sizeof( double ) );
    310         for( i=0; i<*n; i++ )
    311            for( j=0; j<*n; j++ )
    312               A[i*LDA+j]=a[j*(*lda)+i];
    313      }
    314      LDB = *n+1;
    315      B   = ( double* )malloc( (*m)*LDB*sizeof( double ) );
    316      for( i=0; i<*m; i++ )
    317         for( j=0; j<*n; j++ )
    318            B[i*LDB+j]=b[j*(*ldb)+i];
    319      cblas_dtrsm(CblasRowMajor, side, uplo, trans, diag, *m, *n, *alpha,
    320 		 A, LDA, B, LDB );
    321      for( j=0; j<*n; j++ )
    322         for( i=0; i<*m; i++ )
    323            b[j*(*ldb)+i]=B[i*LDB+j];
    324      free(A);
    325      free(B);
    326   }
    327   else if (*order == TEST_COL_MJR)
    328      cblas_dtrsm(CblasColMajor, side, uplo, trans, diag, *m, *n, *alpha,
    329 		   a, *lda, b, *ldb);
    330   else
    331      cblas_dtrsm(UNDEFINED, side, uplo, trans, diag, *m, *n, *alpha,
    332 		   a, *lda, b, *ldb);
    333 }
    334