xref: /petsc/src/mat/impls/aij/seq/aijmkl/aijmkl.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
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