1938d9b04SRichard Tran Mills #include <../src/mat/impls/aij/mpi/mpiaij.h>
2938d9b04SRichard Tran Mills /*@C
3938d9b04SRichard Tran Mills MatCreateMPIAIJPERM - Creates a sparse parallel matrix whose local
411a5261eSBarry Smith portions are stored as `MATSEQAIJPERM` matrices (a matrix class that inherits
5938d9b04SRichard Tran Mills from SEQAIJ but includes some optimizations to allow more effective
620f4b53cSBarry Smith vectorization).
7938d9b04SRichard Tran Mills
8d083f849SBarry Smith Collective
9938d9b04SRichard Tran Mills
10938d9b04SRichard Tran Mills Input Parameters:
11938d9b04SRichard Tran Mills + comm - MPI communicator
122ef1f0ffSBarry Smith . m - number of local rows (or `PETSC_DECIDE` to have calculated if `M` is given)
13938d9b04SRichard Tran Mills This value should be the same as the local size used in creating the
14938d9b04SRichard Tran Mills y vector for the matrix-vector product y = Ax.
15938d9b04SRichard Tran Mills . n - This value should be the same as the local size used in creating the
16938d9b04SRichard Tran Mills x vector for the matrix-vector product y = Ax. (or PETSC_DECIDE to have
172ef1f0ffSBarry Smith calculated if `N` is given) For square matrices `n` is almost always `m`.
182ef1f0ffSBarry Smith . M - number of global rows (or `PETSC_DETERMINE` to have calculated if `m` is given)
192ef1f0ffSBarry Smith . N - number of global columns (or `PETSC_DETERMINE` to have calculated if `n` is given)
20938d9b04SRichard Tran Mills . d_nz - number of nonzeros per row in DIAGONAL portion of local submatrix
21938d9b04SRichard Tran Mills (same value is used for all local rows)
22938d9b04SRichard Tran Mills . d_nnz - array containing the number of nonzeros in the various rows of the
23938d9b04SRichard Tran Mills DIAGONAL portion of the local submatrix (possibly different for each row)
242ef1f0ffSBarry Smith or `NULL`, if `d_nz` is used to specify the nonzero structure.
252ef1f0ffSBarry Smith The size of this array is equal to the number of local rows, i.e `m`.
26938d9b04SRichard Tran Mills For matrices you plan to factor you must leave room for the diagonal entry and
27938d9b04SRichard Tran Mills put in the entry even if it is zero.
28938d9b04SRichard Tran Mills . o_nz - number of nonzeros per row in the OFF-DIAGONAL portion of local
29938d9b04SRichard Tran Mills submatrix (same value is used for all local rows).
30938d9b04SRichard Tran Mills - o_nnz - array containing the number of nonzeros in the various rows of the
31938d9b04SRichard Tran Mills OFF-DIAGONAL portion of the local submatrix (possibly different for
322ef1f0ffSBarry Smith each row) or `NULL`, if `o_nz` is used to specify the nonzero
33938d9b04SRichard Tran Mills structure. The size of this array is equal to the number
342ef1f0ffSBarry Smith of local rows, i.e `m`.
35938d9b04SRichard Tran Mills
36938d9b04SRichard Tran Mills Output Parameter:
37938d9b04SRichard Tran Mills . A - the matrix
38938d9b04SRichard Tran Mills
3927430b45SBarry Smith Options Database Keys:
4027430b45SBarry Smith + -mat_no_inode - Do not use inodes
4127430b45SBarry Smith - -mat_inode_limit <limit> - Sets inode limit (max limit=5)
4227430b45SBarry Smith
4327430b45SBarry Smith Level: intermediate
4427430b45SBarry Smith
45938d9b04SRichard Tran Mills Notes:
46938d9b04SRichard Tran Mills If the *_nnz parameter is given then the *_nz parameter is ignored
47938d9b04SRichard Tran Mills
482ef1f0ffSBarry Smith `m`,`n`,`M`,`N` parameters specify the size of the matrix, and its partitioning across
492ef1f0ffSBarry Smith processors, while `d_nz`,`d_nnz`,`o_nz`,`o_nnz` parameters specify the approximate
50938d9b04SRichard Tran Mills storage requirements for this matrix.
51938d9b04SRichard Tran Mills
5211a5261eSBarry Smith If `PETSC_DECIDE` or `PETSC_DETERMINE` is used for a particular argument on one
53938d9b04SRichard Tran Mills processor than it must be used on all processors that share the object for
54938d9b04SRichard Tran Mills that argument.
55938d9b04SRichard Tran Mills
56938d9b04SRichard Tran Mills The user MUST specify either the local or global matrix dimensions
57938d9b04SRichard Tran Mills (possibly both).
58938d9b04SRichard Tran Mills
59938d9b04SRichard Tran Mills The parallel matrix is partitioned such that the first m0 rows belong to
60938d9b04SRichard Tran Mills process 0, the next m1 rows belong to process 1, the next m2 rows belong
612ef1f0ffSBarry Smith to process 2 etc.. where m0,m1,m2... are the input parameter `m`.
62938d9b04SRichard Tran Mills
63938d9b04SRichard Tran Mills The DIAGONAL portion of the local submatrix of a processor can be defined
64938d9b04SRichard Tran Mills as the submatrix which is obtained by extraction the part corresponding
65938d9b04SRichard Tran Mills to the rows r1-r2 and columns r1-r2 of the global matrix, where r1 is the
66938d9b04SRichard Tran Mills first row that belongs to the processor, and r2 is the last row belonging
67938d9b04SRichard Tran Mills to the this processor. This is a square mxm matrix. The remaining portion
68938d9b04SRichard Tran Mills of the local submatrix (mxN) constitute the OFF-DIAGONAL portion.
69938d9b04SRichard Tran Mills
702ef1f0ffSBarry Smith If `o_nnz`, `d_nnz` are specified, then `o_nz`, and `d_nz` are ignored.
71938d9b04SRichard Tran Mills
72938d9b04SRichard Tran Mills When calling this routine with a single process communicator, a matrix of
7311a5261eSBarry Smith type `MATSEQAIJPERM` is returned. If a matrix of type `MATMPIAIJPERM` is desired
7427430b45SBarry Smith for this type of communicator, use the construction mechanism
7527430b45SBarry Smith .vb
7627430b45SBarry Smith MatCreate(...,&A);
7727430b45SBarry Smith MatSetType(A,MPIAIJ);
7827430b45SBarry Smith MatMPIAIJSetPreallocation(A,...);
7927430b45SBarry Smith .ve
80938d9b04SRichard Tran Mills
81938d9b04SRichard Tran Mills By default, this format uses inodes (identical nodes) when possible.
82938d9b04SRichard Tran Mills We search for consecutive rows with the same nonzero structure, thereby
83938d9b04SRichard Tran Mills reusing matrix information to achieve increased efficiency.
84938d9b04SRichard Tran Mills
851cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, [Sparse Matrix Creation](sec_matsparse), `MATMPIAIJPERM`, `MatCreate()`, `MatCreateSeqAIJPERM()`, `MatSetValues()`
86938d9b04SRichard Tran Mills @*/
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)87d71ae5a4SJacob 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)
88d71ae5a4SJacob Faibussowitsch {
89938d9b04SRichard Tran Mills PetscMPIInt size;
90938d9b04SRichard Tran Mills
91938d9b04SRichard Tran Mills PetscFunctionBegin;
929566063dSJacob Faibussowitsch PetscCall(MatCreate(comm, A));
939566063dSJacob Faibussowitsch PetscCall(MatSetSizes(*A, m, n, M, N));
949566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size));
95938d9b04SRichard Tran Mills if (size > 1) {
969566063dSJacob Faibussowitsch PetscCall(MatSetType(*A, MATMPIAIJPERM));
979566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(*A, d_nz, d_nnz, o_nz, o_nnz));
98938d9b04SRichard Tran Mills } else {
999566063dSJacob Faibussowitsch PetscCall(MatSetType(*A, MATSEQAIJPERM));
1009566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(*A, d_nz, d_nnz));
101938d9b04SRichard Tran Mills }
1023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
103938d9b04SRichard Tran Mills }
104938d9b04SRichard Tran Mills
MatMPIAIJSetPreallocation_MPIAIJPERM(Mat B,PetscInt d_nz,const PetscInt d_nnz[],PetscInt o_nz,const PetscInt o_nnz[])105*66976f2fSJacob Faibussowitsch static PetscErrorCode MatMPIAIJSetPreallocation_MPIAIJPERM(Mat B, PetscInt d_nz, const PetscInt d_nnz[], PetscInt o_nz, const PetscInt o_nnz[])
106d71ae5a4SJacob Faibussowitsch {
107938d9b04SRichard Tran Mills Mat_MPIAIJ *b = (Mat_MPIAIJ *)B->data;
108938d9b04SRichard Tran Mills
109938d9b04SRichard Tran Mills PetscFunctionBegin;
1109566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation_MPIAIJ(B, d_nz, d_nnz, o_nz, o_nnz));
1119566063dSJacob Faibussowitsch PetscCall(MatConvert_SeqAIJ_SeqAIJPERM(b->A, MATSEQAIJPERM, MAT_INPLACE_MATRIX, &b->A));
1129566063dSJacob Faibussowitsch PetscCall(MatConvert_SeqAIJ_SeqAIJPERM(b->B, MATSEQAIJPERM, MAT_INPLACE_MATRIX, &b->B));
1133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
114938d9b04SRichard Tran Mills }
115938d9b04SRichard Tran Mills
MatConvert_MPIAIJ_MPIAIJPERM(Mat A,MatType type,MatReuse reuse,Mat * newmat)116d71ae5a4SJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatConvert_MPIAIJ_MPIAIJPERM(Mat A, MatType type, MatReuse reuse, Mat *newmat)
117d71ae5a4SJacob Faibussowitsch {
118938d9b04SRichard Tran Mills Mat B = *newmat;
119938d9b04SRichard Tran Mills
120938d9b04SRichard Tran Mills PetscFunctionBegin;
12148a46eb9SPierre Jolivet if (reuse == MAT_INITIAL_MATRIX) PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &B));
122938d9b04SRichard Tran Mills
1239566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)B, MATMPIAIJPERM));
1249566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatMPIAIJSetPreallocation_C", MatMPIAIJSetPreallocation_MPIAIJPERM));
125938d9b04SRichard Tran Mills *newmat = B;
1263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
127938d9b04SRichard Tran Mills }
128938d9b04SRichard Tran Mills
MatCreate_MPIAIJPERM(Mat A)129d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJPERM(Mat A)
130d71ae5a4SJacob Faibussowitsch {
131938d9b04SRichard Tran Mills PetscFunctionBegin;
1329566063dSJacob Faibussowitsch PetscCall(MatSetType(A, MATMPIAIJ));
1339566063dSJacob Faibussowitsch PetscCall(MatConvert_MPIAIJ_MPIAIJPERM(A, MATMPIAIJPERM, MAT_INPLACE_MATRIX, &A));
1343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
135938d9b04SRichard Tran Mills }
136938d9b04SRichard Tran Mills
137938d9b04SRichard Tran Mills /*MC
1382ef1f0ffSBarry Smith MATAIJPERM - "AIJPERM" - A matrix type to be used for sparse matrices.
139938d9b04SRichard Tran Mills
14011a5261eSBarry Smith This matrix type is identical to `MATSEQAIJPERM` when constructed with a single process communicator,
14111a5261eSBarry Smith and `MATMPIAIJPERM` otherwise. As a result, for single process communicators,
14211a5261eSBarry Smith `MatSeqAIJSetPreallocation()` is supported, and similarly `MatMPIAIJSetPreallocation()` is supported
143938d9b04SRichard Tran Mills for communicators controlling multiple processes. It is recommended that you call both of
144938d9b04SRichard Tran Mills the above preallocation routines for simplicity.
145938d9b04SRichard Tran Mills
14627430b45SBarry Smith Options Database Key:
1472ef1f0ffSBarry Smith . -mat_type aijperm - sets the matrix type to `MATAIJPERM`
148938d9b04SRichard Tran Mills
149938d9b04SRichard Tran Mills Level: beginner
150938d9b04SRichard Tran Mills
1511cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, `MatCreateMPIAIJPERM()`, `MATSEQAIJPERM`, `MATMPIAIJPERM`, `MATSEQAIJ`, `MATMPIAIJ`, `MATSEQAIJMKL`, `MATMPIAIJMKL`, `MATSEQAIJSELL`, `MATMPIAIJSELL`
152938d9b04SRichard Tran Mills M*/
153