xref: /petsc/src/mat/impls/scatter/mscatter.c (revision 1cc06b555e92f8ec64db10330b8bbd830e5bc876)
12a6744ebSBarry Smith 
22a6744ebSBarry Smith /*
32a6744ebSBarry Smith    This provides a matrix that applies a VecScatter to a vector.
42a6744ebSBarry Smith */
52a6744ebSBarry Smith 
6af0996ceSBarry Smith #include <petsc/private/matimpl.h> /*I "petscmat.h" I*/
7af0996ceSBarry Smith #include <petsc/private/vecimpl.h>
82a6744ebSBarry Smith 
92a6744ebSBarry Smith typedef struct {
102a6744ebSBarry Smith   VecScatter scatter;
112a6744ebSBarry Smith } Mat_Scatter;
122a6744ebSBarry Smith 
132a6744ebSBarry Smith /*@
1411a5261eSBarry Smith     MatScatterGetVecScatter - Returns the user-provided scatter set with `MatScatterSetVecScatter()` in a `MATSCATTER` matrix
152a6744ebSBarry Smith 
162ef1f0ffSBarry Smith     Logically Collective
172a6744ebSBarry Smith 
182a6744ebSBarry Smith     Input Parameter:
1911a5261eSBarry Smith .   mat - the matrix, should have been created with MatCreateScatter() or have type `MATSCATTER`
202a6744ebSBarry Smith 
212a6744ebSBarry Smith     Output Parameter:
222a6744ebSBarry Smith .   scatter - the scatter context
232a6744ebSBarry Smith 
242a6744ebSBarry Smith     Level: intermediate
252a6744ebSBarry Smith 
26*1cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, `MATSCATTER`, `MatCreateScatter()`, `MatScatterSetVecScatter()`, `MATSCATTER`
272a6744ebSBarry Smith @*/
28d71ae5a4SJacob Faibussowitsch PetscErrorCode MatScatterGetVecScatter(Mat mat, VecScatter *scatter)
29d71ae5a4SJacob Faibussowitsch {
302a6744ebSBarry Smith   Mat_Scatter *mscatter;
312a6744ebSBarry Smith 
322a6744ebSBarry Smith   PetscFunctionBegin;
330700a824SBarry Smith   PetscValidHeaderSpecific(mat, MAT_CLASSID, 1);
342a6744ebSBarry Smith   PetscValidPointer(scatter, 2);
352a6744ebSBarry Smith   mscatter = (Mat_Scatter *)mat->data;
362a6744ebSBarry Smith   *scatter = mscatter->scatter;
373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
382a6744ebSBarry Smith }
392a6744ebSBarry Smith 
40d71ae5a4SJacob Faibussowitsch PetscErrorCode MatDestroy_Scatter(Mat mat)
41d71ae5a4SJacob Faibussowitsch {
422a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)mat->data;
432a6744ebSBarry Smith 
442a6744ebSBarry Smith   PetscFunctionBegin;
459566063dSJacob Faibussowitsch   PetscCall(VecScatterDestroy(&scatter->scatter));
469566063dSJacob Faibussowitsch   PetscCall(PetscFree(mat->data));
473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
482a6744ebSBarry Smith }
492a6744ebSBarry Smith 
50d71ae5a4SJacob Faibussowitsch PetscErrorCode MatMult_Scatter(Mat A, Vec x, Vec y)
51d71ae5a4SJacob Faibussowitsch {
522a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
532a6744ebSBarry Smith 
542a6744ebSBarry Smith   PetscFunctionBegin;
5528b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
569566063dSJacob Faibussowitsch   PetscCall(VecZeroEntries(y));
579566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, y, ADD_VALUES, SCATTER_FORWARD));
589566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, y, ADD_VALUES, SCATTER_FORWARD));
593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
602a6744ebSBarry Smith }
612a6744ebSBarry Smith 
62d71ae5a4SJacob Faibussowitsch PetscErrorCode MatMultAdd_Scatter(Mat A, Vec x, Vec y, Vec z)
63d71ae5a4SJacob Faibussowitsch {
642a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
652a6744ebSBarry Smith 
662a6744ebSBarry Smith   PetscFunctionBegin;
6728b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
689566063dSJacob Faibussowitsch   if (z != y) PetscCall(VecCopy(y, z));
699566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, z, ADD_VALUES, SCATTER_FORWARD));
709566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, z, ADD_VALUES, SCATTER_FORWARD));
713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
722a6744ebSBarry Smith }
732a6744ebSBarry Smith 
74d71ae5a4SJacob Faibussowitsch PetscErrorCode MatMultTranspose_Scatter(Mat A, Vec x, Vec y)
75d71ae5a4SJacob Faibussowitsch {
762a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
772a6744ebSBarry Smith 
782a6744ebSBarry Smith   PetscFunctionBegin;
7928b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
809566063dSJacob Faibussowitsch   PetscCall(VecZeroEntries(y));
819566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, y, ADD_VALUES, SCATTER_REVERSE));
829566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, y, ADD_VALUES, SCATTER_REVERSE));
833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
842a6744ebSBarry Smith }
852a6744ebSBarry Smith 
86d71ae5a4SJacob Faibussowitsch PetscErrorCode MatMultTransposeAdd_Scatter(Mat A, Vec x, Vec y, Vec z)
87d71ae5a4SJacob Faibussowitsch {
882a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
892a6744ebSBarry Smith 
902a6744ebSBarry Smith   PetscFunctionBegin;
9128b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
929566063dSJacob Faibussowitsch   if (z != y) PetscCall(VecCopy(y, z));
939566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, z, ADD_VALUES, SCATTER_REVERSE));
949566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, z, ADD_VALUES, SCATTER_REVERSE));
953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
962a6744ebSBarry Smith }
972a6744ebSBarry Smith 
98f4259b30SLisandro Dalcin static struct _MatOps MatOps_Values = {NULL,
99f4259b30SLisandro Dalcin                                        NULL,
100f4259b30SLisandro Dalcin                                        NULL,
1012a6744ebSBarry Smith                                        MatMult_Scatter,
1022a6744ebSBarry Smith                                        /*  4*/ MatMultAdd_Scatter,
1032a6744ebSBarry Smith                                        MatMultTranspose_Scatter,
1042a6744ebSBarry Smith                                        MatMultTransposeAdd_Scatter,
105f4259b30SLisandro Dalcin                                        NULL,
106f4259b30SLisandro Dalcin                                        NULL,
107f4259b30SLisandro Dalcin                                        NULL,
108f4259b30SLisandro Dalcin                                        /* 10*/ NULL,
109f4259b30SLisandro Dalcin                                        NULL,
110f4259b30SLisandro Dalcin                                        NULL,
111f4259b30SLisandro Dalcin                                        NULL,
112f4259b30SLisandro Dalcin                                        NULL,
113f4259b30SLisandro Dalcin                                        /* 15*/ NULL,
114f4259b30SLisandro Dalcin                                        NULL,
115f4259b30SLisandro Dalcin                                        NULL,
116f4259b30SLisandro Dalcin                                        NULL,
117f4259b30SLisandro Dalcin                                        NULL,
118f4259b30SLisandro Dalcin                                        /* 20*/ NULL,
119f4259b30SLisandro Dalcin                                        NULL,
120f4259b30SLisandro Dalcin                                        NULL,
121f4259b30SLisandro Dalcin                                        NULL,
122f4259b30SLisandro Dalcin                                        /* 24*/ NULL,
123f4259b30SLisandro Dalcin                                        NULL,
124f4259b30SLisandro Dalcin                                        NULL,
125f4259b30SLisandro Dalcin                                        NULL,
126f4259b30SLisandro Dalcin                                        NULL,
127f4259b30SLisandro Dalcin                                        /* 29*/ NULL,
128f4259b30SLisandro Dalcin                                        NULL,
129f4259b30SLisandro Dalcin                                        NULL,
130f4259b30SLisandro Dalcin                                        NULL,
131f4259b30SLisandro Dalcin                                        NULL,
132f4259b30SLisandro Dalcin                                        /* 34*/ NULL,
133f4259b30SLisandro Dalcin                                        NULL,
134f4259b30SLisandro Dalcin                                        NULL,
135f4259b30SLisandro Dalcin                                        NULL,
136f4259b30SLisandro Dalcin                                        NULL,
137f4259b30SLisandro Dalcin                                        /* 39*/ NULL,
138f4259b30SLisandro Dalcin                                        NULL,
139f4259b30SLisandro Dalcin                                        NULL,
140f4259b30SLisandro Dalcin                                        NULL,
141f4259b30SLisandro Dalcin                                        NULL,
142f4259b30SLisandro Dalcin                                        /* 44*/ NULL,
143f4259b30SLisandro Dalcin                                        NULL,
1447d68702bSBarry Smith                                        MatShift_Basic,
145f4259b30SLisandro Dalcin                                        NULL,
146f4259b30SLisandro Dalcin                                        NULL,
147f4259b30SLisandro Dalcin                                        /* 49*/ NULL,
148f4259b30SLisandro Dalcin                                        NULL,
149f4259b30SLisandro Dalcin                                        NULL,
150f4259b30SLisandro Dalcin                                        NULL,
151f4259b30SLisandro Dalcin                                        NULL,
152f4259b30SLisandro Dalcin                                        /* 54*/ NULL,
153f4259b30SLisandro Dalcin                                        NULL,
154f4259b30SLisandro Dalcin                                        NULL,
155f4259b30SLisandro Dalcin                                        NULL,
156f4259b30SLisandro Dalcin                                        NULL,
157f4259b30SLisandro Dalcin                                        /* 59*/ NULL,
1582a6744ebSBarry Smith                                        MatDestroy_Scatter,
159f4259b30SLisandro Dalcin                                        NULL,
160f4259b30SLisandro Dalcin                                        NULL,
161f4259b30SLisandro Dalcin                                        NULL,
162f4259b30SLisandro Dalcin                                        /* 64*/ NULL,
163f4259b30SLisandro Dalcin                                        NULL,
164f4259b30SLisandro Dalcin                                        NULL,
165f4259b30SLisandro Dalcin                                        NULL,
166f4259b30SLisandro Dalcin                                        NULL,
167f4259b30SLisandro Dalcin                                        /* 69*/ NULL,
168f4259b30SLisandro Dalcin                                        NULL,
169f4259b30SLisandro Dalcin                                        NULL,
170f4259b30SLisandro Dalcin                                        NULL,
171f4259b30SLisandro Dalcin                                        NULL,
172f4259b30SLisandro Dalcin                                        /* 74*/ NULL,
173f4259b30SLisandro Dalcin                                        NULL,
174f4259b30SLisandro Dalcin                                        NULL,
175f4259b30SLisandro Dalcin                                        NULL,
176f4259b30SLisandro Dalcin                                        NULL,
177f4259b30SLisandro Dalcin                                        /* 79*/ NULL,
178f4259b30SLisandro Dalcin                                        NULL,
179f4259b30SLisandro Dalcin                                        NULL,
180f4259b30SLisandro Dalcin                                        NULL,
181f4259b30SLisandro Dalcin                                        NULL,
182f4259b30SLisandro Dalcin                                        /* 84*/ NULL,
183f4259b30SLisandro Dalcin                                        NULL,
184f4259b30SLisandro Dalcin                                        NULL,
185f4259b30SLisandro Dalcin                                        NULL,
186f4259b30SLisandro Dalcin                                        NULL,
187f4259b30SLisandro Dalcin                                        /* 89*/ NULL,
188f4259b30SLisandro Dalcin                                        NULL,
189f4259b30SLisandro Dalcin                                        NULL,
190f4259b30SLisandro Dalcin                                        NULL,
191f4259b30SLisandro Dalcin                                        NULL,
192f4259b30SLisandro Dalcin                                        /* 94*/ NULL,
193f4259b30SLisandro Dalcin                                        NULL,
194f4259b30SLisandro Dalcin                                        NULL,
195f4259b30SLisandro Dalcin                                        NULL,
196f4259b30SLisandro Dalcin                                        NULL,
197f4259b30SLisandro Dalcin                                        /*99*/ NULL,
198f4259b30SLisandro Dalcin                                        NULL,
199f4259b30SLisandro Dalcin                                        NULL,
200f4259b30SLisandro Dalcin                                        NULL,
201f4259b30SLisandro Dalcin                                        NULL,
202f4259b30SLisandro Dalcin                                        /*104*/ NULL,
203f4259b30SLisandro Dalcin                                        NULL,
204f4259b30SLisandro Dalcin                                        NULL,
205f4259b30SLisandro Dalcin                                        NULL,
206f4259b30SLisandro Dalcin                                        NULL,
207f4259b30SLisandro Dalcin                                        /*109*/ NULL,
208f4259b30SLisandro Dalcin                                        NULL,
209f4259b30SLisandro Dalcin                                        NULL,
210f4259b30SLisandro Dalcin                                        NULL,
211f4259b30SLisandro Dalcin                                        NULL,
212f4259b30SLisandro Dalcin                                        /*114*/ NULL,
213f4259b30SLisandro Dalcin                                        NULL,
214f4259b30SLisandro Dalcin                                        NULL,
215f4259b30SLisandro Dalcin                                        NULL,
216f4259b30SLisandro Dalcin                                        NULL,
217f4259b30SLisandro Dalcin                                        /*119*/ NULL,
218f4259b30SLisandro Dalcin                                        NULL,
219f4259b30SLisandro Dalcin                                        NULL,
220f4259b30SLisandro Dalcin                                        NULL,
221f4259b30SLisandro Dalcin                                        NULL,
222f4259b30SLisandro Dalcin                                        /*124*/ NULL,
223f4259b30SLisandro Dalcin                                        NULL,
224f4259b30SLisandro Dalcin                                        NULL,
225f4259b30SLisandro Dalcin                                        NULL,
226f4259b30SLisandro Dalcin                                        NULL,
227f4259b30SLisandro Dalcin                                        /*129*/ NULL,
228f4259b30SLisandro Dalcin                                        NULL,
229f4259b30SLisandro Dalcin                                        NULL,
230f4259b30SLisandro Dalcin                                        NULL,
231f4259b30SLisandro Dalcin                                        NULL,
232f4259b30SLisandro Dalcin                                        /*134*/ NULL,
233f4259b30SLisandro Dalcin                                        NULL,
234f4259b30SLisandro Dalcin                                        NULL,
235f4259b30SLisandro Dalcin                                        NULL,
236f4259b30SLisandro Dalcin                                        NULL,
237f4259b30SLisandro Dalcin                                        /*139*/ NULL,
238d70f29a3SPierre Jolivet                                        NULL,
239d70f29a3SPierre Jolivet                                        NULL,
240d70f29a3SPierre Jolivet                                        NULL,
241d70f29a3SPierre Jolivet                                        NULL,
242d70f29a3SPierre Jolivet                                        /*144*/ NULL,
243d70f29a3SPierre Jolivet                                        NULL,
244f4259b30SLisandro Dalcin                                        NULL,
24599a7f59eSMark Adams                                        NULL,
24699a7f59eSMark Adams                                        NULL,
2477fb60732SBarry Smith                                        NULL,
248dec0b466SHong Zhang                                        /*150*/ NULL,
249dec0b466SHong Zhang                                        NULL};
2502a6744ebSBarry Smith 
2512a6744ebSBarry Smith /*MC
2522ef1f0ffSBarry Smith    MATSCATTER - "scatter" - A matrix type that simply applies a `VecScatterBegin()` and `VecScatterEnd()` to perform `MatMult()`
2532a6744ebSBarry Smith 
2542a6744ebSBarry Smith   Level: advanced
2552a6744ebSBarry Smith 
256*1cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, ``MATSCATTER`, MatCreateScatter()`, `MatScatterSetVecScatter()`, `MatScatterGetVecScatter()`
2572a6744ebSBarry Smith M*/
2582a6744ebSBarry Smith 
259d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MatCreate_Scatter(Mat A)
260d71ae5a4SJacob Faibussowitsch {
2612a6744ebSBarry Smith   Mat_Scatter *b;
2622a6744ebSBarry Smith 
2632a6744ebSBarry Smith   PetscFunctionBegin;
2649566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(A->ops, &MatOps_Values, sizeof(struct _MatOps)));
2654dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&b));
2662a6744ebSBarry Smith 
2672a6744ebSBarry Smith   A->data = (void *)b;
2682a6744ebSBarry Smith 
2699566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetUp(A->rmap));
2709566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetUp(A->cmap));
2712a6744ebSBarry Smith 
2722a6744ebSBarry Smith   A->assembled    = PETSC_TRUE;
2732a6744ebSBarry Smith   A->preallocated = PETSC_FALSE;
27474d95942SJed Brown 
2759566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)A, MATSCATTER));
2763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2772a6744ebSBarry Smith }
2782a6744ebSBarry Smith 
27997929ea7SJunchao Zhang #include <petsc/private/sfimpl.h>
2802a6744ebSBarry Smith /*@C
28111a5261eSBarry Smith    MatCreateScatter - Creates a new matrix of `MatType` `MATSCATTER`, based on a VecScatter
2822a6744ebSBarry Smith 
283d083f849SBarry Smith   Collective
2842a6744ebSBarry Smith 
2852a6744ebSBarry Smith    Input Parameters:
2862a6744ebSBarry Smith +  comm - MPI communicator
28711a5261eSBarry Smith -  scatter - a `VecScatter`
2882a6744ebSBarry Smith 
2892a6744ebSBarry Smith    Output Parameter:
2902a6744ebSBarry Smith .  A - the matrix
2912a6744ebSBarry Smith 
2922a6744ebSBarry Smith    Level: intermediate
2932a6744ebSBarry Smith 
2942a6744ebSBarry Smith    PETSc requires that matrices and vectors being used for certain
2952a6744ebSBarry Smith    operations are partitioned accordingly.  For example, when
2962a6744ebSBarry Smith    creating a scatter matrix, A, that supports parallel matrix-vector
29711a5261eSBarry Smith    products using `MatMult`(A,x,y) the user should set the number
2982a6744ebSBarry Smith    of local matrix rows to be the number of local elements of the
2992a6744ebSBarry Smith    corresponding result vector, y. Note that this is information is
3002a6744ebSBarry Smith    required for use of the matrix interface routines, even though
3012a6744ebSBarry Smith    the scatter matrix may not actually be physically partitioned.
3022a6744ebSBarry Smith 
30311a5261eSBarry Smith   Developer Note:
30411a5261eSBarry Smith    This directly accesses information inside the `VecScatter` associated with the matrix-vector product
3056eb45d04SBarry Smith    for this matrix. This is not desirable..
3066eb45d04SBarry Smith 
307*1cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, `MatScatterSetVecScatter()`, `MatScatterGetVecScatter()`, `MATSCATTER`
3082a6744ebSBarry Smith @*/
309d71ae5a4SJacob Faibussowitsch PetscErrorCode MatCreateScatter(MPI_Comm comm, VecScatter scatter, Mat *A)
310d71ae5a4SJacob Faibussowitsch {
3112a6744ebSBarry Smith   PetscFunctionBegin;
3129566063dSJacob Faibussowitsch   PetscCall(MatCreate(comm, A));
3139566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(*A, scatter->vscat.to_n, scatter->vscat.from_n, PETSC_DETERMINE, PETSC_DETERMINE));
3149566063dSJacob Faibussowitsch   PetscCall(MatSetType(*A, MATSCATTER));
3159566063dSJacob Faibussowitsch   PetscCall(MatScatterSetVecScatter(*A, scatter));
3169566063dSJacob Faibussowitsch   PetscCall(MatSetUp(*A));
3173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3182a6744ebSBarry Smith }
3192a6744ebSBarry Smith 
3202a6744ebSBarry Smith /*@
32111a5261eSBarry Smith     MatScatterSetVecScatter - sets the scatter that the matrix is to apply as its linear operator in a `MATSCATTER`
3222a6744ebSBarry Smith 
3232ef1f0ffSBarry Smith    Logically Collective
3242a6744ebSBarry Smith 
3252a6744ebSBarry Smith     Input Parameters:
32611a5261eSBarry Smith +   mat - the `MATSCATTER` matrix
32711a5261eSBarry Smith -   scatter - the scatter context create with `VecScatterCreate()`
3282a6744ebSBarry Smith 
3292a6744ebSBarry Smith    Level: advanced
3302a6744ebSBarry Smith 
331*1cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, `MATSCATTER`, `MatCreateScatter()`, `MATSCATTER`
3322a6744ebSBarry Smith @*/
333d71ae5a4SJacob Faibussowitsch PetscErrorCode MatScatterSetVecScatter(Mat mat, VecScatter scatter)
334d71ae5a4SJacob Faibussowitsch {
3352a6744ebSBarry Smith   Mat_Scatter *mscatter = (Mat_Scatter *)mat->data;
3362a6744ebSBarry Smith 
3372a6744ebSBarry Smith   PetscFunctionBegin;
3380700a824SBarry Smith   PetscValidHeaderSpecific(mat, MAT_CLASSID, 1);
33997929ea7SJunchao Zhang   PetscValidHeaderSpecific(scatter, PETSCSF_CLASSID, 2);
340064a246eSJacob Faibussowitsch   PetscCheckSameComm((PetscObject)scatter, 2, (PetscObject)mat, 1);
34108401ef6SPierre Jolivet   PetscCheck(mat->rmap->n == scatter->vscat.to_n, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Number of local rows in matrix %" PetscInt_FMT " not equal local scatter size %" PetscInt_FMT, mat->rmap->n, scatter->vscat.to_n);
34208401ef6SPierre Jolivet   PetscCheck(mat->cmap->n == scatter->vscat.from_n, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Number of local columns in matrix %" PetscInt_FMT " not equal local scatter size %" PetscInt_FMT, mat->cmap->n, scatter->vscat.from_n);
3432a6744ebSBarry Smith 
3449566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)scatter));
3459566063dSJacob Faibussowitsch   PetscCall(VecScatterDestroy(&mscatter->scatter));
34626fbe8dcSKarl Rupp 
3472a6744ebSBarry Smith   mscatter->scatter = scatter;
3483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3492a6744ebSBarry Smith }
350