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,
52 float *y,
const int& incy);
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);
58 double *y,
const int& incy);
60 float *y,
const int& incy);
66 double *y,
const int& incy,
const double& c,
69 float *y,
const int& incy,
const float& c,
71 double F77NAME(
ddot) (
const int& n,
const double *x,
const int& incx,
72 const double *y,
const int& incy);
73 float F77NAME(
sdot) (
const int& n,
const float *x,
const int& incx,
74 const float *y,
const int& incy);
75 double F77NAME(
dnrm2) (
const int& n,
const double *x,
const int& incx);
76 float F77NAME(
snrm2) (
const int& n,
const float *x,
const int& incx);
77 double F77NAME(
dasum) (
const int& n,
const double *x,
const int& incx);
78 float F77NAME(
sasum) (
const int& n,
const float *x,
const int& incx);
84 const int& n,
const double& alpha,
85 const double* a,
const int& lda,
86 const double* x,
const int& incx,
87 const double& beta,
double* y,
const int& incy);
90 const int& n,
const float& alpha,
91 const float* a,
const int& lda,
92 const float* x,
const int& incx,
93 const float& beta,
float* y,
const int& incy);
96 const int& n,
const int& kl,
const int& ku,
98 const double* a,
const int& lda,
99 const double* x,
const int& incx,
100 const double& beta,
double* y,
const int& incy);
102 const int& n,
const int& kl,
const int& ku,
104 const float* a,
const int& lda,
105 const float* x,
const int& incx,
106 const float& beta,
float* y,
const int& incy);
108 void F77NAME(
dtpmv) (
const char& uplo,
const char& trans,
const char& diag,
109 const int& n,
const double* ap,
double* x,
const int& incx);
111 const char& diag,
const int& n,
const float* ap,
float* x,
114 void F77NAME(
dspmv) (
const char& uplo,
const int& n,
const double& alpha,
115 const double* a,
const double* x,
const int& incx,
116 const double& beta,
double* y,
const int& incy);
117 void F77NAME(
sspmv) (
const char& uplo,
const int& n,
const float& alpha,
118 const float* a,
const float* x,
const int& incx,
119 const float& beta,
float* y,
const int& incy);
122 const int& k,
const double& alpha,
123 const double* a,
const int& lda,
124 const double* x,
const int& incx,
125 const double& beta,
double* y,
const int& incy);
127 const int& k,
const float& alpha,
128 const float* a,
const int& lda,
129 const float* x,
const int& incx,
130 const float& beta,
float* y,
const int& incy);
133 const int& n,
const double& alpha,
134 const double* x,
const int& incx,
135 const double* y,
const int& incy,
136 double* a,
const int& lda);
138 const int& n,
const float& alpha,
139 const float* x,
const int& incx,
140 const float* y,
const int& incy,
141 float* a,
const int& lda);
145 const int& m1,
const int& n,
146 const int& k,
const double& alpha,
147 const double* a,
const int& lda,
148 const double* b,
const int& ldb,
149 const double& beta,
double* c,
const int& ldc);
152 const int& m1,
const int& n,
153 const int& k,
const float& alpha,
154 const float* a,
const int& lda,
155 const float* b,
const int& ldb,
156 const float& beta,
float* c,
const int& ldc);
160 static inline void Dcopy (
const int& n,
const double *x,
const int& incx,
161 double *y,
const int& incy)
167 static inline void Daxpy (
const int& n,
const double& alpha,
const double *x,
168 const int& incx,
const double *y,
const int& incy)
175 static inline void Dswap (
const int& n,
double *x,
const int& incx,
176 double *y,
const int& incy)
182 static inline void Dscal (
const int& n,
const double& alpha,
double *x,
189 static inline void Drot (
const int& n,
double *x,
const int& incx,
190 double *y,
const int& incy,
const double& c,
197 static inline double Ddot (
const int& n,
const double *x,
const int& incx,
198 const double *y,
const int& incy)
205 static inline double Dnrm2 (
const int& n,
const double *x,
const int& incx)
211 static inline double Dasum (
const int& n,
const double *x,
const int& incx)
219 static inline int Idamax (
const int& n,
const double *x,
const int& incx)
226 static inline void Ger (
const int& m,
227 const int& n,
const double& alpha,
228 const double* x,
const int& incx,
229 const double* y,
const int& incy,
230 double* a,
const int& lda)
237 static inline void Ger (
const int& m,
238 const int& n,
const float& alpha,
239 const float* x,
const int& incx,
240 const float* y,
const int& incy,
241 float* a,
const int& lda)
247 static inline void Gemv (
const char& trans,
const int& m,
const int& n,
248 const double& alpha,
const double* a,
const int& lda,
249 const double* x,
const int& incx,
const double& beta,
250 double* y,
const int& incy)
252 F77NAME(
dgemv) (trans,m,n,alpha,a,lda,x,incx,beta,y,incy);
256 static inline void Gemv (
const char& trans,
const int& m,
const int& n,
257 const float& alpha,
const float* a,
const int& lda,
258 const float* x,
const int& incx,
const float& beta,
259 float* y,
const int& incy)
261 F77NAME(
sgemv) (trans,m,n,alpha,a,lda,x,incx,beta,y,incy);
265 static inline void Dgemv (
const char& trans,
const int& m,
const int& n,
266 const double& alpha,
const double* a,
const int& lda,
267 const double* x,
const int& incx,
const double& beta,
268 double* y,
const int& incy)
270 F77NAME(
dgemv) (trans,m,n,alpha,a,lda,x,incx,beta,y,incy);
273 static inline void Gbmv (
const char& trans,
const int& m,
274 const int& n,
const int& kl,
const int& ku,
276 const double* a,
const int& lda,
277 const double* x,
const int& incx,
278 const double& beta,
double* y,
const int& incy)
280 F77NAME(
dgbmv) (trans, m, n, kl, ku, alpha, a, lda, x, incx, beta, y,
284 static inline void Gbmv (
const char& trans,
const int& m,
285 const int& n,
const int& kl,
const int& ku,
287 const float* a,
const int& lda,
288 const float* x,
const int& incx,
289 const float& beta,
float* y,
const int& incy)
291 F77NAME(
sgbmv) (trans, m, n, kl, ku, alpha, a, lda, x, incx, beta, y,
295 static inline void Dgbmv (
const char& trans,
const int& m,
296 const int& n,
const int& kl,
const int& ku,
298 const double* a,
const int& lda,
299 const double* x,
const int& incx,
300 const double& beta,
double* y,
const int& incy)
302 F77NAME(
dgbmv) (trans, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy);
305 static inline void Tpmv(
const char& uplo,
const char& trans,
306 const char& diag,
const int& n,
const double* ap,
double* x,
312 static inline void Tpmv(
const char& uplo,
const char& trans,
313 const char& diag,
const int& n,
const float* ap,
float* x,
319 static inline void Dtpmv(
const char& uplo,
const char& trans,
const char& diag,
320 const int& n,
const double* ap,
double* x,
const int& incx)
327 static inline void Spmv (
const char& uplo,
const int& n,
329 const double* a,
const double* x,
const int& incx,
330 const double& beta,
double* y,
const int& incy)
336 static inline void Spmv (
const char& uplo,
const int& n,
338 const float* a,
const float* x,
const int& incx,
339 const float& beta,
float* y,
const int& incy)
346 static inline void Dspmv (
const char& uplo,
const int& n,
const double& alpha,
347 const double* a,
const double* x,
const int& incx,
348 const double& beta,
double* y,
const int& incy)
353 static inline void Dsbmv (
const char& uplo,
const int& m,
const int& k,
354 const double& alpha,
const double* a,
const int& lda,
355 const double* x,
const int& incx,
const double& beta,
356 double* y,
const int& incy)
358 F77NAME(
dsbmv) (uplo,m,k,alpha,a,lda,x,incx,beta,y,incy);
365 static inline void Gemm (
const char& transa,
const char& transb,
367 const int& n,
const int& k,
const double& alpha,
368 const double* a,
const int& lda,
const double* b,
369 const int& ldb,
const double& beta,
double* c,
372 F77NAME(
dgemm) (transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc);
379 static inline void Gemm (
const char& transa,
const char& transb,
381 const int& n,
const int& k,
const float& alpha,
382 const float* a,
const int& lda,
const float* b,
383 const int& ldb,
const float& beta,
float* c,
386 F77NAME(
sgemm) (transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc);
394 static inline void Dgemm (
const char& transa,
const char& transb,
const int& m,
395 const int& n,
const int& k,
const double& alpha,
396 const double* a,
const int& lda,
const double* b,
397 const int& ldb,
const double& beta,
double* c,
400 F77NAME(
dgemm) (transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc);
405 static inline void Cdgemm(
const int M,
const int N,
const int K,
const double a,
406 const double *
A,
const int ldA,
const double * B,
const int ldB,
407 const double b,
double *C,
const int ldC)
409 boost::ignore_unused(ldA, ldB, ldC);
410 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)