55
66extern " C"
77{
8- // level 1: std::vector-std::vector operations
8+ // level 1: std::vector-std::vector operations, O(n) data and O(n) work.
99
1010 // Peize Lin add ?scal 2016-08-04, to compute x=a*x
1111 void sscal_ (const int *N, const float *alpha, float *X, const int *incX);
@@ -22,14 +22,20 @@ extern "C"
2222 void dcopy_ (long const *n, const double *a, int const *incx, double *b, int const *incy);
2323 void zcopy_ (long const *n, const std::complex <double > *a, int const *incx, std::complex <double > *b, int const *incy);
2424
25+ // reason for passing results as argument instead of returning it:
26+ // see https://www.numbercrunch.de/blog/2014/07/lost-in-translation/
2527 void zdotc_ (std::complex <double > *result, const int *n, const std::complex <double > *zx,
2628 const int *incx, const std::complex <double > *zy, const int *incy);
27-
2829 // Peize Lin add ?dot 2017-10-27, to compute d=x*y
2930 float sdot_ (const int *N, const float *X, const int *incX, const float *Y, const int *incY);
3031 double ddot_ (const int *N, const double *X, const int *incX, const double *Y, const int *incY);
3132
32- // level 2: matrix-std::vector operations
33+ // Peize Lin add ?nrm2 2018-06-12, to compute out = ||x||_2 = \sqrt{ \sum_i x_i**2 }
34+ float snrm2_ ( const int *n, const float *X, const int *incX );
35+ double dnrm2_ ( const int *n, const double *X, const int *incX );
36+ double dznrm2_ ( const int *n, const std::complex <double > *X, const int *incX );
37+
38+ // level 2: matrix-std::vector operations, O(n^2) data and O(n^2) work.
3339 void dgemv_ (const char *transa, const int *m, const int *n, const double *alpha, const double *a,
3440 const int *lda, const double *x, const int *incx, const double *beta, double *y, const int *incy);
3541
@@ -41,10 +47,15 @@ extern "C"
4147 const double *alpha, const double *a, const int *lda,
4248 const double *x, const int *incx,
4349 const double *beta, double *y, const int *incy);
44-
45- // level 3: matrix-matrix operations
50+
51+ // A := alpha x * y.T + A
52+ void dger_ (int *m, int *n, double *alpha, double *x, int *incx, double *y, int *incy, double *a, int *lda);
53+ void zgerc_ (int *m, int *n, std::complex <double > *alpha,std::complex <double > *x, int *incx, std::complex <double > *y, int *incy,std::complex <double > *a, int *lda);
54+
55+ // level 3: matrix-matrix operations, O(n^2) data and O(n^3) work.
4656
47- // Peize Lin add ?gemm 2017-10-27, to compute C = a * A.? * B.? + b * C
57+ // Peize Lin add ?gemm 2017-10-27, to compute C = a * A.? * B.? + b * C
58+ // A is general
4859 void sgemm_ (const char *transa, const char *transb, const int *m, const int *n, const int *k,
4960 const float *alpha, const float *a, const int *lda, const float *b, const int *ldb,
5061 const float *beta, float *c, const int *ldc);
@@ -54,27 +65,21 @@ extern "C"
5465 void zgemm_ (const char *transa, const char *transb, const int *m, const int *n, const int *k,
5566 const std::complex <double > *alpha, const std::complex <double > *a, const int *lda, const std::complex <double > *b, const int *ldb,
5667 const std::complex <double > *beta, std::complex <double > *c, const int *ldc);
57-
68+
69+ // a is symmetric
5870 void dsymm_ (const char *side, const char *uplo, const int *m, const int *n,
5971 const double *alpha, const double *a, const int *lda, const double *b, const int *ldb,
6072 const double *beta, double *c, const int *ldc);
61-
73+ // a is hermitian
6274 void zhemm_ (char *side, char *uplo, int *m, int *n,std::complex <double > *alpha,
6375 std::complex <double > *a, int *lda, std::complex <double > *b, int *ldb, std::complex <double > *beta, std::complex <double > *c, int *ldc);
6476
77+ // solving triangular matrix with multiple right hand sides
6578 void dtrsm_ (char *side, char * uplo, char *transa, char *diag, int *m, int *n,
6679 double * alpha, double * a, int *lda, double *b, int *ldb);
67-
6880 void ztrsm_ (char *side, char * uplo, char *transa, char *diag, int *m, int *n,
6981 std::complex <double >* alpha, std::complex <double >* a, int *lda, std::complex <double >*b, int *ldb);
7082
71- // Peize Lin add ?nrm2 2018-06-12, to compute out = ||x||_2 = \sqrt{ \sum_i x_i**2 }
72- float snrm2_ ( const int *n, const float *X, const int *incX );
73- double dnrm2_ ( const int *n, const double *X, const int *incX );
74- double dznrm2_ ( const int *n, const std::complex <double > *X, const int *incX );
75- // Peize Lin add zherk 2019-04-14
76- // if trans=='N': C = a * A * A.H + b * C
77- // if trans=='C': C = a * A.H * A + b * C
7883};
7984
8085// Class BlasConnector provide the connector to fortran lapack routine.
@@ -137,7 +142,6 @@ class BlasConnector
137142 {
138143 return sdot_ (&n, X, &incX, Y, &incY);
139144 }
140-
141145 static inline
142146 double dot ( const int n, const double *X, const int incX, const double *Y, const int incY)
143147 {
@@ -191,7 +195,8 @@ class BlasConnector
191195 {
192196 return dznrm2_ ( &n, X, &incX );
193197 }
194-
198+
199+ // copies a into b
195200 static inline
196201 void copy (const long n, const double *a, const int incx, double *b, const int incy)
197202 {
0 commit comments