Actual source code: petscblaslapack_mangle.h

  1: /*
  2:       This file deals with the BLAS/LAPACK naming convention on
  3:       non-Microsoft Windows systems, which may append an underscore, use
  4:       upper or lower case, and/or use a configurable symbol suffix.
  5: */
  6: #pragma once

  8: /* MANSEC = Sys */

 10: /* macros to mangle BLAS/LAPACK names as needed for linking */

 12: /* token pasting, with an extra level of indirection so that we
 13:    can paste the contents of other preprocessor #definitions */
 14: #define PETSC_PASTE2_(a, b)    a##b
 15: #define PETSC_PASTE2(a, b)     PETSC_PASTE2_(a, b)
 16: #define PETSC_PASTE3_(a, b, c) a##b##c
 17: #define PETSC_PASTE3(a, b, c)  PETSC_PASTE3_(a, b, c)

 19: #if !defined(PETSC_BLASLAPACK_SUFFIX)
 20:   #if defined(PETSC_BLASLAPACK_UNDERSCORE)
 21:     #define PETSC_BLASLAPACK_SUFFIX_ _
 22:   #else
 23:     #define PETSC_BLASLAPACK_SUFFIX_
 24:   #endif
 25: #else
 26:   #if defined(PETSC_BLASLAPACK_UNDERSCORE)
 27:     #define PETSC_BLASLAPACK_SUFFIX_ PETSC_PASTE2(PETSC_BLASLAPACK_SUFFIX, _)
 28:   #else
 29:     #define PETSC_BLASLAPACK_SUFFIX_ PETSC_BLASLAPACK_SUFFIX
 30:   #endif
 31: #endif

 33: /* complex/real and single/double/quad/half precision prefixes: */
 34: #if !defined(PETSC_USE_COMPLEX)
 35:   #if defined(PETSC_BLASLAPACK_CAPS)
 36:     #if defined(PETSC_USE_REAL_SINGLE)
 37:       #define PETSC_BLASLAPACK_PREFIX_        S
 38:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX C
 39:     #elif defined(PETSC_USE_REAL_DOUBLE)
 40:       #define PETSC_BLASLAPACK_PREFIX_        D
 41:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX Z
 42:     #elif defined(PETSC_USE_REAL___FLOAT128)
 43:       #define PETSC_BLASLAPACK_PREFIX_        Q
 44:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX W
 45:     #else
 46:       #define PETSC_BLASLAPACK_PREFIX_        H
 47:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX K
 48:     #endif
 49:   #else
 50:     #if defined(PETSC_USE_REAL_SINGLE)
 51:       #define PETSC_BLASLAPACK_PREFIX_        s
 52:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX c
 53:     #elif defined(PETSC_USE_REAL_DOUBLE)
 54:       #define PETSC_BLASLAPACK_PREFIX_        d
 55:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX z
 56:     #elif defined(PETSC_USE_REAL___FLOAT128)
 57:       #define PETSC_BLASLAPACK_PREFIX_        q
 58:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX w
 59:     #else
 60:       #define PETSC_BLASLAPACK_PREFIX_        h
 61:       #define PETSC_BLASLAPACK_PREFIX_COMPLEX k
 62:     #endif
 63:   #endif
 64:   #define PETSC_BLASLAPACK_RPREFIX_    PETSC_BLASLAPACK_PREFIX_
 65:   #define PETSC_BLASLAPACK_PREFIX_REAL PETSC_BLASLAPACK_PREFIX_
 66: #else
 67:   #if defined(PETSC_BLASLAPACK_CAPS)
 68:     #if defined(PETSC_USE_REAL_SINGLE)
 69:       #define PETSC_BLASLAPACK_PREFIX_     C
 70:       #define PETSC_BLASLAPACK_PREFIX_REAL S
 71:       #define PETSC_BLASLAPACK_RPREFIX_    SC
 72:     #elif defined(PETSC_USE_REAL_DOUBLE)
 73:       #define PETSC_BLASLAPACK_PREFIX_     Z
 74:       #define PETSC_BLASLAPACK_PREFIX_REAL D
 75:       #define PETSC_BLASLAPACK_RPREFIX_    DZ
 76:     #elif defined(PETSC_USE_REAL___FLOAT128)
 77:       #define PETSC_BLASLAPACK_PREFIX_     W
 78:       #define PETSC_BLASLAPACK_PREFIX_REAL Q
 79:       #define PETSC_BLASLAPACK_RPREFIX_    QW
 80:     #else
 81:       #define PETSC_BLASLAPACK_PREFIX_     K
 82:       #define PETSC_BLASLAPACK_PREFIX_REAL H
 83:       #define PETSC_BLASLAPACK_RPREFIX_    HK
 84:     #endif
 85:   #else
 86:     #if defined(PETSC_USE_REAL_SINGLE)
 87:       #define PETSC_BLASLAPACK_PREFIX_     c
 88:       #define PETSC_BLASLAPACK_PREFIX_REAL s
 89:       #define PETSC_BLASLAPACK_RPREFIX_    sc
 90:     #elif defined(PETSC_USE_REAL_DOUBLE)
 91:       #define PETSC_BLASLAPACK_PREFIX_     z
 92:       #define PETSC_BLASLAPACK_PREFIX_REAL d
 93:       #define PETSC_BLASLAPACK_RPREFIX_    dz
 94:     #elif defined(PETSC_USE_REAL___FLOAT128)
 95:       #define PETSC_BLASLAPACK_PREFIX_     w
 96:       #define PETSC_BLASLAPACK_PREFIX_REAL q
 97:       #define PETSC_BLASLAPACK_RPREFIX_    qw
 98:     #else
 99:       #define PETSC_BLASLAPACK_PREFIX_     k
