1 /* 2 This file deals with the BLAS/LAPACK naming convention on 3 non-Microsoft Windows systems, which may append an underscore, use 4 upper or lower case, and/or use a configurable symbol suffix. 5 */ 6 #pragma once 7 8 /* macros to mangle BLAS/LAPACK names as needed for linking */ 9 10 /* token pasting, with an extra level of indirection so that we 11 can paste the contents of other preprocessor #definitions */ 12 #define PETSC_PASTE2_(a, b) a##b 13 #define PETSC_PASTE2(a, b) PETSC_PASTE2_(a, b) 14 #define PETSC_PASTE3_(a, b, c) a##b##c 15 #define PETSC_PASTE3(a, b, c) PETSC_PASTE3_(a, b, c) 16 17 #if !defined(PETSC_BLASLAPACK_SUFFIX) 18 #if defined(PETSC_BLASLAPACK_UNDERSCORE) 19 #define PETSC_BLASLAPACK_SUFFIX_ _ 20 #else 21 #define PETSC_BLASLAPACK_SUFFIX_ 22 #endif 23 #else 24 #if defined(PETSC_BLASLAPACK_UNDERSCORE) 25 #define PETSC_BLASLAPACK_SUFFIX_ PETSC_PASTE2(PETSC_BLASLAPACK_SUFFIX, _) 26 #else 27 #define PETSC_BLASLAPACK_SUFFIX_ PETSC_BLASLAPACK_SUFFIX 28 #endif 29 #endif 30 31 /* complex/real and single/double/quad/half precision prefixes: */ 32 #if !defined(PETSC_USE_COMPLEX) 33 #if defined(PETSC_BLASLAPACK_CAPS) 34 #if defined(PETSC_USE_REAL_SINGLE) 35 #define PETSC_BLASLAPACK_PREFIX_ S 36 #define PETSC_BLASLAPACK_PREFIX_COMPLEX C 37 #elif defined(PETSC_USE_REAL_DOUBLE) 38 #define PETSC_BLASLAPACK_PREFIX_ D 39 #define PETSC_BLASLAPACK_PREFIX_COMPLEX Z 40 #elif defined(PETSC_USE_REAL___FLOAT128) 41 #define PETSC_BLASLAPACK_PREFIX_ Q 42 #define PETSC_BLASLAPACK_PREFIX_COMPLEX W 43 #else 44 #define PETSC_BLASLAPACK_PREFIX_ H 45 #define PETSC_BLASLAPACK_PREFIX_COMPLEX K 46 #endif 47 #else 48 #if defined(PETSC_USE_REAL_SINGLE) 49 #define PETSC_BLASLAPACK_PREFIX_ s 50 #define PETSC_BLASLAPACK_PREFIX_COMPLEX c 51 #elif defined(PETSC_USE_REAL_DOUBLE) 52 #define PETSC_BLASLAPACK_PREFIX_ d 53 #define PETSC_BLASLAPACK_PREFIX_COMPLEX z 54 #elif defined(PETSC_USE_REAL___FLOAT128) 55 #define PETSC_BLASLAPACK_PREFIX_ q 56 #define PETSC_BLASLAPACK_PREFIX_COMPLEX w 57 #else 58 #define PETSC_BLASLAPACK_PREFIX_ h 59 #define PETSC_BLASLAPACK_PREFIX_COMPLEX k 60 #endif 61 #endif 62 #define PETSC_BLASLAPACK_RPREFIX_ PETSC_BLASLAPACK_PREFIX_ 63 #define PETSC_BLASLAPACK_PREFIX_REAL PETSC_BLASLAPACK_PREFIX_ 64 #else 65 #if defined(PETSC_BLASLAPACK_CAPS) 66 #if defined(PETSC_USE_REAL_SINGLE) 67 #define PETSC_BLASLAPACK_PREFIX_ C 68 #define PETSC_BLASLAPACK_PREFIX_REAL S 69 #define PETSC_BLASLAPACK_RPREFIX_ SC 70 #elif defined(PETSC_USE_REAL_DOUBLE) 71 #define PETSC_BLASLAPACK_PREFIX_ Z 72 #define PETSC_BLASLAPACK_PREFIX_REAL D 73 #define PETSC_BLASLAPACK_RPREFIX_ DZ 74 #elif defined(PETSC_USE_REAL___FLOAT128) 75 #define PETSC_BLASLAPACK_PREFIX_ W 76 #define PETSC_BLASLAPACK_PREFIX_REAL Q 77 #define PETSC_BLASLAPACK_RPREFIX_ QW 78 #else 79 #define PETSC_BLASLAPACK_PREFIX_ K 80 #define PETSC_BLASLAPACK_PREFIX_REAL H 81 #define PETSC_BLASLAPACK_RPREFIX_ HK 82 #endif 83 #else 84 #if defined(PETSC_USE_REAL_SINGLE) 85 #define PETSC_BLASLAPACK_PREFIX_ c 86 #define PETSC_BLASLAPACK_PREFIX_REAL s 87 #define PETSC_BLASLAPACK_RPREFIX_ sc 88 #elif defined(PETSC_USE_REAL_DOUBLE) 89 #define PETSC_BLASLAPACK_PREFIX_ z 90 #define PETSC_BLASLAPACK_PREFIX_REAL d 91 #define PETSC_BLASLAPACK_RPREFIX_ dz 92 #elif defined(PETSC_USE_REAL___FLOAT128) 93 #define PETSC_BLASLAPACK_PREFIX_ w 94 #define PETSC_BLASLAPACK_PREFIX_REAL q 95 #define PETSC_BLASLAPACK_RPREFIX_ qw 96 #else 97 #define PETSC_BLASLAPACK_PREFIX_ k 98 #define PETSC_BLASLAPACK_PREFIX_REAL h 99 #define PETSC_BLASLAPACK_RPREFIX_ hk 100 #endif 101 #endif 102 #define PETSC_BLASLAPACK_PREFIX_COMPLEX PETSC_BLASLAPACK_PREFIX_ 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 PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, X, PETSC_BLASLAPACK_SUFFIX_) 111 #define PETSCBLASR(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_) 112 #else 113 #define PETSCBLAS(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_) 114 #define PETSCBLASREAL(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, x, PETSC_BLASLAPACK_SUFFIX_) 115 #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, x, PETSC_BLASLAPACK_SUFFIX_) 116 #define PETSCBLASR(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_) 117 #endif 118 119 /* definitions of BLAS and LAPACK symbols */ 120 121 /* Subroutine names that are the same for real/complex data: */ 122 /* no character-string arguments: */ 123 #define LAPACKgeqrf_ PETSCBLAS(geqrf, GEQRF) 124 #define LAPACKgetrf_ PETSCBLAS(getrf, GETRF) 125 #define LAPACKgetri_ PETSCBLAS(getri, GETRI) 126 #define LAPACKREALgetrf_ PETSCBLASREAL(getrf, GETRF) 127 #define LAPACKREALgetri_ PETSCBLASREAL(getri, GETRI) 128 #define BLASnrm2_ PETSCBLASR(nrm2, NRM2) 129 #define BLASscal_ PETSCBLAS(scal, SCAL) 130 #define BLAScopy_ PETSCBLAS(copy, COPY) 131 #define BLASswap_ PETSCBLAS(swap, SWAP) 132 #define BLASaxpy_ PETSCBLAS(axpy, AXPY) 133 #define BLASasum_ PETSCBLASR(asum, ASUM) 134 #define LAPACKpttrf_ PETSCBLAS(pttrf, PTTRF) /* factorization of a spd tridiagonal matrix */ 135 #define LAPACKpttrs_ PETSCBLAS(pttrs, PTTRS) /* solve a spd tridiagonal matrix system */ 136 #if !defined(PETSC_MISSING_LAPACK_STEIN) 137 #define LAPACKstein_ PETSCBLAS(stein, STEIN) /* eigenvectors of real symm tridiagonal matrix */ 138 #endif 139 #define LAPACKgesv_ PETSCBLAS(gesv, GESV) 140 #if !defined(PETSC_MISSING_LAPACK_GELSS) 141 #define LAPACKgelss_ PETSCBLAS(gelss, GELSS) 142 #endif 143 #if !defined(PETSC_MISSING_LAPACK_GERFS) 144 #define LAPACKgerfs_ PETSCBLAS(gerfs, GERFS) 145 #endif 146 #if !defined(PETSC_MISSING_LAPACK_TGSEN) 147 #define LAPACKtgsen_ PETSCBLAS(tgsen, TGSEN) 148 #endif 149 /* character-string arguments: */ 150 #define LAPACKtrtri_ PETSCBLAS(trtri, TRTRI) 151 #define LAPACKpotrf_ PETSCBLAS(potrf, POTRF) 152 #define LAPACKpotri_ PETSCBLAS(potri, POTRI) 153 #define LAPACKpotrs_ PETSCBLAS(potrs, POTRS) 154 #define LAPACKsytrf_ PETSCBLAS(sytrf, SYTRF) 155 #define LAPACKsytrs_ PETSCBLAS(sytrs, SYTRS) 156 #if !defined(PETSC_MISSING_LAPACK_SYTRI) 157 #define LAPACKsytri_ PETSCBLAS(sytri, SYTRI) 158 #endif 159 #define BLASgemv_ PETSCBLAS(gemv, GEMV) 160 #define LAPACKgetrs_ PETSCBLAS(getrs, GETRS) 161 #define BLAStrmv_ PETSCBLAS(trmv, TRMV) 162 #define BLAStrsv_ PETSCBLAS(trsv, TRSV) 163 #define BLASgemm_ PETSCBLAS(gemm, GEMM) 164 #define BLASsymm_ PETSCBLAS(symm, SYMM) 165 #define BLASsyrk_ PETSCBLAS(syrk, SYRK) 166 #define BLASsyr2k_ PETSCBLAS(syr2k, SYR2K) 167 #define BLAStrsm_ PETSCBLAS(trsm, TRSM) 168 #define BLASREALgemm_ PETSCBLASREAL(gemm, GEMM) 169 #define LAPACKgesvd_ PETSCBLAS(gesvd, GESVD) 170 #define LAPACKgeev_ PETSCBLAS(geev, GEEV) 171 #define LAPACKgels_ PETSCBLAS(gels, GELS) 172 #if !defined(PETSC_MISSING_LAPACK_STEGR) 173 #define LAPACKstegr_ PETSCBLAS(stegr, STEGR) /* eigenvalues and eigenvectors of symm tridiagonal */ 174 #endif 175 #if !defined(PETSC_MISSING_LAPACK_STEQR) 176 #define LAPACKsteqr_ PETSCBLAS(steqr, STEQR) /* eigenvalues and eigenvectors of symm tridiagonal */ 177 #define LAPACKREALsteqr_ PETSCBLASREAL(steqr, STEQR) 178 #endif 179 #if !defined(PETSC_MISSING_LAPACK_STEV) 180 #define LAPACKstev_ PETSCBLAS(stev, STEV) /* eigenvalues and eigenvectors of symm tridiagonal */ 181 #define LAPACKREALstev_ PETSCBLASREAL(stev, STEV) 182 #endif 183 #if !defined(PETSC_MISSING_LAPACK_HSEQR) 184 #define LAPACKhseqr_ PETSCBLAS(hseqr, HSEQR) 185 #endif 186 #if !defined(PETSC_MISSING_LAPACK_GGES) 187 #define LAPACKgges_ PETSCBLAS(gges, GGES) 188 #endif 189 #if !defined(PETSC_MISSING_LAPACK_TRSEN) 190 #define LAPACKtrsen_ PETSCBLAS(trsen, TRSEN) 191 #endif 192 #if !defined(PETSC_MISSING_LAPACK_HGEQZ) 193 #define LAPACKhgeqz_ PETSCBLAS(hgeqz, HGEQZ) 194 #endif 195 #if !defined(PETSC_MISSING_LAPACK_TRTRS) 196 #define LAPACKtrtrs_ PETSCBLAS(trtrs, TRTRS) 197 #endif 198 199 /* Subroutine names that differ for real/complex data: */ 200 #if !defined(PETSC_USE_COMPLEX) 201 #if !defined(PETSC_MISSING_LAPACK_ORGQR) 202 #define LAPACKorgqr_ PETSCBLAS(orgqr, ORGQR) 203 #endif 204 #if !defined(PETSC_MISSING_LAPACK_ORMQR) 205 #define LAPACKormqr_ PETSCBLAS(ormqr, ORMQR) 206 #endif 207 #define BLASdot_ PETSCBLAS(dot, DOT) 208 #define BLASdotu_ PETSCBLAS(dot, DOT) 209 210 #define LAPACKsyev_ PETSCBLAS(syev, SYEV) /* eigenvalues and eigenvectors of a symm matrix */ 211 #define LAPACKsyevx_ PETSCBLAS(syevx, SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */ 212 #define LAPACKsygv_ PETSCBLAS(sygv, SYGV) 213 #define LAPACKsygvx_ PETSCBLAS(sygvx, SYGVX) 214 215 /* stebz does not exist for complex data */ 216 #if !defined(PETSC_MISSING_LAPACK_STEBZ) 217 #define LAPACKstebz_ PETSCBLAS(stebz, STEBZ) /* eigenvalues of symm tridiagonal matrix */ 218 #endif 219 #define LAPACKgerc_ PETSCBLAS(ger, GER) 220 #define BLAShemv_ PETSCBLAS(symv, SYMV) 221 #else 222 #define LAPACKhetrf_ PETSCBLAS(hetrf, HETRF) 223 #define LAPACKhetrs_ PETSCBLAS(hetrs, HETRS) 224 #define LAPACKhetri_ PETSCBLAS(hetri, HETRI) 225 #define LAPACKheev_ PETSCBLAS(heev, HEEV) 226 #if !defined(PETSC_MISSING_LAPACK_ORGQR) 227 #define LAPACKorgqr_ PETSCBLAS(ungqr, UNGQR) 228 #endif 229 #if !defined(PETSC_MISSING_LAPACK_ORMQR) 230 #define LAPACKormqr_ PETSCBLAS(unmqr, UNMQR) 231 #endif 232 /* note: dot and dotu are handled separately for complex data */ 233 234 #define LAPACKsyev_ PETSCBLAS(heev, HEEV) /* eigenvalues and eigenvectors of a symm matrix */ 235 #define LAPACKsyevx_ PETSCBLAS(heevx, HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */ 236 #define LAPACKsygv_ PETSCBLAS(hegv, HEGV) 237 #define LAPACKsygvx_ PETSCBLAS(hegvx, HEGVX) 238 239 #define LAPACKgerc_ PETSCBLAS(gerc, GERC) 240 #define BLAShemv_ PETSCBLAS(hemv, HEMV) 241 #endif 242