1 /*
2  *
3  * cblas_dgemm.c
4  * This program is a C interface to dgemm.
5  * Written by Keita Teranishi
6  * 4/8/1998
7  *
8  */
9 
10 #include <R.h>
11 #include <R_ext/Applic.h> /* R blas declarations */
12 
13 #include "cblas.h"
cblas_dgemm(const enum CBLAS_ORDER Order,const enum CBLAS_TRANSPOSE TransA,const enum CBLAS_TRANSPOSE TransB,const int M,const int N,const int K,const double alpha,const double * A,const int lda,const double * B,const int ldb,const double beta,double * C,const int ldc)14 void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
15                  const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
16                  const int K, const double alpha, const double  *A,
17                  const int lda, const double  *B, const int ldb,
18                  const double beta, double  *C, const int ldc)
19 {
20    char TA, TB;
21 #ifdef F77_CHAR
22    F77_CHAR F77_TA, F77_TB;
23 #else
24    #define F77_TA &TA
25    #define F77_TB &TB
26 #endif
27 
28 #ifdef F77_INT
29    F77_INT F77_M=M, F77_N=N, F77_K=K, F77_lda=lda, F77_ldb=ldb;
30    F77_INT F77_ldc=ldc;
31 #else
32    #define F77_M M
33    #define F77_N N
34    #define F77_K K
35    #define F77_lda lda
36    #define F77_ldb ldb
37    #define F77_ldc ldc
38 #endif
39 
40    /* the follow two vars were originally in Carla's.h as ex-terns, but that runs into conflicts on system with a
41       preexisting cblas */
42    int CBLAS_CallFromC;
43    int RowMajorStrg;
44 
45    RowMajorStrg = 0;
46    CBLAS_CallFromC = 1;
47 
48    if( Order == CblasColMajor )
49    {
50       if(TransA == CblasTrans) TA='T';
51       else if ( TransA == CblasConjTrans ) TA='C';
52       else if ( TransA == CblasNoTrans )   TA='N';
53       else
54       {
55 	error("cblas_dgemm","Illegal TransA setting, %d\n", TransA);
56 	/* cblas_xerbla(2, "cblas_dgemm","Illegal TransA setting, %d\n", TransA); */
57          CBLAS_CallFromC = 0;
58          RowMajorStrg = 0;
59          return;
60       }
61 
62       if(TransB == CblasTrans) TB='T';
63       else if ( TransB == CblasConjTrans ) TB='C';
64       else if ( TransB == CblasNoTrans )   TB='N';
65       else
66       {
67 	error("cblas_dgemm","Illegal TransB setting, %d\n", TransB);
68 	/* cblas_xerbla(3, "cblas_dgemm","Illegal TransB setting, %d\n", TransB); */
69          CBLAS_CallFromC = 0;
70          RowMajorStrg = 0;
71          return;
72       }
73 
74       #ifdef F77_CHAR
75          F77_TA = C2F_CHAR(&TA);
76          F77_TB = C2F_CHAR(&TB);
77       #endif
78 
79 	 F77_CALL(dgemm)(F77_TA, F77_TB, &F77_M, &F77_N, &F77_K, &alpha, A,
80        &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc);
81    } else if (Order == CblasRowMajor)
82    {
83       RowMajorStrg = 1;
84       if(TransA == CblasTrans) TB='T';
85       else if ( TransA == CblasConjTrans ) TB='C';
86       else if ( TransA == CblasNoTrans )   TB='N';
87       else
88       {
89 	error("cblas_dgemm","Illegal TransA setting, %d\n", TransA);
90 	/* cblas_xerbla(2, "cblas_dgemm","Illegal TransA setting, %d\n", TransA); */
91          CBLAS_CallFromC = 0;
92          RowMajorStrg = 0;
93          return;
94       }
95       if(TransB == CblasTrans) TA='T';
96       else if ( TransB == CblasConjTrans ) TA='C';
97       else if ( TransB == CblasNoTrans )   TA='N';
98       else
99       {
100 	error("cblas_dgemm","Illegal TransB setting, %d\n", TransB);
101 	/* cblas_xerbla(2, "cblas_dgemm","Illegal TransB setting, %d\n", TransB); */
102          CBLAS_CallFromC = 0;
103          RowMajorStrg = 0;
104          return;
105       }
106       #ifdef F77_CHAR
107          F77_TA = C2F_CHAR(&TA);
108          F77_TB = C2F_CHAR(&TB);
109       #endif
110 
111 	 F77_CALL(dgemm)(F77_TA, F77_TB, &F77_N, &F77_M, &F77_K, &alpha, B,
112 			 &F77_ldb, A, &F77_lda, &beta, C, &F77_ldc);
113    }
114    else  {
115      error("cblas_dgemm", "Illegal Order setting, %d\n", Order);
116      /* cblas_xerbla(1, "cblas_dgemm", "Illegal Order setting, %d\n", Order); */
117    }
118    CBLAS_CallFromC = 0;
119    RowMajorStrg = 0;
120    return;
121 }
122 
123 
124