xref: /petsc/include/petscblaslapack_mangle.h (revision 2f6eced2a19e978d64f27de66fbc6c26cc5c7934)
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 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 #  elif defined(PETSC_USE_REAL_DOUBLE)
39 #   define PETSC_BLASLAPACK_PREFIX_ D
40 #  else
41 #   define PETSC_BLASLAPACK_PREFIX_ Q
42 #  endif
43 # else
44 #  if defined(PETSC_USE_REAL_SINGLE)
45 #   define PETSC_BLASLAPACK_PREFIX_ s
46 #  elif defined(PETSC_USE_REAL_DOUBLE)
47 #   define PETSC_BLASLAPACK_PREFIX_ d
48 #  elif defined(PETSC_USE_REAL___FLOAT128)
49 #   define PETSC_BLASLAPACK_PREFIX_ q
50 #  else
51 #   define PETSC_BLASLAPACK_PREFIX_ h
52 #  endif
53 # endif
54 # define PETSC_BLASLAPACK_RPREFIX_ PETSC_BLASLAPACK_PREFIX_
55 #else
56 # if defined(PETSC_BLASLAPACK_CAPS)
57 #  if defined(PETSC_USE_REAL_SINGLE)
58 #   define PETSC_BLASLAPACK_PREFIX_ C
59 #   define PETSC_BLASLAPACK_RPREFIX_ SC
60 #  elif defined(PETSC_USE_REAL_DOUBLE)
61 #   define PETSC_BLASLAPACK_PREFIX_ Z
62 #   define PETSC_BLASLAPACK_RPREFIX_ DZ
63 #  elif defined(PETSC_USE_REAL___FLOAT128)
64 #   define PETSC_BLASLAPACK_PREFIX_ W
65 #   define PETSC_BLASLAPACK_RPREFIX_ QW
66 #  else
67 #   define PETSC_BLASLAPACK_PREFIX_ HK
68 #   define PETSC_BLASLAPACK_RPREFIX_ K
69 #  endif
70 # else
71 #  if defined(PETSC_USE_REAL_SINGLE)
72 #   define PETSC_BLASLAPACK_PREFIX_ c
73 #   define PETSC_BLASLAPACK_RPREFIX_ sc
74 #  elif defined(PETSC_USE_REAL_DOUBLE)
75 #   define PETSC_BLASLAPACK_PREFIX_ z
76 #   define PETSC_BLASLAPACK_RPREFIX_ dz
77 #  elif defined(PETSC_USE_REAL___FLOAT128)
78 #   define PETSC_BLASLAPACK_PREFIX_ w
79 #   define PETSC_BLASLAPACK_RPREFIX_ qw
80 #  else
81 #   define PETSC_BLASLAPACK_PREFIX_ hk
82 #   define PETSC_BLASLAPACK_RPREFIX_ k
83 #  endif
84 # endif
85 #endif
86 
87 /* define macros PETSCBLAS to mangle BLAS/LAPACK subroutine names, and
88    PETSCBLASR for functions returning real values */
89 #if defined(PETSC_BLASLAPACK_CAPS)
90 #  define PETSCBLAS(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
91 #  define PETSCBLASR(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
92 #else
93 #  define PETSCBLAS(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
94 #  define PETSCBLASR(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
95 #endif
96 
97 /****************************************************************************/
98 /* definitions of BLAS and LAPACK symbols */
99 
100 /* Subroutine names that are the same for real/complex data: */
101 /* no character-string arguments: */
102 #define LAPACKgeqrf_ PETSCBLAS(geqrf,GEQRF)
103 #define LAPACKgetrf_ PETSCBLAS(getrf,GETRF)
104 #define LAPACKgetri_ PETSCBLAS(getri,GETRI)
105 #define BLASnrm2_    PETSCBLASR(nrm2,NRM2)
106 #define BLASscal_    PETSCBLAS(scal,SCAL)
107 #define BLAScopy_    PETSCBLAS(copy,COPY)
108 #define BLASswap_    PETSCBLAS(swap,SWAP)
109 #define BLASaxpy_    PETSCBLAS(axpy,AXPY)
110 #define BLASasum_    PETSCBLASR(asum,ASUM)
111 #define LAPACKpttrf_ PETSCBLAS(pttrf,PTTRF) /* factorization of a spd tridiagonal matrix */
112 #define LAPACKpttrs_ PETSCBLAS(pttrs,PTTRS) /* solve a spd tridiagonal matrix system */
113 #define LAPACKstein_ PETSCBLAS(stein,STEIN) /* eigenvectors of real symm tridiagonal matrix */
114 #define LAPACKgesv_  PETSCBLAS(gesv,GESV)
115 #define LAPACKgelss_ PETSCBLAS(gelss,GELSS)
116 #define LAPACKgerfs_ PETSCBLAS(gerfs,GERFS)
117 #define LAPACKtgsen_ PETSCBLAS(tgsen,TGSEN)
118 /* character-string arguments: */
119 #define LAPACKpotrf_ PETSCBLAS(potrf,POTRF)
120 #define LAPACKpotri_ PETSCBLAS(potri,POTRI)
121 #define LAPACKpotrs_ PETSCBLAS(potrs,POTRS)
122 #define LAPACKsytrf_ PETSCBLAS(sytrf,SYTRF)
123 #define LAPACKsytrs_ PETSCBLAS(sytrs,SYTRS)
124 #define LAPACKsytri_ PETSCBLAS(sytri,SYTRI)
125 #define BLASgemv_    PETSCBLAS(gemv,GEMV)
126 #define LAPACKgetrs_ PETSCBLAS(getrs,GETRS)
127 #define BLAStrmv_    PETSCBLAS(trmv,TRMV)
128 #define BLASgemm_    PETSCBLAS(gemm,GEMM)
129 #define BLASsymm_    PETSCBLAS(symm,SYMM)
130 #define BLASsyrk_    PETSCBLAS(syrk,SYRK)
131 #define BLASsyr2k_   PETSCBLAS(syr2k,SYR2K)
132 #define BLAStrsm_    PETSCBLAS(trsm,TRSM)
133 #define LAPACKgesvd_ PETSCBLAS(gesvd,GESVD)
134 #define LAPACKgeev_  PETSCBLAS(geev,GEEV)
135 #define LAPACKgels_  PETSCBLAS(gels,GELS)
136 #define LAPACKsteqr_ PETSCBLAS(steqr,STEQR)  /* eigenvalues and eigenvectors of symm tridiagonal */
137 #define LAPACKhseqr_ PETSCBLAS(hseqr,HSEQR)
138 #define LAPACKgges_  PETSCBLAS(gges,GGES)
139 #define LAPACKtrsen_ PETSCBLAS(trsen,TRSEN)
140 #define LAPACKormqr_ PETSCBLAS(ormqr,ORMQR)
141 #define LAPACKhgeqz_ PETSCBLAS(hgeqz,HGEQZ)
142 #define LAPACKtrtrs_ PETSCBLAS(trtrs,TRTRS)
143 
144 /* Subroutine names that differ for real/complex data: */
145 #if !defined(PETSC_USE_COMPLEX)
146 # define LAPACKungqr_ PETSCBLAS(orgqr,ORGQR)
147 # define BLASdot_     PETSCBLAS(dot,DOT)
148 # define BLASdotu_    PETSCBLAS(dot,DOT)
149 
150 # define LAPACKsyev_  PETSCBLAS(syev,SYEV)  /* eigenvalues and eigenvectors of a symm matrix */
151 # define LAPACKsyevx_ PETSCBLAS(syevx,SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
152 # define LAPACKsygv_  PETSCBLAS(sygv,SYGV)
153 # define LAPACKsygvx_ PETSCBLAS(sygvx,SYGVX)
154 
155   /* stebz does not exist for complex data */
156 # define LAPACKstebz_ PETSCBLAS(stebz,STEBZ) /* eigenvalues of symm tridiagonal matrix */
157 #else
158 # define LAPACKungqr_ PETSCBLAS(ungqr,UNGQR)
159    /* note: dot and dotu are handled separately for complex data */
160 
161 # define LAPACKsyev_  PETSCBLAS(heev,HEEV)  /* eigenvalues and eigenvectors of a symm matrix */
162 # define LAPACKsyevx_ PETSCBLAS(heevx,HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
163 # define LAPACKsygv_  PETSCBLAS(hegv,HEGV)
164 # define LAPACKsygvx_ PETSCBLAS(hegvx,HEGVX)
165 #endif
166 
167 #endif
168