1 /++ 2 $(H2 BLAS API for GLAS) 3 4 Please read $(LINK2 http://www.netlib.org/blas/ , Netlib BLAS) for more details. 5 6 Note: Standard (fortran) BLAS API is column major. 7 8 Copyright: Copyright © 2016-, Ilya Yaroshenko. 9 License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0). 10 Authors: Ilya Yaroshenko 11 +/ 12 module glas.fortran; 13 14 /// Alias for Fortran77 integer. 15 alias FortranInt = int; 16 17 extern(C) nothrow @nogc @system: 18 19 /++ 20 `gemm_` performs one of the matrix-matrix operations 21 22 `C := alpha*op( A )*op( B ) + beta*C`, 23 24 where `op( X )` is one of 25 26 `op( X ) = X or op( X ) = X**T or op( X ) = X**H`, 27 28 alpha and beta are scalars, and `A`, `B` and `C` are matrices, with `op( A )` 29 an `m ⨉ k` matrix, `op( B )` a `k ⨉ n` matrix and `C` an `m ⨉ n` matrix. 30 31 Unified_alias: `gemm_` 32 +/ 33 int sgemm_(ref const char transa, ref const char transb, ref const FortranInt m, ref const FortranInt n, ref const FortranInt k, ref const float alpha, const(float)* a, ref const FortranInt lda, const(float)* b, ref const FortranInt ldb, ref const float beta, float* c, ref const FortranInt ldc); 34 /// ditto 35 int dgemm_(ref const char transa, ref const char transb, ref const FortranInt m, ref const FortranInt n, ref const FortranInt k, ref const double alpha, const(double)* a, ref const FortranInt lda, const(double)* b, ref const FortranInt ldb, ref const double beta, double* c, ref const FortranInt ldc); 36 /// ditto 37 int cgemm_(ref const char transa, ref const char transb, ref const FortranInt m, ref const FortranInt n, ref const FortranInt k, ref const cfloat alpha, const(cfloat)* a, ref const FortranInt lda, const(cfloat)* b, ref const FortranInt ldb, ref const cfloat beta, cfloat* c, ref const FortranInt ldc); 38 /// ditto 39 int zgemm_(ref const char transa, ref const char transb, ref const FortranInt m, ref const FortranInt n, ref const FortranInt k, ref const cdouble alpha, const(cdouble)* a, ref const FortranInt lda, const(cdouble)* b, ref const FortranInt ldb, ref const cdouble beta, cdouble* c, ref const FortranInt ldc); 40 41 alias gemm_ = sgemm_; 42 alias gemm_ = dgemm_; 43 alias gemm_ = cgemm_; 44 alias gemm_ = zgemm_; 45 46 /++ 47 `symm_` performs one of the matrix-matrix operations 48 49 `C := alpha*A*B + beta*C`, 50 51 where `op( X )` is one of 52 53 `C := alpha*B*A + beta*C`, 54 55 alpha and beta are scalars, `A` is a symmetric matrix and `B` and 56 `C` are `m ⨉ n` matrices.. 57 58 Unified_alias: `symm_` 59 +/ 60 int ssymm_(ref const char side, ref const char uplo, ref const FortranInt m, ref const FortranInt n, ref const float alpha, const(float)* a, ref const FortranInt lda, const(float)* b, ref const FortranInt ldb, ref const float beta, float* c, ref const FortranInt ldc); 61 /// ditto 62 int dsymm_(ref const char side, ref const char uplo, ref const FortranInt m, ref const FortranInt n, ref const double alpha, const(double)* a, ref const FortranInt lda, const(double)* b, ref const FortranInt ldb, ref const double beta, double* c, ref const FortranInt ldc); 63 /// ditto 64 int csymm_(ref const char side, ref const char uplo, ref const FortranInt m, ref const FortranInt n, ref const cfloat alpha, const(cfloat)* a, ref const FortranInt lda, const(cfloat)* b, ref const FortranInt ldb, ref const cfloat beta, cfloat* c, ref const FortranInt ldc); 65 /// ditto 66 int zsymm_(ref const char side, ref const char uplo, ref const FortranInt m, ref const FortranInt n, ref const cdouble alpha, const(cdouble)* a, ref const FortranInt lda, const(cdouble)* b, ref const FortranInt ldb, ref const cdouble beta, cdouble* c, ref const FortranInt ldc); 67 68 alias symm_ = ssymm_; 69 alias symm_ = dsymm_; 70 alias symm_ = csymm_; 71 alias symm_ = zsymm_; 72 73 /++ 74 `hemm_` performs one of the matrix-matrix operations 75 76 `C := alpha*A*B + beta*C`, 77 78 where `op( X )` is one of 79 80 `C := alpha*B*A + beta*C`, 81 82 alpha and beta are scalars, `A` is a hermitian matrix and `B` and 83 `C` are `m ⨉ n` matrices.. 84 85 Unified_alias: `hemm_` 86 +/ 87 int chemm_(ref const char side, ref const char uplo, ref const FortranInt m, ref const FortranInt n, ref const cfloat alpha, const(cfloat)* a, ref const FortranInt lda, const(cfloat)* b, ref const FortranInt ldb, ref const cfloat beta, cfloat* c, ref const FortranInt ldc); 88 /// ditto 89 int zhemm_(ref const char side, ref const char uplo, ref const FortranInt m, ref const FortranInt n, ref const cdouble alpha, const(cdouble)* a, ref const FortranInt lda, const(cdouble)* b, ref const FortranInt ldb, ref const cdouble beta, cdouble* c, ref const FortranInt ldc); 90 91 alias hemm_ = chemm_; 92 alias hemm_ = zhemm_; 93 94 /++ 95 Copies a vector, `x`, to a vector, `y`. 96 97 Unified_alias: `copy_` 98 +/ 99 int scopy_(ref const FortranInt n, const(float)* x, ref const FortranInt incx, float* y, ref const FortranInt incy); 100 /// ditto 101 int dcopy_(ref const FortranInt n, const(double)* x, ref const FortranInt incx, double* y, ref const FortranInt incy); 102 /// ditto 103 int ccopy_(ref const FortranInt n, const(cfloat)* x, ref const FortranInt incx, cfloat* y, ref const FortranInt incy); 104 /// ditto 105 int zcopy_(ref const FortranInt n, const(cdouble)* x, ref const FortranInt incx, cdouble* y, ref const FortranInt incy); 106 107 alias copy_ = scopy_; 108 alias copy_ = dcopy_; 109 alias copy_ = ccopy_; 110 alias copy_ = zcopy_; 111 112 /++ 113 Interchanges two vectors. 114 115 Unified_alias: `swap_` 116 +/ 117 int sswap_(ref const FortranInt n, float* x, ref const FortranInt incx, float* y, ref const FortranInt incy); 118 /// ditto 119 int dswap_(ref const FortranInt n, double* x, ref const FortranInt incx, double* y, ref const FortranInt incy); 120 /// ditto 121 int cswap_(ref const FortranInt n, cfloat* x, ref const FortranInt incx, cfloat* y, ref const FortranInt incy); 122 /// ditto 123 int zswap_(ref const FortranInt n, cdouble* x, ref const FortranInt incx, cdouble* y, ref const FortranInt incy); 124 125 alias swap_ = sswap_; 126 alias swap_ = dswap_; 127 alias swap_ = cswap_; 128 alias swap_ = zswap_; 129 130 /++ 131 Copies a vector, `x`, to a vector, `y`. 132 133 Unified_alias: `axpy_` 134 +/ 135 int saxpy_(ref const FortranInt n, ref const float a, const(float)* x, ref const FortranInt incx, float* y, ref const FortranInt incy); 136 /// ditto 137 int daxpy_(ref const FortranInt n, ref const double a, const(double)* x, ref const FortranInt incx, double* y, ref const FortranInt incy); 138 /// ditto 139 int caxpy_(ref const FortranInt n, ref const cfloat a, const(cfloat)* x, ref const FortranInt incx, cfloat* y, ref const FortranInt incy); 140 /// ditto 141 int zaxpy_(ref const FortranInt n, ref const cdouble a, const(cdouble)* x, ref const FortranInt incx, cdouble* y, ref const FortranInt incy); 142 143 alias axpy_ = saxpy_; 144 alias axpy_ = daxpy_; 145 alias axpy_ = caxpy_; 146 alias axpy_ = zaxpy_; 147 148 /++ 149 Returns the euclidean norm of a vector via the function. 150 151 Unified_alias: `nrm2_` 152 +/ 153 int snrm2_(ref const FortranInt n, const(float)* x, ref const FortranInt incx); 154 /// ditto 155 int dnrm2_(ref const FortranInt n, const(double)* x, ref const FortranInt incx); 156 /// ditto 157 int scnrm2_(ref const FortranInt n, const(cfloat)* x, ref const FortranInt incx); 158 /// ditto 159 int dznrm2_(ref const FortranInt n, const(cdouble)* x, ref const FortranInt incx); 160 161 alias nrm2_ = snrm2_; 162 alias nrm2_ = dnrm2_; 163 alias nrm2_ = scnrm2_; 164 alias nrm2_ = dznrm2_; 165 166 /++ 167 Takes the sum of the absolute values. 168 169 Unified_alias: `asum_` 170 +/ 171 int sasum_(ref const FortranInt n, const(float)* x, ref const FortranInt incx); 172 /// ditto 173 int dasum_(ref const FortranInt n, const(double)* x, ref const FortranInt incx); 174 /// ditto 175 int scasum_(ref const FortranInt n, const(cfloat)* x, ref const FortranInt incx); 176 /// ditto 177 int dzasum_(ref const FortranInt n, const(cdouble)* x, ref const FortranInt incx); 178 179 alias asum_ = sasum_; 180 alias asum_ = dasum_; 181 alias asum_ = scasum_; 182 alias asum_ = dzasum_; 183 184 /++ 185 Finds the index of the first element having maximum `|Re(.)| + |Im(.)|`. 186 187 Unified_alias: `iamax_` 188 +/ 189 int isamax_(ref const FortranInt n, const(float)* x, ref const FortranInt incx); 190 /// ditto 191 int idamax_(ref const FortranInt n, const(double)* x, ref const FortranInt incx); 192 /// ditto 193 int icamax_(ref const FortranInt n, const(cfloat)* x, ref const FortranInt incx); 194 /// ditto 195 int izamax_(ref const FortranInt n, const(cdouble)* x, ref const FortranInt incx); 196 197 alias iamax_ = isamax_; 198 alias iamax_ = idamax_; 199 alias iamax_ = icamax_; 200 alias iamax_ = izamax_; 201 202 /++ 203 `scal_` scales a vector by a constant. 204 205 Unified_alias: `scal_` 206 +/ 207 int sscal_(ref const FortranInt n, ref const float a, float* x, ref const FortranInt incx); 208 /// ditto 209 int dscal_(ref const FortranInt n, ref const double a, double* x, ref const FortranInt incx); 210 /// ditto 211 int csscal_(ref const FortranInt n, ref const float a, cfloat* x, ref const FortranInt incx); 212 /// ditto 213 int cscal_(ref const FortranInt n, ref const cfloat a, cfloat* x, ref const FortranInt incx); 214 /// ditto 215 int csIscal_(ref const FortranInt n, ref const ifloat a, cfloat* x, ref const FortranInt incx); 216 /// ditto 217 int zdscal_(ref const FortranInt n, ref const double a, cdouble* x, ref const FortranInt incx); 218 /// ditto 219 int zscal_(ref const FortranInt n, ref const cdouble a, cdouble* x, ref const FortranInt incx); 220 /// ditto 221 int zdIscal_(ref const FortranInt n, ref const idouble a, cdouble* x, ref const FortranInt incx); 222 223 alias scal_ = sscal_; 224 alias scal_ = dscal_; 225 alias scal_ = csscal_; 226 alias scal_ = cscal_; 227 alias scal_ = csIscal_; 228 alias scal_ = zdscal_; 229 alias scal_ = zscal_; 230 alias scal_ = zdIscal_; 231 232 /++ 233 XERBLA is an error handler for the LAPACK routines. 234 It is called by an LAPACK routine if an input parameter has an 235 invalid value. A message is printed and execution stops. 236 237 Installers may consider modifying the STOP statement in order to 238 call system-specific exception-handling facilities. 239 +/ 240 int xerbla_(in char* srname, ref FortranInt info);