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