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