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