xref: /petsc/src/mat/impls/aij/mpi/aijmkl/mpiaijmkl.c (revision 864c62dfd577300df05c8a4e4992489f187e8c79)
1 #include <../src/mat/impls/aij/mpi/mpiaij.h>
2 #undef __FUNCT__
3 #define __FUNCT__ "MatCreateMPIAIJMKL"
4 /*@C
5    MatCreateMPIAIJMKL - Creates a sparse parallel matrix whose local
6    portions are stored as SEQAIJMKL matrices (a matrix class that inherits
7    from SEQAIJ but uses some operations provided by Intel MKL).  The same
8    guidelines that apply to MPIAIJ matrices for preallocating the matrix
9    storage apply here as well.
10 
11       Collective on MPI_Comm
12 
13    Input Parameters:
14 +  comm - MPI communicator
15 .  m - number of local rows (or PETSC_DECIDE to have calculated if M is given)
16            This value should be the same as the local size used in creating the
17            y vector for the matrix-vector product y = Ax.
18 .  n - This value should be the same as the local size used in creating the
19        x vector for the matrix-vector product y = Ax. (or PETSC_DECIDE to have
20        calculated if N is given) For square matrices n is almost always m.
21 .  M - number of global rows (or PETSC_DETERMINE to have calculated if m is given)
22 .  N - number of global columns (or PETSC_DETERMINE to have calculated if n is given)
23 .  d_nz  - number of nonzeros per row in DIAGONAL portion of local submatrix
24            (same value is used for all local rows)
25 .  d_nnz - array containing the number of nonzeros in the various rows of the
26            DIAGONAL portion of the local submatrix (possibly different for each row)
27            or NULL, if d_nz is used to specify the nonzero structure.
28            The size of this array is equal to the number of local rows, i.e 'm'.
29            For matrices you plan to factor you must leave room for the diagonal entry and
30            put in the entry even if it is zero.
31 .  o_nz  - number of nonzeros per row in the OFF-DIAGONAL portion of local
32            submatrix (same value is used for all local rows).
33 -  o_nnz - array containing the number of nonzeros in the various rows of the
34            OFF-DIAGONAL portion of the local submatrix (possibly different for
35            each row) or NULL, if o_nz is used to specify the nonzero
36            structure. The size of this array is equal to the number
37            of local rows, i.e 'm'.
38 
39    Output Parameter:
40 .  A - the matrix
41 
42    Notes:
43    If the *_nnz parameter is given then the *_nz parameter is ignored
44 
45    m,n,M,N parameters specify the size of the matrix, and its partitioning across
46    processors, while d_nz,d_nnz,o_nz,o_nnz parameters specify the approximate
47    storage requirements for this matrix.
48 
49    If PETSC_DECIDE or PETSC_DETERMINE is used for a particular argument on one
50    processor than it must be used on all processors that share the object for
51    that argument.
52 
53    The user MUST specify either the local or global matrix dimensions
54    (possibly both).
55 
56    The parallel matrix is partitioned such that the first m0 rows belong to
57    process 0, the next m1 rows belong to process 1, the next m2 rows belong
58    to process 2 etc.. where m0,m1,m2... are the input parameter 'm'.
59 
60    The DIAGONAL portion of the local submatrix of a processor can be defined
61    as the submatrix which is obtained by extraction the part corresponding
62    to the rows r1-r2 and columns r1-r2 of the global matrix, where r1 is the
63    first row that belongs to the processor, and r2 is the last row belonging
64    to the this processor. This is a square mxm matrix. The remaining portion
65    of the local submatrix (mxN) constitute the OFF-DIAGONAL portion.
66 
67    If o_nnz, d_nnz are specified, then o_nz, and d_nz are ignored.
68 
69    When calling this routine with a single process communicator, a matrix of
70    type SEQAIJMKL is returned.  If a matrix of type MPIAIJMKL is desired
71    for this type of communicator, use the construction mechanism:
72      MatCreate(...,&A); MatSetType(A,MPIAIJMKL); MatMPIAIJSetPreallocation(A,...);
73 
74    Options Database Keys:
75 .  -mat_aijmkl_no_spmv2 - disables use of the SpMV2 inspector-executor routines
76 
77    Level: intermediate
78 
79 .keywords: matrix, MKL, sparse, parallel
80 
81 .seealso: MatCreate(), MatCreateSeqAIJMKL(), MatSetValues()
82 @*/
83 PetscErrorCode  MatCreateMPIAIJMKL(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt d_nz,const PetscInt d_nnz[],PetscInt o_nz,const PetscInt o_nnz[],Mat *A)
84 {
85   PetscErrorCode ierr;
86   PetscMPIInt    size;
87 
88   PetscFunctionBegin;
89   ierr = MatCreate(comm,A);CHKERRQ(ierr);
90   ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr);
91   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
92   if (size > 1) {
93     ierr = MatSetType(*A,MATMPIAIJMKL);CHKERRQ(ierr);
94     ierr = MatMPIAIJSetPreallocation(*A,d_nz,d_nnz,o_nz,o_nnz);CHKERRQ(ierr);
95   } else {
96     ierr = MatSetType(*A,MATSEQAIJMKL);CHKERRQ(ierr);
97     ierr = MatSeqAIJSetPreallocation(*A,d_nz,d_nnz);CHKERRQ(ierr);
98   }
99   PetscFunctionReturn(0);
100 }
101 
102 PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqAIJMKL(Mat,MatType,MatReuse,Mat*);
103 
104 #undef __FUNCT__
105 #define __FUNCT__ "MatMPIAIJSetPreallocation_MPIAIJMKL"
106 PetscErrorCode  MatMPIAIJSetPreallocation_MPIAIJMKL(Mat B,PetscInt d_nz,const PetscInt d_nnz[],PetscInt o_nz,const PetscInt o_nnz[])
107 {
108   Mat_MPIAIJ     *b = (Mat_MPIAIJ*)B->data;
109   PetscErrorCode ierr;
110 
111   PetscFunctionBegin;
112   ierr = MatMPIAIJSetPreallocation_MPIAIJ(B,d_nz,d_nnz,o_nz,o_nnz);CHKERRQ(ierr);
113   ierr = MatConvert_SeqAIJ_SeqAIJMKL(b->A, MATSEQAIJMKL, MAT_INPLACE_MATRIX, &b->A);CHKERRQ(ierr);
114   ierr = MatConvert_SeqAIJ_SeqAIJMKL(b->B, MATSEQAIJMKL, MAT_INPLACE_MATRIX, &b->B);CHKERRQ(ierr);
115   PetscFunctionReturn(0);
116 }
117 
118 #undef __FUNCT__
119 #define __FUNCT__ "MatConvert_MPIAIJ_MPIAIJMKL"
120 PETSC_INTERN PetscErrorCode MatConvert_MPIAIJ_MPIAIJMKL(Mat A,MatType type,MatReuse reuse,Mat *newmat)
121 {
122   PetscErrorCode ierr;
123   Mat            B = *newmat;
124 
125   PetscFunctionBegin;
126   if (reuse == MAT_INITIAL_MATRIX) {
127     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
128   }
129 
130   ierr = PetscObjectChangeTypeName((PetscObject) B, MATMPIAIJMKL);CHKERRQ(ierr);
131   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMPIAIJSetPreallocation_C",MatMPIAIJSetPreallocation_MPIAIJMKL);CHKERRQ(ierr);
132   *newmat = B;
133   PetscFunctionReturn(0);
134 }
135 
136 #undef __FUNCT__
137 #define __FUNCT__ "MatCreate_MPIAIJMKL"
138 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJMKL(Mat A)
139 {
140   PetscErrorCode ierr;
141 
142   PetscFunctionBegin;
143   ierr = MatSetType(A,MATMPIAIJ);CHKERRQ(ierr);
144   ierr = MatConvert_MPIAIJ_MPIAIJMKL(A,MATMPIAIJMKL,MAT_INPLACE_MATRIX,&A);CHKERRQ(ierr);
145   PetscFunctionReturn(0);
146 }
147 
148 /*MC
149    MATAIJMKL - MATAIJMKL = "AIJMKL" - A matrix type to be used for sparse matrices.
150 
151    This matrix type is identical to MATSEQAIJMKL when constructed with a single process communicator,
152    and MATMPIAIJMKL otherwise.  As a result, for single process communicators,
153   MatSeqAIJSetPreallocation() is supported, and similarly MatMPIAIJSetPreallocation() is supported
154   for communicators controlling multiple processes.  It is recommended that you call both of
155   the above preallocation routines for simplicity.
156 
157    Options Database Keys:
158 . -mat_type aijmkl - sets the matrix type to "AIJMKL" during a call to MatSetFromOptions()
159 
160   Level: beginner
161 
162 .seealso: MatCreateMPIAIJMKL(), MATSEQAIJMKL, MATMPIAIJMKL
163 M*/
164 
165