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