35#ifndef NEKTAR_LIB_UTILITIES_LINEAR_ALGEBRA_BLAS_HPP
36#define NEKTAR_LIB_UTILITIES_LINEAR_ALGEBRA_BLAS_HPP
38#include <boost/core/ignore_unused.hpp>
49 void F77NAME(
dcopy)(
const int &n,
const double *x,
const int &incx,
50 double *y,
const int &incy);
51 void F77NAME(
daxpy)(
const int &n,
const double &alpha,
const double *x,
52 const int &incx,
const double *y,
const int &incy);
53 void F77NAME(
dswap)(
const int &n,
double *x,
const int &incx,
double *y,
57 void F77NAME(
drot)(
const int &n,
double *x,
const int &incx,
double *y,
58 const int &incy,
const double &c,
const double &s);
59 double F77NAME(
ddot)(
const int &n,
const double *x,
const int &incx,
60 const double *y,
const int &incy);
61 double F77NAME(
dnrm2)(
const int &n,
const double *x,
const int &incx);
62 double F77NAME(
dasum)(
const int &n,
const double *x,
const int &incx);
67 const double &alpha,
const double *a,
const int &lda,
68 const double *x,
const int &incx,
const double &
beta,
69 double *y,
const int &incy);
71 const float &alpha,
const float *a,
const int &lda,
72 const float *x,
const int &incx,
const float &
beta,
73 float *y,
const int &incy);
76 const int &kl,
const int &ku,
const double &alpha,
77 const double *a,
const int &lda,
const double *x,
78 const int &incx,
const double &
beta,
double *y,
81 const int &kl,
const int &ku,
const float &alpha,
82 const float *a,
const int &lda,
const float *x,
83 const int &incx,
const float &
beta,
float *y,
86 void F77NAME(
dspmv)(
const char &uplo,
const int &n,
const double &alpha,
87 const double *a,
const double *x,
const int &incx,
88 const double &
beta,
double *y,
const int &incy);
89 void F77NAME(
sspmv)(
const char &uplo,
const int &n,
const float &alpha,
90 const float *a,
const float *x,
const int &incx,
91 const float &
beta,
float *y,
const int &incy);
94 const double &alpha,
const double *a,
const int &lda,
95 const double *x,
const int &incx,
const double &
beta,
96 double *y,
const int &incy);
98 const float &alpha,
const float *a,
const int &lda,
99 const float *x,
const int &incx,
const float &
beta,
100 float *y,
const int &incy);
102 void F77NAME(
dtpmv)(
const char &uplo,
const char &trans,
const char &diag,
103 const int &n,
const double *ap,
double *x,
105 void F77NAME(
stpmv)(
const char &uplo,
const char &trans,
const char &diag,
106 const int &n,
const float *ap,
float *x,
109 void F77NAME(
dger)(
const int &m,
const int &n,
const double &alpha,
110 const double *x,
const int &incx,
const double *y,
111 const int &incy,
double *a,
const int &lda);
112 void F77NAME(
sger)(
const int &m,
const int &n,
const float &alpha,
113 const float *x,
const int &incx,
const float *y,
114 const int &incy,
float *a,
const int &lda);
117 void F77NAME(
dgemm)(
const char &trans,
const char &transb,
const int &m1,
118 const int &n,
const int &k,
const double &alpha,
119 const double *a,
const int &lda,
const double *b,
120 const int &ldb,
const double &
beta,
double *c,
122 void F77NAME(
sgemm)(
const char &trans,
const char &transb,
const int &m1,
123 const int &n,
const int &k,
const float &alpha,
124 const float *a,
const int &lda,
const float *b,
125 const int &ldb,
const float &
beta,
float *c,
130static inline void Dcopy(
const int &n,
const double *x,
const int &incx,
131 double *y,
const int &incy)
137static inline void Daxpy(
const int &n,
const double &alpha,
const double *x,
138 const int &incx,
const double *y,
const int &incy)
144static inline void Dswap(
const int &n,
double *x,
const int &incx,
double *y,
151static inline void Dscal(
const int &n,
const double &alpha,
double *x,
158static inline void Drot(
const int &n,
double *x,
const int &incx,
double *y,
159 const int &incy,
const double &c,
const double &s)
165static inline double Ddot(
const int &n,
const double *x,
const int &incx,
166 const double *y,
const int &incy)
172static inline double Dnrm2(
const int &n,
const double *x,
const int &incx)
178static inline double Dasum(
const int &n,
const double *x,
const int &incx)
186static inline int Idamax(
const int &n,
const double *x,
const int &incx)
193static inline void Gemv(
const char &trans,
const int &m,
const int &n,
194 const double &alpha,
const double *a,
const int &lda,
195 const double *x,
const int &incx,
const double &
beta,
196 double *y,
const int &incy)
198 F77NAME(
dgemv)(trans, m, n, alpha, a, lda, x, incx,
beta, y, incy);
203static inline void Gemv(
const char &trans,
const int &m,
const int &n,
204 const float &alpha,
const float *a,
const int &lda,
205 const float *x,
const int &incx,
const float &
beta,
206 float *y,
const int &incy)
208 F77NAME(
sgemv)(trans, m, n, alpha, a, lda, x, incx,
beta, y, incy);
213static inline void Dgemv(
const char &trans,
const int &m,
const int &n,
214 const double &alpha,
const double *a,
const int &lda,
215 const double *x,
const int &incx,
const double &
beta,
216 double *y,
const int &incy)
218 F77NAME(
dgemv)(trans, m, n, alpha, a, lda, x, incx,
beta, y, incy);
223static inline void Gbmv(
const char &trans,
const int &m,
const int &n,
224 const int &kl,
const int &ku,
const double &alpha,
225 const double *a,
const int &lda,
const double *x,
226 const int &incx,
const double &
beta,
double *y,
229 F77NAME(
dgbmv)(trans, m, n, kl, ku, alpha, a, lda, x, incx,
beta, y, incy);
234static inline void Gbmv(
const char &trans,
const int &m,
const int &n,
235 const int &kl,
const int &ku,
const float &alpha,
236 const float *a,
const int &lda,
const float *x,
237 const int &incx,
const float &
beta,
float *y,
240 F77NAME(
sgbmv)(trans, m, n, kl, ku, alpha, a, lda, x, incx,
beta, y, incy);
245static inline void Dgbmv(
const char &trans,
const int &m,
const int &n,
246 const int &kl,
const int &ku,
const double &alpha,
247 const double *a,
const int &lda,
const double *x,
248 const int &incx,
const double &
beta,
double *y,
251 F77NAME(
dgbmv)(trans, m, n, kl, ku, alpha, a, lda, x, incx,
beta, y, incy);
256static inline void Spmv(
const char &uplo,
const int &n,
const double &alpha,
257 const double *a,
const double *x,
const int &incx,
258 const double &
beta,
double *y,
const int &incy)
265static inline void Spmv(
const char &uplo,
const int &n,
const float &alpha,
266 const float *a,
const float *x,
const int &incx,
267 const float &
beta,
float *y,
const int &incy)
274static inline void Dspmv(
const char &uplo,
const int &n,
const double &alpha,
275 const double *a,
const double *x,
const int &incx,
276 const double &
beta,
double *y,
const int &incy)
283static inline void Sbmv(
const char &uplo,
const int &m,
const int &k,
284 const double &alpha,
const double *a,
const int &lda,
285 const double *x,
const int &incx,
const double &
beta,
286 double *y,
const int &incy)
288 F77NAME(
dsbmv)(uplo, m, k, alpha, a, lda, x, incx,
beta, y, incy);
293static inline void Sbmv(
const char &uplo,
const int &m,
const int &k,
294 const float &alpha,
const float *a,
const int &lda,
295 const float *x,
const int &incx,
const float &
beta,
296 float *y,
const int &incy)
298 F77NAME(
ssbmv)(uplo, m, k, alpha, a, lda, x, incx,
beta, y, incy);
303static inline void Dsbmv(
const char &uplo,
const int &m,
const int &k,
304 const double &alpha,
const double *a,
const int &lda,
305 const double *x,
const int &incx,
const double &
beta,
306 double *y,
const int &incy)
308 F77NAME(
dsbmv)(uplo, m, k, alpha, a, lda, x, incx,
beta, y, incy);
312static inline void Tpmv(
const char &uplo,
const char &trans,
const char &diag,
313 const int &n,
const double *ap,
double *x,
320static inline void Tpmv(
const char &uplo,
const char &trans,
const char &diag,
321 const int &n,
const float *ap,
float *x,
328static inline void Dtpmv(
const char &uplo,
const char &trans,
const char &diag,
329 const int &n,
const double *ap,
double *x,
337static inline void Ger(
const int &m,
const int &n,
const double &alpha,
338 const double *x,
const int &incx,
const double *y,
339 const int &incy,
double *a,
const int &lda)
341 F77NAME(
dger)(m, n, alpha, x, incx, y, incy, a, lda);
346static inline void Ger(
const int &m,
const int &n,
const float &alpha,
347 const float *x,
const int &incx,
const float *y,
348 const int &incy,
float *a,
const int &lda)
350 F77NAME(
sger)(m, n, alpha, x, incx, y, incy, a, lda);
357static inline void Gemm(
const char &transa,
const char &transb,
const int &m,
358 const int &n,
const int &k,
const double &alpha,
359 const double *a,
const int &lda,
const double *b,
360 const int &ldb,
const double &
beta,
double *c,
364 (transa, transb, m, n, k, alpha, a, lda, b, ldb,
beta, c, ldc);
371static inline void Gemm(
const char &transa,
const char &transb,
const int &m,
372 const int &n,
const int &k,
const float &alpha,
373 const float *a,
const int &lda,
const float *b,
374 const int &ldb,
const float &
beta,
float *c,
378 (transa, transb, m, n, k, alpha, a, lda, b, ldb,
beta, c, ldc);
385static inline void Dgemm(
const char &transa,
const char &transb,
const int &m,
386 const int &n,
const int &k,
const double &alpha,
387 const double *a,
const int &lda,
const double *b,
388 const int &ldb,
const double &
beta,
double *c,
392 (transa, transb, m, n, k, alpha, a, lda, b, ldb,
beta, c, ldc);
397static inline void Cdgemm(
const int M,
const int N,
const int K,
const double a,
398 const double *
A,
const int ldA,
const double *B,
399 const int ldB,
const double b,
double *C,
402 boost::ignore_unused(ldA, ldB, ldC);
403 Dgemm(
'N',
'N', N, M, K, a, B, N,
A, K, b, C, N);
#define F77NAME(x)
Fortran routines need an underscore.
int F77NAME() idamax(const int &n, const double *x, const int &incx)
static void Dgemv(const char &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)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n].
static void Dgbmv(const char &trans, const int &m, const int &n, const int &kl, const int &ku, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n] is banded.
static void Dswap(const int &n, double *x, const int &incx, double *y, const int &incy)
BLAS level 1: Swap x with y.
static void Drot(const int &n, double *x, const int &incx, double *y, const int &incy, const double &c, const double &s)
BLAS level 1: Plane rotation by c = cos(theta), s = sin(theta)
void F77NAME() daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static void Sbmv(const char &uplo, const int &m, const int &k, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x m] is symmetric banded.
void F77NAME() dswap(const int &n, double *x, const int &incx, double *y, const int &incy)
void F77NAME() drot(const int &n, double *x, const int &incx, double *y, const int &incy, const double &c, const double &s)
static void Gemm(const char &transa, const char &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)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
double F77NAME() dasum(const int &n, const double *x, const int &incx)
void F77NAME() dtpmv(const char &uplo, const char &trans, const char &diag, const int &n, const double *ap, double *x, const int &incx)
void F77NAME() stpmv(const char &uplo, const char &trans, const char &diag, const int &n, const float *ap, float *x, const int &incx)
static void Gemv(const char &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)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n].
static double Dasum(const int &n, const double *x, const int &incx)
BLAS level 1: output = .
void F77NAME() dspmv(const char &uplo, const int &n, const double &alpha, const double *a, const double *x, const int &incx, const double &beta, double *y, const int &incy)
void F77NAME() dscal(const int &n, const double &alpha, double *x, const int &incx)
double F77NAME() ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
static void Gbmv(const char &trans, const int &m, const int &n, const int &kl, const int &ku, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n] is banded.
static void Dsbmv(const char &uplo, const int &m, const int &k, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x m] is symmetric banded.
static int Idamax(const int &n, const double *x, const int &incx)
BLAS level 1: output = 1st value where Note it is modified to return a value between (0,...
void F77NAME() ssbmv(const char &uplo, const int &m, const int &k, const float &alpha, const float *a, const int &lda, const float *x, const int &incx, const float &beta, float *y, const int &incy)
static void Dcopy(const int &n, const double *x, const int &incx, double *y, const int &incy)
BLAS level 1: Copy x to y.
void F77NAME() dsbmv(const char &uplo, const int &m, const int &k, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
void F77NAME() sspmv(const char &uplo, const int &n, const float &alpha, const float *a, const float *x, const int &incx, const float &beta, float *y, const int &incy)
void F77NAME() sgbmv(const char &trans, const int &m, const int &n, const int &kl, const int &ku, const float &alpha, const float *a, const int &lda, const float *x, const int &incx, const float &beta, float *y, const int &incy)
static double Dnrm2(const int &n, const double *x, const int &incx)
void F77NAME() dcopy(const int &n, const double *x, const int &incx, double *y, const int &incy)
void F77NAME() sger(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)
void F77NAME() sgemv(const char &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)
void F77NAME() dgbmv(const char &trans, const int &m, const int &n, const int &kl, const int &ku, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
void F77NAME() dgemm(const char &trans, const char &transb, const int &m1, 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)
void F77NAME() dgemv(const char &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)
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Cdgemm(const int M, const int N, const int K, const double a, const double *A, const int ldA, const double *B, const int ldB, const double b, double *C, const int ldC)
static void Dgemm(const char &transa, const char &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)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
void F77NAME() sgemm(const char &trans, const char &transb, const int &m1, 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)
double F77NAME() dnrm2(const int &n, const double *x, const int &incx)
static void Tpmv(const char &uplo, const char &trans, const char &diag, const int &n, const double *ap, double *x, const int &incx)
BLAS level 2: Matrix vector multiply x = alpha A x where A[n x n].
static void Dspmv(const char &uplo, const int &n, const double &alpha, const double *a, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[n x n] is symmetric packed.
void F77NAME() dger(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)
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
static void 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)
BLAS level 2: Matrix vector multiply A = alpha*x*y**T + A where A[m x n].
static void Spmv(const char &uplo, const int &n, const double &alpha, const double *a, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[n x n] is symmetric packed.
static void Dtpmv(const char &uplo, const char &trans, const char &diag, const int &n, const double *ap, double *x, const int &incx)
BLAS level 2: Matrix vector multiply x = alpha A x where A[n x n].
@ beta
Gauss Radau pinned at x=-1,.