22#ifndef LAPACK_CONNECTOR_HPP
23#define LAPACK_CONNECTOR_HPP
30#include "../complexmatrix.h"
31#include "../global_function.h"
42 constexpr double LAPACK_ABSTOL = 2*std::numeric_limits<double>::min();
67void dsygvd_(
const int* itype,
const char* jobz,
const char* uplo,
const int* n,
68 double* a,
const int* lda,
69 double* b,
const int* ldb,
71 double* work,
const int* lwork,
72 int* iwork,
const int* liwork,
75void chegvd_(
const int* itype,
const char* jobz,
const char* uplo,
const int* n,
76 std::complex<float>* a,
const int* lda,
77 std::complex<float>* b,
const int* ldb,
79 std::complex<float>* work,
const int* lwork,
80 float* rwork,
const int* lrwork,
81 int* iwork,
const int* liwork,
84void zhegvd_(
const int* itype,
const char* jobz,
const char* uplo,
const int* n,
85 std::complex<double>* a,
const int* lda,
86 std::complex<double>* b,
const int* ldb,
88 std::complex<double>* work,
const int* lwork,
89 double* rwork,
const int* lrwork,
90 int* iwork,
const int* liwork,
95void dsyevx_(
const char* jobz,
const char* range,
const char* uplo,
const int* n,
96 double* a,
const int* lda,
97 const double* vl,
const double* vu,
98 const int* il,
const int* iu,
100 int* m,
double* w,
double* z,
const int* ldz,
101 double* work,
const int* lwork,
102 int* iwork,
int* ifail,
105void cheevx_(
const char* jobz,
const char* range,
const char* uplo,
const int* n,
106 std::complex<float>* a,
const int* lda,
107 const float* vl,
const float* vu,
108 const int* il,
const int* iu,
110 int* m,
float* w, std::complex<float>* z,
const int* ldz,
111 std::complex<float>* work,
const int* lwork,
112 float* rwork,
int* iwork,
int* ifail,
115void zheevx_(
const char* jobz,
const char* range,
const char* uplo,
const int* n,
116 std::complex<double>* a,
const int* lda,
117 const double* vl,
const double* vu,
118 const int* il,
const int* iu,
119 const double* abstol,
120 int* m,
double* w, std::complex<double>* z,
const int* ldz,
121 std::complex<double>* work,
const int* lwork,
122 double* rwork,
int* iwork,
int* ifail,
127void dsygvx_(
const int* itype,
const char* jobz,
const char* range,
const char* uplo,
129 double* a,
const int* lda,
130 double* b,
const int* ldb,
131 const double* vl,
const double* vu,
132 const int* il,
const int* iu,
133 const double* abstol,
134 int* m,
double* w,
double* z,
const int* ldz,
135 double* work,
const int* lwork,
136 int* iwork,
int* ifail,
139void chegvx_(
const int* itype,
const char* jobz,
const char* range,
const char* uplo,
141 std::complex<float>* a,
const int* lda,
142 std::complex<float>* b,
const int* ldb,
143 const float* vl,
const float* vu,
144 const int* il,
const int* iu,
146 int* m,
float* w, std::complex<float>* z,
const int* ldz,
147 std::complex<float>* work,
const int* lwork,
148 float* rwork,
int* iwork,
int* ifail,
151void zhegvx_(
const int* itype,
const char* jobz,
const char* range,
const char* uplo,
153 std::complex<double>* a,
const int* lda,
154 std::complex<double>* b,
const int* ldb,
155 const double* vl,
const double* vu,
156 const int* il,
const int* iu,
157 const double* abstol,
158 int* m,
double* w, std::complex<double>* z,
const int* ldz,
159 std::complex<double>* work,
const int* lwork,
160 double* rwork,
int* iwork,
int* ifail,
165void dsygv_(
const int* itype,
const char* jobz,
const char* uplo,
const int* n,
166 double* a,
const int* lda,
167 double* b,
const int* ldb,
169 double* work,
const int* lwork,
172void chegv_(
const int* itype,
const char* jobz,
const char* uplo,
const int* n,
173 std::complex<float>* a,
const int* lda,
174 std::complex<float>* b,
const int* ldb,
176 std::complex<float>* work,
const int* lwork,
180void zhegv_(
const int* itype,
const char* jobz,
const char* uplo,
const int* n,
181 std::complex<double>* a,
const int* lda,
182 std::complex<double>* b,
const int* ldb,
184 std::complex<double>* work,
const int* lwork,
209void cheev_(
const char* jobz,
const char* uplo,
const int* n,
210 std::complex<float>* a,
const int* lda,
212 std::complex<float>* work,
const int* lwork,
216void zheev_(
const char* jobz,
const char* uplo,
const int* n,
217 std::complex<double>* a,
const int* lda,
219 std::complex<double>* work,
const int* lwork,
225void dgeev_(
const char* jobvl,
const char* jobvr,
const int* n,
226 double* a,
const int* lda,
227 double* wr,
double* wi,
228 double* vl,
const int* ldvl,
229 double* vr,
const int* ldvr,
230 double* work,
const int* lwork,
233void zgeev_(
const char* jobvl,
const char* jobvr,
const int* n,
234 std::complex<double>* a,
const int* lda,
235 std::complex<double>* w,
236 std::complex<double>* vl,
const int* ldvl,
237 std::complex<double>* vr,
const int* ldvr,
238 std::complex<double>* work,
const int* lwork,
244void dgetrf_(
const int* m,
const int* n,
double* a,
const int* lda,
245 int* ipiv,
int* info);
247void dgetri_(
const int* n,
double* a,
const int* lda,
249 double* work,
const int* lwork,
254void dsytrf_(
const char* uplo,
const int* n,
double* a,
const int* lda,
255 int* ipiv,
double* work,
const int* lwork,
int* info);
257void dsytri_(
const char* uplo,
const int* n,
double* a,
const int* lda,
258 const int* ipiv,
double* work,
int* info);
262void spotrf_(
const char* uplo,
const int* n,
float* a,
const int* lda,
int* info);
263void dpotrf_(
const char* uplo,
const int* n,
double* a,
const int* lda,
int* info);
264void cpotrf_(
const char* uplo,
const int* n, std::complex<float>* a,
const int* lda,
int* info);
265void zpotrf_(
const char* uplo,
const int* n, std::complex<double>* a,
const int* lda,
int* info);
267void spotri_(
const char* uplo,
const int* n,
float* a,
const int* lda,
int* info);
268void dpotri_(
const char* uplo,
const int* n,
double* a,
const int* lda,
int* info);
269void cpotri_(
const char* uplo,
const int* n, std::complex<float>* a,
const int* lda,
int* info);
270void zpotri_(
const char* uplo,
const int* n, std::complex<double>* a,
const int* lda,
int* info);
274void zgetrf_(
const int* m,
const int* n, std::complex<double>* a,
const int* lda,
275 int* ipiv,
int* info);
277void zgetri_(
const int* n, std::complex<double>* a,
const int* lda,
279 std::complex<double>* work,
const int* lwork,
285void dsterf_(
const int* n,
double* d,
double* e,
int* info);
287void dstein_(
const int* n,
const double* d,
const double* e,
288 const int* m,
const double* w,
289 const int* iblock,
const int* isplit,
290 double* z,
const int* ldz,
291 double* work,
int* iwork,
int* ifail,
294void zstein_(
const int* n,
const double* d,
const double* e,
295 const int* m,
const double* w,
296 const int* iblock,
const int* isplit,
297 std::complex<double>* z,
const int* ldz,
298 double* work,
int* iwork,
int* ifail,
303void dpotf2_(
const char* uplo,
const int* n,
double* a,
const int* lda,
int* info);
304void zpotf2_(
const char* uplo,
const int* n, std::complex<double>* a,
const int* lda,
int* info);
308void dgtsv_(
const int* n,
const int* nrhs,
309 double* dl,
double* d,
double* du,
310 double* b,
const int* ldb,
315void dsysv_(
const char* uplo,
const int* n,
const int* nrhs,
316 double* a,
const int* lda,
318 double* b,
const int* ldb,
319 double* work,
const int* lwork,
324#define zhegvx_ zhegvx_i
330 std::complex<double>* a,
332 std::complex<double>* b,
338 const double* abstol,
341 std::complex<double>* z,
343 std::complex<double>* work,
360 std::complex<double>* aux =
new std::complex<double>[lda*n];
361 for (
int i = 0;
i < n; ++
i)
363 for (
int j = 0; j < lda; ++j)
365 aux[
i*lda+j] = a(j,
i);
372 std::complex<float>* transpose(
const std::complex<float>* a,
const int n,
const int lda,
const int nbase_x)
374 std::complex<float>* aux =
new std::complex<float>[lda*n];
375 for (
int i = 0;
i < n; ++
i)
377 for (
int j = 0; j < lda; ++j)
379 aux[j * n +
i] = a[
i * nbase_x + j];
386 std::complex<double>* transpose(
const std::complex<double>* a,
const int n,
const int lda,
const int nbase_x)
388 std::complex<double>* aux =
new std::complex<double>[lda*n];
389 for (
int i = 0;
i < n; ++
i)
391 for (
int j = 0; j < lda; ++j)
393 aux[j * n +
i] = a[
i * nbase_x + j];
403 for (
int i = 0;
i < n; ++
i)
405 for (
int j = 0; j < lda; ++j)
407 a(j,
i) = aux[
i*lda+j];
414 void transpose(
const std::complex<float>* aux, std::complex<float>* a,
const int n,
const int lda,
const int nbase_x)
416 for (
int i = 0;
i < n; ++
i)
418 for (
int j = 0; j < lda; ++j)
420 a[j * nbase_x +
i] = aux[
i * lda + j];
427 void transpose(
const std::complex<double>* aux, std::complex<double>* a,
const int n,
const int lda,
const int nbase_x)
429 for (
int i = 0;
i < n; ++
i)
431 for (
int j = 0; j < lda; ++j)
433 a[j * nbase_x +
i] = aux[
i * lda + j];
440 char change_uplo(
const char &uplo)
444 case 'U':
return 'L';
445 case 'L':
return 'U';
446 default:
throw std::invalid_argument(
"uplo must be 'U' or 'L'");
452 char change_trans_NC(
const char &trans)
456 case 'N':
return 'C';
457 case 'C':
return 'N';
458 default:
throw std::invalid_argument(
"trans must be 'N' or 'C'");
464 void zheev(
const char jobz,
470 std::complex< double >* work,
475 std::complex<double> *aux = LapackConnector::transpose(a, n, lda);
477 zheev_(&jobz, &uplo, &n, aux, &lda, w, work, &lwork, rwork, info);
479 LapackConnector::transpose(aux, a, n, lda);
487 std::complex<double> *aux = LapackConnector::transpose(a, n, lda);
488 zgetrf_( &m, &n, aux, &lda, ipiv, info);
489 LapackConnector::transpose(aux, a, n, lda);
496 std::complex<double> *aux = LapackConnector::transpose(a, n, lda);
497 zgetri_( &n, aux, &lda, ipiv, work, &lwork, info);
498 LapackConnector::transpose(aux, a, n, lda);
505 void potrf(
const char &uplo,
const int &n,
float*
const A,
const int &lda,
int &info )
507 const char uplo_changed = change_uplo(uplo);
508 spotrf_( &uplo_changed, &n, A, &lda, &info );
511 void potrf(
const char &uplo,
const int &n,
double*
const A,
const int &lda,
int &info )
513 const char uplo_changed = change_uplo(uplo);
514 dpotrf_( &uplo_changed, &n, A, &lda, &info );
517 void potrf(
const char &uplo,
const int &n, std::complex<float>*
const A,
const int &lda,
int &info )
519 const char uplo_changed = change_uplo(uplo);
520 cpotrf_( &uplo_changed, &n, A, &lda, &info );
523 void potrf(
const char &uplo,
const int &n, std::complex<double>*
const A,
const int &lda,
int &info )
525 const char uplo_changed = change_uplo(uplo);
526 zpotrf_( &uplo_changed, &n, A, &lda, &info );
532 void potri(
const char &uplo,
const int &n,
float*
const A,
const int &lda,
int &info )
534 const char uplo_changed = change_uplo(uplo);
535 spotri_( &uplo_changed, &n, A, &lda, &info);
538 void potri(
const char &uplo,
const int &n,
double*
const A,
const int &lda,
int &info )
540 const char uplo_changed = change_uplo(uplo);
541 dpotri_( &uplo_changed, &n, A, &lda, &info);
544 void potri(
const char &uplo,
const int &n, std::complex<float>*
const A,
const int &lda,
int &info )
546 const char uplo_changed = change_uplo(uplo);
547 cpotri_( &uplo_changed, &n, A, &lda, &info);
550 void potri(
const char &uplo,
const int &n, std::complex<double>*
const A,
const int &lda,
int &info )
552 const char uplo_changed = change_uplo(uplo);
553 zpotri_( &uplo_changed, &n, A, &lda, &info);
558 void potrf(
const char &uplo,
const int &n,
ModuleBase::matrix &A,
const int &lda,
int &info )
560 potrf( uplo, n, A.c, lda, info );
565 potrf( uplo, n, A.c, lda, info );
570 void potri(
const char &uplo,
const int &n,
ModuleBase::matrix &A,
const int &lda,
int &info )
572 potri( uplo, n, A.c, lda, info);
577 potri( uplo, n, A.c, lda, info);
584 void herk(
const char uplo,
const char trans,
const int n,
const int k,
585 const double alpha,
const std::complex<double> *A,
const int lda,
586 const double beta, std::complex<double> *C,
const int ldc)
588 const char uplo_changed = change_uplo(uplo);
589 const char trans_changed = change_trans_NC(trans);
590 zherk_(&uplo_changed, &trans_changed, &n, &k, &alpha, A, &lda, &beta, C, &ldc);
593 void herk(
const char uplo,
const char trans,
const int n,
const int k,
594 const float alpha,
const std::complex<float>* A,
const int lda,
595 const float beta, std::complex<float>* C,
const int ldc)
597 const char uplo_changed = change_uplo(uplo);
598 const char trans_changed = change_trans_NC(trans);
599 cherk_(&uplo_changed, &trans_changed, &n, &k, &alpha, A, &lda, &beta, C, &ldc);
void spotri_(const char *uplo, const int *n, float *A, const int *lda, int *info)
void zgetrf_(const int *m, const int *n, std::complex< double > *a, const int *lda, int *ipiv, int *info)
void cpotrf_(const char *uplo, const int *n, std::complex< float > *A, const int *lda, int *info)
void spotrf_(const char *uplo, const int *n, float *A, const int *lda, int *info)
void cpotri_(const char *uplo, const int *n, std::complex< float > *A, const int *lda, int *info)
void zpotri_(const char *uplo, const int *n, std::complex< double > *A, const int *lda, int *info)
void zpotrf_(const char *uplo, const int *n, std::complex< double > *A, const int *lda, int *info)
void dpotrf_(const char *uplo, const int *n, double *A, const int *lda, int *info)
void dpotri_(const char *uplo, const int *n, double *A, const int *lda, int *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)
void cherk_(const char *uplo, const char *trans, const int *n, const int *k, const float *alpha, const std::complex< float > *a, const int *lda, const float *beta, std::complex< float > *c, const int *ldc)
void zherk_(const char *uplo, const char *trans, const int *n, const int *k, const double *alpha, const std::complex< double > *a, const int *lda, const double *beta, std::complex< double > *c, const int *ldc)
const std::complex< double > i
Definition cal_pLpR.cpp:46
Definition complexmatrix.h:13
void zhegvx_i(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, std::complex< double > *a, const int *lda, std::complex< double > *b, const int *ldb, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, 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)
Definition gather_math_lib_info.cpp:49
constexpr double LAPACK_ABSTOL
Definition lapack_connector.h:45
void chegvx_(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, std::complex< float > *a, const int *lda, std::complex< float > *b, const int *ldb, const float *vl, const float *vu, const int *il, const int *iu, const float *abstol, 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 dgetrf_(const int *m, const int *n, double *a, const int *lda, int *ipiv, int *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, int *m, double *w, double *z, const int *ldz, double *work, const int *lwork, int *iwork, int *ifail, int *info)
void chegv_(const int *itype, const char *jobz, const char *uplo, const int *n, std::complex< float > *a, const int *lda, std::complex< float > *b, const int *ldb, float *w, std::complex< float > *work, const int *lwork, float *rwork, int *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, 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 spotrf_(const char *uplo, const int *n, float *a, const int *lda, int *info)
void dgtsv_(const int *n, const int *nrhs, double *dl, double *d, double *du, double *b, const int *ldb, int *info)
void dsygvd_(const int *itype, const char *jobz, const char *uplo, const int *n, double *a, const int *lda, double *b, const int *ldb, double *w, double *work, const int *lwork, int *iwork, const int *liwork, int *info)
void dgetri_(const int *n, double *a, const int *lda, const int *ipiv, double *work, const int *lwork, int *info)
void zpotrf_(const char *uplo, const int *n, std::complex< double > *a, const int *lda, int *info)
void dsygv_(const int *itype, const char *jobz, const char *uplo, const int *n, double *a, const int *lda, double *b, const int *ldb, double *w, double *work, const int *lwork, int *info)
void dpotrf_(const char *uplo, const int *n, double *a, const int *lda, int *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)
void dsterf_(const int *n, double *d, double *e, int *info)
void dsysv_(const char *uplo, const int *n, const int *nrhs, double *a, const int *lda, int *ipiv, double *b, const int *ldb, double *work, const int *lwork, int *info)
void zgetrf_(const int *m, const int *n, std::complex< double > *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, std::complex< double > *b, const int *ldb, double *w, std::complex< double > *work, const int *lwork, double *rwork, const int *lrwork, int *iwork, const int *liwork, int *info)
void zhegv_(const int *itype, const char *jobz, const char *uplo, const int *n, std::complex< double > *a, const int *lda, std::complex< double > *b, const int *ldb, double *w, std::complex< double > *work, const int *lwork, double *rwork, int *info)
void zheev_(const char *jobz, const char *uplo, const int *n, std::complex< double > *a, const int *lda, double *w, std::complex< double > *work, const int *lwork, double *rwork, int *info)
void dsytri_(const char *uplo, const int *n, double *a, const int *lda, const int *ipiv, double *work, int *info)
void cheev_(const char *jobz, const char *uplo, const int *n, std::complex< float > *a, const int *lda, float *w, std::complex< float > *work, const int *lwork, float *rwork, 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, 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 zpotri_(const char *uplo, const int *n, std::complex< double > *a, const int *lda, int *info)
constexpr double LAPACK_ORFAC
Definition lapack_connector.h:46
void zhegvx_(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, std::complex< double > *a, const int *lda, std::complex< double > *b, const int *ldb, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, 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 dsygvx_(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, double *a, const int *lda, double *b, const int *ldb, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, int *m, double *w, double *z, const int *ldz, double *work, const int *lwork, int *iwork, int *ifail, int *info)
void zgeev_(const char *jobvl, const char *jobvr, const int *n, std::complex< double > *a, const int *lda, std::complex< double > *w, std::complex< double > *vl, const int *ldvl, std::complex< double > *vr, const int *ldvr, std::complex< double > *work, const int *lwork, double *rwork, int *info)
void zstein_(const int *n, const double *d, const double *e, const int *m, const double *w, const int *iblock, const int *isplit, std::complex< double > *z, const int *ldz, double *work, int *iwork, int *ifail, int *info)
void dsytrf_(const char *uplo, const int *n, double *a, const int *lda, int *ipiv, double *work, const int *lwork, int *info)
void dstein_(const int *n, const double *d, const double *e, const int *m, const double *w, const int *iblock, const int *isplit, double *z, const int *ldz, double *work, int *iwork, int *ifail, int *info)
void dpotf2_(const char *uplo, const int *n, double *a, const int *lda, int *info)
void zpotf2_(const char *uplo, const int *n, std::complex< double > *a, const int *lda, int *info)
void chegvd_(const int *itype, const char *jobz, const char *uplo, const int *n, std::complex< float > *a, const int *lda, std::complex< float > *b, const int *ldb, float *w, std::complex< float > *work, const int *lwork, float *rwork, const int *lrwork, int *iwork, const int *liwork, int *info)
void dpotri_(const char *uplo, const int *n, double *a, const int *lda, int *info)
void dsyev_(const char *jobz, const char *uplo, const int *n, double *a, const int *lda, double *w, double *work, const int *lwork, int *info)
void dgeev_(const char *jobvl, const char *jobvr, const int *n, double *a, const int *lda, double *wr, double *wi, double *vl, const int *ldvl, double *vr, const int *ldvr, double *work, const int *lwork, int *info)
void spotri_(const char *uplo, const int *n, float *a, const int *lda, int *info)
void ssyev_(const char *jobz, const char *uplo, const int *n, float *a, const int *lda, float *w, float *work, const int *lwork, int *info)
void cpotri_(const char *uplo, const int *n, std::complex< float > *a, const int *lda, int *info)
void cpotrf_(const char *uplo, const int *n, std::complex< float > *a, const int *lda, int *info)
Definition lapack_connector.h:355