1 #include <cxxblas/cxxblas.cxx>
  2 #include <cxxblas/interface/aux.h>
  3 
  4 using cxxblas::StorageOrder;
  5 using cxxblas::ColMajor;
  6 using cxxblas::RowMajor;
  7 using cxxblas::Transpose;
  8 using cxxblas::NoTrans;
  9 using cxxblas::Trans;
 10 using cxxblas::Conj;
 11 using cxxblas::ConjTrans;
 12 using cxxblas::StorageUpLo;
 13 using cxxblas::Upper;
 14 using cxxblas::Lower;
 15 
 16 
 17 extern "C" {
 18 
 19     void xerbla_(const char* srname, int* info);
 20 
 21 #ifndef COMPLEX_FLOAT1
 22     typedef CBLAS_FLOAT                 CBLAS_ALPHA;
 23     typedef CBLAS_FLOAT                 CBLAS_BETA;
 24     typedef CBLAS_FLOAT                 CXXBLAS_FLOAT;
 25 #else
 26     typedef const CBLAS_FLOAT *         CBLAS_ALPHA;
 27     typedef const CBLAS_FLOAT *         CBLAS_BETA;
 28     typedef std::complex<CBLAS_FLOAT>   CXXBLAS_FLOAT;
 29 #endif
 30 
 31     enum CBLAS_ORDER        {CblasRowMajor=101, CblasColMajor=102};
 32     enum CBLAS_TRANSPOSE    {CblasNoTrans=111, CblasTrans=112,
 33                              CblasConjTrans=113, CblasConjNoTrans=114};
 34     enum CBLAS_UPLO         {CblasUpper=121, CblasLower=122};
 35 
 36     void
 37     CBLAS_NAME(enum CBLAS_ORDER _order,
 38                enum CBLAS_UPLO _upLo,
 39                CBLAS_INT n,
 40                CBLAS_ALPHA _alpha,
 41                const CBLAS_FLOAT  *_A, CBLAS_INT ldA,
 42                const CBLAS_FLOAT  *_x, CBLAS_INT incX,
 43                CBLAS_BETA _beta,
 44                CBLAS_FLOAT  *_y, CBLAS_INT incY)
 45 #ifdef CREATE_CBLAS
 46     {
 47         StorageOrder order = (_order==CblasColMajor) ? ColMajor
 48                                                      : RowMajor;
 49         StorageUpLo upLo = Lower;
 50         if (_upLo==CblasUpper) {
 51             upLo = Upper;
 52         }
 53 
 54         const CXXBLAS_FLOAT *A = reinterpret_cast<const CXXBLAS_FLOAT *>(_A);
 55         const CXXBLAS_FLOAT *x = reinterpret_cast<const CXXBLAS_FLOAT *>(_x);
 56         CXXBLAS_FLOAT *y = reinterpret_cast<CXXBLAS_FLOAT *>(_y);
 57 
 58     #ifndef COMPLEX_FLOAT1
 59         CXXBLAS_FLOAT alpha = _alpha;
 60         CXXBLAS_FLOAT beta = _beta;
 61     #else
 62         CXXBLAS_FLOAT alpha(_alpha[0], _alpha[1]);
 63         CXXBLAS_FLOAT beta(_beta[0], _beta[1]);
 64     #endif
 65 
 66 #   ifdef TEST_ROW_MAJOR
 67         switchFullStorageOrder(order, n, n, A, ldA);
 68         order = (order==ColMajor) ? RowMajor : ColMajor;
 69 #   endif
 70 
 71         cxxblas::hemv(order,
 72                       upLo,
 73                       n,
 74                       alpha,
 75                       A, ldA,
 76                       x, incX,
 77                       beta,
 78                       y, incY);
 79 
 80 #   ifdef TEST_ROW_MAJOR
 81         releaseStorage(A);
 82 #   endif
 83     }
 84 #else
 85     ;
 86 #endif // CREATE_CBLAS
 87 
 88 #ifdef CREATE_BLAS
 89     void
 90     BLAS_NAME(const char *_upLo,
 91               const CBLAS_INT *_n,
 92               const CBLAS_FLOAT *_alpha,
 93               const CBLAS_FLOAT *A, const CBLAS_INT *_ldA,
 94               const CBLAS_FLOAT *x, const CBLAS_INT *_incX,
 95               const CBLAS_FLOAT *_beta,
 96               CBLAS_FLOAT *y, const CBLAS_INT *_incY)
 97     {
 98         bool checkUpLo = false;
 99         CBLAS_UPLO upLo = CblasUpper;
100         if ((*_upLo=='L') || (*_upLo=='l')) {
101             upLo = CblasLower;
102             checkUpLo = true;
103         }
104         if ((*_upLo=='U') || (*_upLo=='u')) {
105             checkUpLo = true;
106         }
107 
108         CBLAS_INT n       = *_n;
109         CBLAS_INT ldA     = *_ldA;
110         CBLAS_INT incX    = *_incX;
111         CBLAS_INT incY    = *_incY;
112 
113 #   ifndef COMPLEX_FLOAT1
114         CBLAS_ALPHA alpha  = *_alpha;
115         CBLAS_BETA beta  = *_beta;
116 #   else
117         CBLAS_ALPHA alpha = _alpha;
118         CBLAS_BETA beta = _beta;
119 #   endif
120 
121         CBLAS_INT info = 0;
122         if (incY==0) {
123             info = 10;
124         }
125         if (incX==0) {
126             info = 7
127         }
128         if (ldA<std::max(1, n)) {
129             info = 5;
130         }
131         if (n<0) {
132             info = 2;
133         }
134         if (!checkUpLo) {
135             info = 1;
136         }
137         if (info!=0) {
138             char blasName[6];
139             strncpy(blasName, BLAS_NAME_STR, 6);
140             for (int i=0; i<6; ++i) {
141                 blasName[i] = std::toupper(blasName[i]);
142             }
143             xerbla_(blasName, &info);
144           return;
145         }
146 
147         // the blas interface calls the cblas interface
148         // so any blas-test will also test the cblas-interface
149         CBLAS_NAME(CblasColMajor,
150                    upLo,
151                    n,
152                    alpha,
153                    A, ldA,
154                    x, incX,
155                    beta,
156                    y, incY);
157     }
158 #endif // CREATE_BLAS
159 
160 // extern "C"