100:       #define PETSC_BLASLAPACK_PREFIX_REAL h
101:       #define PETSC_BLASLAPACK_RPREFIX_    hk
102:     #endif
103:   #endif
104:   #define PETSC_BLASLAPACK_PREFIX_COMPLEX PETSC_BLASLAPACK_PREFIX_
105: #endif

107: /* define macros PETSCBLAS to mangle BLAS/LAPACK subroutine names, and
108:    PETSCBLASR for functions returning real values */
109: #if defined(PETSC_BLASLAPACK_CAPS)
110:   /*MC
111:     PETSCBLAS - Mangle a BLAS or LAPACK subroutine name to its `PetscScalar`-precision flavour with the configured Fortran name-mangling suffix

113:     Synopsis:
114: #include <petscblaslapack.h>
115:     PETSCBLAS(x, X)

117:     Not Collective; No Fortran Support

119:     Input Parameters:
120:   + x - the lowercase root of the BLAS/LAPACK routine name (e.g. `gemm`)
121:   - X - the uppercase root of the BLAS/LAPACK routine name (e.g. `GEMM`)

123:     Level: developer

125:     Note:
126:     Use this for BLAS/LAPACK subroutines that operate on `PetscScalar` arguments. For routines
127:     that always take real arguments use `PETSCBLASREAL()`; for routines that return a real result
128:     from complex inputs use `PETSCBLASR()`; for routines that always take complex arguments use
129:     `PETSCBLASCOMPLEX()`.

131: .seealso: `PETSCBLASREAL`, `PETSCBLASCOMPLEX`, `PETSCBLASR`
132: M*/
133:   #define PETSCBLAS(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
134:   /*MC
135:     PETSCBLASREAL - Mangle a BLAS or LAPACK subroutine name for the real-arithmetic flavour of the routine

137:     Synopsis:
138: #include <petscblaslapack.h>
139:     PETSCBLASREAL(x, X)

141:     Not Collective; No Fortran Support

143:     Input Parameters:
144:   + x - the lowercase root of the BLAS/LAPACK routine name
145:   - X - the uppercase root of the BLAS/LAPACK routine name

147:     Level: developer

149: .seealso: `PETSCBLAS`, `PETSCBLASCOMPLEX`, `PETSCBLASR`
150: M*/
151:   #define PETSCBLASREAL(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, X, PETSC_BLASLAPACK_SUFFIX_)
152:   /*MC
153:     PETSCBLASCOMPLEX - Mangle a BLAS or LAPACK subroutine name for the complex-arithmetic flavour of the routine

155:     Synopsis:
156: #include <petscblaslapack.h>
157:     PETSCBLASCOMPLEX(x, X)

159:     Not Collective; No Fortran Support

161:     Input Parameters:
162:   + x - the lowercase root of the BLAS/LAPACK routine name
163:   - X - the uppercase root of the BLAS/LAPACK routine name

165:     Level: developer

167: .seealso: `PETSCBLAS`, `PETSCBLASREAL`, `PETSCBLASR`
168: M*/
169:   #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, X, PETSC_BLASLAPACK_SUFFIX_)
170:   /*MC
171:     PETSCBLASR - Mangle a BLAS or LAPACK subroutine name for a routine that returns a real value from inputs of the configured `PetscScalar` type

173:     Synopsis:
174: #include <petscblaslapack.h>
175:     PETSCBLASR(x, X)

177:     Not Collective; No Fortran Support

179:     Input Parameters:
180:   + x - the lowercase root of the BLAS/LAPACK routine name (e.g. `nrm2`)
181:   - X - the uppercase root of the BLAS/LAPACK routine name (e.g. `NRM2`)

183:     Level: developer

185:     Note:
186:     For real `PetscScalar` this resolves to the same name as `PETSCBLASREAL()`; for complex
187:     `PetscScalar` it prefixes with `sc` or `dz` (e.g. `scnrm2`, `dznrm2`).

189: .seealso: `PETSCBLAS`, `PETSCBLASREAL`, `PETSCBLASCOMPLEX`
190: M*/
191:   #define PETSCBLASR(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
192: #else
193:   #define PETSCBLAS(x, X)        PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
194:   #define PETSCBLASREAL(x, X)    PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, x, PETSC_BLASLAPACK_SUFFIX_)
195:   #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, x, PETSC_BLASLAPACK_SUFFIX_)
196:   #define PETSCBLASR(x, X)       PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
197: #endif

