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