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 #if !defined(PETSC_MISSING_LAPACK_ORGQR) 221 # define LAPACKorgqr_ PETSCBLAS(ungqr,UNGQR) 222 #endif 223 #if !defined(PETSC_MISSING_LAPACK_ORMQR) 224 # define LAPACKormqr_ PETSCBLAS(unmqr,UNMQR) 225 #endif 226 /* note: dot and dotu are handled separately for complex data */ 227 228 # define LAPACKsyev_ PETSCBLAS(heev,HEEV) /* eigenvalues and eigenvectors of a symm matrix */ 229 # define LAPACKsyevx_ PETSCBLAS(heevx,HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */ 230 # define LAPACKsygv_ PETSCBLAS(hegv,HEGV) 231 # define LAPACKsygvx_ PETSCBLAS(hegvx,HEGVX) 232 #endif 233 234 #endif 235