199: /* definitions of BLAS and LAPACK symbols */

201: /* Subroutine names that are the same for real/complex data: */
202: /* no character-string arguments: */
203: #define LAPACKgeqrf_     PETSCBLAS(geqrf, GEQRF)
204: #define LAPACKgetrf_     PETSCBLAS(getrf, GETRF)
205: #define LAPACKgetri_     PETSCBLAS(getri, GETRI)
206: #define LAPACKREALgetrf_ PETSCBLASREAL(getrf, GETRF)
207: #define LAPACKREALgetri_ PETSCBLASREAL(getri, GETRI)
208: #define BLASnrm2_        PETSCBLASR(nrm2, NRM2)
209: #define BLASscal_        PETSCBLAS(scal, SCAL)
210: #define BLAScopy_        PETSCBLAS(copy, COPY)
211: #define BLASswap_        PETSCBLAS(swap, SWAP)
212: #define BLASaxpy_        PETSCBLAS(axpy, AXPY)
213: #define BLASasum_        PETSCBLASR(asum, ASUM)
214: #define LAPACKpttrf_     PETSCBLAS(pttrf, PTTRF) /* factorization of a spd tridiagonal matrix */
215: #define LAPACKpttrs_     PETSCBLAS(pttrs, PTTRS) /* solve a spd tridiagonal matrix system */
216: #if !defined(PETSC_MISSING_LAPACK_STEIN)
217:   #define LAPACKstein_ PETSCBLAS(stein, STEIN) /* eigenvectors of real symm tridiagonal matrix */
218: #endif
219: #define LAPACKgesv_ PETSCBLAS(gesv, GESV)
220: #if !defined(PETSC_MISSING_LAPACK_GELSS)
221:   #define LAPACKgelss_ PETSCBLAS(gelss, GELSS)
222: #endif
223: #if !defined(PETSC_MISSING_LAPACK_GERFS)
224:   #define LAPACKgerfs_ PETSCBLAS(gerfs, GERFS)
225: #endif
226: #if !defined(PETSC_MISSING_LAPACK_TGSEN)
227:   #define LAPACKtgsen_ PETSCBLAS(tgsen, TGSEN)
228: #endif
229: /* character-string arguments: */
230: #define LAPACKtrtri_ PETSCBLAS(trtri, TRTRI)
231: #define LAPACKpotrf_ PETSCBLAS(potrf, POTRF)
232: #define LAPACKpotri_ PETSCBLAS(potri, POTRI)
233: #define LAPACKpotrs_ PETSCBLAS(potrs, POTRS)
234: #define LAPACKsytrf_ PETSCBLAS(sytrf, SYTRF)
235: #define LAPACKsytrs_ PETSCBLAS(sytrs, SYTRS)
236: #if !defined(PETSC_MISSING_LAPACK_SYTRI)
237:   #define LAPACKsytri_ PETSCBLAS(sytri, SYTRI)
238: #endif
239: #define BLASgemv_     PETSCBLAS(gemv, GEMV)
240: #define LAPACKgetrs_  PETSCBLAS(getrs, GETRS)
241: #define BLAStrmv_     PETSCBLAS(trmv, TRMV)
242: #define BLAStrsv_     PETSCBLAS(trsv, TRSV)
243: #define BLASgemm_     PETSCBLAS(gemm, GEMM)
244: #define BLASsymm_     PETSCBLAS(symm, SYMM)
245: #define BLASsyrk_     PETSCBLAS(syrk, SYRK)
246: #define BLASsyr2k_    PETSCBLAS(syr2k, SYR2K)
247: #define BLAStrsm_     PETSCBLAS(trsm, TRSM)
248: #define BLASREALgemm_ PETSCBLASREAL(gemm, GEMM)
249: #define LAPACKgesvd_  PETSCBLAS(gesvd, GESVD)
250: #define LAPACKgeev_   PETSCBLAS(geev, GEEV)
251: #define LAPACKgels_   PETSCBLAS(gels, GELS)
252: #if !defined(PETSC_MISSING_LAPACK_STEGR)
253:   #define LAPACKstegr_ PETSCBLAS(stegr, STEGR) /* eigenvalues and eigenvectors of symm tridiagonal */
254: #endif
255: #if !defined(PETSC_MISSING_LAPACK_STEQR)
256:   #define LAPACKsteqr_     PETSCBLAS(steqr, STEQR) /* eigenvalues and eigenvectors of symm tridiagonal */
257:   #define LAPACKREALsteqr_ PETSCBLASREAL(steqr, STEQR)
258: #endif
259: #if !defined(PETSC_MISSING_LAPACK_STEV)
260:   #define LAPACKstev_     PETSCBLAS(stev, STEV) /* eigenvalues and eigenvectors of symm tridiagonal */
261:   #define LAPACKREALstev_ PETSCBLASREAL(stev, STEV)
262: #endif
263: #if !defined(PETSC_MISSING_LAPACK_HSEQR)
264:   #define LAPACKhseqr_ PETSCBLAS(hseqr, HSEQR)
265: #endif
266: #if !defined(PETSC_MISSING_LAPACK_GGES)
267:   #define LAPACKgges_ PETSCBLAS(gges, GGES)
268: #endif
269: #if !defined(PETSC_MISSING_LAPACK_TRSEN)
270:   #define LAPACKtrsen_ PETSCBLAS(trsen, TRSEN)
271: #endif
272: #if !defined(PETSC_MISSING_LAPACK_HGEQZ)
273:   #define LAPACKhgeqz_ PETSCBLAS(hgeqz, HGEQZ)
274: #endif
275: #if !defined(PETSC_MISSING_LAPACK_TRTRS)
276:   #define LAPACKtrtrs_ PETSCBLAS(trtrs, TRTRS)
277: #endif

