1 #ifndef SCALAPACK_CONNECTOR_H
2 #define SCALAPACK_CONNECTOR_H
5 #include "interface/blacs_scalapack.h"
6 #include "lapack_connector.h"
12 inline static int indxg2p(
const int &indxglob,
const int &nb,
const int &iproc,
const int &isrcproc,
const int &nprocs)
14 return (isrcproc + indxglob / nb) % nprocs;
16 inline static int indxg2l(
const int &indxglob,
const int &nb,
const int &iproc,
const int &isrcproc,
const int &nprocs)
18 return nb * (indxglob/ (nb * nprocs)) + indxglob % nb;
20 inline static int indxl2g(
const int &indxloc,
const int &nb,
const int &iproc,
const int &isrcproc,
const int &nprocs)
22 return nprocs * nb * (indxloc / nb) + indxloc % nb +
23 ((nprocs + iproc - isrcproc) % nprocs) * nb;
26 static void transpose_desc(
int desc_T[9],
const int desc[9] )
30 desc_T[2] = desc[3]; desc_T[3] = desc[2];
31 desc_T[4] = desc[5]; desc_T[5] = desc[4];
32 desc_T[6] = desc[6]; desc_T[7] = desc[7];
36 static void blacs_gridinit(
int &ictxt,
const char order,
const int nprow,
const int npcol )
38 blacs_gridinit_(&ictxt, &order, &nprow, &npcol);
41 static void blacs_gridinfo(
const int &ictxt,
int &nprow,
int &npcol,
int &myprow,
int &mypcol )
43 blacs_gridinfo_( &ictxt, &nprow, &npcol, &myprow, &mypcol );
46 static int numroc(
const int n,
const int nb,
const int iproc,
const int srcproc,
const int nprocs )
48 return numroc_(&n, &nb, &iproc, &srcproc, &nprocs);
53 const int m,
const int n,
const int mb,
const int nb,
const int irsrc,
const int icsrc,
54 const int ictxt,
const int lld,
int &info )
56 descinit_(desc, &m, &n, &mb, &nb, &irsrc, &icsrc, &ictxt, &lld, &info);
62 const char transa,
const char transb,
63 const int M,
const int N,
const int K,
65 const double *A,
const int IA,
const int JA,
const int *DESCA,
66 const double *B,
const int IB,
const int JB,
const int *DESCB,
68 double *C,
const int IC,
const int JC,
const int *DESCC)
70 int DESCA_T[9], DESCB_T[9], DESCC_T[9];
71 transpose_desc( DESCA_T, DESCA );
72 transpose_desc( DESCB_T, DESCB );
73 transpose_desc( DESCC_T, DESCC );
81 C, &JC, &IC, DESCC_T);
93 void pdgetrf(
int m,
int n,
matrix &a,
int ia,
int ja,
int *desca,
int *ipiv,
int *info)
95 double *aux = LapackConnector::transpose_matrix(a, n, m);
96 pdgetrf_( &m, &n, aux, &ia, &ja, desca, ipiv, info);
97 LapackConnector::transpose_matrix(aux, a, n, m);
103 void pscal_f(
const int &N,
const float &alpha,
float *X,
104 const int &IX,
const int &JX,
const int *DESCX,
107 psscal_(&N, &alpha, X, &IX, &JX, DESCX, &INCX);
111 void pscal_f(
const int &N,
const double &alpha,
double *X,
112 const int &IX,
const int &JX,
const int *DESCX,
115 pdscal_(&N, &alpha, X, &IX, &JX, DESCX, &INCX);
119 void pscal_f(
const int &N,
const std::complex<float> &alpha, std::complex<float> *X,
120 const int &IX,
const int &JX,
const int *DESCX,
123 pcscal_(&N, &alpha, X, &IX, &JX, DESCX, &INCX);
127 void pscal_f(
const int &N,
const std::complex<double> &alpha, std::complex<double> *X,
128 const int &IX,
const int &JX,
const int *DESCX,
131 pzscal_(&N, &alpha, X, &IX, &JX, DESCX, &INCX);
135 void pscal_f(
const int &N,
const float &alpha, std::complex<float> *X,
136 const int &IX,
const int &JX,
const int *DESCX,
139 pcsscal_(&N, &alpha, X, &IX, &JX, DESCX, &INCX);
143 void pscal_f(
const int &N,
const double &alpha, std::complex<double> *X,
144 const int &IX,
const int &JX,
const int *DESCX,
147 pzdscal_(&N, &alpha, X, &IX, &JX, DESCX, &INCX);
151 float pdot_f(
const int &N,
const float *X,
const int &IX,
152 const int &JX,
const int *DESCX,
const int &INCX,
153 const float *Y,
const int &IY,
const int &JY,
154 const int *DESCY,
const int &INCY)
157 psdot_(&N, &result, X, &IX, &JX, DESCX, &INCX, Y, &IY, &JY, DESCY, &INCY);
162 double pdot_f(
const int &N,
const double *X,
const int &IX,
163 const int &JX,
const int *DESCX,
const int &INCX,
164 const double *Y,
const int &IY,
const int &JY,
165 const int *DESCY,
const int &INCY)
168 pddot_(&N, &result, X, &IX, &JX, DESCX, &INCX, Y, &IY, &JY, DESCY, &INCY);
173 std::complex<float> pdot_f(
const int &N,
const std::complex<float> *X,
174 const int &IX,
const int &JX,
const int *DESCX,
175 const int &INCX,
const std::complex<float> *Y,
176 const int &IY,
const int &JY,
const int *DESCY,
179 std::complex<float> result = 0.0;
180 pcdotu_(&N, &result, X, &IX, &JX, DESCX, &INCX, Y, &IY, &JY, DESCY, &INCY);
185 std::complex<float> pdotc_f(
const int &N,
const std::complex<float> *X,
186 const int &IX,
const int &JX,
const int *DESCX,
187 const int &INCX,
const std::complex<float> *Y,
188 const int &IY,
const int &JY,
const int *DESCY,
191 std::complex<float> result = 0.0;
192 pcdotc_(&N, &result, X, &IX, &JX, DESCX, &INCX, Y, &IY, &JY, DESCY, &INCY);
197 std::complex<double> pdot_f(
const int &N,
const std::complex<double> *X,
198 const int &IX,
const int &JX,
const int *DESCX,
199 const int &INCX,
const std::complex<double> *Y,
200 const int &IY,
const int &JY,
const int *DESCY,
203 std::complex<double> result = 0.0;
204 pzdotu_(&N, &result, X, &IX, &JX, DESCX, &INCX, Y, &IY, &JY, DESCY, &INCY);
209 std::complex<double> pdotc_f(
const int &N,
const std::complex<double> *X,
210 const int &IX,
const int &JX,
const int *DESCX,
211 const int &INCX,
const std::complex<double> *Y,
212 const int &IY,
const int &JY,
const int *DESCY,
215 std::complex<double> result = 0.0;
216 pzdotc_(&N, &result, X, &IX, &JX, DESCX, &INCX, Y, &IY, &JY, DESCY, &INCY);
221 void pgemv_f(
const char &transa,
const int &M,
const int &N,
const float &alpha,
222 const float *A,
const int &IA,
const int &JA,
const int *DESCA,
223 const float *X,
const int &IX,
const int &JX,
const int *DESCX,
const int &INCX,
225 float *Y,
const int &IY,
const int &JY,
const int *DESCY,
const int &INCY)
227 psgemv_(&transa, &M, &N, &alpha,
229 X, &IX, &JX, DESCX, &INCX,
230 &beta, Y, &IY, &JY, DESCY, &INCY);
234 void pgemv_f(
const char &transa,
const int &M,
const int &N,
const double &alpha,
235 const double *A,
const int &IA,
const int &JA,
const int *DESCA,
236 const double *X,
const int &IX,
const int &JX,
const int *DESCX,
const int &INCX,
238 double *Y,
const int &IY,
const int &JY,
const int *DESCY,
const int &INCY)
240 pdgemv_(&transa, &M, &N, &alpha,
242 X, &IX, &JX, DESCX, &INCX,
243 &beta, Y, &IY, &JY, DESCY, &INCY);
247 void pgemv_f(
const char &transa,
const int &M,
const int &N,
const std::complex<float> &alpha,
248 const std::complex<float> *A,
const int &IA,
const int &JA,
const int *DESCA,
249 const std::complex<float> *X,
const int &IX,
const int &JX,
const int *DESCX,
const int &INCX,
250 const std::complex<float> &beta,
251 std::complex<float> *Y,
const int &IY,
const int &JY,
const int *DESCY,
const int &INCY)
253 pcgemv_(&transa, &M, &N, &alpha,
255 X, &IX, &JX, DESCX, &INCX,
256 &beta, Y, &IY, &JY, DESCY, &INCY);
260 void pgemv_f(
const char &transa,
const int &M,
const int &N,
const std::complex<double> &alpha,
261 const std::complex<double> *A,
const int &IA,
const int &JA,
const int *DESCA,
262 const std::complex<double> *X,
const int &IX,
const int &JX,
const int *DESCX,
const int &INCX,
263 const std::complex<double> &beta,
264 std::complex<double> *Y,
const int &IY,
const int &JY,
const int *DESCY,
const int &INCY)
266 pzgemv_(&transa, &M, &N, &alpha,
268 X, &IX, &JX, DESCX, &INCX,
269 &beta, Y, &IY, &JY, DESCY, &INCY);
273 void pgemm_f(
const char &transa,
const char &transb,
274 const int &M,
const int &N,
const int &K,
276 const float *A,
const int &IA,
const int &JA,
const int *DESCA,
277 const float *B,
const int &IB,
const int &JB,
const int *DESCB,
279 float *C,
const int &IC,
const int &JC,
const int *DESCC)
281 psgemm_(&transa, &transb, &M, &N, &K, &alpha,
289 void pgemm_f(
const char &transa,
const char &transb,
290 const int &M,
const int &N,
const int &K,
292 const double *A,
const int &IA,
const int &JA,
const int *DESCA,
293 const double *B,
const int &IB,
const int &JB,
const int *DESCB,
295 double *C,
const int &IC,
const int &JC,
const int *DESCC)
297 pdgemm_(&transa, &transb, &M, &N, &K, &alpha,
305 void pgemm_f(
const char &transa,
const char &transb,
306 const int &M,
const int &N,
const int &K,
307 const std::complex<float> &alpha,
308 const std::complex<float> *A,
const int &IA,
const int &JA,
const int *DESCA,
309 const std::complex<float> *B,
const int &IB,
const int &JB,
const int *DESCB,
310 const std::complex<float> &beta,
311 std::complex<float> *C,
const int &IC,
const int &JC,
const int *DESCC)
313 pcgemm_(&transa, &transb, &M, &N, &K, &alpha,
321 void pgemm_f(
const char &transa,
const char &transb,
322 const int &M,
const int &N,
const int &K,
323 const std::complex<double> &alpha,
324 const std::complex<double> *A,
const int &IA,
const int &JA,
const int *DESCA,
325 const std::complex<double> *B,
const int &IB,
const int &JB,
const int *DESCB,
326 const std::complex<double> &beta,
327 std::complex<double> *C,
const int &IC,
const int &JC,
const int *DESCC)
329 pzgemm_(&transa, &transb, &M, &N, &K, &alpha,
337 void pgemr2d_f(
const int m,
const int n,
338 const float *a,
const int ia,
const int ja,
const int *desca,
339 float *b,
const int ib,
const int jb,
const int *descb,
342 psgemr2d_(&m, &n, a, &ia, &ja, desca, b, &ib, &jb, descb, &ictxt);
346 void pgemr2d_f(
const int m,
const int n,
347 const double *a,
const int ia,
const int ja,
const int *desca,
348 double *b,
const int ib,
const int jb,
const int *descb,
351 pdgemr2d_(&m, &n, a, &ia, &ja, desca, b, &ib, &jb, descb, &ictxt);
355 void pgemr2d_f(
const int m,
const int n,
356 const std::complex<float> *a,
const int ia,
const int ja,
const int *desca,
357 std::complex<float> *b,
const int ib,
const int jb,
const int *descb,
360 pcgemr2d_(&m, &n, a, &ia, &ja, desca, b, &ib, &jb, descb, &ictxt);
364 void pgemr2d_f(
const int m,
const int n,
365 const std::complex<double> *a,
const int ia,
const int ja,
const int *desca,
366 std::complex<double> *b,
const int ib,
const int jb,
const int *descb,
369 pzgemr2d_(&m, &n, a, &ia, &ja, desca, b, &ib, &jb, descb, &ictxt);
373 void psyev_f(
const char &jobz,
const char &uplo,
374 const int &n,
float *A,
const int &ia,
const int &ja,
const int *desca,
375 float *W,
float *Z,
const int &iz,
const int &jz,
const int *descz,
376 float *work,
const int &lwork,
float *rwork,
const int &lrwork,
int &info)
378 pssyev_(&jobz, &uplo, &n, A, &ia, &ja, desca,
379 W, Z, &iz, &jz, descz,
380 work, &lwork, rwork, &lrwork, &info);
383 void psyev_f(
const char &jobz,
const char &uplo,
384 const int &n,
double *A,
const int &ia,
const int &ja,
const int *desca,
385 double *W,
double *Z,
const int &iz,
const int &jz,
const int *descz,
386 double *work,
const int &lwork,
double *rwork,
const int &lrwork,
int &info)
388 pdsyev_(&jobz, &uplo, &n, A, &ia, &ja, desca,
389 W, Z, &iz, &jz, descz,
390 work, &lwork, rwork, &lrwork, &info);
393 void pheev_f(
const char &jobz,
const char &uplo,
394 const int &n, std::complex<float> *A,
const int &ia,
const int &ja,
const int *desca,
395 float *W, std::complex<float> *Z,
const int &iz,
const int &jz,
const int *descz,
396 std::complex<float> *work,
const int &lwork,
float *rwork,
const int &lrwork,
int &info)
398 pcheev_(&jobz, &uplo, &n, A, &ia, &ja, desca,
399 W, Z, &iz, &jz, descz,
400 work, &lwork, rwork, &lrwork, &info);
403 void pheev_f(
const char &jobz,
const char &uplo,
404 const int &n, std::complex<double> *A,
const int &ia,
const int &ja,
const int *desca,
405 double *W, std::complex<double> *Z,
const int &iz,
const int &jz,
const int *descz,
406 std::complex<double> *work,
const int &lwork,
double *rwork,
const int &lrwork,
int &info)
409 pzheev_(&jobz, &uplo, &n, A, &ia, &ja, desca,
410 W, Z, &iz, &jz, descz,
411 work, &lwork, rwork, &lrwork, &info);
415 void pgetrf_f(
const int &m,
const int &n,
float *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv,
int &info)
417 psgetrf_(&m, &n, a, &ia, &ja, desca, ipiv, &info);
421 void pgetrf_f(
const int &m,
const int &n,
double *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv,
int &info)
423 pdgetrf_(&m, &n, a, &ia, &ja, desca, ipiv, &info);
427 void pgetrf_f(
const int &m,
const int &n, std::complex<float> *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv,
int &info)
429 pcgetrf_(&m, &n, a, &ia, &ja, desca, ipiv, &info);
433 void pgetrf_f(
const int &m,
const int &n, std::complex<double> *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv,
int &info)
435 pzgetrf_(&m, &n, a, &ia, &ja, desca, ipiv, &info);
439 void pgetri_f(
const int &n,
float *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv,
float *work,
const int &lwork,
int *iwork,
const int &liwork,
int &info)
441 psgetri_(&n, a, &ia, &ja, desca, ipiv, work, &lwork, iwork, &liwork, &info);
445 void pgetri_f(
const int &n,
double *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv,
double *work,
const int &lwork,
int *iwork,
const int &liwork,
int &info)
447 pdgetri_(&n, a, &ia, &ja, desca, ipiv, work, &lwork, iwork, &liwork, &info);
451 void pgetri_f(
const int &n, std::complex<float> *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv, std::complex<float> *work,
const int &lwork,
int *iwork,
const int &liwork,
int &info)
453 pcgetri_(&n, a, &ia, &ja, desca, ipiv, work, &lwork, iwork, &liwork, &info);
457 void pgetri_f(
const int &n, std::complex<double> *a,
const int &ia,
const int &ja,
const int *desca,
int *ipiv, std::complex<double> *work,
const int &lwork,
int *iwork,
const int &liwork,
int &info)
459 pzgetri_(&n, a, &ia, &ja, desca, ipiv, work, &lwork, iwork, &liwork, &info);
Definition: scalapack_connector.h:9