Actual source code: petscscalapack.h
1: #ifndef _PETSCSCALAPACK_H
2: #define _PETSCSCALAPACK_H
4: #include <petsc/private/matimpl.h>
5: #include <petscblaslapack.h>
7: typedef struct {
8: PetscBLASInt ictxt; /* process grid context */
9: PetscBLASInt nprow, npcol; /* number of process rows and columns */
10: PetscBLASInt myrow, mycol; /* coordinates of local process on the grid */
11: PetscInt grid_refct; /* reference count */
12: PetscBLASInt ictxrow, ictxcol; /* auxiliary 1d process grid contexts */
13: } Mat_ScaLAPACK_Grid;
15: typedef struct {
16: Mat_ScaLAPACK_Grid *grid; /* process grid */
17: PetscBLASInt desc[9]; /* ScaLAPACK descriptor */
18: PetscBLASInt M, N; /* global dimensions, for rows and columns */
19: PetscBLASInt locr, locc; /* dimensions of local array */
20: PetscBLASInt mb, nb; /* block size, for rows and columns */
21: PetscBLASInt rsrc, csrc; /* coordinates of process owning first row and column */
22: PetscScalar *loc; /* pointer to local array */
23: PetscBLASInt lld; /* local leading dimension */
24: PetscBLASInt *pivots; /* pivots in LU factorization */
25: PetscBool roworiented; /* if true, row oriented input (default) */
26: } Mat_ScaLAPACK;
28: PETSC_INTERN PetscErrorCode MatMatMultSymbolic_ScaLAPACK(Mat, Mat, PetscReal, Mat);
29: PETSC_INTERN PetscErrorCode MatMatMultNumeric_ScaLAPACK(Mat, Mat, Mat);
31: /* Macro to check nonzero info after ScaLAPACK call */
33: do { \
35: } while (0)
37: #define PETSC_PASTE4_(a, b, c, d) a##b##c##d
38: #define PETSC_PASTE4(a, b, c, d) PETSC_PASTE4_(a, b, c, d)
40: #if defined(PETSC_BLASLAPACK_CAPS)
41: #define PETSC_SCALAPACK_PREFIX_ P
42: #define PETSCBLASNOTYPE(x, X) PETSC_PASTE2(X, PETSC_BLASLAPACK_SUFFIX_)
43: #define PETSCSCALAPACK(x, X) PETSC_PASTE4(PETSC_SCALAPACK_PREFIX_, PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
44: #else
45: #define PETSC_SCALAPACK_PREFIX_ p
46: #define PETSCBLASNOTYPE(x, X) PETSC_PASTE2(x, PETSC_BLASLAPACK_SUFFIX_)
47: #define PETSCSCALAPACK(x, X) PETSC_PASTE4(PETSC_SCALAPACK_PREFIX_, PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
48: #endif
50: /* BLACS routines (C interface) */
51: BLAS_EXTERN PetscBLASInt Csys2blacs_handle(MPI_Comm syscontext);
52: BLAS_EXTERN void Cblacs_pinfo(PetscBLASInt *mypnum, PetscBLASInt *nprocs);
53: BLAS_EXTERN void Cblacs_get(PetscBLASInt context, PetscBLASInt request, PetscBLASInt *value);
54: BLAS_EXTERN PetscBLASInt Cblacs_pnum(PetscBLASInt context, PetscBLASInt prow, PetscBLASInt pcol);
55: BLAS_EXTERN PetscBLASInt Cblacs_gridinit(PetscBLASInt *context, const char *order, PetscBLASInt np_row, PetscBLASInt np_col);
56: BLAS_EXTERN void Cblacs_gridinfo(PetscBLASInt context, PetscBLASInt *np_row, PetscBLASInt *np_col, PetscBLASInt *my_row, PetscBLASInt *my_col);
57: BLAS_EXTERN void Cblacs_gridexit(PetscBLASInt context);
58: BLAS_EXTERN void Cblacs_exit(PetscBLASInt error_code);
59: BLAS_EXTERN void Cdgebs2d(PetscBLASInt ctxt, const char *scope, const char *top, PetscBLASInt m, PetscBLASInt n, PetscScalar *A, PetscBLASInt lda);
60: BLAS_EXTERN void Cdgebr2d(PetscBLASInt ctxt, const char *scope, const char *top, PetscBLASInt m, PetscBLASInt n, PetscScalar *A, PetscBLASInt lda, PetscBLASInt rsrc, PetscBLASInt csrc);
61: BLAS_EXTERN void Cdgsum2d(PetscBLASInt ctxt, const char *scope, const char *top, PetscBLASInt m, PetscBLASInt n, PetscScalar *A, PetscBLASInt lda, PetscBLASInt rsrc, PetscBLASInt csrc);
63: /* PBLAS */
64: #define PBLASgemv_ PETSCSCALAPACK(gemv, GEMV)
65: #define PBLASgemm_ PETSCSCALAPACK(gemm, GEMM)
66: #if defined(PETSC_USE_COMPLEX)
67: #define PBLAStran_ PETSCSCALAPACK(tranc, TRANC)
68: #else
69: #define PBLAStran_ PETSCSCALAPACK(tran, TRAN)
70: #endif
72: BLAS_EXTERN void PBLASgemv_(const char *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
73: BLAS_EXTERN void PBLASgemm_(const char *, const char *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
74: BLAS_EXTERN void PBLAStran_(PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
76: /* ScaLAPACK */
77: #define SCALAPACKlange_ PETSCSCALAPACK(lange, LANGE)
78: #define SCALAPACKpotrf_ PETSCSCALAPACK(potrf, POTRF)
79: #define SCALAPACKpotrs_ PETSCSCALAPACK(potrs, POTRS)
80: #define SCALAPACKgetrf_ PETSCSCALAPACK(getrf, GETRF)
81: #define SCALAPACKgetrs_ PETSCSCALAPACK(getrs, GETRS)
83: BLAS_EXTERN PetscReal SCALAPACKlange_(const char *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *);
84: BLAS_EXTERN void SCALAPACKpotrf_(const char *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
85: BLAS_EXTERN void SCALAPACKpotrs_(const char *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
86: BLAS_EXTERN void SCALAPACKgetrf_(PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
87: BLAS_EXTERN void SCALAPACKgetrs_(const char *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
89: /* auxiliary routines */
90: #define SCALAPACKnumroc_ PETSCBLASNOTYPE(numroc, NUMROC)
91: #define SCALAPACKdescinit_ PETSCBLASNOTYPE(descinit, DESCINIT)
92: #define SCALAPACKinfog2l_ PETSCBLASNOTYPE(infog2l, INFOG2L)
93: #define SCALAPACKgemr2d_ PETSCSCALAPACK(gemr2d, GEMR2D)
94: #define SCALAPACKmatadd_ PETSCSCALAPACK(matadd, MATADD)
95: #define SCALAPACKelset_ PETSCSCALAPACK(elset, ELSET)
96: #define SCALAPACKelget_ PETSCSCALAPACK(elget, ELGET)
98: BLAS_EXTERN PetscBLASInt SCALAPACKnumroc_(PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
99: BLAS_EXTERN void SCALAPACKdescinit_(PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
100: BLAS_EXTERN void SCALAPACKinfog2l_(PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
101: BLAS_EXTERN void SCALAPACKgemr2d_(PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
102: BLAS_EXTERN void SCALAPACKmatadd_(PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
103: BLAS_EXTERN void SCALAPACKelset_(PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *, PetscScalar *);
104: BLAS_EXTERN void SCALAPACKelget_(const char *, const char *, PetscScalar *, PetscScalar *, PetscBLASInt *, PetscBLASInt *, PetscBLASInt *);
106: /*
107: Macros to test valid arguments
108: */
109: #if !defined(PETSC_USE_DEBUG)
111: #define MatScaLAPACKCheckDistribution(a, arga, b, argb) \
112: do { \
113: (void)(a); \
114: (void)(b); \
115: } while (0)
117: #else
119: #define MatScaLAPACKCheckDistribution(a, arga, b, argb) \
120: do { \
121: Mat_ScaLAPACK *_aa = (Mat_ScaLAPACK *)(a)->data, *_bb = (Mat_ScaLAPACK *)(b)->data; \
123: _aa->grid->mycol == _bb->grid->mycol, \
124: PetscObjectComm((PetscObject)(a)), PETSC_ERR_ARG_INCOMP, "Arguments #%d and #%d have different ScaLAPACK distribution", arga, argb); \
125: } while (0)
127: #endif
129: #endif