xref: /petsc/include/petscblaslapack_mangle.h (revision 9369748b2bc19a5d839ec476b2c9a6cf9f5bc18a)
1e5b2100bSSteven G. Johnson /*
2e5b2100bSSteven G. Johnson       This file deals with the BLAS/LAPACK naming convention on
3e5b2100bSSteven G. Johnson       non-Microsoft systems, which may append an underscore, use
4e5b2100bSSteven G. Johnson       upper or lower case, and/or use a configurable symbol suffix.
5e5b2100bSSteven G. Johnson */
6e5b2100bSSteven G. Johnson #if !defined(_BLASLAPACK_MANGLE_H)
7e5b2100bSSteven G. Johnson #define _BLASLAPACK_MANGLE_H
8e5b2100bSSteven G. Johnson 
9e5b2100bSSteven G. Johnson /****************************************************************************/
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 /****************************************************************************/
122e5b2100bSSteven G. Johnson /* definitions of BLAS and LAPACK symbols */
123e5b2100bSSteven G. Johnson 
124e5b2100bSSteven G. Johnson /* Subroutine names that are the same for real/complex data: */
125e5b2100bSSteven G. Johnson /* no character-string arguments: */
126e5b2100bSSteven G. Johnson #define LAPACKgeqrf_ PETSCBLAS(geqrf,GEQRF)
127e5b2100bSSteven G. Johnson #define LAPACKgetrf_ PETSCBLAS(getrf,GETRF)
128e5b2100bSSteven G. Johnson #define LAPACKgetri_ PETSCBLAS(getri,GETRI)
129b9d4cb8dSJed Brown #define LAPACKREALgetrf_ PETSCBLASREAL(getrf,GETRF)
130b9d4cb8dSJed Brown #define LAPACKREALgetri_ PETSCBLASREAL(getri,GETRI)
131e5b2100bSSteven G. Johnson #define BLASnrm2_    PETSCBLASR(nrm2,NRM2)
132e5b2100bSSteven G. Johnson #define BLASscal_    PETSCBLAS(scal,SCAL)
133e5b2100bSSteven G. Johnson #define BLAScopy_    PETSCBLAS(copy,COPY)
134e5b2100bSSteven G. Johnson #define BLASswap_    PETSCBLAS(swap,SWAP)
135e5b2100bSSteven G. Johnson #define BLASaxpy_    PETSCBLAS(axpy,AXPY)
136e5b2100bSSteven G. Johnson #define BLASasum_    PETSCBLASR(asum,ASUM)
137e5b2100bSSteven G. Johnson #define LAPACKpttrf_ PETSCBLAS(pttrf,PTTRF) /* factorization of a spd tridiagonal matrix */
138e5b2100bSSteven G. Johnson #define LAPACKpttrs_ PETSCBLAS(pttrs,PTTRS) /* solve a spd tridiagonal matrix system */
1393c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEIN)
140e5b2100bSSteven G. Johnson #define LAPACKstein_ PETSCBLAS(stein,STEIN) /* eigenvectors of real symm tridiagonal matrix */
1413c377650SSatish Balay #endif
142e5b2100bSSteven G. Johnson #define LAPACKgesv_  PETSCBLAS(gesv,GESV)
1433c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GELSS)
144e5b2100bSSteven G. Johnson #define LAPACKgelss_ PETSCBLAS(gelss,GELSS)
1453c377650SSatish Balay #endif
1463c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GERFS)
147e5b2100bSSteven G. Johnson #define LAPACKgerfs_ PETSCBLAS(gerfs,GERFS)
1483c377650SSatish Balay #endif
1493c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TGSEN)
150e5b2100bSSteven G. Johnson #define LAPACKtgsen_ PETSCBLAS(tgsen,TGSEN)
1513c377650SSatish Balay #endif
152e5b2100bSSteven G. Johnson /* character-string arguments: */
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)
164e5b2100bSSteven G. Johnson #define BLASgemm_    PETSCBLAS(gemm,GEMM)
165e5b2100bSSteven G. Johnson #define BLASsymm_    PETSCBLAS(symm,SYMM)
1663f9d1987SStefano Zampini #define BLASsyrk_    PETSCBLAS(syrk,SYRK)
1673f9d1987SStefano Zampini #define BLASsyr2k_   PETSCBLAS(syr2k,SYR2K)
168e5b2100bSSteven G. Johnson #define BLAStrsm_    PETSCBLAS(trsm,TRSM)
169b9d4cb8dSJed Brown #define BLASREALgemm_ PETSCBLASREAL(gemm,GEMM)
170e5b2100bSSteven G. Johnson #define LAPACKgesvd_ PETSCBLAS(gesvd,GESVD)
171e5b2100bSSteven G. Johnson #define LAPACKgeev_  PETSCBLAS(geev,GEEV)
1729d150b73SToby Isaac #define LAPACKgels_  PETSCBLAS(gels,GELS)
173*9369748bSToby Isaac #if !defined(PETSC_MISSING_LAPACK_STEGR)
174*9369748bSToby Isaac #define LAPACKstegr_ PETSCBLAS(stegr,STEGR)  /* eigenvalues and eigenvectors of symm tridiagonal */
175*9369748bSToby Isaac #endif
1763c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEQR)
177e5b2100bSSteven G. Johnson #define LAPACKsteqr_ PETSCBLAS(steqr,STEQR)  /* eigenvalues and eigenvectors of symm tridiagonal */
178f1058c0fSBarry Smith #define LAPACKREALsteqr_ PETSCBLASREAL(steqr,STEQR)
1793c377650SSatish Balay #endif
1803c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_HSEQR)
181e5b2100bSSteven G. Johnson #define LAPACKhseqr_ PETSCBLAS(hseqr,HSEQR)
1823c377650SSatish Balay #endif
1833c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GGES)
184e5b2100bSSteven G. Johnson #define LAPACKgges_  PETSCBLAS(gges,GGES)
1853c377650SSatish Balay #endif
1863c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TRSEN)
187e5b2100bSSteven G. Johnson #define LAPACKtrsen_ PETSCBLAS(trsen,TRSEN)
1883c377650SSatish Balay #endif
1893c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_HGEQZ)
190e5b2100bSSteven G. Johnson #define LAPACKhgeqz_ PETSCBLAS(hgeqz,HGEQZ)
1913c377650SSatish Balay #endif
1923c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TRTRS)
193e5b2100bSSteven G. Johnson #define LAPACKtrtrs_ PETSCBLAS(trtrs,TRTRS)
1943c377650SSatish Balay #endif
195e5b2100bSSteven G. Johnson 
196e5b2100bSSteven G. Johnson /* Subroutine names that differ for real/complex data: */
197e5b2100bSSteven G. Johnson #if !defined(PETSC_USE_COMPLEX)
1983c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORGQR)
199c964aadfSJose E. Roman # define LAPACKorgqr_ PETSCBLAS(orgqr,ORGQR)
2003c377650SSatish Balay #endif
2013c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORMQR)
202872393edSJose E. Roman # define LAPACKormqr_ PETSCBLAS(ormqr,ORMQR)
2033c377650SSatish Balay #endif
204e5b2100bSSteven G. Johnson # define BLASdot_     PETSCBLAS(dot,DOT)
205e5b2100bSSteven G. Johnson # define BLASdotu_    PETSCBLAS(dot,DOT)
206e5b2100bSSteven G. Johnson 
207e5b2100bSSteven G. Johnson # define LAPACKsyev_  PETSCBLAS(syev,SYEV)  /* eigenvalues and eigenvectors of a symm matrix */
208e5b2100bSSteven G. Johnson # define LAPACKsyevx_ PETSCBLAS(syevx,SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
209e5b2100bSSteven G. Johnson # define LAPACKsygv_  PETSCBLAS(sygv,SYGV)
210e5b2100bSSteven G. Johnson # define LAPACKsygvx_ PETSCBLAS(sygvx,SYGVX)
211e5b2100bSSteven G. Johnson 
212e5b2100bSSteven G. Johnson   /* stebz does not exist for complex data */
2133c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEBZ)
214e5b2100bSSteven G. Johnson # define LAPACKstebz_ PETSCBLAS(stebz,STEBZ) /* eigenvalues of symm tridiagonal matrix */
2153c377650SSatish Balay #endif
216e5b2100bSSteven G. Johnson #else
21765da4498SStefano Zampini # define LAPACKhetrf_ PETSCBLAS(hetrf,HETRF)
21865da4498SStefano Zampini # define LAPACKhetrs_ PETSCBLAS(hetrs,HETRS)
21965da4498SStefano Zampini # define LAPACKhetri_ PETSCBLAS(hetri,HETRI)
2203c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORGQR)
221c964aadfSJose E. Roman # define LAPACKorgqr_ PETSCBLAS(ungqr,UNGQR)
2223c377650SSatish Balay #endif
2233c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORMQR)
224872393edSJose E. Roman # define LAPACKormqr_ PETSCBLAS(unmqr,UNMQR)
2253c377650SSatish Balay #endif
226e5b2100bSSteven G. Johnson    /* note: dot and dotu are handled separately for complex data */
227e5b2100bSSteven G. Johnson 
228e5b2100bSSteven G. Johnson # define LAPACKsyev_  PETSCBLAS(heev,HEEV)  /* eigenvalues and eigenvectors of a symm matrix */
229e5b2100bSSteven G. Johnson # define LAPACKsyevx_ PETSCBLAS(heevx,HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
230e5b2100bSSteven G. Johnson # define LAPACKsygv_  PETSCBLAS(hegv,HEGV)
231e5b2100bSSteven G. Johnson # define LAPACKsygvx_ PETSCBLAS(hegvx,HEGVX)
232e5b2100bSSteven G. Johnson #endif
233e5b2100bSSteven G. Johnson 
234e5b2100bSSteven G. Johnson #endif
235