51 #if defined (INTEL_CXML)
59 #if defined (INTEL_CXML)
60 #define CHAR_MACRO(char_var) &char_var, one
62 #define CHAR_MACRO(char_var) &char_var
66 const char Teuchos::ESideChar[] = {
'L' ,
'R' };
67 const char Teuchos::ETranspChar[] = {
'N' ,
'T' ,
'C' };
68 const char Teuchos::EUploChar[] = {
'U' ,
'L' };
69 const char Teuchos::EDiagChar[] = {
'U' ,
'N' };
70 const char Teuchos::ETypeChar[] = {
'G' ,
'L',
'U',
'H',
'B',
'Q',
'Z' };
85 template<
typename Scalar>
86 Scalar generic_dot(
const int& n,
const Scalar* x,
const int& incx,
87 const Scalar* y,
const int& incy)
91 if (incx==1 && incy==1) {
92 for (
int i = 0; i < n; ++i)
93 dot += (*x++)*ST::conjugate(*y++);
100 for (
int i = 0; i < n; ++i, x+=incx, y+=incy)
101 dot += (*x)*ST::conjugate(*y);
115 # ifdef HAVE_TEUCHOS_COMPLEX
116 template BLAS<long int, std::complex<float> >;
117 template BLAS<long int, std::complex<double> >;
119 template BLAS<long int, float>;
120 template BLAS<long int, double>;
126 { SROTG_F77(da, db, c, s ); }
128 void BLAS<int, float>::ROT(
const int& n,
float* dx,
const int& incx,
float* dy,
const int& incy,
float* c,
float* s)
const
129 { SROT_F77(&n, dx, &incx, dy, &incy, c, s); }
134 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
135 return cblas_sasum(n, x, incx);
136 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
137 float tmp = SASUM_F77(&n, x, &incx);
140 typedef ScalarTraits<float> ST;
143 for (
int i = 0; i < n; ++i)
144 sum += ST::magnitude(*x++);
147 for (
int i = 0; i < n; ++i, x+=incx)
148 sum += ST::magnitude(*x);
154 void BLAS<int, float>::AXPY(
const int& n,
const float& alpha,
const float* x,
const int& incx,
float* y,
const int& incy)
const
155 { SAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
157 void BLAS<int, float>::COPY(
const int& n,
const float* x,
const int& incx,
float* y,
const int& incy)
const
158 { SCOPY_F77(&n, x, &incx, y, &incy); }
160 float BLAS<int, float>::DOT(
const int& n,
const float* x,
const int& incx,
const float* y,
const int& incy)
const
162 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
163 return cblas_sdot(n, x, incx, y, incy);
164 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
165 return SDOT_F77(&n, x, &incx, y, &incy);
167 return generic_dot(n, x, incx, y, incy);
172 {
return ISAMAX_F77(&n, x, &incx); }
176 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
177 return cblas_snrm2(n, x, incx);
178 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
179 return SNRM2_F77(&n, x, &incx);
186 { SSCAL_F77(&n, &alpha, x, &incx); }
188 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
189 { SGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
191 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
192 { SGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
195 { STRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
197 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
198 { SGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
200 void BLAS<int, float>::SWAP(
const int& n,
float*
const x,
const int& incx,
float*
const y,
const int& incy)
const
202 SSWAP_F77 (&n, x, &incx, y, &incy);
205 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
206 { SSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
208 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
209 { SSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
211 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
212 { SSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
214 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
215 { 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); }
217 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
218 { 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); }
223 { DROTG_F77(da, db, c, s); }
225 void BLAS<int, double>::ROT(
const int& n,
double* dx,
const int& incx,
double* dy,
const int& incy,
double* c,
double* s)
const
226 { DROT_F77(&n, dx, &incx, dy, &incy, c, s); }
229 {
return DASUM_F77(&n, x, &incx); }
231 void BLAS<int, double>::AXPY(
const int& n,
const double& alpha,
const double* x,
const int& incx,
double* y,
const int& incy)
const
232 { DAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
235 { DCOPY_F77(&n, x, &incx, y, &incy); }
237 double BLAS<int, double>::DOT(
const int& n,
const double* x,
const int& incx,
const double* y,
const int& incy)
const
239 return DDOT_F77(&n, x, &incx, y, &incy);
243 {
return IDAMAX_F77(&n, x, &incx); }
246 {
return DNRM2_F77(&n, x, &incx); }
249 { DSCAL_F77(&n, &alpha, x, &incx); }
251 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
252 { DGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
254 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
255 { DGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
258 { DTRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
260 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
261 { DGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
263 void BLAS<int, double>::SWAP(
const int& n,
double*
const x,
const int& incx,
double*
const y,
const int& incy)
const
265 DSWAP_F77 (&n, x, &incx, y, &incy);
268 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
269 { DSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
271 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
272 { DSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
274 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
275 { DSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
277 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
278 { 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); }
280 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
281 { 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); }
283 #ifdef HAVE_TEUCHOS_COMPLEX
287 void BLAS<int, std::complex<float> >::ROTG(std::complex<float>* da, std::complex<float>* db,
float* c, std::complex<float>* s)
const
288 { CROTG_F77(da, db, c, s ); }
290 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
291 { CROT_F77(&n, dx, &incx, dy, &incy, c, s); }
293 float BLAS<int, std::complex<float> >::ASUM(
const int& n,
const std::complex<float>* x,
const int& incx)
const
295 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
296 return cblas_scasum(n, x, incx);
297 #elif defined(HAVE_TEUCHOS_BLASFLOAT_DOUBLE_RETURN)
298 return (
float) SCASUM_F77(&n, x, &incx);
299 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
300 return SCASUM_F77(&n, x, &incx);
301 #else // Wow, you just plain don't have this routine.
306 for (
int i = 0; i < n; ++i) {
307 result += std::abs (std::real (x[i])) + std::abs (std::imag (x[i]));
310 const int nincx = n * incx;
311 for (
int i = 0; i < nincx; i += incx) {
312 result += std::abs (std::real (x[i])) + std::abs (std::imag (x[i]));
315 return static_cast<float> (result);
319 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
320 { CAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
322 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
323 { CCOPY_F77(&n, x, &incx, y, &incy); }
325 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
327 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
328 std::complex<float> z;
329 cblas_cdotc_sub(n,x,incx,y,incy,&z);
331 #elif defined(HAVE_COMPLEX_BLAS_PROBLEM) && defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
332 std::complex<float> z;
333 CDOT_F77(&z, &n, x, &incx, y, &incy);
335 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
336 return CDOT_F77(&n, x, &incx, y, &incy);
337 #else // Wow, you just plain don't have this routine.
340 std::complex<double> result (0, 0);
342 if (incx == 1 && incy == 1) {
343 for (
int i = 0; i < n; ++i) {
344 result += std::conj (x[i]) * y[i];
355 for (
int i = 0; i < n; ++i) {
356 result += std::conj (x[ix]) * y[iy];
362 return static_cast<std::complex<float>
> (result);
366 int BLAS<int, std::complex<float> >::IAMAX(
const int& n,
const std::complex<float>* x,
const int& incx)
const
367 {
return ICAMAX_F77(&n, x, &incx); }
369 float BLAS<int, std::complex<float> >::NRM2(
const int& n,
const std::complex<float>* x,
const int& incx)
const
371 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
372 return cblas_scnrm2(n, x, incx);
373 #elif defined(HAVE_TEUCHOS_BLASFLOAT_DOUBLE_RETURN)
374 return (
float) SCNRM2_F77(&n, x, &incx);
375 #elif defined(HAVE_TEUCHOS_BLASFLOAT)
376 return SCNRM2_F77(&n, x, &incx);
377 #else // Wow, you just plain don't have this routine.
380 if (n < 1 || incx < 1) {
386 const int upper = 1 + (n-1)*incx;
387 for (
int ix = 0; ix < upper; ix += incx) {
392 if (std::real (x[ix]) != 0) {
393 const double temp = std::abs (std::real (x[ix]));
395 const double scale_over_temp = scale / temp;
396 ssq = 1 + ssq * scale_over_temp*scale_over_temp;
400 const double temp_over_scale = temp / scale;
401 ssq = ssq + temp_over_scale*temp_over_scale;
404 if (std::imag (x[ix]) != 0) {
405 const double temp = std::abs (std::imag (x[ix]));
407 const double scale_over_temp = scale / temp;
408 ssq = 1 + ssq * scale_over_temp*scale_over_temp;
412 const double temp_over_scale = temp / scale;
413 ssq = ssq + temp_over_scale*temp_over_scale;
417 return static_cast<float> (scale * std::sqrt (ssq));
422 void BLAS<int, std::complex<float> >::SCAL(
const int& n,
const std::complex<float> alpha, std::complex<float>* x,
const int& incx)
const
423 { CSCAL_F77(&n, &alpha, x, &incx); }
425 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
426 { CGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
428 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
429 { CGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
431 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
432 { CTRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
434 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
435 { CGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
437 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
439 CSWAP_F77 (&n, x, &incx, y, &incy);
442 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
443 { CSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
445 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
446 { CSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
448 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
449 { CHERK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
451 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
452 { 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); }
454 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
455 { 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); }
459 void BLAS<int, std::complex<double> >::ROTG(std::complex<double>* da, std::complex<double>* db,
double* c, std::complex<double>* s)
const
460 { ZROTG_F77(da, db, c, s); }
462 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
463 { ZROT_F77(&n, dx, &incx, dy, &incy, c, s); }
465 double BLAS<int, std::complex<double> >::ASUM(
const int& n,
const std::complex<double>* x,
const int& incx)
const
466 {
return ZASUM_F77(&n, x, &incx); }
468 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
469 { ZAXPY_F77(&n, &alpha, x, &incx, y, &incy); }
471 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
472 { ZCOPY_F77(&n, x, &incx, y, &incy); }
474 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
476 #if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
477 std::complex<double> z;
478 cblas_zdotc_sub(n,x,incx,y,incy,&z);
480 #elif defined(HAVE_COMPLEX_BLAS_PROBLEM)
481 # if defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
482 std::complex<double> z;
483 ZDOT_F77(&z, &n, x, &incx, y, &incy);
489 std::complex<double> ztemp (0, 0);
491 if (incx == 1 && incy == 1) {
492 for (
int i = 0; i < n; ++i) {
493 ztemp += std::conj (x[i]) * y[i];
504 for (
int i = 0; i < n; ++i) {
505 ztemp += std::conj (x[ix]) * y[iy];
513 # endif // defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
515 return ZDOT_F77(&n, x, &incx, y, &incy);
519 int BLAS<int, std::complex<double> >::IAMAX(
const int& n,
const std::complex<double>* x,
const int& incx)
const
520 {
return IZAMAX_F77(&n, x, &incx); }
522 double BLAS<int, std::complex<double> >::NRM2(
const int& n,
const std::complex<double>* x,
const int& incx)
const
523 {
return ZNRM2_F77(&n, x, &incx); }
525 void BLAS<int, std::complex<double> >::SCAL(
const int& n,
const std::complex<double> alpha, std::complex<double>* x,
const int& incx)
const
526 { ZSCAL_F77(&n, &alpha, x, &incx); }
528 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
529 { ZGEMV_F77(CHAR_MACRO(ETranspChar[trans]), &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy); }
531 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
532 { ZGER_F77(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); }
534 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
535 { ZTRMV_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), CHAR_MACRO(EDiagChar[diag]), &n, A, &lda, x, &incx); }
537 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
538 { ZGEMM_F77(CHAR_MACRO(ETranspChar[transa]), CHAR_MACRO(ETranspChar[transb]), &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
540 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
542 ZSWAP_F77 (&n, x, &incx, y, &incy);
545 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
546 { ZSYMM_F77(CHAR_MACRO(ESideChar[side]), CHAR_MACRO(EUploChar[uplo]), &m, &n, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); }
548 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
549 { ZSYRK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
551 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
552 { ZHERK_F77(CHAR_MACRO(EUploChar[uplo]), CHAR_MACRO(ETranspChar[trans]), &n, &k, &alpha, A, &lda, &beta, C, &ldc); }
554 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
555 { 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); }
557 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
558 { 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); }
560 #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.