xref: /petsc/src/mat/impls/scatter/mscatter.c (revision 4dfa11a44d5adf2389f1d3acbc8f3c1116dc6c3a)
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 
1611a5261eSBarry Smith     Not Collective, but not cannot use scatter if not used collectively on `Mat`
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 
2611a5261eSBarry Smith .seealso: `MATSCATTER`, `MatCreateScatter()`, `MatScatterSetVecScatter()`, `MATSCATTER`
272a6744ebSBarry Smith @*/
289371c9d4SSatish Balay PetscErrorCode MatScatterGetVecScatter(Mat mat, VecScatter *scatter) {
292a6744ebSBarry Smith   Mat_Scatter *mscatter;
302a6744ebSBarry Smith 
312a6744ebSBarry Smith   PetscFunctionBegin;
320700a824SBarry Smith   PetscValidHeaderSpecific(mat, MAT_CLASSID, 1);
332a6744ebSBarry Smith   PetscValidPointer(scatter, 2);
342a6744ebSBarry Smith   mscatter = (Mat_Scatter *)mat->data;
352a6744ebSBarry Smith   *scatter = mscatter->scatter;
362a6744ebSBarry Smith   PetscFunctionReturn(0);
372a6744ebSBarry Smith }
382a6744ebSBarry Smith 
399371c9d4SSatish Balay PetscErrorCode MatDestroy_Scatter(Mat mat) {
402a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)mat->data;
412a6744ebSBarry Smith 
422a6744ebSBarry Smith   PetscFunctionBegin;
439566063dSJacob Faibussowitsch   PetscCall(VecScatterDestroy(&scatter->scatter));
449566063dSJacob Faibussowitsch   PetscCall(PetscFree(mat->data));
452a6744ebSBarry Smith   PetscFunctionReturn(0);
462a6744ebSBarry Smith }
472a6744ebSBarry Smith 
489371c9d4SSatish Balay PetscErrorCode MatMult_Scatter(Mat A, Vec x, Vec y) {
492a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
502a6744ebSBarry Smith 
512a6744ebSBarry Smith   PetscFunctionBegin;
5228b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
539566063dSJacob Faibussowitsch   PetscCall(VecZeroEntries(y));
549566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, y, ADD_VALUES, SCATTER_FORWARD));
559566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, y, ADD_VALUES, SCATTER_FORWARD));
562a6744ebSBarry Smith   PetscFunctionReturn(0);
572a6744ebSBarry Smith }
582a6744ebSBarry Smith 
599371c9d4SSatish Balay PetscErrorCode MatMultAdd_Scatter(Mat A, Vec x, Vec y, Vec z) {
602a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
612a6744ebSBarry Smith 
622a6744ebSBarry Smith   PetscFunctionBegin;
6328b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
649566063dSJacob Faibussowitsch   if (z != y) PetscCall(VecCopy(y, z));
659566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, z, ADD_VALUES, SCATTER_FORWARD));
669566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, z, ADD_VALUES, SCATTER_FORWARD));
672a6744ebSBarry Smith   PetscFunctionReturn(0);
682a6744ebSBarry Smith }
692a6744ebSBarry Smith 
709371c9d4SSatish Balay PetscErrorCode MatMultTranspose_Scatter(Mat A, Vec x, Vec y) {
712a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
722a6744ebSBarry Smith 
732a6744ebSBarry Smith   PetscFunctionBegin;
7428b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
759566063dSJacob Faibussowitsch   PetscCall(VecZeroEntries(y));
769566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, y, ADD_VALUES, SCATTER_REVERSE));
779566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, y, ADD_VALUES, SCATTER_REVERSE));
782a6744ebSBarry Smith   PetscFunctionReturn(0);
792a6744ebSBarry Smith }
802a6744ebSBarry Smith 
819371c9d4SSatish Balay PetscErrorCode MatMultTransposeAdd_Scatter(Mat A, Vec x, Vec y, Vec z) {
822a6744ebSBarry Smith   Mat_Scatter *scatter = (Mat_Scatter *)A->data;
832a6744ebSBarry Smith 
842a6744ebSBarry Smith   PetscFunctionBegin;
8528b400f6SJacob Faibussowitsch   PetscCheck(scatter->scatter, PetscObjectComm((PetscObject)A), PETSC_ERR_ARG_WRONGSTATE, "Need to first call MatScatterSetScatter()");
869566063dSJacob Faibussowitsch   if (z != y) PetscCall(VecCopy(y, z));
879566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(scatter->scatter, x, z, ADD_VALUES, SCATTER_REVERSE));
889566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(scatter->scatter, x, z, ADD_VALUES, SCATTER_REVERSE));
892a6744ebSBarry Smith   PetscFunctionReturn(0);
902a6744ebSBarry Smith }
912a6744ebSBarry Smith 
92f4259b30SLisandro Dalcin static struct _MatOps MatOps_Values = {NULL,
93f4259b30SLisandro Dalcin                                        NULL,
94f4259b30SLisandro Dalcin                                        NULL,
952a6744ebSBarry Smith                                        MatMult_Scatter,
962a6744ebSBarry Smith                                        /*  4*/ MatMultAdd_Scatter,
972a6744ebSBarry Smith                                        MatMultTranspose_Scatter,
982a6744ebSBarry Smith                                        MatMultTransposeAdd_Scatter,
99f4259b30SLisandro Dalcin                                        NULL,
100f4259b30SLisandro Dalcin                                        NULL,
101f4259b30SLisandro Dalcin                                        NULL,
102f4259b30SLisandro Dalcin                                        /* 10*/ NULL,
103f4259b30SLisandro Dalcin                                        NULL,
104f4259b30SLisandro Dalcin                                        NULL,
105f4259b30SLisandro Dalcin                                        NULL,
106f4259b30SLisandro Dalcin                                        NULL,
107f4259b30SLisandro Dalcin                                        /* 15*/ NULL,
108f4259b30SLisandro Dalcin                                        NULL,
109f4259b30SLisandro Dalcin                                        NULL,
110f4259b30SLisandro Dalcin                                        NULL,
111f4259b30SLisandro Dalcin                                        NULL,
112f4259b30SLisandro Dalcin                                        /* 20*/ NULL,
113f4259b30SLisandro Dalcin                                        NULL,
114f4259b30SLisandro Dalcin                                        NULL,
115f4259b30SLisandro Dalcin                                        NULL,
116f4259b30SLisandro Dalcin                                        /* 24*/ NULL,
117f4259b30SLisandro Dalcin                                        NULL,
118f4259b30SLisandro Dalcin                                        NULL,
119f4259b30SLisandro Dalcin                                        NULL,
120f4259b30SLisandro Dalcin                                        NULL,
121f4259b30SLisandro Dalcin                                        /* 29*/ NULL,
122f4259b30SLisandro Dalcin                                        NULL,
123f4259b30SLisandro Dalcin                                        NULL,
124f4259b30SLisandro Dalcin                                        NULL,
125f4259b30SLisandro Dalcin                                        NULL,
126f4259b30SLisandro Dalcin                                        /* 34*/ NULL,
127f4259b30SLisandro Dalcin                                        NULL,
128f4259b30SLisandro Dalcin                                        NULL,
129f4259b30SLisandro Dalcin                                        NULL,
130f4259b30SLisandro Dalcin                                        NULL,
131f4259b30SLisandro Dalcin                                        /* 39*/ NULL,
132f4259b30SLisandro Dalcin                                        NULL,
133f4259b30SLisandro Dalcin                                        NULL,
134f4259b30SLisandro Dalcin                                        NULL,
135f4259b30SLisandro Dalcin                                        NULL,
136f4259b30SLisandro Dalcin                                        /* 44*/ NULL,
137f4259b30SLisandro Dalcin                                        NULL,
1387d68702bSBarry Smith                                        MatShift_Basic,
139f4259b30SLisandro Dalcin                                        NULL,
140f4259b30SLisandro Dalcin                                        NULL,
141f4259b30SLisandro Dalcin                                        /* 49*/ NULL,
142f4259b30SLisandro Dalcin                                        NULL,
143f4259b30SLisandro Dalcin                                        NULL,
144f4259b30SLisandro Dalcin                                        NULL,
145f4259b30SLisandro Dalcin                                        NULL,
146f4259b30SLisandro Dalcin                                        /* 54*/ NULL,
147f4259b30SLisandro Dalcin                                        NULL,
148f4259b30SLisandro Dalcin                                        NULL,
149f4259b30SLisandro Dalcin                                        NULL,
150f4259b30SLisandro Dalcin                                        NULL,
151f4259b30SLisandro Dalcin                                        /* 59*/ NULL,
1522a6744ebSBarry Smith                                        MatDestroy_Scatter,
153f4259b30SLisandro Dalcin                                        NULL,
154f4259b30SLisandro Dalcin                                        NULL,
155f4259b30SLisandro Dalcin                                        NULL,
156f4259b30SLisandro Dalcin                                        /* 64*/ NULL,
157f4259b30SLisandro Dalcin                                        NULL,
158f4259b30SLisandro Dalcin                                        NULL,
159f4259b30SLisandro Dalcin                                        NULL,
160f4259b30SLisandro Dalcin                                        NULL,
161f4259b30SLisandro Dalcin                                        /* 69*/ NULL,
162f4259b30SLisandro Dalcin                                        NULL,
163f4259b30SLisandro Dalcin                                        NULL,
164f4259b30SLisandro Dalcin                                        NULL,
165f4259b30SLisandro Dalcin                                        NULL,
166f4259b30SLisandro Dalcin                                        /* 74*/ NULL,
167f4259b30SLisandro Dalcin                                        NULL,
168f4259b30SLisandro Dalcin                                        NULL,
169f4259b30SLisandro Dalcin                                        NULL,
170f4259b30SLisandro Dalcin                                        NULL,
171f4259b30SLisandro Dalcin                                        /* 79*/ NULL,
172f4259b30SLisandro Dalcin                                        NULL,
173f4259b30SLisandro Dalcin                                        NULL,
174f4259b30SLisandro Dalcin                                        NULL,
175f4259b30SLisandro Dalcin                                        NULL,
176f4259b30SLisandro Dalcin                                        /* 84*/ NULL,
177f4259b30SLisandro Dalcin                                        NULL,
178f4259b30SLisandro Dalcin                                        NULL,
179f4259b30SLisandro Dalcin                                        NULL,
180f4259b30SLisandro Dalcin                                        NULL,
181f4259b30SLisandro Dalcin                                        /* 89*/ NULL,
182f4259b30SLisandro Dalcin                                        NULL,
183f4259b30SLisandro Dalcin                                        NULL,
184f4259b30SLisandro Dalcin                                        NULL,
185f4259b30SLisandro Dalcin                                        NULL,
186f4259b30SLisandro Dalcin                                        /* 94*/ NULL,
187f4259b30SLisandro Dalcin                                        NULL,
188f4259b30SLisandro Dalcin                                        NULL,
189f4259b30SLisandro Dalcin                                        NULL,
190f4259b30SLisandro Dalcin                                        NULL,
191f4259b30SLisandro Dalcin                                        /*99*/ NULL,
192f4259b30SLisandro Dalcin                                        NULL,
193f4259b30SLisandro Dalcin                                        NULL,
194f4259b30SLisandro Dalcin                                        NULL,
195f4259b30SLisandro Dalcin                                        NULL,
196f4259b30SLisandro Dalcin                                        /*104*/ NULL,
197f4259b30SLisandro Dalcin                                        NULL,
198f4259b30SLisandro Dalcin                                        NULL,
199f4259b30SLisandro Dalcin                                        NULL,
200f4259b30SLisandro Dalcin                                        NULL,
201f4259b30SLisandro Dalcin                                        /*109*/ NULL,
202f4259b30SLisandro Dalcin                                        NULL,
203f4259b30SLisandro Dalcin                                        NULL,
204f4259b30SLisandro Dalcin                                        NULL,
205f4259b30SLisandro Dalcin                                        NULL,
206f4259b30SLisandro Dalcin                                        /*114*/ NULL,
207f4259b30SLisandro Dalcin                                        NULL,
208f4259b30SLisandro Dalcin                                        NULL,
209f4259b30SLisandro Dalcin                                        NULL,
210f4259b30SLisandro Dalcin                                        NULL,
211f4259b30SLisandro Dalcin                                        /*119*/ NULL,
212f4259b30SLisandro Dalcin                                        NULL,
213f4259b30SLisandro Dalcin                                        NULL,
214f4259b30SLisandro Dalcin                                        NULL,
215f4259b30SLisandro Dalcin                                        NULL,
216f4259b30SLisandro Dalcin                                        /*124*/ NULL,
217f4259b30SLisandro Dalcin                                        NULL,
218f4259b30SLisandro Dalcin                                        NULL,
219f4259b30SLisandro Dalcin                                        NULL,
220f4259b30SLisandro Dalcin                                        NULL,
221f4259b30SLisandro Dalcin                                        /*129*/ NULL,
222f4259b30SLisandro Dalcin                                        NULL,
223f4259b30SLisandro Dalcin                                        NULL,
224f4259b30SLisandro Dalcin                                        NULL,
225f4259b30SLisandro Dalcin                                        NULL,
226f4259b30SLisandro Dalcin                                        /*134*/ NULL,
227f4259b30SLisandro Dalcin                                        NULL,
228f4259b30SLisandro Dalcin                                        NULL,
229f4259b30SLisandro Dalcin                                        NULL,
230f4259b30SLisandro Dalcin                                        NULL,
231f4259b30SLisandro Dalcin                                        /*139*/ NULL,
232d70f29a3SPierre Jolivet                                        NULL,
233d70f29a3SPierre Jolivet                                        NULL,
234d70f29a3SPierre Jolivet                                        NULL,
235d70f29a3SPierre Jolivet                                        NULL,
236d70f29a3SPierre Jolivet                                        /*144*/ NULL,
237d70f29a3SPierre Jolivet                                        NULL,
238f4259b30SLisandro Dalcin                                        NULL,
23999a7f59eSMark Adams                                        NULL,
24099a7f59eSMark Adams                                        NULL,
2417fb60732SBarry Smith                                        NULL,
2429371c9d4SSatish Balay                                        /*150*/ NULL};
2432a6744ebSBarry Smith 
2442a6744ebSBarry Smith /*MC
24511a5261eSBarry Smith    MATSCATTER - MATSCATTER = "scatter" - A matrix type that simply applies a `VecScatterBegin()` and `VecScatterEnd()`
2462a6744ebSBarry Smith 
2472a6744ebSBarry Smith   Level: advanced
2482a6744ebSBarry Smith 
24911a5261eSBarry Smith .seealso: ``MATSCATTER`, MatCreateScatter()`, `MatScatterSetVecScatter()`, `MatScatterGetVecScatter()`
2502a6744ebSBarry Smith M*/
2512a6744ebSBarry Smith 
2529371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode MatCreate_Scatter(Mat A) {
2532a6744ebSBarry Smith   Mat_Scatter *b;
2542a6744ebSBarry Smith 
2552a6744ebSBarry Smith   PetscFunctionBegin;
2569566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(A->ops, &MatOps_Values, sizeof(struct _MatOps)));
257*4dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&b));
2582a6744ebSBarry Smith 
2592a6744ebSBarry Smith   A->data = (void *)b;
2602a6744ebSBarry Smith 
2619566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetUp(A->rmap));
2629566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetUp(A->cmap));
2632a6744ebSBarry Smith 
2642a6744ebSBarry Smith   A->assembled    = PETSC_TRUE;
2652a6744ebSBarry Smith   A->preallocated = PETSC_FALSE;
26674d95942SJed Brown 
2679566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)A, MATSCATTER));
2682a6744ebSBarry Smith   PetscFunctionReturn(0);
2692a6744ebSBarry Smith }
2702a6744ebSBarry Smith 
27197929ea7SJunchao Zhang #include <petsc/private/sfimpl.h>
2722a6744ebSBarry Smith /*@C
27311a5261eSBarry Smith    MatCreateScatter - Creates a new matrix of `MatType` `MATSCATTER`, based on a VecScatter
2742a6744ebSBarry Smith 
275d083f849SBarry Smith   Collective
2762a6744ebSBarry Smith 
2772a6744ebSBarry Smith    Input Parameters:
2782a6744ebSBarry Smith +  comm - MPI communicator
27911a5261eSBarry Smith -  scatter - a `VecScatter`
2802a6744ebSBarry Smith 
2812a6744ebSBarry Smith    Output Parameter:
2822a6744ebSBarry Smith .  A - the matrix
2832a6744ebSBarry Smith 
2842a6744ebSBarry Smith    Level: intermediate
2852a6744ebSBarry Smith 
2862a6744ebSBarry Smith    PETSc requires that matrices and vectors being used for certain
2872a6744ebSBarry Smith    operations are partitioned accordingly.  For example, when
2882a6744ebSBarry Smith    creating a scatter matrix, A, that supports parallel matrix-vector
28911a5261eSBarry Smith    products using `MatMult`(A,x,y) the user should set the number
2902a6744ebSBarry Smith    of local matrix rows to be the number of local elements of the
2912a6744ebSBarry Smith    corresponding result vector, y. Note that this is information is
2922a6744ebSBarry Smith    required for use of the matrix interface routines, even though
2932a6744ebSBarry Smith    the scatter matrix may not actually be physically partitioned.
2942a6744ebSBarry Smith 
29511a5261eSBarry Smith   Developer Note:
29611a5261eSBarry Smith    This directly accesses information inside the `VecScatter` associated with the matrix-vector product
2976eb45d04SBarry Smith    for this matrix. This is not desirable..
2986eb45d04SBarry Smith 
299db781477SPatrick Sanan .seealso: `MatScatterSetVecScatter()`, `MatScatterGetVecScatter()`, `MATSCATTER`
3002a6744ebSBarry Smith @*/
3019371c9d4SSatish Balay PetscErrorCode MatCreateScatter(MPI_Comm comm, VecScatter scatter, Mat *A) {
3022a6744ebSBarry Smith   PetscFunctionBegin;
3039566063dSJacob Faibussowitsch   PetscCall(MatCreate(comm, A));
3049566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(*A, scatter->vscat.to_n, scatter->vscat.from_n, PETSC_DETERMINE, PETSC_DETERMINE));
3059566063dSJacob Faibussowitsch   PetscCall(MatSetType(*A, MATSCATTER));
3069566063dSJacob Faibussowitsch   PetscCall(MatScatterSetVecScatter(*A, scatter));
3079566063dSJacob Faibussowitsch   PetscCall(MatSetUp(*A));
3082a6744ebSBarry Smith   PetscFunctionReturn(0);
3092a6744ebSBarry Smith }
3102a6744ebSBarry Smith 
3112a6744ebSBarry Smith /*@
31211a5261eSBarry Smith     MatScatterSetVecScatter - sets the scatter that the matrix is to apply as its linear operator in a `MATSCATTER`
3132a6744ebSBarry Smith 
31411a5261eSBarry Smith    Collective on mat
3152a6744ebSBarry Smith 
3162a6744ebSBarry Smith     Input Parameters:
31711a5261eSBarry Smith +   mat - the `MATSCATTER` matrix
31811a5261eSBarry Smith -   scatter - the scatter context create with `VecScatterCreate()`
3192a6744ebSBarry Smith 
3202a6744ebSBarry Smith    Level: advanced
3212a6744ebSBarry Smith 
32211a5261eSBarry Smith .seealso: `MATSCATTER`, `MatCreateScatter()`, `MATSCATTER`
3232a6744ebSBarry Smith @*/
3249371c9d4SSatish Balay PetscErrorCode MatScatterSetVecScatter(Mat mat, VecScatter scatter) {
3252a6744ebSBarry Smith   Mat_Scatter *mscatter = (Mat_Scatter *)mat->data;
3262a6744ebSBarry Smith 
3272a6744ebSBarry Smith   PetscFunctionBegin;
3280700a824SBarry Smith   PetscValidHeaderSpecific(mat, MAT_CLASSID, 1);
32997929ea7SJunchao Zhang   PetscValidHeaderSpecific(scatter, PETSCSF_CLASSID, 2);
330064a246eSJacob Faibussowitsch   PetscCheckSameComm((PetscObject)scatter, 2, (PetscObject)mat, 1);
33108401ef6SPierre 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);
33208401ef6SPierre 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);
3332a6744ebSBarry Smith 
3349566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)scatter));
3359566063dSJacob Faibussowitsch   PetscCall(VecScatterDestroy(&mscatter->scatter));
33626fbe8dcSKarl Rupp 
3372a6744ebSBarry Smith   mscatter->scatter = scatter;
3382a6744ebSBarry Smith   PetscFunctionReturn(0);
3392a6744ebSBarry Smith }
340