ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
lapack.h
Go to the documentation of this file.
1#ifndef BASE_THIRD_PARTY_LAPACK_H_
2#define BASE_THIRD_PARTY_LAPACK_H_
3
4#include <complex>
5
6
7#if defined(__CUDA)
9#elif defined(__ROCM)
11#endif
12
13//Naming convention of lapack subroutines : ammxxx, where
14//"a" specifies the data type:
15// - d stands for double
16// - z stands for complex double
17//"mm" specifies the type of matrix, for example:
18// - he stands for hermitian
19// - sy stands for symmetric
20//"xxx" specifies the type of problem, for example:
21// - gv stands for generalized eigenvalue
22
23extern "C"
24{
25int ilaenv_(int* ispec,const char* name,const char* opts,
26 const int* n1,const int* n2,const int* n3,const int* n4);
27
28
29// solve the generalized eigenproblem Ax=eBx, where A is Hermitian and complex couble
30// zhegv_ & zhegvd_ returns all eigenvalues while zhegvx_ returns selected ones
31void ssygvd_(const int* itype, const char* jobz, const char* uplo, const int* n,
32 float* a, const int* lda,
33 const float* b, const int* ldb, float* w,
34 float* work, int* lwork,
35 int* iwork, int* liwork, int* info);
36
37void dsygvd_(const int* itype, const char* jobz, const char* uplo, const int* n,
38 double* a, const int* lda,
39 const double* b, const int* ldb, double* w,
40 double* work, int* lwork,
41 int* iwork, int* liwork, int* info);
42
43void chegvd_(const int* itype, const char* jobz, const char* uplo, const int* n,
44 std::complex<float>* a, const int* lda,
45 const std::complex<float>* b, const int* ldb, float* w,
46 std::complex<float>* work, int* lwork, float* rwork, int* lrwork,
47 int* iwork, int* liwork, int* info);
48
49void zhegvd_(const int* itype, const char* jobz, const char* uplo, const int* n,
50 std::complex<double>* a, const int* lda,
51 const std::complex<double>* b, const int* ldb, double* w,
52 std::complex<double>* work, int* lwork, double* rwork, int* lrwork,
53 int* iwork, int* liwork, int* info);
54
55void ssyevx_(const char* jobz, const char* range, const char* uplo, const int* n,
56 float *a, const int* lda,
57 const float* vl, const float* vu, const int* il, const int* iu, const float* abstol,
58 const int* m, float* w, float *z, const int *ldz,
59 float *work, const int* lwork, float* rwork, int* iwork, int* ifail, int* info);
60void dsyevx_(const char* jobz, const char* range, const char* uplo, const int* n,
61 double *a, const int* lda,
62 const double* vl, const double* vu, const int* il, const int* iu, const double* abstol,
63 const int* m, double* w, double *z, const int *ldz,
64 double *work, const int* lwork, double* rwork, int* iwork, int* ifail, int* info);
65void cheevx_(const char* jobz, const char* range, const char* uplo, const int* n,
66 std::complex<float> *a, const int* lda,
67 const float* vl, const float* vu, const int* il, const int* iu, const float* abstol,
68 const int* m, float* w, std::complex<float> *z, const int *ldz,
69 std::complex<float> *work, const int* lwork, float* rwork, int* iwork, int* ifail, int* info);
70void zheevx_(const char* jobz, const char* range, const char* uplo, const int* n,
71 std::complex<double> *a, const int* lda,
72 const double* vl, const double* vu, const int* il, const int* iu, const double* abstol,
73 const int* m, double* w, std::complex<double> *z, const int *ldz,
74 std::complex<double> *work, const int* lwork, double* rwork, int* iwork, int* ifail, int* info);
75
76void ssyevd_(const char *jobz, const char *uplo, const int *n,
77 float *a, const int *lda, float *w,
78 float *work, int *lwork,
79 int *iwork, int *liwork, int *info);
80void dsyevd_(const char *jobz, const char *uplo, const int *n,
81 double *a, const int *lda, double *w,
82 double *work, int *lwork,
83 int *iwork, int *liwork, int *info);
84void cheevd_(const char *jobz, const char *uplo, const int *n,
85 std::complex<float> *a, const int *lda, float *w,
86 std::complex<float> *work, int *lwork, float *rwork, int *lrwork,
87 int *iwork, int *liwork, int *info);
88void zheevd_(const char *jobz, const char *uplo, const int *n,
89 std::complex<double> *a, const int *lda, double *w,
90 std::complex<double> *work, int *lwork, double *rwork, int *lrwork,
91 int *iwork, int *liwork, int *info);
92
93void spotrf_(const char*const uplo, const int*const n, float*const A, const int*const lda, int*const info);
94void dpotrf_(const char*const uplo, const int*const n, double*const A, const int*const lda, int*const info);
95void cpotrf_(const char*const uplo, const int*const n, std::complex<float>*const A, const int*const lda, int*const info);
96void zpotrf_(const char*const uplo, const int*const n, std::complex<double>*const A, const int*const lda, int*const info);
97
98void spotri_(const char*const uplo, const int*const n, float*const A, const int*const lda, int*const info);
99void dpotri_(const char*const uplo, const int*const n, double*const A, const int*const lda, int*const info);
100void cpotri_(const char*const uplo, const int*const n, std::complex<float>*const A, const int*const lda, int*const info);
101void zpotri_(const char*const uplo, const int*const n, std::complex<double>*const A, const int*const lda, int*const info);
102
103void strtri_(const char* uplo, const char* diag, const int* n, float* a, const int* lda, int* info);
104void dtrtri_(const char* uplo, const char* diag, const int* n, double* a, const int* lda, int* info);
105void ctrtri_(const char* uplo, const char* diag, const int* n, std::complex<float>* a, const int* lda, int* info);
106void ztrtri_(const char* uplo, const char* diag, const int* n, std::complex<double>* a, const int* lda, int* info);
107
108void sgetrf_(const int* m, const int* n, float* a, const int* lda, int* ipiv, int* info);
109void dgetrf_(const int* m, const int* n, double* a, const int* lda, int* ipiv, int* info);
110void cgetrf_(const int* m, const int* n, std::complex<float>* a, const int* lda, int* ipiv, int* info);
111void zgetrf_(const int* m, const int* n, std::complex<double>* a, const int* lda, int* ipiv, int* info);
112
113void sgetri_(const int* n, float* A, const int* lda, const int* ipiv, float* work, const int* lwork, int* info);
114void dgetri_(const int* n, double* A, const int* lda, const int* ipiv, double* work, const int* lwork, int* info);
115void cgetri_(const int* n, std::complex<float>* A, const int* lda, const int* ipiv, std::complex<float>* work, const int* lwork, int* info);
116void zgetri_(const int* n, std::complex<double>* A, const int* lda, const int* ipiv, std::complex<double>* work, const int* lwork, int* info);
117
118void sgetrs_(const char* trans, const int* n, const int* nrhs, const float* A, const int* lda, const int* ipiv, float* B, const int* ldb, int* info);
119void dgetrs_(const char* trans, const int* n, const int* nrhs, const double* A, const int* lda, const int* ipiv, double* B, const int* ldb, int* info);
120void cgetrs_(const char* trans, const int* n, const int* nrhs, const std::complex<float>* A, const int* lda, const int* ipiv, std::complex<float>* B, const int* ldb, int* info);
121void zgetrs_(const char* trans, const int* n, const int* nrhs, const std::complex<double>* A, const int* lda, const int* ipiv, std::complex<double>* B, const int* ldb, int* info);
122}
123
124// Class LapackConnector provide the connector to fortran lapack routine.
125// The entire function in this class are static and inline function.
126// Usage example: LapackConnector::functionname(parameter list).
127namespace container {
128namespace lapackConnector
129{
130static inline
131int ilaenv( int ispec, const char *name,const char *opts,const int n1,const int n2,
132 const int n3,const int n4)
133{
134 const int nb = ilaenv_(&ispec, name, opts, &n1, &n2, &n3, &n4);
135 return nb;
136}
137// wrap function of fortran lapack routine zhegvd. (pointer version)
138static inline
139void dngvd(const int itype, const char jobz, const char uplo, const int n,
140 float* a, const int lda,
141 const float* b, const int ldb, float* w,
142 float* work, int lwork, float* rwork, int lrwork,
143 int* iwork, int liwork, int info)
144{
145 // call the fortran routine
146 ssygvd_(&itype, &jobz, &uplo, &n,
147 a, &lda, b, &ldb, w,
148 work, &lwork,
149 iwork, &liwork, &info);
150}
151// wrap function of fortran lapack routine zhegvd.
152static inline
153void dngvd(const int itype, const char jobz, const char uplo, const int n,
154 double* a, const int lda,
155 const double* b, const int ldb, double* w,
156 double* work, int lwork, double* rwork, int lrwork,
157 int* iwork, int liwork, int info)
158{
159 // call the fortran routine
160 dsygvd_(&itype, &jobz, &uplo, &n,
161 a, &lda, b, &ldb, w,
162 work, &lwork,
163 iwork, &liwork, &info);
164}
165static inline
166void dngvd(const int itype, const char jobz, const char uplo, const int n,
167 std::complex<float>* a, const int lda,
168 const std::complex<float>* b, const int ldb, float* w,
169 std::complex<float>* work, int lwork, float* rwork, int lrwork,
170 int* iwork, int liwork, int info)
171{
172 // call the fortran routine
173 chegvd_(&itype, &jobz, &uplo, &n,
174 a, &lda, b, &ldb, w,
175 work, &lwork, rwork, &lrwork,
176 iwork, &liwork, &info);
177}
178// wrap function of fortran lapack routine zhegvd.
179static inline
180void dngvd(const int itype, const char jobz, const char uplo, const int n,
181 std::complex<double>* a, const int lda,
182 const std::complex<double>* b, const int ldb, double* w,
183 std::complex<double>* work, int lwork, double* rwork, int lrwork,
184 int* iwork, int liwork, int info)
185{
186 // call the fortran routine
187 zhegvd_(&itype, &jobz, &uplo, &n,
188 a, &lda, b, &ldb, w,
189 work, &lwork, rwork, &lrwork,
190 iwork, &liwork, &info);
191}
192
193// wrap function of fortran lapack routine zheevx.
194static inline
195void dnevx( const int itype, const char jobz, const char range, const char uplo, const int n,
196 float* a, const int lda,
197 const float vl, const float vu, const int il, const int iu, const float abstol,
198 const int m, float* w, float* z, const int ldz,
199 float* work, const int lwork, float* rwork, int* iwork, int* ifail, int info)
200{
201 ssyevx_(&jobz, &range, &uplo, &n,
202 a, &lda, &vl, &vu, &il, &iu,
203 &abstol, &m, w, z, &ldz,
204 work, &lwork, rwork, iwork, ifail, &info);
205}
206// wrap function of fortran lapack routine zheevx.
207static inline
208void dnevx( const int itype, const char jobz, const char range, const char uplo, const int n,
209 double* a, const int lda,
210 const double vl, const double vu, const int il, const int iu, const double abstol,
211 const int m, double* w, double* z, const int ldz,
212 double* work, const int lwork, double* rwork, int* iwork, int* ifail, int info)
213{
214 dsyevx_(&jobz, &range, &uplo, &n,
215 a, &lda, &vl, &vu, &il, &iu,
216 &abstol, &m, w, z, &ldz,
217 work, &lwork, rwork, iwork, ifail, &info);
218}
219static inline
220void dnevx( const int itype, const char jobz, const char range, const char uplo, const int n,
221 std::complex<float>* a, const int lda,
222 const float vl, const float vu, const int il, const int iu, const float abstol,
223 const int m, float* w, std::complex<float>* z, const int ldz,
224 std::complex<float>* work, const int lwork, float* rwork, int* iwork, int* ifail, int info)
225{
226 cheevx_(&jobz, &range, &uplo, &n,
227 a, &lda, &vl, &vu, &il, &iu,
228 &abstol, &m, w, z, &ldz,
229 work, &lwork, rwork, iwork, ifail, &info);
230}
231// wrap function of fortran lapack routine zheevx.
232static inline
233void dnevx( const int itype, const char jobz, const char range, const char uplo, const int n,
234 std::complex<double>* a, const int lda,
235 const double vl, const double vu, const int il, const int iu, const double abstol,
236 const int m, double* w, std::complex<double>* z, const int ldz,
237 std::complex<double>* work, const int lwork, double* rwork, int* iwork, int* ifail, int info)
238{
239 zheevx_(&jobz, &range, &uplo, &n,
240 a, &lda, &vl, &vu, &il, &iu,
241 &abstol, &m, w, z, &ldz,
242 work, &lwork, rwork, iwork, ifail, &info);
243}
244
245static inline
246void dnevd(const char jobz, const char uplo, const int n,
247 float* a, const int lda, float* w,
248 float* work, int lwork, float* rwork, int lrwork,
249 int* iwork, int liwork, int& info)
250{
251 // call the fortran routine
252 ssyevd_( &jobz, &uplo, &n,
253 a, &lda, w,
254 work, &lwork,
255 iwork, &liwork, &info);
256}
257// wrap function of fortran lapack routine zhegvd.
258static inline
259void dnevd(const char jobz, const char uplo, const int n,
260 double* a, const int lda, double* w,
261 double* work, int lwork, double* rwork, int lrwork,
262 int* iwork, int liwork, int& info)
263{
264 // call the fortran routine
265 dsyevd_( &jobz, &uplo, &n,
266 a, &lda, w,
267 work, &lwork,
268 iwork, &liwork, &info);
269}
270static inline
271void dnevd(const char jobz, const char uplo, const int n,
272 std::complex<float>* a, const int lda, float* w,
273 std::complex<float>* work, int lwork, float* rwork, int lrwork,
274 int* iwork, int liwork, int& info)
275{
276 // call the fortran routine
277 cheevd_( &jobz, &uplo, &n,
278 a, &lda, w,
279 work, &lwork, rwork, &lrwork,
280 iwork, &liwork, &info);
281}
282// wrap function of fortran lapack routine zhegvd.
283static inline
284void dnevd(const char jobz, const char uplo, const int n,
285 std::complex<double>* a, const int lda, double* w,
286 std::complex<double>* work, int lwork, double* rwork, int lrwork,
287 int* iwork, int liwork, int& info)
288{
289 // call the fortran routine
290 zheevd_( &jobz, &uplo, &n,
291 a, &lda, w,
292 work, &lwork, rwork, &lrwork,
293 iwork, &liwork, &info);
294}
295
296static inline
297void potrf( const char &uplo, const int &n, float* A, const int &lda, int &info )
298{
299 spotrf_(&uplo, &n, A, &lda, &info );
300}
301static inline
302void potrf( const char &uplo, const int &n, double* A, const int &lda, int &info )
303{
304 dpotrf_(&uplo, &n, A, &lda, &info );
305}
306static inline
307void potrf( const char &uplo, const int &n, std::complex<float>* A, const int &lda, int &info )
308{
309 cpotrf_(&uplo, &n, A, &lda, &info );
310}
311static inline
312void potrf( const char &uplo, const int &n, std::complex<double>* A, const int &lda, int &info )
313{
314 zpotrf_( &uplo, &n, A, &lda, &info );
315}
316
317static inline
318void trtri( const char &uplo, const char &diag, const int &n, float* A, const int &lda, int &info )
319{
320 strtri_( &uplo, &diag, &n, A, &lda, &info);
321}
322static inline
323void trtri( const char &uplo, const char &diag, const int &n, double* A, const int &lda, int &info)
324{
325 dtrtri_( &uplo, &diag, &n, A, &lda, &info);
326}
327static inline
328void trtri( const char &uplo, const char &diag, const int &n, std::complex<float>* A, const int &lda, int &info )
329{
330 ctrtri_( &uplo, &diag, &n, A, &lda, &info);
331}
332static inline
333void trtri( const char &uplo, const char &diag, const int &n, std::complex<double>* A, const int &lda, int &info)
334{
335 ztrtri_( &uplo, &diag, &n, A, &lda, &info);
336}
337
338static inline
339void getrf(const int m, const int n, float* A, const int lda, int* ipiv, int &info)
340{
341 sgetrf_(&m, &n, A, &lda, ipiv, &info);
342}
343static inline
344void getrf(const int m, const int n, double* A, const int lda, int* ipiv, int &info)
345{
346 dgetrf_(&m, &n, A, &lda, ipiv, &info);
347}
348static inline
349void getrf(const int m, const int n, std::complex<float>* A, const int lda, int* ipiv, int &info)
350{
351 cgetrf_(&m, &n, A, &lda, ipiv, &info);
352}
353static inline
354void getrf(const int m, const int n, std::complex<double>* A, const int lda, int* ipiv, int &info)
355{
356 zgetrf_(&m, &n, A, &lda, ipiv, &info);
357}
358
359static inline
360void getri(const int n, float* A, const int lda, const int* ipiv, float* work, const int lwork, int& info)
361{
362 sgetri_(&n, A, &lda, ipiv, work, &lwork, &info);
363}
364static inline
365void getri(const int n, double* A, const int lda, const int* ipiv, double* work, const int lwork, int& info)
366{
367 dgetri_(&n, A, &lda, ipiv, work, &lwork, &info);
368}
369static inline
370void getri(const int n, std::complex<float>* A, const int lda, const int* ipiv, std::complex<float>* work, const int lwork, int& info)
371{
372 cgetri_(&n, A, &lda, ipiv, work, &lwork, &info);
373}
374static inline
375void getri(const int n, std::complex<double>* A, const int lda, const int* ipiv, std::complex<double>* work, const int lwork, int& info)
376{
377 zgetri_(&n, A, &lda, ipiv, work, &lwork, &info);
378}
379
380static inline
381void getrs(const char& trans, const int n, const int nrhs, float* A, const int lda, const int* ipiv, float* B, const int ldb, int& info)
382{
383 sgetrs_(&trans, &n, &nrhs, A, &lda, ipiv, B, &ldb, &info);
384}
385static inline
386void getrs(const char& trans, const int n, const int nrhs, double* A, const int lda, const int* ipiv, double* B, const int ldb, int& info)
387{
388 dgetrs_(&trans, &n, &nrhs, A, &lda, ipiv, B, &ldb, &info);
389}
390static inline
391void getrs(const char& trans, const int n, const int nrhs, std::complex<float>* A, const int lda, const int* ipiv, std::complex<float>* B, const int ldb, int& info)
392{
393 cgetrs_(&trans, &n, &nrhs, A, &lda, ipiv, B, &ldb, &info);
394}
395static inline
396void getrs(const char& trans, const int n, const int nrhs, std::complex<double>* A, const int lda, const int* ipiv, std::complex<double>* B, const int ldb, int& info)
397{
398 zgetrs_(&trans, &n, &nrhs, A, &lda, ipiv, B, &ldb, &info);
399}
400
401} // namespace lapackConnector
402} // namespace container
403
404#endif // BASE_THIRD_PARTY_LAPACK_H_
void ssygvd_(const int *itype, const char *jobz, const char *uplo, const int *n, float *a, const int *lda, const float *b, const int *ldb, float *w, float *work, int *lwork, int *iwork, int *liwork, int *info)
void dpotrf_(const char *const uplo, const int *const n, double *const A, const int *const lda, int *const info)
void zgetrs_(const char *trans, const int *n, const int *nrhs, const std::complex< double > *A, const int *lda, const int *ipiv, std::complex< double > *B, const int *ldb, int *info)
void dgetrs_(const char *trans, const int *n, const int *nrhs, const double *A, const int *lda, const int *ipiv, double *B, const int *ldb, int *info)
void dgetrf_(const int *m, const int *n, double *a, const int *lda, int *ipiv, int *info)
void cpotri_(const char *const uplo, const int *const n, std::complex< float > *const A, const int *const lda, int *const info)
void spotrf_(const char *const uplo, const int *const n, float *const A, const int *const lda, int *const info)
void dsyevx_(const char *jobz, const char *range, const char *uplo, const int *n, double *a, const int *lda, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, const int *m, double *w, double *z, const int *ldz, double *work, const int *lwork, double *rwork, int *iwork, int *ifail, int *info)
void cheevd_(const char *jobz, const char *uplo, const int *n, std::complex< float > *a, const int *lda, float *w, std::complex< float > *work, int *lwork, float *rwork, int *lrwork, int *iwork, int *liwork, int *info)
void ssyevx_(const char *jobz, const char *range, const char *uplo, const int *n, float *a, const int *lda, const float *vl, const float *vu, const int *il, const int *iu, const float *abstol, const int *m, float *w, float *z, const int *ldz, float *work, const int *lwork, float *rwork, int *iwork, int *ifail, int *info)
void zpotrf_(const char *const uplo, const int *const n, std::complex< double > *const A, const int *const lda, int *const info)
void dgetri_(const int *n, double *A, const int *lda, const int *ipiv, double *work, const int *lwork, int *info)
void cgetrf_(const int *m, const int *n, std::complex< float > *a, const int *lda, int *ipiv, int *info)
void zhegvd_(const int *itype, const char *jobz, const char *uplo, const int *n, std::complex< double > *a, const int *lda, const std::complex< double > *b, const int *ldb, double *w, std::complex< double > *work, int *lwork, double *rwork, int *lrwork, int *iwork, int *liwork, int *info)
void ztrtri_(const char *uplo, const char *diag, const int *n, std::complex< double > *a, const int *lda, int *info)
void zheevx_(const char *jobz, const char *range, const char *uplo, const int *n, std::complex< double > *a, const int *lda, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, const int *m, double *w, std::complex< double > *z, const int *ldz, std::complex< double > *work, const int *lwork, double *rwork, int *iwork, int *ifail, int *info)
void dsygvd_(const int *itype, const char *jobz, const char *uplo, const int *n, double *a, const int *lda, const double *b, const int *ldb, double *w, double *work, int *lwork, int *iwork, int *liwork, int *info)
void chegvd_(const int *itype, const char *jobz, const char *uplo, const int *n, std::complex< float > *a, const int *lda, const std::complex< float > *b, const int *ldb, float *w, std::complex< float > *work, int *lwork, float *rwork, int *lrwork, int *iwork, int *liwork, int *info)
void sgetrf_(const int *m, const int *n, float *a, const int *lda, int *ipiv, int *info)
void dsyevd_(const char *jobz, const char *uplo, const int *n, double *a, const int *lda, double *w, double *work, int *lwork, int *iwork, int *liwork, int *info)
void zpotri_(const char *const uplo, const int *const n, std::complex< double > *const A, const int *const lda, int *const info)
void zgetrf_(const int *m, const int *n, std::complex< double > *a, const int *lda, int *ipiv, int *info)
void dtrtri_(const char *uplo, const char *diag, const int *n, double *a, const int *lda, int *info)
void cgetrs_(const char *trans, const int *n, const int *nrhs, const std::complex< float > *A, const int *lda, const int *ipiv, std::complex< float > *B, const int *ldb, int *info)
void ctrtri_(const char *uplo, const char *diag, const int *n, std::complex< float > *a, const int *lda, int *info)
void strtri_(const char *uplo, const char *diag, const int *n, float *a, const int *lda, int *info)
void sgetri_(const int *n, float *A, const int *lda, const int *ipiv, float *work, const int *lwork, int *info)
void ssyevd_(const char *jobz, const char *uplo, const int *n, float *a, const int *lda, float *w, float *work, int *lwork, int *iwork, int *liwork, int *info)
void dpotri_(const char *const uplo, const int *const n, double *const A, const int *const lda, int *const info)
void cheevx_(const char *jobz, const char *range, const char *uplo, const int *n, std::complex< float > *a, const int *lda, const float *vl, const float *vu, const int *il, const int *iu, const float *abstol, const int *m, float *w, std::complex< float > *z, const int *ldz, std::complex< float > *work, const int *lwork, float *rwork, int *iwork, int *ifail, int *info)
void sgetrs_(const char *trans, const int *n, const int *nrhs, const float *A, const int *lda, const int *ipiv, float *B, const int *ldb, int *info)
int ilaenv_(int *ispec, const char *name, const char *opts, const int *n1, const int *n2, const int *n3, const int *n4)
void cpotrf_(const char *const uplo, const int *const n, std::complex< float > *const A, const int *const lda, int *const info)
void zheevd_(const char *jobz, const char *uplo, const int *n, std::complex< double > *a, const int *lda, double *w, std::complex< double > *work, int *lwork, double *rwork, int *lrwork, int *iwork, int *liwork, int *info)
void cgetri_(const int *n, std::complex< float > *A, const int *lda, const int *ipiv, std::complex< float > *work, const int *lwork, int *info)
void spotri_(const char *const uplo, const int *const n, float *const A, const int *const lda, int *const info)
void zgetri_(const int *n, std::complex< double > *A, const int *lda, const int *ipiv, std::complex< double > *work, const int *lwork, int *info)
Definition tensor.cpp:8