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 
  8 using cxxblas::Transpose;
  9 using cxxblas::NoTrans;
 10 using cxxblas::Trans;
 11 using cxxblas::Conj;
 12 using cxxblas::ConjTrans;
 13 
 14 using cxxblas::StorageUpLo;
 15 using cxxblas::Upper;
 16 using cxxblas::Lower;
 17 
 18 using cxxblas::Diag;
 19 using cxxblas::Unit;
 20 using cxxblas::NonUnit;
 21 
 22 
 23 extern "C" {
 24 
 25     void xerbla_(const char* srname, int* info);
 26 
 27 #ifndef COMPLEX_FLOAT1
 28     typedef CBLAS_FLOAT                 CXXBLAS_FLOAT;
 29 #else
 30     typedef std::complex<CBLAS_FLOAT>   CXXBLAS_FLOAT;
 31 #endif
 32 
 33     enum CBLAS_ORDER        {CblasRowMajor=101, CblasColMajor=102};
 34     enum CBLAS_UPLO         {CblasUpper=121, CblasLower=122};
 35     enum CBLAS_TRANSPOSE    {CblasNoTrans=111, CblasTrans=112,
 36                              CblasConjTrans=113, CblasConjNoTrans=114};
 37     enum CBLAS_DIAG         {CblasNonUnit=131, CblasUnit=132};
 38 
 39 
 40     void
 41     CBLAS_NAME(enum CBLAS_ORDER _order,
 42                enum CBLAS_UPLO _upLo,
 43                enum CBLAS_TRANSPOSE _transA,
 44                enum CBLAS_DIAG _diag,
 45                CBLAS_INT n, CBLAS_INT k,
 46                const CBLAS_FLOAT  *_A, CBLAS_INT ldA,
 47                CBLAS_FLOAT  *_x, CBLAS_INT incX)
 48 #ifdef CREATE_CBLAS
 49     {
 50         StorageOrder order = (_order==CblasColMajor) ? ColMajor
 51                                                      : RowMajor;
 52         StorageUpLo upLo = Lower;
 53         if (_upLo==CblasUpper) {
 54             upLo = Upper;
 55         }
 56 
 57         Transpose transA = NoTrans;
 58         if (_transA==CblasTrans) {
 59             transA = Trans;
 60         }
 61         if (_transA==CblasConjTrans) {
 62             transA = ConjTrans;
 63         }
 64         if (_transA==CblasConjNoTrans) {
 65             transA = Conj;
 66         }
 67 
 68         Diag diag = NonUnit;
 69         if (_diag==CblasUnit) {
 70             diag = Unit;
 71         }
 72 
 73         const CXXBLAS_FLOAT *A = reinterpret_cast<const CXXBLAS_FLOAT *>(_A);
 74         CXXBLAS_FLOAT *x = reinterpret_cast<CXXBLAS_FLOAT *>(_x);
 75 
 76 #   ifdef TEST_ROW_MAJOR
 77         switchBandStorageOrder(order, upLo, n, k, A, ldA);
 78         order = (order==ColMajor) ? RowMajor : ColMajor;
 79 #   endif
 80 
 81         cxxblas::tbmv(order, upLo, transA, diag,
 82                       n, k,
 83                       A, ldA,
 84                       x, incX);
 85 
 86 #   ifdef TEST_ROW_MAJOR
 87         releaseStorage(A);
 88 #   endif
 89     }
 90 #else
 91     ;
 92 #endif // CREATE_CBLAS
 93 
 94 #ifdef CREATE_BLAS
 95     void
 96     BLAS_NAME(const char *_upLo, const char *_transA, const char *_diag,
 97               const CBLAS_INT *_n, const CBLAS_INT *_k,
 98               const CBLAS_FLOAT *A, const CBLAS_INT *_ldA,
 99               CBLAS_FLOAT *x, const CBLAS_INT *_incX)
100     {
101         bool checkUpLo = false,
102              checkDiag = false,
103              checkTrans = false;
104         
105         CBLAS_UPLO upLo = CblasUpper;
106         if ((*_upLo=='L') || (*_upLo=='l')) {
107             upLo = CblasLower;
108             checkUpLo = true;
109         }
110         if ((*_upLo=='U') || (*_upLo=='u')) {
111             checkUpLo = true;
112         }
113 
114         CBLAS_TRANSPOSE transA = CblasConjNoTrans;
115         if ((*_transA=='N') || (*_transA=='n')) {
116             transA = CblasNoTrans;
117             checkTrans = true;
118         }
119         if ((*_transA=='T') || (*_transA=='t')) {
120             transA = CblasTrans;
121             checkTrans = true;
122         }
123         if ((*_transA=='C') || (*_transA=='c')) {
124             transA = CblasConjTrans;
125             checkTrans = true;
126         }
127         if ((*_transA=='R') || (*_transA=='r')) {
128             transA = CblasConjNoTrans;
129             checkTrans = true;
130         }
131 
132         CBLAS_DIAG diag = CblasUnit;
133         if ((*_diag=='N') || (*_diag=='n')) {
134             diag = CblasNonUnit;
135             checkDiag = true;
136         }
137         if ((*_diag=='U') || (*_diag=='u')) {
138             checkDiag = true;
139         }
140 
141         CBLAS_INT n       = *_n;
142         CBLAS_INT k       = *_k;
143         CBLAS_INT ldA     = *_ldA;
144         CBLAS_INT incX    = *_incX;
145 
146         CBLAS_INT info = 0;
147         if (incX==0) {
148             info = 9
149         }
150         if (ldA<k+1) {
151             info = 7;
152         }
153         if (k<0) {
154             info = 5;
155         }
156         if (n<0) {
157             info = 4;
158         }
159         if (!checkDiag) {
160             info = 3;
161         }
162         if (!checkTrans) {
163             info = 2;
164         }
165         if (!checkUpLo) {
166             info = 1;
167         }
168         if (info!=0) {
169             char blasName[6];
170             strncpy(blasName, BLAS_NAME_STR, 6);
171             for (int i=0; i<6; ++i) {
172                 blasName[i] = std::toupper(blasName[i]);
173             }
174             xerbla_(blasName, &info);
175           return;
176         }
177 
178         // the blas interface calls the cblas interface
179         // so any blas-test will also test the cblas-interface
180         CBLAS_NAME(CblasColMajor, upLo, transA, diag,
181                    n, k,
182                    A, ldA,
183                    x, incX);
184     }
185 #endif // CREATE_BLAS
186 
187 // extern "C"