00001 #ifndef SimTK_SimTKCOMMON_TEMPLATIZED_LAPACK_H_
00002 #define SimTK_SimTKCOMMON_TEMPLATIZED_LAPACK_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00041 #include "SimTKcommon/internal/common.h"
00042 #include "SimTKlapack.h"
00043
00044 #include <complex>
00045 using std::complex;
00046
00047 namespace SimTK {
00048
00049 class Lapack {
00050 public:
00051
00052
00053 template <class P> static void
00054 gemm
00055 (char transa, char transb,
00056 int m, int n, int k,
00057 const P& alpha, const P a[], int lda,
00058 const P b[], int ldb,
00059 const P& beta, P c[], int ldc) {assert(false);}
00060
00061 template <class P> static void
00062 getri
00063 (int n,
00064 P a[],
00065 int lda,
00066 const int ipiv[],
00067 P work[],
00068 int lwork,
00069 int &info ) {assert(false);}
00070
00071 template <class P> static void
00072 getrf
00073 (int m,
00074 int n,
00075 P a[],
00076 int lda,
00077 int ipiv[],
00078 int &info ) {assert(false);}
00079
00080 };
00081
00082
00083
00084 template <> inline void Lapack::gemm<float>
00085 (char transa, char transb,
00086 int m, int n, int k,
00087 const float& alpha, const float a[], int lda,
00088 const float b[], int ldb,
00089 const float& beta, float c[], int ldc)
00090 {
00091 sgemm_(
00092 transa, transb,
00093 m,n,k,alpha,a,lda,b,ldb,beta,c,ldc
00094 );
00095 }
00096 template <> inline void Lapack::gemm<double>
00097 (char transa, char transb,
00098 int m, int n, int k,
00099 const double& alpha, const double a[], int lda,
00100 const double b[], int ldb,
00101 const double& beta, double c[], int ldc)
00102 {
00103 dgemm_(
00104 transa, transb,
00105 m,n,k,alpha,a,lda,b,ldb,beta,c,ldc
00106 );
00107 }
00108 template <> inline void Lapack::gemm< complex<float> >
00109 (char transa, char transb,
00110 int m, int n, int k,
00111 const complex<float>& alpha, const complex<float> a[], int lda,
00112 const complex<float> b[], int ldb,
00113 const complex<float>& beta, complex<float> c[], int ldc)
00114 {
00115 cgemm_(
00116 transa, transb,
00117 m,n,k,alpha,a,lda,b,ldb,beta,c,ldc
00118 );
00119 }
00120 template <> inline void Lapack::gemm< complex<double> >
00121 (char transa, char transb,
00122 int m, int n, int k,
00123 const complex<double>& alpha, const complex<double> a[], int lda,
00124 const complex<double> b[], int ldb,
00125 const complex<double>& beta, complex<double> c[], int ldc)
00126 {
00127 zgemm_(
00128 transa, transb,
00129 m,n,k,alpha,a,lda,b,ldb,beta,c,ldc
00130 );
00131 }
00132
00133
00134
00135 template <> inline void Lapack::getri<float>
00136 (int n,
00137 float a[],
00138 int lda,
00139 const int ipiv[],
00140 float work[],
00141 int lwork,
00142 int& info )
00143 {
00144 sgetri_(n,a,lda,ipiv,work,lwork,info);
00145 }
00146
00147 template <> inline void Lapack::getri<double>
00148 (int n,
00149 double a[],
00150 int lda,
00151 const int ipiv[],
00152 double work[],
00153 int lwork,
00154 int& info )
00155 {
00156 dgetri_(n,a,lda,ipiv,work,lwork,info);
00157 }
00158
00159 template <> inline void Lapack::getri< complex<float> >
00160 (int n,
00161 complex<float> a[],
00162 int lda,
00163 const int ipiv[],
00164 complex<float> work[],
00165 int lwork,
00166 int& info )
00167 {
00168 cgetri_(n,a,lda,ipiv,work,lwork,info);
00169 }
00170
00171 template <> inline void Lapack::getri< complex<double> >
00172 (int n,
00173 complex<double> a[],
00174 int lda,
00175 const int ipiv[],
00176 complex<double> work[],
00177 int lwork,
00178 int& info )
00179 {
00180 zgetri_(n,a,lda,ipiv,work,lwork,info);
00181 }
00182
00183
00184 template <> inline void Lapack::getrf<float>
00185 (int m,
00186 int n,
00187 float a[],
00188 int lda,
00189 int ipiv[],
00190 int& info )
00191 {
00192 sgetrf_(m,n,a,lda,ipiv,info);
00193 }
00194
00195 template <> inline void Lapack::getrf<double>
00196 (int m,
00197 int n,
00198 double a[],
00199 int lda,
00200 int ipiv[],
00201 int& info )
00202 {
00203 dgetrf_(m,n,a,lda,ipiv,info);
00204 }
00205
00206 template <> inline void Lapack::getrf< complex<float> >
00207 (int m,
00208 int n,
00209 complex<float> a[],
00210 int lda,
00211 int ipiv[],
00212 int& info )
00213 {
00214 cgetrf_(m,n,a,lda,ipiv,info);
00215 }
00216
00217 template <> inline void Lapack::getrf< complex<double> >
00218 (int m,
00219 int n,
00220 complex<double> a[],
00221 int lda,
00222 int ipiv[],
00223 int& info )
00224 {
00225 zgetrf_(m,n,a,lda,ipiv,info);
00226 }
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367 }
00368
00369 #endif // SimTK_SimTKCOMMON_TEMPLATIZED_LAPACK_H_