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"
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"