1e5b2100bSSteven G. Johnson /* 2e5b2100bSSteven G. Johnson This file deals with the BLAS/LAPACK naming convention on 316a05f60SBarry Smith non-Microsoft Windows systems, which may append an underscore, use 4e5b2100bSSteven G. Johnson upper or lower case, and/or use a configurable symbol suffix. 5e5b2100bSSteven G. Johnson */ 6a4963045SJacob Faibussowitsch #pragma once 7e5b2100bSSteven G. Johnson 8e5b2100bSSteven G. Johnson /* macros to mangle BLAS/LAPACK names as needed for linking */ 9e5b2100bSSteven G. Johnson 10e5b2100bSSteven G. Johnson /* token pasting, with an extra level of indirection so that we 11e5b2100bSSteven G. Johnson can paste the contents of other preprocessor #definitions */ 12e5b2100bSSteven G. Johnson #define PETSC_PASTE2_(a, b) a##b 13e5b2100bSSteven G. Johnson #define PETSC_PASTE2(a, b) PETSC_PASTE2_(a, b) 14e5b2100bSSteven G. Johnson #define PETSC_PASTE3_(a, b, c) a##b##c 15e5b2100bSSteven G. Johnson #define PETSC_PASTE3(a, b, c) PETSC_PASTE3_(a, b, c) 16e5b2100bSSteven G. Johnson 17e5b2100bSSteven G. Johnson #if !defined(PETSC_BLASLAPACK_SUFFIX) 18e5b2100bSSteven G. Johnson #if defined(PETSC_BLASLAPACK_UNDERSCORE) 19e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_SUFFIX_ _ 20e5b2100bSSteven G. Johnson #else 21e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_SUFFIX_ 22e5b2100bSSteven G. Johnson #endif 23e5b2100bSSteven G. Johnson #else 24e5b2100bSSteven G. Johnson #if defined(PETSC_BLASLAPACK_UNDERSCORE) 25e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_SUFFIX_ PETSC_PASTE2(PETSC_BLASLAPACK_SUFFIX, _) 26e5b2100bSSteven G. Johnson #else 27e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_SUFFIX_ PETSC_BLASLAPACK_SUFFIX 28e5b2100bSSteven G. Johnson #endif 29e5b2100bSSteven G. Johnson #endif 30e5b2100bSSteven G. Johnson 31eef667f9SJose E. Roman /* complex/real and single/double/quad/half precision prefixes: */ 32e5b2100bSSteven G. Johnson #if !defined(PETSC_USE_COMPLEX) 33e5b2100bSSteven G. Johnson #if defined(PETSC_BLASLAPACK_CAPS) 34e5b2100bSSteven G. Johnson #if defined(PETSC_USE_REAL_SINGLE) 35e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ S 365cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX C 37e5b2100bSSteven G. Johnson #elif defined(PETSC_USE_REAL_DOUBLE) 38e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ D 395cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX Z 40b161f5d8SJose E. Roman #elif defined(PETSC_USE_REAL___FLOAT128) 41e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ Q 425cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX W 43b161f5d8SJose E. Roman #else 44b161f5d8SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_ H 455cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX K 46e5b2100bSSteven G. Johnson #endif 47e5b2100bSSteven G. Johnson #else 48e5b2100bSSteven G. Johnson #if defined(PETSC_USE_REAL_SINGLE) 49e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ s 505cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX c 51e5b2100bSSteven G. Johnson #elif defined(PETSC_USE_REAL_DOUBLE) 52e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ d 535cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX z 54570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 55e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ q 565cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX w 57570b7f6dSBarry Smith #else 58570b7f6dSBarry Smith #define PETSC_BLASLAPACK_PREFIX_ h 595cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX k 60e5b2100bSSteven G. Johnson #endif 61e5b2100bSSteven G. Johnson #endif 62e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_RPREFIX_ PETSC_BLASLAPACK_PREFIX_ 635cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_REAL PETSC_BLASLAPACK_PREFIX_ 64e5b2100bSSteven G. Johnson #else 65e5b2100bSSteven G. Johnson #if defined(PETSC_BLASLAPACK_CAPS) 66e5b2100bSSteven G. Johnson #if defined(PETSC_USE_REAL_SINGLE) 67e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ C 6870c87898SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_REAL S 69e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_RPREFIX_ SC 70e5b2100bSSteven G. Johnson #elif defined(PETSC_USE_REAL_DOUBLE) 71e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ Z 72f1058c0fSBarry Smith #define PETSC_BLASLAPACK_PREFIX_REAL D 73e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_RPREFIX_ DZ 74570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 75e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ W 76f1058c0fSBarry Smith #define PETSC_BLASLAPACK_PREFIX_REAL Q 77e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_RPREFIX_ QW 78570b7f6dSBarry Smith #else 79eef667f9SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_ K 80f1058c0fSBarry Smith #define PETSC_BLASLAPACK_PREFIX_REAL H 81eef667f9SJose E. Roman #define PETSC_BLASLAPACK_RPREFIX_ HK 82e5b2100bSSteven G. Johnson #endif 83e5b2100bSSteven G. Johnson #else 84e5b2100bSSteven G. Johnson #if defined(PETSC_USE_REAL_SINGLE) 85e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ c 86f1058c0fSBarry Smith #define PETSC_BLASLAPACK_PREFIX_REAL s 87e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_RPREFIX_ sc 88e5b2100bSSteven G. Johnson #elif defined(PETSC_USE_REAL_DOUBLE) 89e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ z 90f1058c0fSBarry Smith #define PETSC_BLASLAPACK_PREFIX_REAL d 91e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_RPREFIX_ dz 92570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 93e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_PREFIX_ w 94f1058c0fSBarry Smith #define PETSC_BLASLAPACK_PREFIX_REAL q 95e5b2100bSSteven G. Johnson #define PETSC_BLASLAPACK_RPREFIX_ qw 96570b7f6dSBarry Smith #else 97eef667f9SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_ k 98f1058c0fSBarry Smith #define PETSC_BLASLAPACK_PREFIX_REAL h 99eef667f9SJose E. Roman #define PETSC_BLASLAPACK_RPREFIX_ hk 100e5b2100bSSteven G. Johnson #endif 101e5b2100bSSteven G. Johnson #endif 1025cfd3391SJose E. Roman #define PETSC_BLASLAPACK_PREFIX_COMPLEX PETSC_BLASLAPACK_PREFIX_ 103e5b2100bSSteven G. Johnson #endif 104e5b2100bSSteven G. Johnson 105e5b2100bSSteven G. Johnson /* define macros PETSCBLAS to mangle BLAS/LAPACK subroutine names, and 106e5b2100bSSteven G. Johnson PETSCBLASR for functions returning real values */ 107e5b2100bSSteven G. Johnson #if defined(PETSC_BLASLAPACK_CAPS) 108e5b2100bSSteven G. Johnson #define PETSCBLAS(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, X, PETSC_BLASLAPACK_SUFFIX_) 109f1058c0fSBarry Smith #define PETSCBLASREAL(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, X, PETSC_BLASLAPACK_SUFFIX_) 1105cfd3391SJose E. Roman #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, X, PETSC_BLASLAPACK_SUFFIX_) 111e5b2100bSSteven G. Johnson #define PETSCBLASR(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, X, PETSC_BLASLAPACK_SUFFIX_) 112e5b2100bSSteven G. Johnson #else 113e5b2100bSSteven G. Johnson #define PETSCBLAS(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_, x, PETSC_BLASLAPACK_SUFFIX_) 114f1058c0fSBarry Smith #define PETSCBLASREAL(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_REAL, x, PETSC_BLASLAPACK_SUFFIX_) 1155cfd3391SJose E. Roman #define PETSCBLASCOMPLEX(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_PREFIX_COMPLEX, x, PETSC_BLASLAPACK_SUFFIX_) 116e5b2100bSSteven G. Johnson #define PETSCBLASR(x, X) PETSC_PASTE3(PETSC_BLASLAPACK_RPREFIX_, x, PETSC_BLASLAPACK_SUFFIX_) 117e5b2100bSSteven G. Johnson #endif 118e5b2100bSSteven G. Johnson 119e5b2100bSSteven G. Johnson /* definitions of BLAS and LAPACK symbols */ 120e5b2100bSSteven G. Johnson 121e5b2100bSSteven G. Johnson /* Subroutine names that are the same for real/complex data: */ 122e5b2100bSSteven G. Johnson /* no character-string arguments: */ 123e5b2100bSSteven G. Johnson #define LAPACKgeqrf_ PETSCBLAS(geqrf, GEQRF) 124e5b2100bSSteven G. Johnson #define LAPACKgetrf_ PETSCBLAS(getrf, GETRF) 125e5b2100bSSteven G. Johnson #define LAPACKgetri_ PETSCBLAS(getri, GETRI) 126b9d4cb8dSJed Brown #define LAPACKREALgetrf_ PETSCBLASREAL(getrf, GETRF) 127b9d4cb8dSJed Brown #define LAPACKREALgetri_ PETSCBLASREAL(getri, GETRI) 128e5b2100bSSteven G. Johnson #define BLASnrm2_ PETSCBLASR(nrm2, NRM2) 129e5b2100bSSteven G. Johnson #define BLASscal_ PETSCBLAS(scal, SCAL) 130e5b2100bSSteven G. Johnson #define BLAScopy_ PETSCBLAS(copy, COPY) 131e5b2100bSSteven G. Johnson #define BLASswap_ PETSCBLAS(swap, SWAP) 132e5b2100bSSteven G. Johnson #define BLASaxpy_ PETSCBLAS(axpy, AXPY) 133e5b2100bSSteven G. Johnson #define BLASasum_ PETSCBLASR(asum, ASUM) 134e5b2100bSSteven G. Johnson #define LAPACKpttrf_ PETSCBLAS(pttrf, PTTRF) /* factorization of a spd tridiagonal matrix */ 135e5b2100bSSteven G. Johnson #define LAPACKpttrs_ PETSCBLAS(pttrs, PTTRS) /* solve a spd tridiagonal matrix system */ 1363c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEIN) 137e5b2100bSSteven G. Johnson #define LAPACKstein_ PETSCBLAS(stein, STEIN) /* eigenvectors of real symm tridiagonal matrix */ 1383c377650SSatish Balay #endif 139e5b2100bSSteven G. Johnson #define LAPACKgesv_ PETSCBLAS(gesv, GESV) 1403c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GELSS) 141e5b2100bSSteven G. Johnson #define LAPACKgelss_ PETSCBLAS(gelss, GELSS) 1423c377650SSatish Balay #endif 1433c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GERFS) 144e5b2100bSSteven G. Johnson #define LAPACKgerfs_ PETSCBLAS(gerfs, GERFS) 1453c377650SSatish Balay #endif 1463c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TGSEN) 147e5b2100bSSteven G. Johnson #define LAPACKtgsen_ PETSCBLAS(tgsen, TGSEN) 1483c377650SSatish Balay #endif 149e5b2100bSSteven G. Johnson /* character-string arguments: */ 150c901295dSPablo Brubeck #define LAPACKtrtri_ PETSCBLAS(trtri, TRTRI) 151e5b2100bSSteven G. Johnson #define LAPACKpotrf_ PETSCBLAS(potrf, POTRF) 152e5b2100bSSteven G. Johnson #define LAPACKpotri_ PETSCBLAS(potri, POTRI) 153e5b2100bSSteven G. Johnson #define LAPACKpotrs_ PETSCBLAS(potrs, POTRS) 154e5b2100bSSteven G. Johnson #define LAPACKsytrf_ PETSCBLAS(sytrf, SYTRF) 155e5b2100bSSteven G. Johnson #define LAPACKsytrs_ PETSCBLAS(sytrs, SYTRS) 1563c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_SYTRI) 157e5b2100bSSteven G. Johnson #define LAPACKsytri_ PETSCBLAS(sytri, SYTRI) 1583c377650SSatish Balay #endif 159e5b2100bSSteven G. Johnson #define BLASgemv_ PETSCBLAS(gemv, GEMV) 160e5b2100bSSteven G. Johnson #define LAPACKgetrs_ PETSCBLAS(getrs, GETRS) 161e5b2100bSSteven G. Johnson #define BLAStrmv_ PETSCBLAS(trmv, TRMV) 162be1c5b79SHansol Suh #define BLAStrsv_ PETSCBLAS(trsv, TRSV) 163e5b2100bSSteven G. Johnson #define BLASgemm_ PETSCBLAS(gemm, GEMM) 164e5b2100bSSteven G. Johnson #define BLASsymm_ PETSCBLAS(symm, SYMM) 1653f9d1987SStefano Zampini #define BLASsyrk_ PETSCBLAS(syrk, SYRK) 1663f9d1987SStefano Zampini #define BLASsyr2k_ PETSCBLAS(syr2k, SYR2K) 167e5b2100bSSteven G. Johnson #define BLAStrsm_ PETSCBLAS(trsm, TRSM) 168b9d4cb8dSJed Brown #define BLASREALgemm_ PETSCBLASREAL(gemm, GEMM) 169e5b2100bSSteven G. Johnson #define LAPACKgesvd_ PETSCBLAS(gesvd, GESVD) 170e5b2100bSSteven G. Johnson #define LAPACKgeev_ PETSCBLAS(geev, GEEV) 1719d150b73SToby Isaac #define LAPACKgels_ PETSCBLAS(gels, GELS) 1729369748bSToby Isaac #if !defined(PETSC_MISSING_LAPACK_STEGR) 1739369748bSToby Isaac #define LAPACKstegr_ PETSCBLAS(stegr, STEGR) /* eigenvalues and eigenvectors of symm tridiagonal */ 1749369748bSToby Isaac #endif 1753c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEQR) 176e5b2100bSSteven G. Johnson #define LAPACKsteqr_ PETSCBLAS(steqr, STEQR) /* eigenvalues and eigenvectors of symm tridiagonal */ 177f1058c0fSBarry Smith #define LAPACKREALsteqr_ PETSCBLASREAL(steqr, STEQR) 1783c377650SSatish Balay #endif 179ee1793ccSZach Atkins #if !defined(PETSC_MISSING_LAPACK_STEV) 180ee1793ccSZach Atkins #define LAPACKstev_ PETSCBLAS(stev, STEV) /* eigenvalues and eigenvectors of symm tridiagonal */ 181ee1793ccSZach Atkins #define LAPACKREALstev_ PETSCBLASREAL(stev, STEV) 182ee1793ccSZach Atkins #endif 1833c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_HSEQR) 184e5b2100bSSteven G. Johnson #define LAPACKhseqr_ PETSCBLAS(hseqr, HSEQR) 1853c377650SSatish Balay #endif 1863c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_GGES) 187e5b2100bSSteven G. Johnson #define LAPACKgges_ PETSCBLAS(gges, GGES) 1883c377650SSatish Balay #endif 1893c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TRSEN) 190e5b2100bSSteven G. Johnson #define LAPACKtrsen_ PETSCBLAS(trsen, TRSEN) 1913c377650SSatish Balay #endif 1923c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_HGEQZ) 193e5b2100bSSteven G. Johnson #define LAPACKhgeqz_ PETSCBLAS(hgeqz, HGEQZ) 1943c377650SSatish Balay #endif 1953c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_TRTRS) 196e5b2100bSSteven G. Johnson #define LAPACKtrtrs_ PETSCBLAS(trtrs, TRTRS) 1973c377650SSatish Balay #endif 198e5b2100bSSteven G. Johnson 199e5b2100bSSteven G. Johnson /* Subroutine names that differ for real/complex data: */ 200e5b2100bSSteven G. Johnson #if !defined(PETSC_USE_COMPLEX) 2013c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORGQR) 202c964aadfSJose E. Roman #define LAPACKorgqr_ PETSCBLAS(orgqr, ORGQR) 2033c377650SSatish Balay #endif 2043c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORMQR) 205872393edSJose E. Roman #define LAPACKormqr_ PETSCBLAS(ormqr, ORMQR) 2063c377650SSatish Balay #endif 207e5b2100bSSteven G. Johnson #define BLASdot_ PETSCBLAS(dot, DOT) 208e5b2100bSSteven G. Johnson #define BLASdotu_ PETSCBLAS(dot, DOT) 209e5b2100bSSteven G. Johnson 210e5b2100bSSteven G. Johnson #define LAPACKsyev_ PETSCBLAS(syev, SYEV) /* eigenvalues and eigenvectors of a symm matrix */ 211e5b2100bSSteven G. Johnson #define LAPACKsyevx_ PETSCBLAS(syevx, SYEVX) /* selected eigenvalues and eigenvectors of a symm matrix */ 212e5b2100bSSteven G. Johnson #define LAPACKsygv_ PETSCBLAS(sygv, SYGV) 213e5b2100bSSteven G. Johnson #define LAPACKsygvx_ PETSCBLAS(sygvx, SYGVX) 214e5b2100bSSteven G. Johnson 215e5b2100bSSteven G. Johnson /* stebz does not exist for complex data */ 2163c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_STEBZ) 217e5b2100bSSteven G. Johnson #define LAPACKstebz_ PETSCBLAS(stebz, STEBZ) /* eigenvalues of symm tridiagonal matrix */ 2183c377650SSatish Balay #endif 219*3a8969d3SToby Isaac #define LAPACKgerc_ PETSCBLAS(ger, GER) 220*3a8969d3SToby Isaac #define BLAShemv_ PETSCBLAS(symv, SYMV) 221e5b2100bSSteven G. Johnson #else 22265da4498SStefano Zampini #define LAPACKhetrf_ PETSCBLAS(hetrf, HETRF) 22365da4498SStefano Zampini #define LAPACKhetrs_ PETSCBLAS(hetrs, HETRS) 22465da4498SStefano Zampini #define LAPACKhetri_ PETSCBLAS(hetri, HETRI) 2251153b427SDavid Wells #define LAPACKheev_ PETSCBLAS(heev, HEEV) 2263c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORGQR) 227c964aadfSJose E. Roman #define LAPACKorgqr_ PETSCBLAS(ungqr, UNGQR) 2283c377650SSatish Balay #endif 2293c377650SSatish Balay #if !defined(PETSC_MISSING_LAPACK_ORMQR) 230872393edSJose E. Roman #define LAPACKormqr_ PETSCBLAS(unmqr, UNMQR) 2313c377650SSatish Balay #endif 232e5b2100bSSteven G. Johnson /* note: dot and dotu are handled separately for complex data */ 233e5b2100bSSteven G. Johnson 234e5b2100bSSteven G. Johnson #define LAPACKsyev_ PETSCBLAS(heev, HEEV) /* eigenvalues and eigenvectors of a symm matrix */ 235e5b2100bSSteven G. Johnson #define LAPACKsyevx_ PETSCBLAS(heevx, HEEVX) /* selected eigenvalues and eigenvectors of a symm matrix */ 236e5b2100bSSteven G. Johnson #define LAPACKsygv_ PETSCBLAS(hegv, HEGV) 237e5b2100bSSteven G. Johnson #define LAPACKsygvx_ PETSCBLAS(hegvx, HEGVX) 238*3a8969d3SToby Isaac 239*3a8969d3SToby Isaac #define LAPACKgerc_ PETSCBLAS(gerc, GERC) 240*3a8969d3SToby Isaac #define BLAShemv_ PETSCBLAS(hemv, HEMV) 241e5b2100bSSteven G. Johnson #endif 242