1 #pragma once 2 /* 3 Wrappers for mkl_cspblas_ routines. 4 A more elegant way to do this would be to use an approach like that used in petsclbaslapack_mangle.h, 5 but since the MKL sparse BLAS routines are not going to be as widely used, and because 6 we don't have to worry about Fortran name mangling, this seems OK for now. 7 */ 8 9 /* Have to redefine MKL_Complex16 and MKL_Complex8 as PetscScalar for the complex number cases. 10 * This works fine with a C99 compiler -- still need to verify that this works with C89. 11 * Note: These definitions need to occur BEFORE including MKL headers. */ 12 #define MKL_Complex16 PetscScalar 13 #define MKL_Complex8 PetscScalar 14 15 #if !defined(PETSC_USE_COMPLEX) 16 #if defined(PETSC_USE_REAL_SINGLE) 17 #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_scsrgemv(transa, m, a, ia, ja, x, y) 18 #elif defined(PETSC_USE_REAL_DOUBLE) 19 #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_dcsrgemv(transa, m, a, ia, ja, x, y) 20 #endif 21 #else 22 #if defined(PETSC_USE_REAL_SINGLE) 23 #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_ccsrgemv(transa, m, a, ia, ja, x, y) 24 #elif defined(PETSC_USE_REAL_DOUBLE) 25 #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_zcsrgemv(transa, m, a, ia, ja, x, y) 26 #endif 27 #endif 28 29 /* Note: MKL releases prior to the end of 2014 do not have a const-correct interface -> ugly casts necessary. 30 Does not apply to mkl_sparse_x_*()-routines, because these have been introduced later. */ 31 #if !defined(PETSC_USE_COMPLEX) 32 #if defined(PETSC_USE_REAL_SINGLE) 33 #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_scsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y) 34 #elif defined(PETSC_USE_REAL_DOUBLE) 35 #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_dcsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y) 36 #endif 37 #else 38 #if defined(PETSC_USE_REAL_SINGLE) 39 #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_ccsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y) 40 #elif defined(PETSC_USE_REAL_DOUBLE) 41 #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_zcsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y) 42 #endif 43 #endif 44 45 #if !defined(PETSC_USE_COMPLEX) 46 #if defined(PETSC_USE_REAL_SINGLE) 47 #define mkl_sparse_x_create_csr mkl_sparse_s_create_csr 48 #elif defined(PETSC_USE_REAL_DOUBLE) 49 #define mkl_sparse_x_create_csr mkl_sparse_d_create_csr 50 #endif 51 #else 52 #if defined(PETSC_USE_REAL_SINGLE) 53 #define mkl_sparse_x_create_csr mkl_sparse_c_create_csr 54 #elif defined(PETSC_USE_REAL_DOUBLE) 55 #define mkl_sparse_x_create_csr mkl_sparse_z_create_csr 56 #endif 57 #endif 58 59 #if !defined(PETSC_USE_COMPLEX) 60 #if defined(PETSC_USE_REAL_SINGLE) 61 #define mkl_sparse_x_mv mkl_sparse_s_mv 62 #elif defined(PETSC_USE_REAL_DOUBLE) 63 #define mkl_sparse_x_mv mkl_sparse_d_mv 64 #endif 65 #else 66 #if defined(PETSC_USE_REAL_SINGLE) 67 #define mkl_sparse_x_mv mkl_sparse_c_mv 68 #elif defined(PETSC_USE_REAL_DOUBLE) 69 #define mkl_sparse_x_mv mkl_sparse_z_mv 70 #endif 71 #endif 72 73 #if !defined(PETSC_USE_COMPLEX) 74 #if defined(PETSC_USE_REAL_SINGLE) 75 #define mkl_sparse_x_export_csr mkl_sparse_s_export_csr 76 #elif defined(PETSC_USE_REAL_DOUBLE) 77 #define mkl_sparse_x_export_csr mkl_sparse_d_export_csr 78 #endif 79 #else 80 #if defined(PETSC_USE_REAL_SINGLE) 81 #define mkl_sparse_x_export_csr mkl_sparse_c_export_csr 82 #elif defined(PETSC_USE_REAL_DOUBLE) 83 #define mkl_sparse_x_export_csr mkl_sparse_z_export_csr 84 #endif 85 #endif 86