xref: /petsc/include/petscblaslapack_mangle.h (revision a69119a591a03a9d906b29c0a4e9802e4d7c9795)
1 /*
2       This file deals with the BLAS/LAPACK naming convention on
3       non-Microsoft systems, which may append an underscore, use
4       upper or lower case, and/or use a configurable symbol suffix.
5 */
6 #if !defined(_BLASLAPACK_MANGLE_H)
7 #define _BLASLAPACK_MANGLE_H
8 
9 /****************************************************************************/
10 /* macros to mangle BLAS/LAPACK names as needed for linking */
11 
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)
18 
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
32 
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
106 
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 #define PETSCBLAS(x, X)        PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
111 #define PETSCBLASREAL(x, X)    PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, X, PETSC_BLASLAPACK_SUFFIX_)
112 #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, X, PETSC_BLASLAPACK_SUFFIX_)
113 #define PETSCBLASR(x, X)       PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
114 #else
115 #define PETSCBLAS(x, X)        PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
116 #define PETSCBLASREAL(x, X)    PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, x, PETSC_BLASLAPACK_SUFFIX_)
117 #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, x, PETSC_BLASLAPACK_SUFFIX_)
118 #define PETSCBLASR(x, X)       PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
119 #endif
120 
121 /****************************************************************************/
122 /* definitions of BLAS and LAPACK symbols */
123 
124 /* Subroutine names that are the same for real/complex data: */
125 /* no character-string arguments: */
126 #define LAPACKgeqrf_     PETSCBLAS(geqrf, GEQRF)
127 #define LAPACKgetrf_     PETSCBLAS(getrf, GETRF)
128 #define LAPACKgetri_     PETSCBLAS(getri, GETRI)
129 #define LAPACKREALgetrf_ PETSCBLASREAL(getrf, GETRF)
130 #define LAPACKREALgetri_ PETSCBLASREAL(getri, GETRI)
131 #define BLASnrm2_        PETSCBLASR(nrm2, NRM2)
132 #define BLASscal_        PETSCBLAS(scal, SCAL)
133 #define BLAScopy_        PETSCBLAS(copy, COPY)
134 #define BLASswap_        PETSCBLAS(swap, SWAP)
135 #define BLASaxpy_        PETSCBLAS(axpy, AXPY)
136 #define BLASasum_        PETSCBLASR(asum, ASUM)
137 #define LAPACKpttrf_     PETSCBLAS(pttrf, PTTRF) /* factorization of a spd tridiagonal matrix */
138 #define LAPACKpttrs_     PETSCBLAS(pttrs, PTTRS) /* solve a spd tridiagonal matrix system */
139 #if !defined(PETSC_MISSING_LAPACK_STEIN)
140 #define LAPACKstein_ PETSCBLAS(stein, STEIN) /* eigenvectors of real symm tridiagonal matrix */
141 #endif
142 #define LAPACKgesv_ PETSCBLAS(gesv, GESV)
143 #if !defined(PETSC_MISSING_LAPACK_GELSS)
144 #define LAPACKgelss_ PETSCBLAS(gelss, GELSS)
145 #endif
146 #if !defined(PETSC_MISSING_LAPACK_GERFS)
147 #define LAPACKgerfs_ PETSCBLAS(gerfs, GERFS)
148 #endif
149 #if !defined(PETSC_MISSING_LAPACK_TGSEN)
150 #define LAPACKtgsen_ PETSCBLAS(tgsen, TGSEN)
151 #endif
152 /* character-string arguments: */
153 #define LAPACKpotrf_ PETSCBLAS(potrf, POTRF)
154 #define LAPACKpotri_ PETSCBLAS(potri, POTRI)
155 #define LAPACKpotrs_ PETSCBLAS(potrs, POTRS)
156 #define LAPACKsytrf_ PETSCBLAS(sytrf, SYTRF)
157 #define LAPACKsytrs_ PETSCBLAS(sytrs, SYTRS)
158 #if !defined(PETSC_MISSING_LAPACK_SYTRI)
159 #define LAPACKsytri_ PETSCBLAS(sytri, SYTRI)
160 #endif
161 #define BLASgemv_     PETSCBLAS(gemv, GEMV)
162 #define LAPACKgetrs_  PETSCBLAS(getrs, GETRS)
163 #define BLAStrmv_     PETSCBLAS(trmv, TRMV)
164 #define BLASgemm_     PETSCBLAS(gemm, GEMM)
165 #define BLASsymm_     PETSCBLAS(symm, SYMM)
166 #define BLASsyrk_     PETSCBLAS(syrk, SYRK)
167 #define BLASsyr2k_    PETSCBLAS(syr2k, SYR2K)
168 #define BLAStrsm_     PETSCBLAS(trsm, TRSM)
169 #define BLASREALgemm_ PETSCBLASREAL(gemm, GEMM)
170 #define LAPACKgesvd_  PETSCBLAS(gesvd, GESVD)
171 #define LAPACKgeev_   PETSCBLAS(geev, GEEV)
172 #define LAPACKgels_   PETSCBLAS(gels, GELS)
173 #if !defined(PETSC_MISSING_LAPACK_STEGR)
174 #define LAPACKstegr_ PETSCBLAS(stegr, STEGR) /* eigenvalues and eigenvectors of symm tridiagonal */
175 #endif
176 #if !defined(PETSC_MISSING_LAPACK_STEQR)
177 #define LAPACKsteqr_     PETSCBLAS(steqr, STEQR) /* eigenvalues and eigenvectors of symm tridiagonal */
178 #define LAPACKREALsteqr_ PETSCBLASREAL(steqr, STEQR)
179 #endif
180 #if !defined(PETSC_MISSING_LAPACK_HSEQR)
181 #define LAPACKhseqr_ PETSCBLAS(hseqr, HSEQR)
182 #endif
183 #if !defined(PETSC_MISSING_LAPACK_GGES)
184 #define LAPACKgges_ PETSCBLAS(gges, GGES)
185 #endif
186 #if !defined(PETSC_MISSING_LAPACK_TRSEN)
187 #define LAPACKtrsen_ PETSCBLAS(trsen, TRSEN)
188 #endif
189 #if !defined(PETSC_MISSING_LAPACK_HGEQZ)
190 #define LAPACKhgeqz_ PETSCBLAS(hgeqz, HGEQZ)
191 #endif
192 #if !defined(PETSC_MISSING_LAPACK_TRTRS)
193 #define LAPACKtrtrs_ PETSCBLAS(trtrs, TRTRS)
194 #endif
195 
196 /* Subroutine names that differ for real/complex data: */
197 #if !defined(PETSC_USE_COMPLEX)
198 #if !defined(PETSC_MISSING_LAPACK_ORGQR)
199 #define LAPACKorgqr_ PETSCBLAS(orgqr, ORGQR)
200 #endif
201 #if !defined(PETSC_MISSING_LAPACK_ORMQR)
202 #define LAPACKormqr_ PETSCBLAS(ormqr, ORMQR)
203 #endif
204 #define BLASdot_  PETSCBLAS(dot, DOT)
205 #define BLASdotu_ PETSCBLAS(dot, DOT)
206 
207 #define LAPACKsyev_  PETSCBLAS(syev, SYEV)   /* eigenvalues and eigenvectors of a symm matrix */
208 #define LAPACKsyevx_ PETSCBLAS(syevx, SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
209 #define LAPACKsygv_  PETSCBLAS(sygv, SYGV)
210 #define LAPACKsygvx_ PETSCBLAS(sygvx, SYGVX)
211 
212 /* stebz does not exist for complex data */
213 #if !defined(PETSC_MISSING_LAPACK_STEBZ)
214 #define LAPACKstebz_ PETSCBLAS(stebz, STEBZ) /* eigenvalues of symm tridiagonal matrix */
215 #endif
216 #else
217 #define LAPACKhetrf_ PETSCBLAS(hetrf, HETRF)
218 #define LAPACKhetrs_ PETSCBLAS(hetrs, HETRS)
219 #define LAPACKhetri_ PETSCBLAS(hetri, HETRI)
220 #define LAPACKheev_  PETSCBLAS(heev, HEEV)
221 #if !defined(PETSC_MISSING_LAPACK_ORGQR)
222 #define LAPACKorgqr_ PETSCBLAS(ungqr, UNGQR)
223 #endif
224 #if !defined(PETSC_MISSING_LAPACK_ORMQR)
225 #define LAPACKormqr_ PETSCBLAS(unmqr, UNMQR)
226 #endif
227 /* note: dot and dotu are handled separately for complex data */
228 
229 #define LAPACKsyev_  PETSCBLAS(heev, HEEV)   /* eigenvalues and eigenvectors of a symm matrix */
230 #define LAPACKsyevx_ PETSCBLAS(heevx, HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
231 #define LAPACKsygv_  PETSCBLAS(hegv, HEGV)
232 #define LAPACKsygvx_ PETSCBLAS(hegvx, HEGVX)
233 #endif
234 
235 #endif
236