19 #if defined (INTEL_CXML)
27 #if defined (INTEL_CXML)
28 #define CHAR_MACRO(char_var) &char_var, one
30 #define CHAR_MACRO(char_var) &char_var
34 const char Teuchos::ESideChar[] = {
'L' ,
'R' };
35 const char Teuchos::ETranspChar[] = {
'N' ,
'T' ,
'C' };
36 const char Teuchos::EUploChar[] = {
'U' ,
'L' };
37 const char Teuchos::EDiagChar[] = {
'U' ,
'N' };
38 const char Teuchos::ETypeChar[] = {
'G' ,
'L',
'U',
'H',
'B',
'Q',
'Z' };
53 template<
typename Scalar>
54 Scalar generic_dot(
const int& n,
const Scalar* x,
const int& incx,
55 const Scalar* y,
const int& incy)
59 if (incx==1 && incy==1) {
60 for (
int i = 0; i < n; ++i)
61 dot += (*x++)*ST::conjugate(*y++);
68 for (
int i = 0; i < n; ++i, x+=incx, y+=incy)
69 dot += (*x)*ST::conjugate(*y);
83 # ifdef HAVE_TEUCHOS_COMPLEX
84 template class BLAS<long int, std::complex<float> >;
85 template class BLAS<long int, std::complex<double> >;
87 template class BLAS<long int, float>;
88 template class BLAS<long int, double>;
94 { SROTG_F77(da, db, c, s ); }
96 void BLAS<int, float>::ROT(
const int& n,
float* dx,
const int& incx,
float* dy,
const int& incy,
float* c,
float* s)
const
97 { SROT_F77(&n, dx, &incx, dy, &incy, c, s); }
102 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
103 return cblas_sasum(n, x, incx);
104 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
105 float tmp = SASUM_F77(&n, x, &incx);
108 typedef ScalarTraits<float> ST;
111 for (
int i = 0; i < n; ++i)
112 sum += ST::magnitude(*x++);
115 for (
int i = 0; i < n; ++i, x+=incx)
116 sum += ST::magnitude(*x);
122 void BLAS<int, float>::AXPY(
const int& n,
const float& alpha,
const float* x,
const int& incx,
float* y,
const int& incy)
const
123 { SAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
125 void BLAS<int, float>::COPY(
const int& n,
const float* x,
const int& incx,
float* y,
const int& incy)
const
126 { SCOPY_F77(&n, x, &incx, y, &incy); }
128 float BLAS<int, float>::DOT(
const int& n,
const float* x,
const int& incx,
const float* y,
const int& incy)
const
130 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
131 return cblas_sdot(n, x, incx, y, incy);
132 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
133 return SDOT_F77(&n, x, &incx, y, &incy);
135 return generic_dot(n, x, incx, y, incy);
140 {
return ISAMAX_F77(&n, x, &incx); }
144 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
145 return cblas_snrm2(n, x, incx);
146 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
147 return SNRM2_F77(&n, x, &incx);
154 { SSCAL_F77(&n, &alpha, x, &incx); }
156 void BLAS<int, float>::GEMV(
ETransp trans,
const int& m,
const int& n,
const float& alpha,
const float* A,
const int& lda,
const float* x,
const int& incx,
const float& beta,
float* y,
const int& incy)
const
157 { SGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
159 void BLAS<int, float>::GER(
const int& m,
const int& n,
const float& alpha,
const float* x,
const int& incx,
const float* y,
const int& incy,
float* A,
const int& lda)
const
160 { SGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
163 { STRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
165 void BLAS<int, float>::GEMM(
ETransp transa,
ETransp transb,
const int& m,
const int& n,
const int& k,
const float& alpha,
const float* A,
const int& lda,
const float* B,
const int& ldb,
const float& beta,
float* C,
const int& ldc)
const
166 { SGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
168 void BLAS<int, float>::SWAP(
const int& n,
float*
const x,
const int& incx,
float*
const y,
const int& incy)
const
170 SSWAP_F77 (&n, x, &incx, y, &incy);
173 void BLAS<int, float>::SYMM(
ESide side,
EUplo uplo,
const int& m,
const int& n,
const float& alpha,
const float* A,
const int& lda,
const float* B,
const int& ldb,
const float& beta,
float* C,
const int& ldc)
const
174 { SSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
176 void BLAS<int, float>::SYRK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const float& alpha,
const float* A,
const int& lda,
const float& beta,
float* C,
const int& ldc)
const
177 { SSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
179 void BLAS<int, float>::HERK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const float& alpha,
const float* A,
const int& lda,
const float& beta,
float* C,
const int& ldc)
const
180 { SSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
182 void BLAS<int, float>::TRMM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const float& alpha,
const float* A,
const int& lda,
float* B,
const int& ldb)
const
183 { STRMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
185 void BLAS<int, float>::TRSM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const float& alpha,
const float* A,
const int& lda,
float* B,
const int& ldb)
const
186 { STRSM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
191 { DROTG_F77(da, db, c, s); }
193 void BLAS<int, double>::ROT(
const int& n,
double* dx,
const int& incx,
double* dy,
const int& incy,
double* c,
double* s)
const
194 { DROT_F77(&n, dx, &incx, dy, &incy, c, s); }
197 {
return DASUM_F77(&n, x, &incx); }
199 void BLAS<int, double>::AXPY(
const int& n,
const double& alpha,
const double* x,
const int& incx,
double* y,
const int& incy)
const
200 { DAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
203 { DCOPY_F77(&n, x, &incx, y, &incy); }
205 double BLAS<int, double>::DOT(
const int& n,
const double* x,
const int& incx,
const double* y,
const int& incy)
const
207 return DDOT_F77(&n, x, &incx, y, &incy);
211 {
return IDAMAX_F77(&n, x, &incx); }
214 {
return DNRM2_F77(&n, x, &incx); }
217 { DSCAL_F77(&n, &alpha, x, &incx); }
219 void BLAS<int, double>::GEMV(
ETransp trans,
const int& m,
const int& n,
const double& alpha,
const double* A,
const int& lda,
const double* x,
const int& incx,
const double& beta,
double* y,
const int& incy)
const
220 { DGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
222 void BLAS<int, double>::GER(
const int& m,
const int& n,
const double& alpha,
const double* x,
const int& incx,
const double* y,
const int& incy,
double* A,
const int& lda)
const
223 { DGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
226 { DTRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
228 void BLAS<int, double>::GEMM(
ETransp transa,
ETransp transb,
const int& m,
const int& n,
const int& k,
const double& alpha,
const double* A,
const int& lda,
const double* B,
const int& ldb,
const double& beta,
double* C,
const int& ldc)
const
229 { DGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
231 void BLAS<int, double>::SWAP(
const int& n,
double*
const x,
const int& incx,
double*
const y,
const int& incy)
const
233 DSWAP_F77 (&n, x, &incx, y, &incy);
236 void BLAS<int, double>::SYMM(
ESide side,
EUplo uplo,
const int& m,
const int& n,
const double& alpha,
const double* A,
const int& lda,
const double* B,
const int& ldb,
const double& beta,
double* C,
const int& ldc)
const
237 { DSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
239 void BLAS<int, double>::SYRK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const double& alpha,
const double* A,
const int& lda,
const double& beta,
double* C,
const int& ldc)
const
240 { DSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
242 void BLAS<int, double>::HERK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const double& alpha,
const double* A,
const int& lda,
const double& beta,
double* C,
const int& ldc)
const
243 { DSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
245 void BLAS<int, double>::TRMM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const double& alpha,
const double* A,
const int& lda,
double* B,
const int& ldb)
const
246 { DTRMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
248 void BLAS<int, double>::TRSM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const double& alpha,
const double* A,
const int& lda,
double* B,
const int& ldb)
const
249 { DTRSM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
251 #ifdef HAVE_TEUCHOS_COMPLEX
255 void BLAS<int, std::complex<float> >::ROTG(std::complex<float>* da, std::complex<float>* db,
float* c, std::complex<float>* s)
const
256 { CROTG_F77(da, db, c, s ); }
258 void BLAS<int, std::complex<float> >::ROT(
const int& n, std::complex<float>* dx,
const int& incx, std::complex<float>* dy,
const int& incy,
float* c, std::complex<float>* s)
const
259 { CROT_F77(&n, dx, &incx, dy, &incy, c, s); }
261 float BLAS<int, std::complex<float> >::ASUM(
const int& n,
const std::complex<float>* x,
const int& incx)
const
263 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
264 return cblas_scasum(n, x, incx);
265 #elif defined(HAVE_TEUCHOS_BLASFLOAT_DOUBLE_RETURN)
266 return (
float) SCASUM_F77(&n, x, &incx);
267 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
268 return SCASUM_F77(&n, x, &incx);
269 #else // Wow, you just plain don't have this routine.
274 for (
int i = 0; i < n; ++i) {
275 result += std::abs (std::real (x[i])) + std::abs (std::imag (x[i]));
278 const int nincx = n * incx;
279 for (
int i = 0; i < nincx; i += incx) {
280 result += std::abs (std::real (x[i])) + std::abs (std::imag (x[i]));
283 return static_cast<float> (result);
287 void BLAS<int, std::complex<float> >::AXPY(
const int& n,
const std::complex<float> alpha,
const std::complex<float>* x,
const int& incx, std::complex<float>* y,
const int& incy)
const
288 { CAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
290 void BLAS<int, std::complex<float> >::COPY(
const int& n,
const std::complex<float>* x,
const int& incx, std::complex<float>* y,
const int& incy)
const
291 { CCOPY_F77(&n, x, &incx, y, &incy); }
293 std::complex<float> BLAS<int, std::complex<float> >::DOT(
const int& n,
const std::complex<float>* x,
const int& incx,
const std::complex<float>* y,
const int& incy)
const
295 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
296 std::complex<float> z;
297 cblas_cdotc_sub(n,x,incx,y,incy,&z);
299 #elif defined(HAVE_COMPLEX_BLAS_PROBLEM) && defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
300 std::complex<float> z;
301 CDOT_F77(&z, &n, x, &incx, y, &incy);
303 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
304 Teuchos_Complex_float_type_name z = CDOT_F77(&n, x, &incx, y, &incy);
305 return TEUCHOS_BLAS_CONVERT_COMPLEX_FORTRAN_TO_CXX(
float, z);
306 #else // Wow, you just plain don't have this routine.
309 std::complex<double> result (0, 0);
311 if (incx == 1 && incy == 1) {
312 for (
int i = 0; i < n; ++i) {
313 result += std::conj (x[i]) * y[i];
324 for (
int i = 0; i < n; ++i) {
325 result += std::conj (x[ix]) * y[iy];
331 return static_cast<std::complex<float>
> (result);
335 int BLAS<int, std::complex<float> >::IAMAX(
const int& n,
const std::complex<float>* x,
const int& incx)
const
336 {
return ICAMAX_F77(&n, x, &incx); }
338 float BLAS<int, std::complex<float> >::NRM2(
const int& n,
const std::complex<float>* x,
const int& incx)
const
340 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
341 return cblas_scnrm2(n, x, incx);
342 #elif defined(HAVE_TEUCHOS_BLASFLOAT_DOUBLE_RETURN)
343 return (
float) SCNRM2_F77(&n, x, &incx);
344 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
345 return SCNRM2_F77(&n, x, &incx);
346 #else // Wow, you just plain don't have this routine.
349 if (n < 1 || incx < 1) {
355 const int upper = 1 + (n-1)*incx;
356 for (
int ix = 0; ix < upper; ix += incx) {
361 if (std::real (x[ix]) != 0) {
362 const double temp = std::abs (std::real (x[ix]));
364 const double scale_over_temp = scale / temp;
365 ssq = 1 + ssq * scale_over_temp*scale_over_temp;
369 const double temp_over_scale = temp / scale;
370 ssq = ssq + temp_over_scale*temp_over_scale;
373 if (std::imag (x[ix]) != 0) {
374 const double temp = std::abs (std::imag (x[ix]));
376 const double scale_over_temp = scale / temp;
377 ssq = 1 + ssq * scale_over_temp*scale_over_temp;
381 const double temp_over_scale = temp / scale;
382 ssq = ssq + temp_over_scale*temp_over_scale;
386 return static_cast<float> (scale * std::sqrt (ssq));
391 void BLAS<int, std::complex<float> >::SCAL(
const int& n,
const std::complex<float> alpha, std::complex<float>* x,
const int& incx)
const
392 { CSCAL_F77(&n, &alpha, x, &incx); }
394 void BLAS<int, std::complex<float> >::GEMV(
ETransp trans,
const int& m,
const int& n,
const std::complex<float> alpha,
const std::complex<float>* A,
const int& lda,
const std::complex<float>* x,
const int& incx,
const std::complex<float> beta, std::complex<float>* y,
const int& incy)
const
395 { CGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
397 void BLAS<int, std::complex<float> >::GER(
const int& m,
const int& n,
const std::complex<float> alpha,
const std::complex<float>* x,
const int& incx,
const std::complex<float>* y,
const int& incy, std::complex<float>* A,
const int& lda)
const
398 { CGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
400 void BLAS<int, std::complex<float> >::TRMV(
EUplo uplo,
ETransp trans,
EDiag diag,
const int& n,
const std::complex<float>* A,
const int& lda, std::complex<float>* x,
const int& incx)
const
401 { CTRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
403 void BLAS<int, std::complex<float> >::GEMM(
ETransp transa,
ETransp transb,
const int& m,
const int& n,
const int& k,
const std::complex<float> alpha,
const std::complex<float>* A,
const int& lda,
const std::complex<float>* B,
const int& ldb,
const std::complex<float> beta, std::complex<float>* C,
const int& ldc)
const
404 { CGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
406 void BLAS<int, std::complex<float> >::SWAP(
const int& n, std::complex<float>*
const x,
const int& incx, std::complex<float>*
const y,
const int& incy)
const
408 CSWAP_F77 (&n, x, &incx, y, &incy);
411 void BLAS<int, std::complex<float> >::SYMM(
ESide side,
EUplo uplo,
const int& m,
const int& n,
const std::complex<float> alpha,
const std::complex<float>* A,
const int& lda,
const std::complex<float>* B,
const int& ldb,
const std::complex<float> beta, std::complex<float>* C,
const int& ldc)
const
412 { CSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
414 void BLAS<int, std::complex<float> >::SYRK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const std::complex<float> alpha,
const std::complex<float>* A,
const int& lda,
const std::complex<float> beta, std::complex<float>* C,
const int& ldc)
const
415 { CSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
417 void BLAS<int, std::complex<float> >::HERK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const std::complex<float> alpha,
const std::complex<float>* A,
const int& lda,
const std::complex<float> beta, std::complex<float>* C,
const int& ldc)
const
418 { CHERK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
420 void BLAS<int, std::complex<float> >::TRMM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const std::complex<float> alpha,
const std::complex<float>* A,
const int& lda, std::complex<float>* B,
const int& ldb)
const
421 { CTRMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
423 void BLAS<int, std::complex<float> >::TRSM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const std::complex<float> alpha,
const std::complex<float>* A,
const int& lda, std::complex<float>* B,
const int& ldb)
const
424 { CTRSM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
428 void BLAS<int, std::complex<double> >::ROTG(std::complex<double>* da, std::complex<double>* db,
double* c, std::complex<double>* s)
const
429 { ZROTG_F77(da, db, c, s); }
431 void BLAS<int, std::complex<double> >::ROT(
const int& n, std::complex<double>* dx,
const int& incx, std::complex<double>* dy,
const int& incy,
double* c, std::complex<double>* s)
const
432 { ZROT_F77(&n, dx, &incx, dy, &incy, c, s); }
434 double BLAS<int, std::complex<double> >::ASUM(
const int& n,
const std::complex<double>* x,
const int& incx)
const
435 {
return ZASUM_F77(&n, x, &incx); }
437 void BLAS<int, std::complex<double> >::AXPY(
const int& n,
const std::complex<double> alpha,
const std::complex<double>* x,
const int& incx, std::complex<double>* y,
const int& incy)
const
438 { ZAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
440 void BLAS<int, std::complex<double> >::COPY(
const int& n,
const std::complex<double>* x,
const int& incx, std::complex<double>* y,
const int& incy)
const
441 { ZCOPY_F77(&n, x, &incx, y, &incy); }
443 std::complex<double> BLAS<int, std::complex<double> >::DOT(
const int& n,
const std::complex<double>* x,
const int& incx,
const std::complex<double>* y,
const int& incy)
const
445 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
446 std::complex<double> z;
447 cblas_zdotc_sub(n,x,incx,y,incy,&z);
449 #elif defined(HAVE_COMPLEX_BLAS_PROBLEM)
450 # if defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
451 std::complex<double> z;
452 ZDOT_F77(&z, &n, x, &incx, y, &incy);
458 std::complex<double> ztemp (0, 0);
460 if (incx == 1 && incy == 1) {
461 for (
int i = 0; i < n; ++i) {
462 ztemp += std::conj (x[i]) * y[i];
473 for (
int i = 0; i < n; ++i) {
474 ztemp += std::conj (x[ix]) * y[iy];
482 # endif // defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
484 Teuchos_Complex_double_type_name z = ZDOT_F77(&n, x, &incx, y, &incy);
485 return TEUCHOS_BLAS_CONVERT_COMPLEX_FORTRAN_TO_CXX(
double, z);
489 int BLAS<int, std::complex<double> >::IAMAX(
const int& n,
const std::complex<double>* x,
const int& incx)
const
490 {
return IZAMAX_F77(&n, x, &incx); }
492 double BLAS<int, std::complex<double> >::NRM2(
const int& n,
const std::complex<double>* x,
const int& incx)
const
493 {
return ZNRM2_F77(&n, x, &incx); }
495 void BLAS<int, std::complex<double> >::SCAL(
const int& n,
const std::complex<double> alpha, std::complex<double>* x,
const int& incx)
const
496 { ZSCAL_F77(&n, &alpha, x, &incx); }
498 void BLAS<int, std::complex<double> >::GEMV(
ETransp trans,
const int& m,
const int& n,
const std::complex<double> alpha,
const std::complex<double>* A,
const int& lda,
const std::complex<double>* x,
const int& incx,
const std::complex<double> beta, std::complex<double>* y,
const int& incy)
const
499 { ZGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
501 void BLAS<int, std::complex<double> >::GER(
const int& m,
const int& n,
const std::complex<double> alpha,
const std::complex<double>* x,
const int& incx,
const std::complex<double>* y,
const int& incy, std::complex<double>* A,
const int& lda)
const
502 { ZGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
504 void BLAS<int, std::complex<double> >::TRMV(
EUplo uplo,
ETransp trans,
EDiag diag,
const int& n,
const std::complex<double>* A,
const int& lda, std::complex<double>* x,
const int& incx)
const
505 { ZTRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
507 void BLAS<int, std::complex<double> >::GEMM(
ETransp transa,
ETransp transb,
const int& m,
const int& n,
const int& k,
const std::complex<double> alpha,
const std::complex<double>* A,
const int& lda,
const std::complex<double>* B,
const int& ldb,
const std::complex<double> beta, std::complex<double>* C,
const int& ldc)
const
508 { ZGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
510 void BLAS<int, std::complex<double> >::SWAP(
const int& n, std::complex<double>*
const x,
const int& incx, std::complex<double>*
const y,
const int& incy)
const
512 ZSWAP_F77 (&n, x, &incx, y, &incy);
515 void BLAS<int, std::complex<double> >::SYMM(
ESide side,
EUplo uplo,
const int& m,
const int& n,
const std::complex<double> alpha,
const std::complex<double>* A,
const int& lda,
const std::complex<double> *B,
const int& ldb,
const std::complex<double> beta, std::complex<double> *C,
const int& ldc)
const
516 { ZSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
518 void BLAS<int, std::complex<double> >::SYRK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const std::complex<double> alpha,
const std::complex<double>* A,
const int& lda,
const std::complex<double> beta, std::complex<double>* C,
const int& ldc)
const
519 { ZSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
521 void BLAS<int, std::complex<double> >::HERK(
EUplo uplo,
ETransp trans,
const int& n,
const int& k,
const std::complex<double> alpha,
const std::complex<double>* A,
const int& lda,
const std::complex<double> beta, std::complex<double>* C,
const int& ldc)
const
522 { ZHERK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
524 void BLAS<int, std::complex<double> >::TRMM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const std::complex<double> alpha,
const std::complex<double>* A,
const int& lda, std::complex<double>* B,
const int& ldb)
const
525 { ZTRMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
527 void BLAS<int, std::complex<double> >::TRSM(
ESide side,
EUplo uplo,
ETransp transa,
EDiag diag,
const int& m,
const int& n,
const std::complex<double> alpha,
const std::complex<double>* A,
const int& lda, std::complex<double>* B,
const int& ldb)
const
528 { ZTRSM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(EDiagChar[diag]), &m, &n, &alpha, A, &lda, B, &ldb); }
530 #endif // HAVE_TEUCHOS_COMPLEX
void TRSM(ESide side, EUplo uplo, ETransp transa, EDiag diag, const OrdinalType &m, const OrdinalType &n, const alpha_type alpha, const A_type *A, const OrdinalType &lda, ScalarType *B, const OrdinalType &ldb) const
Solves the matrix equations: op(A)*X=alpha*B or X*op(A)=alpha*B where X and B are m by n matrices...
void GER(const OrdinalType &m, const OrdinalType &n, const alpha_type alpha, const x_type *x, const OrdinalType &incx, const y_type *y, const OrdinalType &incy, ScalarType *A, const OrdinalType &lda) const
Performs the rank 1 operation: A <- alpha*x*y'+A.
void AXPY(const OrdinalType &n, const alpha_type alpha, const x_type *x, const OrdinalType &incx, ScalarType *y, const OrdinalType &incy) const
Perform the operation: y <- y+alpha*x.
void TRMV(EUplo uplo, ETransp trans, EDiag diag, const OrdinalType &n, const A_type *A, const OrdinalType &lda, ScalarType *x, const OrdinalType &incx) const
Performs the matrix-vector operation: x <- A*x or x <- A'*x where A is a unit/non-unit n by n upper/low...
Templated interface class to BLAS routines.
void GEMV(ETransp trans, const OrdinalType &m, const OrdinalType &n, const alpha_type alpha, const A_type *A, const OrdinalType &lda, const x_type *x, const OrdinalType &incx, const beta_type beta, ScalarType *y, const OrdinalType &incy) const
Performs the matrix-vector operation: y <- alpha*A*x+beta*y or y <- alpha*A'*x+beta*y where A is a gene...
void ROT(const OrdinalType &n, ScalarType *dx, const OrdinalType &incx, ScalarType *dy, const OrdinalType &incy, MagnitudeType *c, ScalarType *s) const
Applies a Givens plane rotation.
static T squareroot(T x)
Returns a number of magnitudeType that is the square root of this scalar type x.
ScalarTraits< ScalarType >::magnitudeType NRM2(const OrdinalType &n, const ScalarType *x, const OrdinalType &incx) const
Compute the 2-norm of the vector x.
OrdinalType IAMAX(const OrdinalType &n, const ScalarType *x, const OrdinalType &incx) const
Return the index of the element of x with the maximum magnitude.
void GEMM(ETransp transa, ETransp transb, const OrdinalType &m, const OrdinalType &n, const OrdinalType &k, const alpha_type alpha, const A_type *A, const OrdinalType &lda, const B_type *B, const OrdinalType &ldb, const beta_type beta, ScalarType *C, const OrdinalType &ldc) const
General matrix-matrix multiply.
The Templated BLAS wrappers.
This structure defines some basic traits for a scalar field type.
ScalarTraits< ScalarType >::magnitudeType ASUM(const OrdinalType &n, const ScalarType *x, const OrdinalType &incx) const
Sum the absolute values of the entries of x.
void COPY(const OrdinalType &n, const ScalarType *x, const OrdinalType &incx, ScalarType *y, const OrdinalType &incy) const
Copy the vector x to the vector y.
ScalarType DOT(const OrdinalType &n, const x_type *x, const OrdinalType &incx, const y_type *y, const OrdinalType &incy) const
Form the dot product of the vectors x and y.
void SYMM(ESide side, EUplo uplo, const OrdinalType &m, const OrdinalType &n, const alpha_type alpha, const A_type *A, const OrdinalType &lda, const B_type *B, const OrdinalType &ldb, const beta_type beta, ScalarType *C, const OrdinalType &ldc) const
Performs the matrix-matrix operation: C <- alpha*A*B+beta*C or C <- alpha*B*A+beta*C where A is an m ...
void TRMM(ESide side, EUplo uplo, ETransp transa, EDiag diag, const OrdinalType &m, const OrdinalType &n, const alpha_type alpha, const A_type *A, const OrdinalType &lda, ScalarType *B, const OrdinalType &ldb) const
Performs the matrix-matrix operation: B <- alpha*op(A)*B or B <- alpha*B*op(A) where op(A) is an unit...
void SCAL(const OrdinalType &n, const ScalarType &alpha, ScalarType *x, const OrdinalType &incx) const
Scale the vector x by the constant alpha.
void ROTG(ScalarType *da, ScalarType *db, rotg_c_type *c, ScalarType *s) const
Computes a Givens plane rotation.
void SYRK(EUplo uplo, ETransp trans, const OrdinalType &n, const OrdinalType &k, const alpha_type alpha, const A_type *A, const OrdinalType &lda, const beta_type beta, ScalarType *C, const OrdinalType &ldc) const
Performs the symmetric rank k operation: C <- alpha*A*A'+beta*C or C <- alpha*A'*A+beta*C, where alpha and beta are scalars, C is an n by n symmetric matrix and A is an n by k matrix in the first case or k by n matrix in the second case.
void SWAP(const OrdinalType &n, ScalarType *const x, const OrdinalType &incx, ScalarType *const y, const OrdinalType &incy) const
Swap the entries of x and y.