xref: /petsc/include/petscblaslapack_mangle.h (revision 0ff9d02ecf1627951ed050a8344155223c6ca4ea)
1e5b2100bSSteven G. Johnson /*
2e5b2100bSSteven G. Johnson       This file deals with the BLAS/LAPACK naming convention on
316a05f60SBarry Smith       non-Microsoft Windows systems, which may append an underscore, use
4e5b2100bSSteven G. Johnson       upper or lower case, and/or use a configurable symbol suffix.
5e5b2100bSSteven G. Johnson */
6a4963045SJacob Faibussowitsch #pragma once
7e5b2100bSSteven G. Johnson 
8*1850900dSBarry Smith /* MANSEC = Sys */
9*1850900dSBarry Smith 
10e5b2100bSSteven G. Johnson /* macros to mangle BLAS/LAPACK names as needed for linking */
11e5b2100bSSteven G. Johnson 
12e5b2100bSSteven G. Johnson /* token pasting, with an extra level of indirection so that we
13e5b2100bSSteven G. Johnson    can paste the contents of other preprocessor #definitions */
14e5b2100bSSteven G. Johnson #define PETSC_PASTE2_(a, b)    a##b
15e5b2100bSSteven G. Johnson #define PETSC_PASTE2(a, b)     PETSC_PASTE2_(a, b)
16e5b2100bSSteven G. Johnson #define PETSC_PASTE3_(a, b, c) a##b##c
17e5b2100bSSteven G. Johnson #define PETSC_PASTE3(a, b, c)  PETSC_PASTE3_(a, b, c)
18e5b2100bSSteven G. Johnson 
19e5b2100bSSteven G. Johnson #if !defined(PETSC_BLASLAPACK_SUFFIX)
20e5b2100bSSteven G. Johnson   #if defined(PETSC_BLASLAPACK_UNDERSCORE)
21e5b2100bSSteven G. Johnson     #define PETSC_BLASLAPACK_SUFFIX_ _
22e5b2100bSSteven G. Johnson   #else
23e5b2100bSSteven G. Johnson     #define PETSC_BLASLAPACK_SUFFIX_
24e5b2100bSSteven G. Johnson   #endif
25e5b2100bSSteven G. Johnson #else
26e5b2100bSSteven G. Johnson   #if defined(PETSC_BLASLAPACK_UNDERSCORE)
27e5b2100bSSteven G. Johnson     #define PETSC_BLASLAPACK_SUFFIX_ PETSC_PASTE2(PETSC_BLASLAPACK_SUFFIX, _)
28e5b2100bSSteven G. Johnson   #else
29e5b2100bSSteven G. Johnson     #define PETSC_BLASLAPACK_SUFFIX_ PETSC_BLASLAPACK_SUFFIX
30e5b2100bSSteven G. Johnson   #endif
31e5b2100bSSteven G. Johnson #endif
32e5b2100bSSteven G. Johnson 
33eef667f9SJose E. Roman /* complex/real and single/double/quad/half precision prefixes: */
34e5b2100bSSteven G. Johnson #if !defined(PETSC_USE_COMPLEX)
35e5b2100bSSteven G. Johnson   #if defined(PETSC_BLASLAPACK_CAPS)
36e5b2100bSSteven G. Johnson     #if defined(PETSC_USE_REAL_SINGLE)
37e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_        S
385cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX C
39e5b2100bSSteven G. Johnson     #elif defined(PETSC_USE_REAL_DOUBLE)
40e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_        D
415cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX Z
42b161f5d8SJose E. Roman     #elif defined(PETSC_USE_REAL___FLOAT128)
43e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_        Q
445cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX W
45b161f5d8SJose E. Roman     #else
46b161f5d8SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_        H
475cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX K
48e5b2100bSSteven G. Johnson     #endif
49e5b2100bSSteven G. Johnson   #else
50e5b2100bSSteven G. Johnson     #if defined(PETSC_USE_REAL_SINGLE)
51e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_        s
525cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX c
53e5b2100bSSteven G. Johnson     #elif defined(PETSC_USE_REAL_DOUBLE)
54e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_        d
555cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX z
56570b7f6dSBarry Smith     #elif defined(PETSC_USE_REAL___FLOAT128)
57e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_        q
585cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX w
59570b7f6dSBarry Smith     #else
60570b7f6dSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_        h
615cfd3391SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_COMPLEX k
62e5b2100bSSteven G. Johnson     #endif
63e5b2100bSSteven G. Johnson   #endif
64e5b2100bSSteven G. Johnson   #define PETSC_BLASLAPACK_RPREFIX_    PETSC_BLASLAPACK_PREFIX_
655cfd3391SJose E. Roman   #define PETSC_BLASLAPACK_PREFIX_REAL PETSC_BLASLAPACK_PREFIX_
66e5b2100bSSteven G. Johnson #else
67e5b2100bSSteven G. Johnson   #if defined(PETSC_BLASLAPACK_CAPS)
68e5b2100bSSteven G. Johnson     #if defined(PETSC_USE_REAL_SINGLE)
69e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_     C
7070c87898SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_REAL S
71e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_RPREFIX_    SC
72e5b2100bSSteven G. Johnson     #elif defined(PETSC_USE_REAL_DOUBLE)
73e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_     Z
74f1058c0fSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_REAL D
75e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_RPREFIX_    DZ
76570b7f6dSBarry Smith     #elif defined(PETSC_USE_REAL___FLOAT128)
77e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_     W
78f1058c0fSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_REAL Q
79e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_RPREFIX_    QW
80570b7f6dSBarry Smith     #else
81eef667f9SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_     K
82f1058c0fSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_REAL H
83eef667f9SJose E. Roman       #define PETSC_BLASLAPACK_RPREFIX_    HK
84e5b2100bSSteven G. Johnson     #endif
85e5b2100bSSteven G. Johnson   #else
86e5b2100bSSteven G. Johnson     #if defined(PETSC_USE_REAL_SINGLE)
87e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_     c
88f1058c0fSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_REAL s
89e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_RPREFIX_    sc
90e5b2100bSSteven G. Johnson     #elif defined(PETSC_USE_REAL_DOUBLE)
91e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_     z
92f1058c0fSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_REAL d
93e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_RPREFIX_    dz
94570b7f6dSBarry Smith     #elif defined(PETSC_USE_REAL___FLOAT128)
95e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_PREFIX_     w
96f1058c0fSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_REAL q
97e5b2100bSSteven G. Johnson       #define PETSC_BLASLAPACK_RPREFIX_    qw
98570b7f6dSBarry Smith     #else
99eef667f9SJose E. Roman       #define PETSC_BLASLAPACK_PREFIX_     k
100f1058c0fSBarry Smith       #define PETSC_BLASLAPACK_PREFIX_REAL h
101eef667f9SJose E. Roman       #define PETSC_BLASLAPACK_RPREFIX_    hk
102e5b2100bSSteven G. Johnson     #endif
103e5b2100bSSteven G. Johnson   #endif
1045cfd3391SJose E. Roman   #define PETSC_BLASLAPACK_PREFIX_COMPLEX PETSC_BLASLAPACK_PREFIX_
105e5b2100bSSteven G. Johnson #endif
106e5b2100bSSteven G. Johnson 
107e5b2100bSSteven G. Johnson /* define macros PETSCBLAS to mangle BLAS/LAPACK subroutine names, and
108e5b2100bSSteven G. Johnson    PETSCBLASR for functions returning real values */
109e5b2100bSSteven G. Johnson #if defined(PETSC_BLASLAPACK_CAPS)
110e5b2100bSSteven G. Johnson   #define PETSCBLAS(x, X)        PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
111f1058c0fSBarry Smith   #define PETSCBLASREAL(x, X)    PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, X, PETSC_BLASLAPACK_SUFFIX_)
1125cfd3391SJose E. Roman   #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, X, PETSC_BLASLAPACK_SUFFIX_)
113e5b2100bSSteven G. Johnson   #define PETSCBLASR(x, X)       PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
114e5b2100bSSteven G. Johnson #else
115e5b2100bSSteven G. Johnson   #define PETSCBLAS(x, X)        PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
116f1058c0fSBarry Smith   #define PETSCBLASREAL(x, X)    PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, x, PETSC_BLASLAPACK_SUFFIX_)
1175cfd3391SJose E. Roman   #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, x, PETSC_BLASLAPACK_SUFFIX_)
118e5b2100bSSteven G. Johnson   #define PETSCBLASR(x, X)       PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
119e5b2100bSSteven G. Johnson #endif
120e5b2100bSSteven G. Johnson 
121e5b2100bSSteven G. Johnson /* definitions of BLAS and LAPACK symbols */
122e5b2100bSSteven G. Johnson 
123e5b2100bSSteven G. Johnson /* Subroutine names that are the same for real/complex data: */
124e5b2100bSSteven G. Johnson /* no character-string arguments: */
125e5b2100bSSteven G. Johnson #define LAPACKgeqrf_     PETSCBLAS(geqrf, GEQRF)
126e5b2100bSSteven G. Johnson #define LAPACKgetrf_     PETSCBLAS(getrf, GETRF)
127e5b2100bSSteven G. Johnson #define LAPACKgetri_     PETSCBLAS(getri, GETRI)
128b9d4cb8dSJed Brown #define LAPACKREALgetrf_ PETSCBLASREAL(getrf, GETRF)
129b9d4cb8dSJed Brown #define LAPACKREALgetri_ PETSCBLASREAL(getri, GETRI)
130e5b2100bSSteven G. Johnson #define BLASnrm2_        PETSCBLASR(nrm2, NRM2)
131e5b2100bSSteven G. Johnson #define BLASscal_        PETSCBLAS(scal, SCAL)
132e5b2100bSSteven G. Johnson #define BLAScopy_        PETSCBLAS(copy, COPY)
133e5b2100bSSteven G. Johnson #define BLASswap_        PETSCBLAS(swap, SWAP)
134e5b2100bSSteven G. Johnson #define BLASaxpy_        PETSCBLAS(axpy, AXPY)
135e5b2100bSSteven G. Johnson #define BLASasum_        PETSCBLASR(asum, ASUM)
136e5b2100bSSteven G. Johnson #define LAPACKpttrf_     PETSCBLAS(pttrf, PTTRF) /* factorization of a spd tridiagonal matrix */
137e5b2100bSSteven G. Johnson #define LAPACKpttrs_     PETSCBLAS(pttrs, PTTRS) /* solve a spd tridiagonal matrix system */
1383c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEIN)
139e5b2100bSSteven G. Johnson   #define LAPACKstein_ PETSCBLAS(stein, STEIN) /* eigenvectors of real symm tridiagonal matrix */
1403c377650SSatish Balay #endif
141e5b2100bSSteven G. Johnson #define LAPACKgesv_ PETSCBLAS(gesv, GESV)
1423c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GELSS)
143e5b2100bSSteven G. Johnson   #define LAPACKgelss_ PETSCBLAS(gelss, GELSS)
1443c377650SSatish Balay #endif
1453c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GERFS)
146e5b2100bSSteven G. Johnson   #define LAPACKgerfs_ PETSCBLAS(gerfs, GERFS)
1473c377650SSatish Balay #endif
1483c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TGSEN)
149e5b2100bSSteven G. Johnson   #define LAPACKtgsen_ PETSCBLAS(tgsen, TGSEN)
1503c377650SSatish Balay #endif
151e5b2100bSSteven G. Johnson /* character-string arguments: */
152c901295dSPablo Brubeck #define LAPACKtrtri_ PETSCBLAS(trtri, TRTRI)
153e5b2100bSSteven G. Johnson #define LAPACKpotrf_ PETSCBLAS(potrf, POTRF)
154e5b2100bSSteven G. Johnson #define LAPACKpotri_ PETSCBLAS(potri, POTRI)
155e5b2100bSSteven G. Johnson #define LAPACKpotrs_ PETSCBLAS(potrs, POTRS)
156e5b2100bSSteven G. Johnson #define LAPACKsytrf_ PETSCBLAS(sytrf, SYTRF)
157e5b2100bSSteven G. Johnson #define LAPACKsytrs_ PETSCBLAS(sytrs, SYTRS)
1583c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_SYTRI)
159e5b2100bSSteven G. Johnson   #define LAPACKsytri_ PETSCBLAS(sytri, SYTRI)
1603c377650SSatish Balay #endif
161e5b2100bSSteven G. Johnson #define BLASgemv_     PETSCBLAS(gemv, GEMV)
162e5b2100bSSteven G. Johnson #define LAPACKgetrs_  PETSCBLAS(getrs, GETRS)
163e5b2100bSSteven G. Johnson #define BLAStrmv_     PETSCBLAS(trmv, TRMV)
164be1c5b79SHansol Suh #define BLAStrsv_     PETSCBLAS(trsv, TRSV)
165e5b2100bSSteven G. Johnson #define BLASgemm_     PETSCBLAS(gemm, GEMM)
166e5b2100bSSteven G. Johnson #define BLASsymm_     PETSCBLAS(symm, SYMM)
1673f9d1987SStefano Zampini #define BLASsyrk_     PETSCBLAS(syrk, SYRK)
1683f9d1987SStefano Zampini #define BLASsyr2k_    PETSCBLAS(syr2k, SYR2K)
169e5b2100bSSteven G. Johnson #define BLAStrsm_     PETSCBLAS(trsm, TRSM)
170b9d4cb8dSJed Brown #define BLASREALgemm_ PETSCBLASREAL(gemm, GEMM)
171e5b2100bSSteven G. Johnson #define LAPACKgesvd_  PETSCBLAS(gesvd, GESVD)
172e5b2100bSSteven G. Johnson #define LAPACKgeev_   PETSCBLAS(geev, GEEV)
1739d150b73SToby Isaac #define LAPACKgels_   PETSCBLAS(gels, GELS)
1749369748bSToby Isaac #if !defined(PETSC_MISSING_LAPACK_STEGR)
1759369748bSToby Isaac   #define LAPACKstegr_ PETSCBLAS(stegr, STEGR) /* eigenvalues and eigenvectors of symm tridiagonal */
1769369748bSToby Isaac #endif
1773c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEQR)
178e5b2100bSSteven G. Johnson   #define LAPACKsteqr_     PETSCBLAS(steqr, STEQR) /* eigenvalues and eigenvectors of symm tridiagonal */
179f1058c0fSBarry Smith   #define LAPACKREALsteqr_ PETSCBLASREAL(steqr, STEQR)
1803c377650SSatish Balay #endif
181ee1793ccSZach Atkins #if !defined(PETSC_MISSING_LAPACK_STEV)
182ee1793ccSZach Atkins   #define LAPACKstev_     PETSCBLAS(stev, STEV) /* eigenvalues and eigenvectors of symm tridiagonal */
183ee1793ccSZach Atkins   #define LAPACKREALstev_ PETSCBLASREAL(stev, STEV)
184ee1793ccSZach Atkins #endif
1853c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_HSEQR)
186e5b2100bSSteven G. Johnson   #define LAPACKhseqr_ PETSCBLAS(hseqr, HSEQR)
1873c377650SSatish Balay #endif
1883c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GGES)
189e5b2100bSSteven G. Johnson   #define LAPACKgges_ PETSCBLAS(gges, GGES)
1903c377650SSatish Balay #endif
1913c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TRSEN)
192e5b2100bSSteven G. Johnson   #define LAPACKtrsen_ PETSCBLAS(trsen, TRSEN)
1933c377650SSatish Balay #endif
1943c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_HGEQZ)
195e5b2100bSSteven G. Johnson   #define LAPACKhgeqz_ PETSCBLAS(hgeqz, HGEQZ)
1963c377650SSatish Balay #endif
1973c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TRTRS)
198e5b2100bSSteven G. Johnson   #define LAPACKtrtrs_ PETSCBLAS(trtrs, TRTRS)
1993c377650SSatish Balay #endif
200e5b2100bSSteven G. Johnson 
201e5b2100bSSteven G. Johnson /* Subroutine names that differ for real/complex data: */
202e5b2100bSSteven G. Johnson #if !defined(PETSC_USE_COMPLEX)
2033c377650SSatish Balay   #if !defined(PETSC_MISSING_LAPACK_ORGQR)
204c964aadfSJose E. Roman     #define LAPACKorgqr_ PETSCBLAS(orgqr, ORGQR)
2053c377650SSatish Balay   #endif
2063c377650SSatish Balay   #if !defined(PETSC_MISSING_LAPACK_ORMQR)
207872393edSJose E. Roman     #define LAPACKormqr_ PETSCBLAS(ormqr, ORMQR)
2083c377650SSatish Balay   #endif
209e5b2100bSSteven G. Johnson   #define BLASdot_  PETSCBLAS(dot, DOT)
210e5b2100bSSteven G. Johnson   #define BLASdotu_ PETSCBLAS(dot, DOT)
211e5b2100bSSteven G. Johnson 
212e5b2100bSSteven G. Johnson   #define LAPACKsyev_  PETSCBLAS(syev, SYEV)   /* eigenvalues and eigenvectors of a symm matrix */
213e5b2100bSSteven G. Johnson   #define LAPACKsyevx_ PETSCBLAS(syevx, SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
214e5b2100bSSteven G. Johnson   #define LAPACKsygv_  PETSCBLAS(sygv, SYGV)
215e5b2100bSSteven G. Johnson   #define LAPACKsygvx_ PETSCBLAS(sygvx, SYGVX)
216e5b2100bSSteven G. Johnson 
217e5b2100bSSteven G. Johnson   /* stebz does not exist for complex data */
2183c377650SSatish Balay   #if !defined(PETSC_MISSING_LAPACK_STEBZ)
219e5b2100bSSteven G. Johnson     #define LAPACKstebz_ PETSCBLAS(stebz, STEBZ) /* eigenvalues of symm tridiagonal matrix */
2203c377650SSatish Balay   #endif
2213a8969d3SToby Isaac   #define LAPACKgerc_ PETSCBLAS(ger, GER)
2223a8969d3SToby Isaac   #define BLAShemv_   PETSCBLAS(symv, SYMV)
223e5b2100bSSteven G. Johnson #else
22465da4498SStefano Zampini   #define LAPACKhetrf_ PETSCBLAS(hetrf, HETRF)
22565da4498SStefano Zampini   #define LAPACKhetrs_ PETSCBLAS(hetrs, HETRS)
22665da4498SStefano Zampini   #define LAPACKhetri_ PETSCBLAS(hetri, HETRI)
2271153b427SDavid Wells   #define LAPACKheev_  PETSCBLAS(heev, HEEV)
2283c377650SSatish Balay   #if !defined(PETSC_MISSING_LAPACK_ORGQR)
229c964aadfSJose E. Roman     #define LAPACKorgqr_ PETSCBLAS(ungqr, UNGQR)
2303c377650SSatish Balay   #endif
2313c377650SSatish Balay   #if !defined(PETSC_MISSING_LAPACK_ORMQR)
232872393edSJose E. Roman     #define LAPACKormqr_ PETSCBLAS(unmqr, UNMQR)
2333c377650SSatish Balay   #endif
234e5b2100bSSteven G. Johnson /* note: dot and dotu are handled separately for complex data */
235e5b2100bSSteven G. Johnson 
236e5b2100bSSteven G. Johnson   #define LAPACKsyev_  PETSCBLAS(heev, HEEV)   /* eigenvalues and eigenvectors of a symm matrix */
237e5b2100bSSteven G. Johnson   #define LAPACKsyevx_ PETSCBLAS(heevx, HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
238e5b2100bSSteven G. Johnson   #define LAPACKsygv_  PETSCBLAS(hegv, HEGV)
239e5b2100bSSteven G. Johnson   #define LAPACKsygvx_ PETSCBLAS(hegvx, HEGVX)
2403a8969d3SToby Isaac 
2413a8969d3SToby Isaac   #define LAPACKgerc_ PETSCBLAS(gerc, GERC)
2423a8969d3SToby Isaac   #define BLAShemv_   PETSCBLAS(hemv, HEMV)
243e5b2100bSSteven G. Johnson #endif
244