279: /* Subroutine names that differ for real/complex data: */
280: #if !defined(PETSC_USE_COMPLEX)
281:   #if !defined(PETSC_MISSING_LAPACK_ORGQR)
282:     #define LAPACKorgqr_ PETSCBLAS(orgqr, ORGQR)
283:   #endif
284:   #if !defined(PETSC_MISSING_LAPACK_ORMQR)
285:     #define LAPACKormqr_ PETSCBLAS(ormqr, ORMQR)
286:   #endif
287:   #define BLASdot_  PETSCBLAS(dot, DOT)
288:   #define BLASdotu_ PETSCBLAS(dot, DOT)

290:   #define LAPACKsyev_  PETSCBLAS(syev, SYEV)   /* eigenvalues and eigenvectors of a symm matrix */
291:   #define LAPACKsyevx_ PETSCBLAS(syevx, SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
292:   #define LAPACKsygv_  PETSCBLAS(sygv, SYGV)
293:   #define LAPACKsygvx_ PETSCBLAS(sygvx, SYGVX)

295:   /* stebz does not exist for complex data */
296:   #if !defined(PETSC_MISSING_LAPACK_STEBZ)
297:     #define LAPACKstebz_ PETSCBLAS(stebz, STEBZ) /* eigenvalues of symm tridiagonal matrix */
298:   #endif
299:   #define LAPACKgerc_ PETSCBLAS(ger, GER)
300:   #define BLAShemv_   PETSCBLAS(symv, SYMV)
301: #else
302:   #define LAPACKhetrf_ PETSCBLAS(hetrf, HETRF)
303:   #define LAPACKhetrs_ PETSCBLAS(hetrs, HETRS)
304:   #define LAPACKhetri_ PETSCBLAS(hetri, HETRI)
305:   #define LAPACKheev_  PETSCBLAS(heev, HEEV)
306:   #if !defined(PETSC_MISSING_LAPACK_ORGQR)
307:     #define LAPACKorgqr_ PETSCBLAS(ungqr, UNGQR)
308:   #endif
309:   #if !defined(PETSC_MISSING_LAPACK_ORMQR)
310:     #define LAPACKormqr_ PETSCBLAS(unmqr, UNMQR)
311:   #endif
312: /* note: dot and dotu are handled separately for complex data */

314:   #define LAPACKsyev_  PETSCBLAS(heev, HEEV)   /* eigenvalues and eigenvectors of a symm matrix */
315:   #define LAPACKsyevx_ PETSCBLAS(heevx, HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
316:   #define LAPACKsygv_  PETSCBLAS(hegv, HEGV)
317:   #define LAPACKsygvx_ PETSCBLAS(hegvx, HEGVX)

319:   #define LAPACKgerc_ PETSCBLAS(gerc, GERC)
320:   #define BLAShemv_   PETSCBLAS(hemv, HEMV)
321: #endif