xref: /petsc/src/mat/impls/aij/mpi/aijperm/mpiaijperm.c (revision 27430b45d0a5eedd7547ed99d6048b6750b3fa8a)
1938d9b04SRichard Tran Mills 
2938d9b04SRichard Tran Mills #include <../src/mat/impls/aij/mpi/mpiaij.h>
3938d9b04SRichard Tran Mills /*@C
4938d9b04SRichard Tran Mills    MatCreateMPIAIJPERM - Creates a sparse parallel matrix whose local
511a5261eSBarry Smith    portions are stored as `MATSEQAIJPERM` matrices (a matrix class that inherits
6938d9b04SRichard Tran Mills    from SEQAIJ but includes some optimizations to allow more effective
711a5261eSBarry Smith    vectorization).  The same guidelines that apply to `MATMPIAIJ` matrices for
8938d9b04SRichard Tran Mills    preallocating the matrix storage apply here as well.
9938d9b04SRichard Tran Mills 
10d083f849SBarry Smith       Collective
11938d9b04SRichard Tran Mills 
12938d9b04SRichard Tran Mills    Input Parameters:
13938d9b04SRichard Tran Mills +  comm - MPI communicator
1411a5261eSBarry Smith .  m - number of local rows (or `PETSC_DECIDE` to have calculated if M is given)
15938d9b04SRichard Tran Mills            This value should be the same as the local size used in creating the
16938d9b04SRichard Tran Mills            y vector for the matrix-vector product y = Ax.
17938d9b04SRichard Tran Mills .  n - This value should be the same as the local size used in creating the
18938d9b04SRichard Tran Mills        x vector for the matrix-vector product y = Ax. (or PETSC_DECIDE to have
19938d9b04SRichard Tran Mills        calculated if N is given) For square matrices n is almost always m.
2011a5261eSBarry Smith .  M - number of global rows (or `PETSC_DETERMINE` to have calculated if m is given)
2111a5261eSBarry Smith .  N - number of global columns (or `PETSC_DETERMINE` to have calculated if n is given)
22938d9b04SRichard Tran Mills .  d_nz  - number of nonzeros per row in DIAGONAL portion of local submatrix
23938d9b04SRichard Tran Mills            (same value is used for all local rows)
24938d9b04SRichard Tran Mills .  d_nnz - array containing the number of nonzeros in the various rows of the
25938d9b04SRichard Tran Mills            DIAGONAL portion of the local submatrix (possibly different for each row)
26938d9b04SRichard Tran Mills            or NULL, if d_nz is used to specify the nonzero structure.
27938d9b04SRichard Tran Mills            The size of this array is equal to the number of local rows, i.e 'm'.
28938d9b04SRichard Tran Mills            For matrices you plan to factor you must leave room for the diagonal entry and
29938d9b04SRichard Tran Mills            put in the entry even if it is zero.
30938d9b04SRichard Tran Mills .  o_nz  - number of nonzeros per row in the OFF-DIAGONAL portion of local
31938d9b04SRichard Tran Mills            submatrix (same value is used for all local rows).
32938d9b04SRichard Tran Mills -  o_nnz - array containing the number of nonzeros in the various rows of the
33938d9b04SRichard Tran Mills            OFF-DIAGONAL portion of the local submatrix (possibly different for
34938d9b04SRichard Tran Mills            each row) or NULL, if o_nz is used to specify the nonzero
35938d9b04SRichard Tran Mills            structure. The size of this array is equal to the number
36938d9b04SRichard Tran Mills            of local rows, i.e 'm'.
37938d9b04SRichard Tran Mills 
38938d9b04SRichard Tran Mills    Output Parameter:
39938d9b04SRichard Tran Mills .  A - the matrix
40938d9b04SRichard Tran Mills 
41*27430b45SBarry Smith    Options Database Keys:
42*27430b45SBarry Smith +  -mat_no_inode  - Do not use inodes
43*27430b45SBarry Smith -  -mat_inode_limit <limit> - Sets inode limit (max limit=5)
44*27430b45SBarry Smith 
45*27430b45SBarry Smith    Level: intermediate
46*27430b45SBarry Smith 
47938d9b04SRichard Tran Mills    Notes:
48938d9b04SRichard Tran Mills    If the *_nnz parameter is given then the *_nz parameter is ignored
49938d9b04SRichard Tran Mills 
50938d9b04SRichard Tran Mills    m,n,M,N parameters specify the size of the matrix, and its partitioning across
51938d9b04SRichard Tran Mills    processors, while d_nz,d_nnz,o_nz,o_nnz parameters specify the approximate
52938d9b04SRichard Tran Mills    storage requirements for this matrix.
53938d9b04SRichard Tran Mills 
5411a5261eSBarry Smith    If `PETSC_DECIDE` or  `PETSC_DETERMINE` is used for a particular argument on one
55938d9b04SRichard Tran Mills    processor than it must be used on all processors that share the object for
56938d9b04SRichard Tran Mills    that argument.
57938d9b04SRichard Tran Mills 
58938d9b04SRichard Tran Mills    The user MUST specify either the local or global matrix dimensions
59938d9b04SRichard Tran Mills    (possibly both).
60938d9b04SRichard Tran Mills 
61938d9b04SRichard Tran Mills    The parallel matrix is partitioned such that the first m0 rows belong to
62938d9b04SRichard Tran Mills    process 0, the next m1 rows belong to process 1, the next m2 rows belong
63938d9b04SRichard Tran Mills    to process 2 etc.. where m0,m1,m2... are the input parameter 'm'.
64938d9b04SRichard Tran Mills 
65938d9b04SRichard Tran Mills    The DIAGONAL portion of the local submatrix of a processor can be defined
66938d9b04SRichard Tran Mills    as the submatrix which is obtained by extraction the part corresponding
67938d9b04SRichard Tran Mills    to the rows r1-r2 and columns r1-r2 of the global matrix, where r1 is the
68938d9b04SRichard Tran Mills    first row that belongs to the processor, and r2 is the last row belonging
69938d9b04SRichard Tran Mills    to the this processor. This is a square mxm matrix. The remaining portion
70938d9b04SRichard Tran Mills    of the local submatrix (mxN) constitute the OFF-DIAGONAL portion.
71938d9b04SRichard Tran Mills 
72938d9b04SRichard Tran Mills    If o_nnz, d_nnz are specified, then o_nz, and d_nz are ignored.
73938d9b04SRichard Tran Mills 
74938d9b04SRichard Tran Mills    When calling this routine with a single process communicator, a matrix of
7511a5261eSBarry Smith    type `MATSEQAIJPERM` is returned.  If a matrix of type `MATMPIAIJPERM` is desired
76*27430b45SBarry Smith    for this type of communicator, use the construction mechanism
77*27430b45SBarry Smith .vb
78*27430b45SBarry Smith    MatCreate(...,&A);
79*27430b45SBarry Smith    MatSetType(A,MPIAIJ);
80*27430b45SBarry Smith    MatMPIAIJSetPreallocation(A,...);
81*27430b45SBarry Smith .ve
82938d9b04SRichard Tran Mills 
83938d9b04SRichard Tran Mills    By default, this format uses inodes (identical nodes) when possible.
84938d9b04SRichard Tran Mills    We search for consecutive rows with the same nonzero structure, thereby
85938d9b04SRichard Tran Mills    reusing matrix information to achieve increased efficiency.
86938d9b04SRichard Tran Mills 
8760161072SBarry Smith .seealso: [Sparse Matrix Creation](sec_matsparse), `MATMPIAIJPERM`, `MatCreate()`, `MatCreateSeqAIJPERM()`, `MatSetValues()`
88938d9b04SRichard Tran Mills @*/
89d71ae5a4SJacob Faibussowitsch PetscErrorCode MatCreateMPIAIJPERM(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)
90d71ae5a4SJacob Faibussowitsch {
91938d9b04SRichard Tran Mills   PetscMPIInt size;
92938d9b04SRichard Tran Mills 
93938d9b04SRichard Tran Mills   PetscFunctionBegin;
949566063dSJacob Faibussowitsch   PetscCall(MatCreate(comm, A));
959566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(*A, m, n, M, N));
969566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
97938d9b04SRichard Tran Mills   if (size > 1) {
989566063dSJacob Faibussowitsch     PetscCall(MatSetType(*A, MATMPIAIJPERM));
999566063dSJacob Faibussowitsch     PetscCall(MatMPIAIJSetPreallocation(*A, d_nz, d_nnz, o_nz, o_nnz));
100938d9b04SRichard Tran Mills   } else {
1019566063dSJacob Faibussowitsch     PetscCall(MatSetType(*A, MATSEQAIJPERM));
1029566063dSJacob Faibussowitsch     PetscCall(MatSeqAIJSetPreallocation(*A, d_nz, d_nnz));
103938d9b04SRichard Tran Mills   }
1043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
105938d9b04SRichard Tran Mills }
106938d9b04SRichard Tran Mills 
107d71ae5a4SJacob Faibussowitsch PetscErrorCode MatMPIAIJSetPreallocation_MPIAIJPERM(Mat B, PetscInt d_nz, const PetscInt d_nnz[], PetscInt o_nz, const PetscInt o_nnz[])
108d71ae5a4SJacob Faibussowitsch {
109938d9b04SRichard Tran Mills   Mat_MPIAIJ *b = (Mat_MPIAIJ *)B->data;
110938d9b04SRichard Tran Mills 
111938d9b04SRichard Tran Mills   PetscFunctionBegin;
1129566063dSJacob Faibussowitsch   PetscCall(MatMPIAIJSetPreallocation_MPIAIJ(B, d_nz, d_nnz, o_nz, o_nnz));
1139566063dSJacob Faibussowitsch   PetscCall(MatConvert_SeqAIJ_SeqAIJPERM(b->A, MATSEQAIJPERM, MAT_INPLACE_MATRIX, &b->A));
1149566063dSJacob Faibussowitsch   PetscCall(MatConvert_SeqAIJ_SeqAIJPERM(b->B, MATSEQAIJPERM, MAT_INPLACE_MATRIX, &b->B));
1153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
116938d9b04SRichard Tran Mills }
117938d9b04SRichard Tran Mills 
118d71ae5a4SJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatConvert_MPIAIJ_MPIAIJPERM(Mat A, MatType type, MatReuse reuse, Mat *newmat)
119d71ae5a4SJacob Faibussowitsch {
120938d9b04SRichard Tran Mills   Mat B = *newmat;
121938d9b04SRichard Tran Mills 
122938d9b04SRichard Tran Mills   PetscFunctionBegin;
12348a46eb9SPierre Jolivet   if (reuse == MAT_INITIAL_MATRIX) PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &B));
124938d9b04SRichard Tran Mills 
1259566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)B, MATMPIAIJPERM));
1269566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatMPIAIJSetPreallocation_C", MatMPIAIJSetPreallocation_MPIAIJPERM));
127938d9b04SRichard Tran Mills   *newmat = B;
1283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
129938d9b04SRichard Tran Mills }
130938d9b04SRichard Tran Mills 
131d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJPERM(Mat A)
132d71ae5a4SJacob Faibussowitsch {
133938d9b04SRichard Tran Mills   PetscFunctionBegin;
1349566063dSJacob Faibussowitsch   PetscCall(MatSetType(A, MATMPIAIJ));
1359566063dSJacob Faibussowitsch   PetscCall(MatConvert_MPIAIJ_MPIAIJPERM(A, MATMPIAIJPERM, MAT_INPLACE_MATRIX, &A));
1363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
137938d9b04SRichard Tran Mills }
138938d9b04SRichard Tran Mills 
139938d9b04SRichard Tran Mills /*MC
140938d9b04SRichard Tran Mills    MATAIJPERM - MATAIJPERM = "AIJPERM" - A matrix type to be used for sparse matrices.
141938d9b04SRichard Tran Mills 
14211a5261eSBarry Smith    This matrix type is identical to `MATSEQAIJPERM` when constructed with a single process communicator,
14311a5261eSBarry Smith    and `MATMPIAIJPERM` otherwise.  As a result, for single process communicators,
14411a5261eSBarry Smith   `MatSeqAIJSetPreallocation()` is supported, and similarly `MatMPIAIJSetPreallocation()` is supported
145938d9b04SRichard Tran Mills   for communicators controlling multiple processes.  It is recommended that you call both of
146938d9b04SRichard Tran Mills   the above preallocation routines for simplicity.
147938d9b04SRichard Tran Mills 
148*27430b45SBarry Smith    Options Database Key:
14911a5261eSBarry Smith . -mat_type aijperm - sets the matrix type to `MATAIJPERM` during a call to `MatSetFromOptions()`
150938d9b04SRichard Tran Mills 
151938d9b04SRichard Tran Mills   Level: beginner
152938d9b04SRichard Tran Mills 
15311a5261eSBarry Smith .seealso: `MatCreateMPIAIJPERM()`, `MATSEQAIJPERM`, `MATMPIAIJPERM`, `MATSEQAIJ`, `MATMPIAIJ`, `MATSEQAIJMKL`, `MATMPIAIJMKL`, `MATSEQAIJSELL`, `MATMPIAIJSELL`
154938d9b04SRichard Tran Mills M*/
155