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(
scopy)(
const int &n,
const float *x,
const int &incx,
float *y,
53 void F77NAME(
daxpy)(
const int &n,
const double &alpha,
const double *x,
54 const int &incx,
const double *y,
const int &incy);
55 void F77NAME(
saxpy)(
const int &n,
const float &alpha,
const float *x,
56 const int &incx,
const float *y,
const int &incy);
57 void F77NAME(
dswap)(
const int &n,
double *x,
const int &incx,
double *y,
59 void F77NAME(
sswap)(
const int &n,
float *x,
const int &incx,
float *y,
65 void F77NAME(
drot)(
const int &n,
double *x,
const int &incx,
double *y,
66 const int &incy,
const double &c,
const double &s);
67 void F77NAME(
srot)(
const int &n,
float *x,
const int &incx,
float *y,
68 const int &incy,
const float &c,
const float &s);
69 double F77NAME(
ddot)(
const int &n,
const double *x,
const int &incx,
70 const double *y,
const int &incy);
71 float F77NAME(
sdot)(
const int &n,
const float *x,
const int &incx,
72 const float *y,
const int &incy);
73 double F77NAME(
dnrm2)(
const int &n,
const double *x,
const int &incx);
74 float F77NAME(
snrm2)(
const int &n,
const float *x,
const int &incx);
75 double F77NAME(
dasum)(
const int &n,
const double *x,
const int &incx);
76 float F77NAME(
sasum)(
const int &n,
const float *x,
const int &incx);
82 const double &alpha,
const double *a,
const int &lda,
83 const double *x,
const int &incx,
const double &
beta,
84 double *y,
const int &incy);
87 const float &alpha,
const float *a,
const int &lda,
88 const float *x,
const int &incx,
const float &
beta,
89 float *y,
const int &incy);
92 const int &kl,
const int &ku,
const double &alpha,
93 const double *a,
const int &lda,
const double *x,
94 const int &incx,
const double &
beta,
double *y,
97 const int &kl,
const int &ku,
const float &alpha,
98 const float *a,
const int &lda,
const float *x,
99 const int &incx,
const float &
beta,
float *y,
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(
dspmv)(
const char &uplo,
const int &n,
const double &alpha,
110 const double *a,
const double *x,
const int &incx,
111 const double &
beta,
double *y,
const int &incy);
112 void F77NAME(
sspmv)(
const char &uplo,
const int &n,
const float &alpha,
113 const float *a,
const float *x,
const int &incx,
114 const float &
beta,
float *y,
const int &incy);
117 const double &alpha,
const double *a,
const int &lda,
118 const double *x,
const int &incx,
const double &
beta,
119 double *y,
const int &incy);
121 const float &alpha,
const float *a,
const int &lda,
122 const float *x,
const int &incx,
const float &
beta,
123 float *y,
const int &incy);
125 void F77NAME(
dger)(
const int &m,
const int &n,
const double &alpha,
126 const double *x,
const int &incx,
const double *y,
127 const int &incy,
double *a,
const int &lda);
128 void F77NAME(
sger)(
const int &m,
const int &n,
const float &alpha,
129 const float *x,
const int &incx,
const float *y,
130 const int &incy,
float *a,
const int &lda);
133 void F77NAME(
dgemm)(
const char &trans,
const char &transb,
const int &m1,
134 const int &n,
const int &k,
const double &alpha,
135 const double *a,
const int &lda,
const double *b,
136 const int &ldb,
const double &
beta,
double *c,
139 void F77NAME(
sgemm)(
const char &trans,
const char &transb,
const int &m1,
140 const int &n,
const int &k,
const float &alpha,
141 const float *a,
const int &lda,
const float *b,
142 const int &ldb,
const float &
beta,
float *c,
147 static inline void Dcopy(
const int &n,
const double *x,
const int &incx,
148 double *y,
const int &incy)
154 static inline void Daxpy(
const int &n,
const double &alpha,
const double *x,
155 const int &incx,
const double *y,
const int &incy)
161 static inline void Dswap(
const int &n,
double *x,
const int &incx,
double *y,
168 static inline void Dscal(
const int &n,
const double &alpha,
double *x,
175 static inline void Drot(
const int &n,
double *x,
const int &incx,
double *y,
176 const int &incy,
const double &c,
const double &s)
182 static inline double Ddot(
const int &n,
const double *x,
const int &incx,
183 const double *y,
const int &incy)
190 static inline double Dnrm2(
const int &n,
const double *x,
const int &incx)
196 static inline double Dasum(
const int &n,
const double *x,
const int &incx)
204 static inline int Idamax(
const int &n,
const double *x,
const int &incx)
211 static inline void Ger(
const int &m,
const int &n,
const double &alpha,
212 const double *x,
const int &incx,
const double *y,
213 const int &incy,
double *a,
const int &lda)
215 F77NAME(
dger)(m, n, alpha, x, incx, y, incy, a, lda);
220 static inline void Ger(
const int &m,
const int &n,
const float &alpha,
221 const float *x,
const int &incx,
const float *y,
222 const int &incy,
float *a,
const int &lda)
224 F77NAME(
sger)(m, n, alpha, x, incx, y, incy, a, lda);
228 static inline void Gemv(
const char &trans,
const int &m,
const int &n,
229 const double &alpha,
const double *a,
const int &lda,
230 const double *x,
const int &incx,
const double &
beta,
231 double *y,
const int &incy)
233 F77NAME(
dgemv)(trans, m, n, alpha, a, lda, x, incx,
beta, y, incy);
237 static inline void Gemv(
const char &trans,
const int &m,
const int &n,
238 const float &alpha,
const float *a,
const int &lda,
239 const float *x,
const int &incx,
const float &
beta,
240 float *y,
const int &incy)
242 F77NAME(
sgemv)(trans, m, n, alpha, a, lda, x, incx,
beta, y, incy);
246 static inline void Dgemv(
const char &trans,
const int &m,
const int &n,
247 const double &alpha,
const double *a,
const int &lda,
248 const double *x,
const int &incx,
const double &
beta,
249 double *y,
const int &incy)
251 F77NAME(
dgemv)(trans, m, n, alpha, a, lda, x, incx,
beta, y, incy);
254 static inline void Gbmv(
const char &trans,
const int &m,
const int &n,
255 const int &kl,
const int &ku,
const double &alpha,
256 const double *a,
const int &lda,
const double *x,
257 const int &incx,
const double &
beta,
double *y,
260 F77NAME(
dgbmv)(trans, m, n, kl, ku, alpha, a, lda, x, incx,
beta, y, incy);
263 static inline void Gbmv(
const char &trans,
const int &m,
const int &n,
264 const int &kl,
const int &ku,
const float &alpha,
265 const float *a,
const int &lda,
const float *x,
266 const int &incx,
const float &
beta,
float *y,
269 F77NAME(
sgbmv)(trans, m, n, kl, ku, alpha, a, lda, x, incx,
beta, y, incy);
272 static inline void Dgbmv(
const char &trans,
const int &m,
const int &n,
273 const int &kl,
const int &ku,
const double &alpha,
274 const double *a,
const int &lda,
const double *x,
275 const int &incx,
const double &
beta,
double *y,
278 F77NAME(
dgbmv)(trans, m, n, kl, ku, alpha, a, lda, x, incx,
beta, y, incy);
281 static inline void Tpmv(
const char &uplo,
const char &trans,
const char &diag,
282 const int &n,
const double *ap,
double *x,
288 static inline void Tpmv(
const char &uplo,
const char &trans,
const char &diag,
289 const int &n,
const float *ap,
float *x,
295 static inline void Dtpmv(
const char &uplo,
const char &trans,
const char &diag,
296 const int &n,
const double *ap,
double *x,
304 static inline void Spmv(
const char &uplo,
const int &n,
const double &alpha,
305 const double *a,
const double *x,
const int &incx,
306 const double &
beta,
double *y,
const int &incy)
312 static inline void Spmv(
const char &uplo,
const int &n,
const float &alpha,
313 const float *a,
const float *x,
const int &incx,
314 const float &
beta,
float *y,
const int &incy)
321 static inline void Dspmv(
const char &uplo,
const int &n,
const double &alpha,
322 const double *a,
const double *x,
const int &incx,
323 const double &
beta,
double *y,
const int &incy)
328 static inline void Dsbmv(
const char &uplo,
const int &m,
const int &k,
329 const double &alpha,
const double *a,
const int &lda,
330 const double *x,
const int &incx,
const double &
beta,
331 double *y,
const int &incy)
333 F77NAME(
dsbmv)(uplo, m, k, alpha, a, lda, x, incx,
beta, y, incy);
340 static inline void Gemm(
const char &transa,
const char &transb,
const int &m,
341 const int &n,
const int &k,
const double &alpha,
342 const double *a,
const int &lda,
const double *b,
343 const int &ldb,
const double &
beta,
double *c,
347 (transa, transb, m, n, k, alpha, a, lda, b, ldb,
beta, c, ldc);
354 static inline void Gemm(
const char &transa,
const char &transb,
const int &m,
355 const int &n,
const int &k,
const float &alpha,
356 const float *a,
const int &lda,
const float *b,
357 const int &ldb,
const float &
beta,
float *c,
361 (transa, transb, m, n, k, alpha, a, lda, b, ldb,
beta, c, ldc);
368 static inline void Dgemm(
const char &transa,
const char &transb,
const int &m,
369 const int &n,
const int &k,
const double &alpha,
370 const double *a,
const int &lda,
const double *b,
371 const int &ldb,
const double &
beta,
double *c,
375 (transa, transb, m, n, k, alpha, a, lda, b, ldb,
beta, c, ldc);
380 static inline void Cdgemm(
const int M,
const int N,
const int K,
const double a,
381 const double *
A,
const int ldA,
const double *B,
382 const int ldB,
const double b,
double *C,
385 boost::ignore_unused(ldA, ldB, ldC);
386 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)
void F77NAME() sscal(const int &n, const float &alpha, float *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 = A x 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)
static void Dswap(const int &n, double *x, const int &incx, double *y, const int &incy)
BLAS level 1: Swap x with y.
void F77NAME() saxpy(const int &n, const float &alpha, const float *x, const int &incx, const float *y, const int &incy)
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.
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 = A x 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)
float F77NAME() sasum(const int &n, const float *x, const int &incx)
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)
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)
float F77NAME() snrm2(const int &n, const float *x, const int &incx)
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() srot(const int &n, float *x, const int &incx, float *y, const int &incy, const float &c, const float &s)
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)
int F77NAME() isamax(const int &n, const float *x, const int &incx)
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)
float F77NAME() sdot(const int &n, const float *x, const int &incx, const float *y, const int &incy)
void F77NAME() sswap(const int &n, float *x, const int &incx, float *y, const int &incy)
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 = A x where A 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)
void F77NAME() scopy(const int &n, const float *x, const int &incx, float *y, const int &incy)
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 = A x where A 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)
@ beta
Gauss Radau pinned at x=-1,.