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