xref: /petsc/include/petscblaslapack_mangle.h (revision e5b2100be8d1775241ada12d104bda49f63dc84b)
1*e5b2100bSSteven G. Johnson /*
2*e5b2100bSSteven G. Johnson       This file deals with the BLAS/LAPACK naming convention on
3*e5b2100bSSteven G. Johnson       non-Microsoft systems, which may append an underscore, use
4*e5b2100bSSteven G. Johnson       upper or lower case, and/or use a configurable symbol suffix.
5*e5b2100bSSteven G. Johnson */
6*e5b2100bSSteven G. Johnson #if !defined(_BLASLAPACK_MANGLE_H)
7*e5b2100bSSteven G. Johnson #define _BLASLAPACK_MANGLE_H
8*e5b2100bSSteven G. Johnson 
9*e5b2100bSSteven G. Johnson /****************************************************************************/
10*e5b2100bSSteven G. Johnson /* macros to mangle BLAS/LAPACK names as needed for linking */
11*e5b2100bSSteven G. Johnson 
12*e5b2100bSSteven G. Johnson /* token pasting, with an extra level of indirection so that we
13*e5b2100bSSteven G. Johnson    can paste the contents of other preprocessor #definitions */
14*e5b2100bSSteven G. Johnson #define PETSC_PASTE2_(a,b) a ## b
15*e5b2100bSSteven G. Johnson #define PETSC_PASTE2(a,b) PETSC_PASTE2_(a,b)
16*e5b2100bSSteven G. Johnson #define PETSC_PASTE3_(a,b,c) a ## b ## c
17*e5b2100bSSteven G. Johnson #define PETSC_PASTE3(a,b,c) PETSC_PASTE3_(a,b,c)
18*e5b2100bSSteven G. Johnson 
19*e5b2100bSSteven G. Johnson #if !defined(PETSC_BLASLAPACK_SUFFIX)
20*e5b2100bSSteven G. Johnson # if defined(PETSC_BLASLAPACK_UNDERSCORE)
21*e5b2100bSSteven G. Johnson #  define PETSC_BLASLAPACK_SUFFIX_ _
22*e5b2100bSSteven G. Johnson # else
23*e5b2100bSSteven G. Johnson #  define PETSC_BLASLAPACK_SUFFIX_
24*e5b2100bSSteven G. Johnson # endif
25*e5b2100bSSteven G. Johnson #else
26*e5b2100bSSteven G. Johnson # if defined(PETSC_BLASLAPACK_UNDERSCORE)
27*e5b2100bSSteven G. Johnson #  define PETSC_BLASLAPACK_SUFFIX_ PETSC_PASTE2(PETSC_BLASLAPACK_SUFFIX,_)
28*e5b2100bSSteven G. Johnson # else
29*e5b2100bSSteven G. Johnson #  define PETSC_BLASLAPACK_SUFFIX_ PETSC_BLASLAPACK_SUFFIX
30*e5b2100bSSteven G. Johnson # endif
31*e5b2100bSSteven G. Johnson #endif
32*e5b2100bSSteven G. Johnson 
33*e5b2100bSSteven G. Johnson /* complex/real and single/double/quad precision prefixes: */
34*e5b2100bSSteven G. Johnson #if !defined(PETSC_USE_COMPLEX)
35*e5b2100bSSteven G. Johnson # if defined(PETSC_BLASLAPACK_CAPS)
36*e5b2100bSSteven G. Johnson #  if defined(PETSC_USE_REAL_SINGLE)
37*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ S
38*e5b2100bSSteven G. Johnson #  elif defined(PETSC_USE_REAL_DOUBLE)
39*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ D
40*e5b2100bSSteven G. Johnson #  else
41*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ Q
42*e5b2100bSSteven G. Johnson #  endif
43*e5b2100bSSteven G. Johnson # else
44*e5b2100bSSteven G. Johnson #  if defined(PETSC_USE_REAL_SINGLE)
45*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ s
46*e5b2100bSSteven G. Johnson #  elif defined(PETSC_USE_REAL_DOUBLE)
47*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ d
48*e5b2100bSSteven G. Johnson #  else
49*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ q
50*e5b2100bSSteven G. Johnson #  endif
51*e5b2100bSSteven G. Johnson # endif
52*e5b2100bSSteven G. Johnson # define PETSC_BLASLAPACK_RPREFIX_ PETSC_BLASLAPACK_PREFIX_
53*e5b2100bSSteven G. Johnson #else
54*e5b2100bSSteven G. Johnson # if defined(PETSC_BLASLAPACK_CAPS)
55*e5b2100bSSteven G. Johnson #  if defined(PETSC_USE_REAL_SINGLE)
56*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ C
57*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_RPREFIX_ SC
58*e5b2100bSSteven G. Johnson #  elif defined(PETSC_USE_REAL_DOUBLE)
59*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ Z
60*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_RPREFIX_ DZ
61*e5b2100bSSteven G. Johnson #  else
62*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ W
63*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_RPREFIX_ QW
64*e5b2100bSSteven G. Johnson #  endif
65*e5b2100bSSteven G. Johnson # else
66*e5b2100bSSteven G. Johnson #  if defined(PETSC_USE_REAL_SINGLE)
67*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ c
68*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_RPREFIX_ sc
69*e5b2100bSSteven G. Johnson #  elif defined(PETSC_USE_REAL_DOUBLE)
70*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ z
71*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_RPREFIX_ dz
72*e5b2100bSSteven G. Johnson #  else
73*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_PREFIX_ w
74*e5b2100bSSteven G. Johnson #   define PETSC_BLASLAPACK_RPREFIX_ qw
75*e5b2100bSSteven G. Johnson #  endif
76*e5b2100bSSteven G. Johnson # endif
77*e5b2100bSSteven G. Johnson #endif
78*e5b2100bSSteven G. Johnson 
79*e5b2100bSSteven G. Johnson /* define macros PETSCBLAS to mangle BLAS/LAPACK subroutine names, and
80*e5b2100bSSteven G. Johnson    PETSCBLASR for functions returning real values */
81*e5b2100bSSteven G. Johnson #if defined(PETSC_BLASLAPACK_CAPS)
82*e5b2100bSSteven G. Johnson #  define PETSCBLAS(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
83*e5b2100bSSteven G. Johnson #  define PETSCBLASR(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_)
84*e5b2100bSSteven G. Johnson #else
85*e5b2100bSSteven G. Johnson #  define PETSCBLAS(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
86*e5b2100bSSteven G. Johnson #  define PETSCBLASR(x,X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_)
87*e5b2100bSSteven G. Johnson #endif
88*e5b2100bSSteven G. Johnson 
89*e5b2100bSSteven G. Johnson /****************************************************************************/
90*e5b2100bSSteven G. Johnson /* definitions of BLAS and LAPACK symbols */
91*e5b2100bSSteven G. Johnson 
92*e5b2100bSSteven G. Johnson /* Subroutine names that are the same for real/complex data: */
93*e5b2100bSSteven G. Johnson /* no character-string arguments: */
94*e5b2100bSSteven G. Johnson #define LAPACKgeqrf_ PETSCBLAS(geqrf,GEQRF)
95*e5b2100bSSteven G. Johnson #define LAPACKgetrf_ PETSCBLAS(getrf,GETRF)
96*e5b2100bSSteven G. Johnson #define LAPACKgetri_ PETSCBLAS(getri,GETRI)
97*e5b2100bSSteven G. Johnson #define BLASnrm2_    PETSCBLASR(nrm2,NRM2)
98*e5b2100bSSteven G. Johnson #define BLASscal_    PETSCBLAS(scal,SCAL)
99*e5b2100bSSteven G. Johnson #define BLAScopy_    PETSCBLAS(copy,COPY)
100*e5b2100bSSteven G. Johnson #define BLASswap_    PETSCBLAS(swap,SWAP)
101*e5b2100bSSteven G. Johnson #define BLASaxpy_    PETSCBLAS(axpy,AXPY)
102*e5b2100bSSteven G. Johnson #define BLASasum_    PETSCBLASR(asum,ASUM)
103*e5b2100bSSteven G. Johnson #define LAPACKpttrf_ PETSCBLAS(pttrf,PTTRF) /* factorization of a spd tridiagonal matrix */
104*e5b2100bSSteven G. Johnson #define LAPACKpttrs_ PETSCBLAS(pttrs,PTTRS) /* solve a spd tridiagonal matrix system */
105*e5b2100bSSteven G. Johnson #define LAPACKstein_ PETSCBLAS(stein,STEIN) /* eigenvectors of real symm tridiagonal matrix */
106*e5b2100bSSteven G. Johnson #define LAPACKgesv_  PETSCBLAS(gesv,GESV)
107*e5b2100bSSteven G. Johnson #define LAPACKgelss_ PETSCBLAS(gelss,GELSS)
108*e5b2100bSSteven G. Johnson #define LAPACKgerfs_ PETSCBLAS(gerfs,GERFS)
109*e5b2100bSSteven G. Johnson #define LAPACKtgsen_ PETSCBLAS(tgsen,TGSEN)
110*e5b2100bSSteven G. Johnson /* character-string arguments: */
111*e5b2100bSSteven G. Johnson #define LAPACKpotrf_ PETSCBLAS(potrf,POTRF)
112*e5b2100bSSteven G. Johnson #define LAPACKpotri_ PETSCBLAS(potri,POTRI)
113*e5b2100bSSteven G. Johnson #define LAPACKpotrs_ PETSCBLAS(potrs,POTRS)
114*e5b2100bSSteven G. Johnson #define LAPACKsytrf_ PETSCBLAS(sytrf,SYTRF)
115*e5b2100bSSteven G. Johnson #define LAPACKsytrs_ PETSCBLAS(sytrs,SYTRS)
116*e5b2100bSSteven G. Johnson #define LAPACKsytri_ PETSCBLAS(sytri,SYTRI)
117*e5b2100bSSteven G. Johnson #define BLASgemv_    PETSCBLAS(gemv,GEMV)
118*e5b2100bSSteven G. Johnson #define LAPACKgetrs_ PETSCBLAS(getrs,GETRS)
119*e5b2100bSSteven G. Johnson #define BLAStrmv_    PETSCBLAS(trmv,TRMV)
120*e5b2100bSSteven G. Johnson #define BLASgemm_    PETSCBLAS(gemm,GEMM)
121*e5b2100bSSteven G. Johnson #define BLASsymm_    PETSCBLAS(symm,SYMM)
122*e5b2100bSSteven G. Johnson #define BLAStrsm_    PETSCBLAS(trsm,TRSM)
123*e5b2100bSSteven G. Johnson #define LAPACKgesvd_ PETSCBLAS(gesvd,GESVD)
124*e5b2100bSSteven G. Johnson #define LAPACKgeev_  PETSCBLAS(geev,GEEV)
125*e5b2100bSSteven G. Johnson #define LAPACKsteqr_ PETSCBLAS(steqr,STEQR)  /* eigenvalues and eigenvectors of symm tridiagonal */
126*e5b2100bSSteven G. Johnson #define LAPACKhseqr_ PETSCBLAS(hseqr,HSEQR)
127*e5b2100bSSteven G. Johnson #define LAPACKgges_  PETSCBLAS(gges,GGES)
128*e5b2100bSSteven G. Johnson #define LAPACKtrsen_ PETSCBLAS(trsen,TRSEN)
129*e5b2100bSSteven G. Johnson #define LAPACKormqr_ PETSCBLAS(ormqr,ORMQR)
130*e5b2100bSSteven G. Johnson #define LAPACKhgeqz_ PETSCBLAS(hgeqz,HGEQZ)
131*e5b2100bSSteven G. Johnson #define LAPACKtrtrs_ PETSCBLAS(trtrs,TRTRS)
132*e5b2100bSSteven G. Johnson 
133*e5b2100bSSteven G. Johnson /* Subroutine names that differ for real/complex data: */
134*e5b2100bSSteven G. Johnson #if !defined(PETSC_USE_COMPLEX)
135*e5b2100bSSteven G. Johnson # define LAPACKungqr_ PETSCBLAS(orgqr,ORGQR)
136*e5b2100bSSteven G. Johnson # define BLASdot_     PETSCBLAS(dot,DOT)
137*e5b2100bSSteven G. Johnson # define BLASdotu_    PETSCBLAS(dot,DOT)
138*e5b2100bSSteven G. Johnson 
139*e5b2100bSSteven G. Johnson # define LAPACKsyev_  PETSCBLAS(syev,SYEV)  /* eigenvalues and eigenvectors of a symm matrix */
140*e5b2100bSSteven G. Johnson # define LAPACKsyevx_ PETSCBLAS(syevx,SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
141*e5b2100bSSteven G. Johnson # define LAPACKsygv_  PETSCBLAS(sygv,SYGV)
142*e5b2100bSSteven G. Johnson # define LAPACKsygvx_ PETSCBLAS(sygvx,SYGVX)
143*e5b2100bSSteven G. Johnson 
144*e5b2100bSSteven G. Johnson   /* stebz does not exist for complex data */
145*e5b2100bSSteven G. Johnson # define LAPACKstebz_ PETSCBLAS(stebz,STEBZ) /* eigenvalues of symm tridiagonal matrix */
146*e5b2100bSSteven G. Johnson #else
147*e5b2100bSSteven G. Johnson # define LAPACKungqr_ PETSCBLAS(ungqr,UNGQR)
148*e5b2100bSSteven G. Johnson    /* note: dot and dotu are handled separately for complex data */
149*e5b2100bSSteven G. Johnson 
150*e5b2100bSSteven G. Johnson # define LAPACKsyev_  PETSCBLAS(heev,HEEV)  /* eigenvalues and eigenvectors of a symm matrix */
151*e5b2100bSSteven G. Johnson # define LAPACKsyevx_ PETSCBLAS(heevx,HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */
152*e5b2100bSSteven G. Johnson # define LAPACKsygv_  PETSCBLAS(hegv,HEGV)
153*e5b2100bSSteven G. Johnson # define LAPACKsygvx_ PETSCBLAS(hegvx,HEGVX)
154*e5b2100bSSteven G. Johnson #endif
155*e5b2100bSSteven G. Johnson 
156*e5b2100bSSteven G. Johnson #endif
157