xref: /petsc/include/petscblaslapack_mangle.h (revision 4dbf25a8fa98e38799e7b47dcb2d8a9309975f41)
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
7 
8 /* macros to mangle BLAS/LAPACK names as needed for linking */
9 
10 /* token pasting, with an extra level of indirection so that we
11    can paste the contents of other preprocessor #definitions */
12 #define PETSC_PASTE2_(a, b)    a##b
13 #define PETSC_PASTE2(a, b)     PETSC_PASTE2_(a, b)
14 #define PETSC_PASTE3_(a, b, c) a##b##c
15 #define PETSC_PASTE3(a, b, c)  PETSC_PASTE3_(a, b, c)
16 
17 #if !defined(PETSC_BLASLAPACK_SUFFIX)
18   #if defined(PETSC_BLASLAPACK_UNDERSCORE)
19     #define PETSC_BLASLAPACK_SUFFIX_ _
20   #else
21     #define PETSC_BLASLAPACK_SUFFIX_
22   #endif
23 #else
24   #if defined(PETSC_BLASLAPACK_UNDERSCORE)
25     #define PETSC_BLASLAPACK_SUFFIX_ PETSC_PASTE2(PETSC_BLASLAPACK_SUFFIX, _)
26   #else
27     #define PETSC_BLASLAPACK_SUFFIX_ PETSC_BLASLAPACK_SUFFIX
28   #endif
29 #endif
30 
31 /* complex/real and single/double/quad/half precision prefixes: */
32 #if !defined(PETSC_USE_COMPLEX)
33   #if defined(PETSC_BLASLAPACK_CAPS)
34     #if defined(PETSC_USE_REAL_SINGLE)
35       #define PETSC_BLASLAPACK_PREFIX_        S
36       #define PETSC_BLASLAPACK_PREFIX_COMPLEX C
37     #elif defined(PETSC_USE_REAL_DOUBLE)
38       #define PETSC_BLASLAPACK_PREFIX_        D
39       #define PETSC_BLASLAPACK_PREFIX_COMPLEX Z
40     #elif defined(PETSC_USE_REAL___FLOAT128)
41       #define PETSC_BLASLAPACK_PREFIX_        Q
42       #define PETSC_BLASLAPACK_PREFIX_COMPLEX W
43     #else
44       #define PETSC_BLASLAPACK_PREFIX_        H
45       #define PETSC_BLASLAPACK_PREFIX_COMPLEX K
46     #endif
47   #else
48     #if defined(PETSC_USE_REAL_SINGLE)
49       #define PETSC_BLASLAPACK_PREFIX_        s
50       #define PETSC_BLASLAPACK_PREFIX_COMPLEX c
51     #elif defined(PETSC_USE_REAL_DOUBLE)
52       #define PETSC_BLASLAPACK_PREFIX_        d
53       #define PETSC_BLASLAPACK_PREFIX_COMPLEX z
54     #elif defined(PETSC_USE_REAL___FLOAT128)
55       #define PETSC_BLASLAPACK_PREFIX_        q
56       #define PETSC_BLASLAPACK_PREFIX_COMPLEX w
57     #else
58       #define PETSC_BLASLAPACK_PREFIX_        h
59       #define PETSC_BLASLAPACK_PREFIX_COMPLEX k
60     #endif
61   #endif
62   #define PETSC_BLASLAPACK_RPREFIX_    PETSC_BLASLAPACK_PREFIX_
63   #define PETSC_BLASLAPACK_PREFIX_REAL PETSC_BLASLAPACK_PREFIX_
64 #else
65   #if defined(PETSC_BLASLAPACK_CAPS)
66     #if defined(PETSC_USE_REAL_SINGLE)
67       #define PETSC_BLASLAPACK_PREFIX_     C
68       #define PETSC_BLASLAPACK_PREFIX_REAL S
69       #define PETSC_BLASLAPACK_RPREFIX_    SC
70     #elif defined(PETSC_USE_REAL_DOUBLE)
71       #define PETSC_BLASLAPACK_PREFIX_     Z
72       #define PETSC_BLASLAPACK_PREFIX_REAL D
73       #define PETSC_BLASLAPACK_RPREFIX_    DZ
74     #elif defined(PETSC_USE_REAL___FLOAT128)
75       #define PETSC_BLASLAPACK_PREFIX_     W
76       #define PETSC_BLASLAPACK_PREFIX_REAL Q
77       #define PETSC_BLASLAPACK_RPREFIX_    QW
78     #else
79       #define PETSC_BLASLAPACK_PREFIX_     K
80       #define PETSC_BLASLAPACK_PREFIX_REAL H
81       #define PETSC_BLASLAPACK_RPREFIX_    HK
82     #endif
83   #else
84     #if defined(PETSC_USE_REAL_SINGLE)
85       #define PETSC_BLASLAPACK_PREFIX_     c
86       #define PETSC_BLASLAPACK_PREFIX_REAL s
87       #define PETSC_BLASLAPACK_RPREFIX_    sc
88     #elif defined(PETSC_USE_REAL_DOUBLE)
89       #define PETSC_BLASLAPACK_PREFIX_     z
90       #define PETSC_BLASLAPACK_PREFIX_REAL d
91       #define PETSC_BLASLAPACK_RPREFIX_    dz
92     #elif defined(PETSC_USE_REAL___FLOAT128)
93       #define PETSC_BLASLAPACK_PREFIX_     w
94       #define PETSC_BLASLAPACK_PREFIX_REAL q
95       #define PETSC_BLASLAPACK_RPREFIX_    qw
96     #else
97       #define PETSC_BLASLAPACK_PREFIX_     k
98       #define PETSC_BLASLAPACK_PREFIX_REAL h
99       #define PETSC_BLASLAPACK_RPREFIX_    hk
100     #endif
101   #endif
102   #define PETSC_BLASLAPACK_PREFIX_COMPLEX PETSC_BLASLAPACK_PREFIX_
103 #endif
104 
105 /* define macros PETSCBLAS to mangle BLAS/LAPACK subroutine names, and
106    PETSCBLASR for functions returning real values */
107 #if defined(PETSC_BLASLAPACK_CAPS)
108   #define PETSCBLAS(x, X)        PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
109   #define PETSCBLASREAL(x, X)    PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, X, PETSC_BLASLAPACK_SUFFIX_)
110   #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, X, PETSC_BLASLAPACK_SUFFIX_)
111   #define PETSCBLASR(x, X)       PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
112 #else
113   #define PETSCBLAS(x, X)        PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
114   #define PETSCBLASREAL(x, X)    PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, x, PETSC_BLASLAPACK_SUFFIX_)
115   #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, x, PETSC_BLASLAPACK_SUFFIX_)
116   #define PETSCBLASR(x, X)       PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
117 #endif
118 
119 /* definitions of BLAS and LAPACK symbols */
120 
121 /* Subroutine names that are the same for real/complex data: */
122 /* no character-string arguments: */
123 #define LAPACKgeqrf_     PETSCBLAS(geqrf, GEQRF)
124 #define LAPACKgetrf_     PETSCBLAS(getrf, GETRF)
125 #define LAPACKgetri_     PETSCBLAS(getri, GETRI)
126 #define LAPACKREALgetrf_ PETSCBLASREAL(getrf, GETRF)
127 #define LAPACKREALgetri_ PETSCBLASREAL(getri, GETRI)
128 #define BLASnrm2_        PETSCBLASR(nrm2, NRM2)
129 #define BLASscal_        PETSCBLAS(scal, SCAL)
130 #define BLAScopy_        PETSCBLAS(copy, COPY)
131 #define BLASswap_        PETSCBLAS(swap, SWAP)
132 #define BLASaxpy_        PETSCBLAS(axpy, AXPY)
133 #define BLASasum_        PETSCBLASR(asum, ASUM)
134 #define LAPACKpttrf_     PETSCBLAS(pttrf, PTTRF) /* factorization of a spd tridiagonal matrix */
135 #define LAPACKpttrs_     PETSCBLAS(pttrs, PTTRS) /* solve a spd tridiagonal matrix system */
136 #if !defined(PETSC_MISSING_LAPACK_STEIN)
137   #define LAPACKstein_ PETSCBLAS(stein, STEIN) /* eigenvectors of real symm tridiagonal matrix */
138 #endif
139 #define LAPACKgesv_ PETSCBLAS(gesv, GESV)
140 #if !defined(PETSC_MISSING_LAPACK_GELSS)
141   #define LAPACKgelss_ PETSCBLAS(gelss, GELSS)
142 #endif
143 #if !defined(PETSC_MISSING_LAPACK_GERFS)
144   #define LAPACKgerfs_ PETSCBLAS(gerfs, GERFS)
145 #endif
146 #if !defined(PETSC_MISSING_LAPACK_TGSEN)
147   #define LAPACKtgsen_ PETSCBLAS(tgsen, TGSEN)
148 #endif
149 /* character-string arguments: */
150 #define LAPACKtrtri_ PETSCBLAS(trtri, TRTRI)
151 #define LAPACKpotrf_ PETSCBLAS(potrf, POTRF)
152 #define LAPACKpotri_ PETSCBLAS(potri, POTRI)
153 #define LAPACKpotrs_ PETSCBLAS(potrs, POTRS)
154 #define LAPACKsytrf_ PETSCBLAS(sytrf, SYTRF)
155 #define LAPACKsytrs_ PETSCBLAS(sytrs, SYTRS)
156 #if !defined(PETSC_MISSING_LAPACK_SYTRI)
157   #define LAPACKsytri_ PETSCBLAS(sytri, SYTRI)
158 #endif
159 #define BLASgemv_     PETSCBLAS(gemv, GEMV)
160 #define LAPACKgetrs_  PETSCBLAS(getrs, GETRS)
161 #define BLAStrmv_     PETSCBLAS(trmv, TRMV)
162 #define BLAStrsv_     PETSCBLAS(trsv, TRSV)
163 #define BLASgemm_     PETSCBLAS(gemm, GEMM)
164 #define BLASsymm_     PETSCBLAS(symm, SYMM)
165 #define BLASsyrk_     PETSCBLAS(syrk, SYRK)
166 #define BLASsyr2k_    PETSCBLAS(syr2k, SYR2K)
167 #define BLAStrsm_     PETSCBLAS(trsm, TRSM)
168 #define BLASREALgemm_ PETSCBLASREAL(gemm, GEMM)
169 #define LAPACKgesvd_  PETSCBLAS(gesvd, GESVD)
170 #define LAPACKgeev_   PETSCBLAS(geev, GEEV)
171 #define LAPACKgels_   PETSCBLAS(gels, GELS)
172 #if !defined(PETSC_MISSING_LAPACK_STEGR)
173   #define LAPACKstegr_ PETSCBLAS(stegr, STEGR) /* eigenvalues and eigenvectors of symm tridiagonal */
174 #endif
175 #if !defined(PETSC_MISSING_LAPACK_STEQR)
176   #define LAPACKsteqr_     PETSCBLAS(steqr, STEQR) /* eigenvalues and eigenvectors of symm tridiagonal */
177   #define LAPACKREALsteqr_ PETSCBLASREAL(steqr, STEQR)
178 #endif
179 #if !defined(PETSC_MISSING_LAPACK_STEV)
180   #define LAPACKstev_     PETSCBLAS(stev, STEV) /* eigenvalues and eigenvectors of symm tridiagonal */
181   #define LAPACKREALstev_ PETSCBLASREAL(stev, STEV)
182 #endif
183 #if !defined(PETSC_MISSING_LAPACK_HSEQR)
184   #define LAPACKhseqr_ PETSCBLAS(hseqr, HSEQR)
185 #endif
186 #if !defined(PETSC_MISSING_LAPACK_GGES)
187   #define LAPACKgges_ PETSCBLAS(gges, GGES)
188 #endif
189 #if !defined(PETSC_MISSING_LAPACK_TRSEN)
190   #define LAPACKtrsen_ PETSCBLAS(trsen, TRSEN)
191 #endif
192 #if !defined(PETSC_MISSING_LAPACK_HGEQZ)
193   #define LAPACKhgeqz_ PETSCBLAS(hgeqz, HGEQZ)
194 #endif
195 #if !defined(PETSC_MISSING_LAPACK_TRTRS)
196   #define LAPACKtrtrs_ PETSCBLAS(trtrs, TRTRS)
197 #endif
198 
199 /* Subroutine names that differ for real/complex data: */
200 #if !defined(PETSC_USE_COMPLEX)
201   #if !defined(PETSC_MISSING_LAPACK_ORGQR)
202     #define LAPACKorgqr_ PETSCBLAS(orgqr, ORGQR)
203   #endif
204   #if !defined(PETSC_MISSING_LAPACK_ORMQR)
205     #define LAPACKormqr_ PETSCBLAS(ormqr, ORMQR)
206   #endif
207   #define BLASdot_  PETSCBLAS(dot, DOT)
208   #define BLASdotu_ PETSCBLAS(dot, DOT)
209 
210   #define LAPACKsyev_  PETSCBLAS(syev, SYEV)   /* eigenvalues and eigenvectors of a symm matrix */
211   #define LAPACKsyevx_ PETSCBLAS(syevx, SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
212   #define LAPACKsygv_  PETSCBLAS(sygv, SYGV)
213   #define LAPACKsygvx_ PETSCBLAS(sygvx, SYGVX)
214 
215   /* stebz does not exist for complex data */
216   #if !defined(PETSC_MISSING_LAPACK_STEBZ)
217     #define LAPACKstebz_ PETSCBLAS(stebz, STEBZ) /* eigenvalues of symm tridiagonal matrix */
218   #endif
219   #define LAPACKgerc_ PETSCBLAS(ger, GER)
220   #define BLAShemv_   PETSCBLAS(symv, SYMV)
221 #else
222   #define LAPACKhetrf_ PETSCBLAS(hetrf, HETRF)
223   #define LAPACKhetrs_ PETSCBLAS(hetrs, HETRS)
224   #define LAPACKhetri_ PETSCBLAS(hetri, HETRI)
225   #define LAPACKheev_  PETSCBLAS(heev, HEEV)
226   #if !defined(PETSC_MISSING_LAPACK_ORGQR)
227     #define LAPACKorgqr_ PETSCBLAS(ungqr, UNGQR)
228   #endif
229   #if !defined(PETSC_MISSING_LAPACK_ORMQR)
230     #define LAPACKormqr_ PETSCBLAS(unmqr, UNMQR)
231   #endif
232 /* note: dot and dotu are handled separately for complex data */
233 
234   #define LAPACKsyev_  PETSCBLAS(heev, HEEV)   /* eigenvalues and eigenvectors of a symm matrix */
235   #define LAPACKsyevx_ PETSCBLAS(heevx, HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
236   #define LAPACKsygv_  PETSCBLAS(hegv, HEGV)
237   #define LAPACKsygvx_ PETSCBLAS(hegvx, HEGVX)
238 
239   #define LAPACKgerc_ PETSCBLAS(gerc, GERC)
240   #define BLAShemv_   PETSCBLAS(hemv, HEMV)
241 #endif
242