ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
scalapack_connector.h
Go to the documentation of this file.
1#ifndef SCALAPACK_CONNECTOR_H
2#define SCALAPACK_CONNECTOR_H
3
4#include <limits>
5// =========================================================
6// Tolerances for LAPACK/ScaLAPACK eigenvalue routines
7// =========================================================
8// Huawei KML strictly validates input parameters.
9// It rejects abstol=0 and orfac=-1, which are standard
10// defaults in open-source ScaLAPACK to trigger internal logic.
11// We must explicitly pass the mathematically equivalent defaults.
12#ifdef __KML
13 constexpr double SCALAPACK_ABSTOL = 2*std::numeric_limits<double>::min(); // 2*PDLAMCH('S')
14 constexpr double SCALAPACK_ORFAC = 2.0e-12; // Default value
15#else
16 constexpr double SCALAPACK_ABSTOL = 0.0;
17 constexpr double SCALAPACK_ORFAC = -1.0;
18#endif
19// =========================================================
20
21#ifdef __MPI
22
23#include <complex>
24
25extern "C"
26{
27 int numroc_( const int *n, const int *nb, const int *iproc, const int *srcproc, const int *nprocs );
28 void descinit_(
29 int *desc,
30 const int *m, const int *n, const int *mb, const int *nb, const int *irsrc, const int *icsrc,
31 const int *ictxt, const int *lld, int *info);
32
33 void pddot_(int* n, double* dot, double* x, int* ix, int* jx, int* descx, int* incx,
34 double* y, int* iy, int* jy, int* descy, int* incy);
35 void pzdotc_(int* n, std::complex<double>* dot, std::complex<double>* x, int* ix, int* jx, int* descx, int* incx,
36 std::complex<double>* y, int* iy, int* jy, int* descy, int* incy);
37
38 void pdpotrf_(char *uplo, int *n, double *a, int *ia, int *ja, int *desca, int *info);
39// void pzpotrf_(char *uplo, int *n, double _Complex *a, int *ia, int *ja, int *desca, int *info);
40 void pzpotrf_(char *uplo, int *n, std::complex<double> *a, int *ia, int *ja, int *desca, int *info);
41
42 void pdtran_(const int* m, const int* n,
43 const double* alpha, const double* a, const int* ia, const int* ja, const int* desca,
44 const double* beta, double* c, const int* ic, const int* jc, const int* descc);
45
46 void pztranu_(const int *m,const int*n,
47 const std::complex<double>* alpha, const std::complex<double>* a, const int* ia, const int* ja, const int* desca,
48 const std::complex<double> *beta , std::complex<double> *c , const int *ic ,const int *jc ,const int *descc);
49
50 void pzgemv_(
51 const char *transa,
52 const int *M, const int *N,
53 const double *alpha,
54 const std::complex<double> *A, const int *IA, const int *JA, const int *DESCA,
55 const std::complex<double> *B, const int *IB, const int *JB, const int *DESCB, const int *K,
56 const double *beta, std::complex<double> *C, const int *IC, const int *JC, const int *DESCC,const int *L);
57 void pdgemv_(
58 const char *transa,
59 const int *M, const int *N,
60 const double *alpha,
61 const double *A, const int *IA, const int *JA, const int *DESCA,
62 const double *B, const int *IB, const int *JB, const int *DESCB, const int *K,
63 const double *beta, double *C, const int *IC, const int *JC, const int *DESCC,const int *L);
64 // C = a * A.? * B.? + b * C
65 void pdgemm_(
66 const char *transa, const char *transb,
67 const int *M, const int *N, const int *K,
68 const double *alpha,
69 const double *A, const int *IA, const int *JA, const int *DESCA,
70 const double *B, const int *IB, const int *JB, const int *DESCB,
71 const double *beta,
72 double *C, const int *IC, const int *JC, const int *DESCC);
73 void pzgemm_(
74 const char *transa, const char *transb,
75 const int *M, const int *N, const int *K,
76 const std::complex<double> *alpha,
77 const std::complex<double> *A, const int *IA, const int *JA, const int *DESCA,
78 const std::complex<double> *B, const int *IB, const int *JB, const int *DESCB,
79 const std::complex<double> *beta,
80 std::complex<double> *C, const int *IC, const int *JC, const int *DESCC);
81 void pdsymm_(char *side , char *uplo , int *m , int *n ,
82 double *alpha , double *a , int *ia , int *ja , int *desca ,
83 double *b , int *ib , int *jb , int *descb ,
84 double *beta , double *c , int *ic , int *jc , int *descc );
85 void pdtrmm_(char *side , char *uplo , char *transa , char *diag , int *m , int *n ,
86 double *alpha , double *a , int *ia , int *ja , int *desca ,
87 double *b , int *ib , int *jb , int *descb );
88// void pztrmm_(char *side , char *uplo , char *transa , char *diag , int *m , int *n ,
89// double *alpha , double _Complex *a , int *ia , int *ja , int *desca ,
90// double _Complex *b , int *ib , int *jb , int *descb );
91 void pztrmm_(char *side , char *uplo , char *transa , char *diag , int *m , int *n ,
92 std::complex<double> *alpha , std::complex<double> *a , int *ia , int *ja , int *desca ,
93 std::complex<double> *b , int *ib , int *jb , int *descb );
94 void pzhemm_(char* side , char* uplo , int* m , int* n ,
95 std::complex<double>* alpha , std::complex<double>* a , int* ia , int* ja , int* desca ,
96 std::complex<double>* b , int* ib , int* jb , int* descb ,
97 std::complex<double>* beta , std::complex<double>* c , int* ic , int* jc , int* descc );
99 const int *M, const int *N,
100 std::complex<double> *A, const int *IA, const int *JA, const int *DESCA,
101 int *ipiv, int *info);
102
104 const int *n, const int *nrhs,
105 const std::complex<double> *A, const int *ia, const int *ja, const int *desca,
106 int *ipiv, std::complex<double>* B, const int* ib, const int* jb, const int*descb, const int *info
107 );
108
109 void pdsygvx_(const int* itype, const char* jobz, const char* range, const char* uplo,
110 const int* n, double* A, const int* ia, const int* ja, const int*desca, double* B, const int* ib, const int* jb, const int*descb,
111 const double* vl, const double* vu, const int* il, const int* iu,
112 const double* abstol, int* m, int* nz, double* w, const double*orfac, double* Z, const int* iz, const int* jz, const int*descz,
113 double* work, int* lwork, int*iwork, int*liwork, int* ifail, int*iclustr, double*gap, int* info);
114
115 void pzhegvx_(const int* itype, const char* jobz, const char* range, const char* uplo,
116 const int* n, std::complex<double>* A, const int* ia, const int* ja, const int*desca, std::complex<double>* B, const int* ib, const int* jb, const int*descb,
117 const double* vl, const double* vu, const int* il, const int* iu,
118 const double* abstol, int* m, int* nz, double* w, const double*orfac, std::complex<double>* Z, const int* iz, const int* jz, const int*descz,
119 std::complex<double>* work, int* lwork, double* rwork, int* lrwork, int*iwork, int*liwork, int* ifail, int*iclustr, double*gap, int* info);
120
121 void pssygvx_(const int* itype, const char* jobz, const char* range, const char* uplo,
122 const int* n, float* A, const int* ia, const int* ja, const int*desca, float* B, const int* ib, const int* jb, const int*descb,
123 const float* vl, const float* vu, const int* il, const int* iu,
124 const float* abstol, int* m, int* nz, float* w, const float*orfac, float* Z, const int* iz, const int* jz, const int*descz,
125 float* work, int* lwork, int*iwork, int*liwork, int* ifail, int*iclustr, float*gap, int* info);
126
127 void pchegvx_(const int* itype, const char* jobz, const char* range, const char* uplo,
128 const int* n, std::complex<float>* A, const int* ia, const int* ja, const int*desca, std::complex<float>* B, const int* ib, const int* jb, const int*descb,
129 const float* vl, const float* vu, const int* il, const int* iu,
130 const float* abstol, int* m, int* nz, float* w, const float*orfac, std::complex<float>* Z, const int* iz, const int* jz, const int*descz,
131 std::complex<float>* work, int* lwork, float* rwork, int* lrwork, int*iwork, int*liwork, int* ifail, int*iclustr, float*gap, int* info);
132
133
135 const int *n,
136 const std::complex<double> *A, const int *ia, const int *ja, const int *desca,
137 int *ipiv, const std::complex<double> *work, const int *lwork, const int *iwork, const int *liwork, const int *info);
138
140 const char *transa,
141 const int *m, const int *n,
142 const std::complex<double> *alpha,
143 const std::complex<double> *a, const int *ia, const int *ja, const int *desca,
144 const std::complex<double> *beta,
145 const std::complex<double> *c, const int *ic, const int *jc, const int *descc);
146
148 const int *M, const int *N,
149 const std::complex<double> *alpha,
150 const std::complex<double> *A, const int *IA, const int *JA, const int *DESCA,
151 const std::complex<double> *beta,
152 std::complex<double> *C, const int *IC, const int *JC, const int *DESCC);
153
154 void pdgemr2d_(const int *M, const int *N,
155 double *A, const int *IA, const int *JA, const int *DESCA,
156 double *B, const int *IB, const int *JB, const int *DESCB,
157 const int *ICTXT);
158
159 void pzgemr2d_(const int *M, const int *N,
160 std::complex<double> *A, const int *IA, const int *JA, const int *DESCA,
161 std::complex<double> *B, const int *IB, const int *JB, const int *DESCB,
162 const int *ICTXT);
163
164 // Scalapack wrappers to copy 2D blocks of data
165 // more info:
166 // https://netlib.org/scalapack/explore-html/da/db5/pigemr_8c.html
167 // https://netlib.org/scalapack/explore-html/dd/dcd/pdgemr_8c.html
168 // https://netlib.org/scalapack/explore-html/d5/dd4/pzgemr_8c.html
169 // https://netlib.org/scalapack/explore-html/d5/deb/psgemr_8c.html
170 // https://netlib.org/scalapack/explore-html/d4/dad/pcgemr_8c.html
171 void Cpigemr2d (int m, int n, int *ptrmyblock, int ia, int ja, int *ma, int *ptrmynewblock, int ib, int jb, int *mb, int globcontext);
172 void Cpdgemr2d (int m, int n, double *ptrmyblock, int ia, int ja, int *ma, double *ptrmynewblock, int ib, int jb, int *mb, int globcontext);
173 void Cpzgemr2d (int m, int n, std::complex<double> *ptrmyblock, int ia, int ja, int *ma, std::complex<double> *ptrmynewblock, int ib, int jb, int *mb, int globcontext);
174 void Cpsgemr2d (int m, int n, float *ptrmyblock, int ia, int ja, int *ma, float *ptrmynewblock, int ib, int jb, int *mb, int globcontext);
175 void Cpcgemr2d (int m, int n, std::complex<float> *ptrmyblock, int ia, int ja, int *ma, std::complex<float> *ptrmynewblock, int ib, int jb, int *mb, int globcontext);
176}
177
178 template <typename T>
180 {
181 constexpr static bool value = std::is_same<T, double>::value || std::is_same<T, std::complex<double>>::value || std::is_same<T, float>::value || std::is_same<T, std::complex<float>>::value || std::is_same<T, int>::value;
182 };
183
184
202 template <typename T>
203 typename std::enable_if<block2d_data_type<T>::value,void>::type Cpxgemr2d(int M, int N, T *A, int IA, int JA, int *DESCA, T *B, int IB, int JB, int *DESCB, int ICTXT)
204 {
205 if (std::is_same<T,double>::value) Cpdgemr2d(M, N, reinterpret_cast<double*>(A),IA, JA, DESCA,reinterpret_cast<double*>(B),IB,JB, DESCB,ICTXT);
206 if (std::is_same<T,std::complex<double>>::value) Cpzgemr2d(M, N, reinterpret_cast<std::complex<double>*>(A),IA, JA, DESCA,reinterpret_cast<std::complex<double>*>(B),IB,JB, DESCB,ICTXT);
207 if (std::is_same<T,float>::value) Cpsgemr2d(M, N, reinterpret_cast<float*>(A),IA, JA, DESCA,reinterpret_cast<float*>(B),IB,JB, DESCB,ICTXT);
208 if (std::is_same<T,std::complex<float>>::value) Cpcgemr2d(M, N, reinterpret_cast<std::complex<float>*>(A),IA, JA, DESCA,reinterpret_cast<std::complex<float>*>(B),IB,JB, DESCB,ICTXT);
209 if (std::is_same<T,int>::value) Cpigemr2d(M, N, reinterpret_cast<int*>(A),IA, JA, DESCA,reinterpret_cast<int*>(B),IB,JB, DESCB,ICTXT);
210 };
211
212
214{
215public:
216 static inline
217 void geadd(
218 const char transa,
219 const int m, const int n,
220 const std::complex<double> alpha,
221 const std::complex<double> *a, const int ia, const int ja, const int *desca,
222 const std::complex<double> beta,
223 const std::complex<double> *c, const int ic, const int jc, const int *descc)
224 {
225 pzgeadd_(&transa, &m, &n, &alpha, a, &ia, &ja, desca, &beta, c, &ic, &jc, descc);
226 }
227
228 static inline
229 void dot(int n,
230 double& dot,
231 double* a,
232 int ia,
233 int ja,
234 int inca,
235 double* b,
236 int ib,
237 int jb,
238 int incb,
239 int* desc)
240 {
241 pddot_(&n, &dot, a, &ia, &ja, desc, &inca, b, &ib, &jb, desc, &incb);
242 }
243
244 static inline
245 void dot(int n,
246 std::complex<double>& dotc,
247 std::complex<double>* a,
248 int ia,
249 int ja,
250 int inca,
251 std::complex<double>* b,
252 int ib,
253 int jb,
254 int incb,
255 int* desc)
256 {
257 pzdotc_(&n, &dotc, a, &ia, &ja, desc, &inca, b, &ib, &jb, desc, &incb);
258 }
259
260 static inline
261 void gemm(
262 const char transa, const char transb,
263 const int M, const int N, const int K,
264 const double alpha,
265 const double* A, const int IA, const int JA, const int* DESCA,
266 const double* B, const int IB, const int JB, const int* DESCB,
267 const double beta,
268 double* C, const int IC, const int JC, const int* DESCC)
269 {
270 pdgemm_(&transa, &transb, &M, &N, &K, &alpha, A, &IA, &JA, DESCA,
271 B, &IB, &JB, DESCB, &beta, C, &IC, &JC, DESCC);
272 }
273
274 static inline
275 void gemm(
276 const char transa, const char transb,
277 const int M, const int N, const int K,
278 const std::complex<double> alpha,
279 const std::complex<double> *A, const int IA, const int JA, const int *DESCA,
280 const std::complex<double> *B, const int IB, const int JB, const int *DESCB,
281 const std::complex<double> beta,
282 std::complex<double> *C, const int IC, const int JC, const int *DESCC)
283 {
284 pzgemm_(&transa, &transb, &M, &N, &K, &alpha, A, &IA, &JA, DESCA,
285 B, &IB, &JB, DESCB, &beta, C, &IC, &JC, DESCC);
286 }
287
288 static inline
289 void gemm(char transa, char transb, int M, int N, int K,
290 double alpha,
291 double* A,
292 double* B,
293 double beta,
294 double* C,
295 int* DESC)
296 {
297 int isrc = 1;
298 pdgemm_(&transa,
299 &transb,
300 &M,
301 &N,
302 &K,
303 &alpha,
304 A,
305 &isrc,
306 &isrc,
307 DESC,
308 B,
309 &isrc,
310 &isrc,
311 DESC,
312 &beta,
313 C,
314 &isrc,
315 &isrc,
316 DESC);
317 }
318
319 static inline
320 void gemm(char transa, char transb, int M, int N, int K,
321 std::complex<double> alpha,
322 std::complex<double>* A,
323 std::complex<double>* B,
324 std::complex<double> beta,
325 std::complex<double>* C,
326 int* DESC)
327 {
328
329 int isrc = 1;
330 pzgemm_(&transa,
331 &transb,
332 &M,
333 &N,
334 &K,
335 &alpha,
336 A,
337 &isrc,
338 &isrc,
339 DESC,
340 B,
341 &isrc,
342 &isrc,
343 DESC,
344 &beta,
345 C,
346 &isrc,
347 &isrc,
348 DESC);
349 }
350
351 static inline
352 void symm(char side,
353 char uplo,
354 int m,
355 int n,
356 double alpha,
357 double* a,
358 double* b,
359 double beta,
360 double* c,
361 int* desc)
362 {
363 int isrc = 1;
364 pdsymm_(&side, &uplo, &m, &n, &alpha, a, &isrc, &isrc, desc, b, &isrc, &isrc, desc, &beta, c, &isrc, &isrc, desc);
365 }
366
367 static inline
368 void getrf(
369 const int M, const int N,
370 std::complex<double> *A, const int IA, const int JA, const int *DESCA,
371 int *ipiv, int *info) //fix a bug: info is output and we must use int*
372 {
373 pzgetrf_(&M, &N, A, &IA, &JA, DESCA, ipiv, info);
374 }
375
376 static inline
377 void getri(
378 const int n,
379 const std::complex<double> *A, const int ia, const int ja, const int *desca, int *ipiv,
380 const std::complex<double> *work, const int *lwork, const int *iwork, const int *liwork, int *info)
381 {
382 pzgetri_(&n, A, &ia, &ja, desca, ipiv, work, lwork, iwork, liwork, info);
383 }
384
385 static inline
386 void gesv(
387 const int n, const int nrhs,
388 const std::complex<double> *A, const int ia, const int ja, const int *desca,
389 int *ipiv, std::complex<double>* B, const int ib, const int jb, const int*descb, int *info)
390 {
391 pzgesv_(&n, &nrhs, A, &ia, &ja, desca, ipiv, B, &ib, &jb, descb, info);
392 }
393
394 static inline
395 void tranu(
396 const int m, const int n,
397 const std::complex<double> alpha , std::complex<double> *a , const int ia , const int ja , const int *desca,
398 const std::complex<double> beta , std::complex<double> *c , const int ic , const int jc , const int *descc)
399 {
400 pztranu_(&m, &n, &alpha, a, &ia, &ja, desca, &beta, c, &ic, &jc, descc);
401 }
402
403 static inline
404 int potrf(char uplo, int na, double* U, int* desc)
405 {
406 int isrc = 1;
407 int info;
408 pdpotrf_(&uplo, &na, U, &isrc, &isrc, desc, &info);
409 return info;
410 }
411
412 static inline
413 int potrf(char uplo, int na, std::complex<double>* U, int* desc)
414 {
415 int isrc = 1;
416 int info;
417 pzpotrf_(&uplo, &na, U, &isrc, &isrc, desc, &info);
418 return info;
419 }
420
421 static inline
422 void trmm(char side,
423 char uplo,
424 char trans,
425 char diag,
426 int m,
427 int n,
428 double alpha,
429 double* a,
430 double* b,
431 int* desc)
432 {
433 int isrc = 1;
434 pdtrmm_(&side, &uplo, &trans, &diag, &m, &n, &alpha, a, &isrc, &isrc, desc, b, &isrc, &isrc, desc);
435 }
436
437 static inline
438 void trmm(char side,
439 char uplo,
440 char trans,
441 char diag,
442 int m,
443 int n,
444 std::complex<double> alpha,
445 std::complex<double>* a,
446 std::complex<double>* b,
447 int* desc)
448 {
449 int isrc = 1;
450 pztrmm_(&side, &uplo, &trans, &diag, &m, &n, &alpha, a, &isrc, &isrc, desc, b, &isrc, &isrc, desc);
451 }
452
453 static inline
454 void hemm(char side,
455 char uplo,
456 int na,
457 std::complex<double> alpha,
458 std::complex<double>* a,
459 std::complex<double>* b,
460 std::complex<double> beta,
461 std::complex<double>* c,
462 int* desc)
463 {
464 int isrc = 1;
465 pzhemm_(&side,
466 &uplo,
467 &na,
468 &na,
469 &alpha,
470 a,
471 &isrc,
472 &isrc,
473 desc,
474 b,
475 &isrc,
476 &isrc,
477 desc,
478 &beta,
479 c,
480 &isrc,
481 &isrc,
482 desc);
483 }
484};
485
486#endif // __MPI
487
488#endif
Definition scalapack_connector.h:214
static void gemm(char transa, char transb, int M, int N, int K, double alpha, double *A, double *B, double beta, double *C, int *DESC)
Definition scalapack_connector.h:289
static void getri(const int n, const std::complex< double > *A, const int ia, const int ja, const int *desca, int *ipiv, const std::complex< double > *work, const int *lwork, const int *iwork, const int *liwork, int *info)
Definition scalapack_connector.h:377
static void gemm(const char transa, const char transb, const int M, const int N, const int K, const std::complex< double > alpha, const std::complex< double > *A, const int IA, const int JA, const int *DESCA, const std::complex< double > *B, const int IB, const int JB, const int *DESCB, const std::complex< double > beta, std::complex< double > *C, const int IC, const int JC, const int *DESCC)
Definition scalapack_connector.h:275
static void trmm(char side, char uplo, char trans, char diag, int m, int n, std::complex< double > alpha, std::complex< double > *a, std::complex< double > *b, int *desc)
Definition scalapack_connector.h:438
static void symm(char side, char uplo, int m, int n, double alpha, double *a, double *b, double beta, double *c, int *desc)
Definition scalapack_connector.h:352
static int potrf(char uplo, int na, double *U, int *desc)
Definition scalapack_connector.h:404
static void gemm(const char transa, const char transb, const int M, const int N, const int K, const double alpha, const double *A, const int IA, const int JA, const int *DESCA, const double *B, const int IB, const int JB, const int *DESCB, const double beta, double *C, const int IC, const int JC, const int *DESCC)
Definition scalapack_connector.h:261
static void geadd(const char transa, const int m, const int n, const std::complex< double > alpha, const std::complex< double > *a, const int ia, const int ja, const int *desca, const std::complex< double > beta, const std::complex< double > *c, const int ic, const int jc, const int *descc)
Definition scalapack_connector.h:217
static void dot(int n, std::complex< double > &dotc, std::complex< double > *a, int ia, int ja, int inca, std::complex< double > *b, int ib, int jb, int incb, int *desc)
Definition scalapack_connector.h:245
static void gemm(char transa, char transb, int M, int N, int K, std::complex< double > alpha, std::complex< double > *A, std::complex< double > *B, std::complex< double > beta, std::complex< double > *C, int *DESC)
Definition scalapack_connector.h:320
static void tranu(const int m, const int n, const std::complex< double > alpha, std::complex< double > *a, const int ia, const int ja, const int *desca, const std::complex< double > beta, std::complex< double > *c, const int ic, const int jc, const int *descc)
Definition scalapack_connector.h:395
static void trmm(char side, char uplo, char trans, char diag, int m, int n, double alpha, double *a, double *b, int *desc)
Definition scalapack_connector.h:422
static int potrf(char uplo, int na, std::complex< double > *U, int *desc)
Definition scalapack_connector.h:413
static void dot(int n, double &dot, double *a, int ia, int ja, int inca, double *b, int ib, int jb, int incb, int *desc)
Definition scalapack_connector.h:229
static void gesv(const int n, const int nrhs, const std::complex< double > *A, const int ia, const int ja, const int *desca, int *ipiv, std::complex< double > *B, const int ib, const int jb, const int *descb, int *info)
Definition scalapack_connector.h:386
static void hemm(char side, char uplo, int na, std::complex< double > alpha, std::complex< double > *a, std::complex< double > *b, std::complex< double > beta, std::complex< double > *c, int *desc)
Definition scalapack_connector.h:454
static void getrf(const int M, const int N, std::complex< double > *A, const int IA, const int JA, const int *DESCA, int *ipiv, int *info)
Definition scalapack_connector.h:368
#define N
Definition exp.cpp:24
#define T
Definition exp.cpp:237
void Cpigemr2d(int m, int n, int *ptrmyblock, int ia, int ja, int *ma, int *ptrmynewblock, int ib, int jb, int *mb, int globcontext)
void pztrmm_(char *side, char *uplo, char *transa, char *diag, int *m, int *n, std::complex< double > *alpha, std::complex< double > *a, int *ia, int *ja, int *desca, std::complex< double > *b, int *ib, int *jb, int *descb)
constexpr double SCALAPACK_ABSTOL
Definition scalapack_connector.h:16
void Cpzgemr2d(int m, int n, std::complex< double > *ptrmyblock, int ia, int ja, int *ma, std::complex< double > *ptrmynewblock, int ib, int jb, int *mb, int globcontext)
void pchegvx_(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, std::complex< float > *A, const int *ia, const int *ja, const int *desca, std::complex< float > *B, const int *ib, const int *jb, const int *descb, const float *vl, const float *vu, const int *il, const int *iu, const float *abstol, int *m, int *nz, float *w, const float *orfac, std::complex< float > *Z, const int *iz, const int *jz, const int *descz, std::complex< float > *work, int *lwork, float *rwork, int *lrwork, int *iwork, int *liwork, int *ifail, int *iclustr, float *gap, int *info)
void pzgetri_(const int *n, const std::complex< double > *A, const int *ia, const int *ja, const int *desca, int *ipiv, const std::complex< double > *work, const int *lwork, const int *iwork, const int *liwork, const int *info)
void pzgemr2d_(const int *M, const int *N, std::complex< double > *A, const int *IA, const int *JA, const int *DESCA, std::complex< double > *B, const int *IB, const int *JB, const int *DESCB, const int *ICTXT)
void Cpcgemr2d(int m, int n, std::complex< float > *ptrmyblock, int ia, int ja, int *ma, std::complex< float > *ptrmynewblock, int ib, int jb, int *mb, int globcontext)
void pdpotrf_(char *uplo, int *n, double *a, int *ia, int *ja, int *desca, int *info)
int numroc_(const int *n, const int *nb, const int *iproc, const int *srcproc, const int *nprocs)
void Cpdgemr2d(int m, int n, double *ptrmyblock, int ia, int ja, int *ma, double *ptrmynewblock, int ib, int jb, int *mb, int globcontext)
void pdgemv_(const char *transa, const int *M, const int *N, const double *alpha, const double *A, const int *IA, const int *JA, const int *DESCA, const double *B, const int *IB, const int *JB, const int *DESCB, const int *K, const double *beta, double *C, const int *IC, const int *JC, const int *DESCC, const int *L)
void pztranc_(const int *M, const int *N, const std::complex< double > *alpha, const std::complex< double > *A, const int *IA, const int *JA, const int *DESCA, const std::complex< double > *beta, std::complex< double > *C, const int *IC, const int *JC, const int *DESCC)
void pdsygvx_(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, double *A, const int *ia, const int *ja, const int *desca, double *B, const int *ib, const int *jb, const int *descb, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, int *m, int *nz, double *w, const double *orfac, double *Z, const int *iz, const int *jz, const int *descz, double *work, int *lwork, int *iwork, int *liwork, int *ifail, int *iclustr, double *gap, int *info)
void pzhegvx_(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, std::complex< double > *A, const int *ia, const int *ja, const int *desca, std::complex< double > *B, const int *ib, const int *jb, const int *descb, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, int *m, int *nz, double *w, const double *orfac, std::complex< double > *Z, const int *iz, const int *jz, const int *descz, std::complex< double > *work, int *lwork, double *rwork, int *lrwork, int *iwork, int *liwork, int *ifail, int *iclustr, double *gap, int *info)
void pdtran_(const int *m, const int *n, const double *alpha, const double *a, const int *ia, const int *ja, const int *desca, const double *beta, double *c, const int *ic, const int *jc, const int *descc)
void pzpotrf_(char *uplo, int *n, std::complex< double > *a, int *ia, int *ja, int *desca, int *info)
void pddot_(int *n, double *dot, double *x, int *ix, int *jx, int *descx, int *incx, double *y, int *iy, int *jy, int *descy, int *incy)
void pzdotc_(int *n, std::complex< double > *dot, std::complex< double > *x, int *ix, int *jx, int *descx, int *incx, std::complex< double > *y, int *iy, int *jy, int *descy, int *incy)
void pdgemm_(const char *transa, const char *transb, const int *M, const int *N, const int *K, const double *alpha, const double *A, const int *IA, const int *JA, const int *DESCA, const double *B, const int *IB, const int *JB, const int *DESCB, const double *beta, double *C, const int *IC, const int *JC, const int *DESCC)
void pzgemm_(const char *transa, const char *transb, const int *M, const int *N, const int *K, const std::complex< double > *alpha, const std::complex< double > *A, const int *IA, const int *JA, const int *DESCA, const std::complex< double > *B, const int *IB, const int *JB, const int *DESCB, const std::complex< double > *beta, std::complex< double > *C, const int *IC, const int *JC, const int *DESCC)
void pzgemv_(const char *transa, const int *M, const int *N, const double *alpha, const std::complex< double > *A, const int *IA, const int *JA, const int *DESCA, const std::complex< double > *B, const int *IB, const int *JB, const int *DESCB, const int *K, const double *beta, std::complex< double > *C, const int *IC, const int *JC, const int *DESCC, const int *L)
void pdtrmm_(char *side, char *uplo, char *transa, char *diag, int *m, int *n, double *alpha, double *a, int *ia, int *ja, int *desca, double *b, int *ib, int *jb, int *descb)
void descinit_(int *desc, const int *m, const int *n, const int *mb, const int *nb, const int *irsrc, const int *icsrc, const int *ictxt, const int *lld, int *info)
void pzgesv_(const int *n, const int *nrhs, const std::complex< double > *A, const int *ia, const int *ja, const int *desca, int *ipiv, std::complex< double > *B, const int *ib, const int *jb, const int *descb, const int *info)
std::enable_if< block2d_data_type< T >::value, void >::type Cpxgemr2d(int M, int N, T *A, int IA, int JA, int *DESCA, T *B, int IB, int JB, int *DESCB, int ICTXT)
Definition scalapack_connector.h:203
void pztranu_(const int *m, const int *n, const std::complex< double > *alpha, const std::complex< double > *a, const int *ia, const int *ja, const int *desca, const std::complex< double > *beta, std::complex< double > *c, const int *ic, const int *jc, const int *descc)
void pdgemr2d_(const int *M, const int *N, double *A, const int *IA, const int *JA, const int *DESCA, double *B, const int *IB, const int *JB, const int *DESCB, const int *ICTXT)
void pdsymm_(char *side, char *uplo, int *m, int *n, double *alpha, double *a, int *ia, int *ja, int *desca, double *b, int *ib, int *jb, int *descb, double *beta, double *c, int *ic, int *jc, int *descc)
void pzgeadd_(const char *transa, const int *m, const int *n, const std::complex< double > *alpha, const std::complex< double > *a, const int *ia, const int *ja, const int *desca, const std::complex< double > *beta, const std::complex< double > *c, const int *ic, const int *jc, const int *descc)
void pssygvx_(const int *itype, const char *jobz, const char *range, const char *uplo, const int *n, float *A, const int *ia, const int *ja, const int *desca, float *B, const int *ib, const int *jb, const int *descb, const float *vl, const float *vu, const int *il, const int *iu, const float *abstol, int *m, int *nz, float *w, const float *orfac, float *Z, const int *iz, const int *jz, const int *descz, float *work, int *lwork, int *iwork, int *liwork, int *ifail, int *iclustr, float *gap, int *info)
constexpr double SCALAPACK_ORFAC
Definition scalapack_connector.h:17
void Cpsgemr2d(int m, int n, float *ptrmyblock, int ia, int ja, int *ma, float *ptrmynewblock, int ib, int jb, int *mb, int globcontext)
void pzhemm_(char *side, char *uplo, int *m, int *n, std::complex< double > *alpha, std::complex< double > *a, int *ia, int *ja, int *desca, std::complex< double > *b, int *ib, int *jb, int *descb, std::complex< double > *beta, std::complex< double > *c, int *ic, int *jc, int *descc)
void pzgetrf_(const int *M, const int *N, std::complex< double > *A, const int *IA, const int *JA, const int *DESCA, int *ipiv, int *info)
Definition scalapack_connector.h:180
static constexpr bool value
Definition scalapack_connector.h:181
int ictxt
Definition tddft_test.cpp:14