xref: /petsc/src/mat/impls/scatter/mscatter.c (revision 6eb45d042f92ca4eb6331185d4cbce3b7a0c0f50)
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 /*@
142a6744ebSBarry Smith     MatScatterGetVecScatter - Returns the user-provided scatter set with MatScatterSetVecScatter()
152a6744ebSBarry Smith 
162a6744ebSBarry Smith     Not Collective, but not cannot use scatter if not used collectively on Mat
172a6744ebSBarry Smith 
182a6744ebSBarry Smith     Input Parameter:
192a6744ebSBarry 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 
262a6744ebSBarry Smith .keywords: matrix, scatter, get
272a6744ebSBarry Smith 
282a6744ebSBarry Smith .seealso: MatCreateScatter(), MatScatterSetVecScatter(), MATSCATTER
292a6744ebSBarry Smith @*/
307087cfbeSBarry Smith PetscErrorCode  MatScatterGetVecScatter(Mat mat,VecScatter *scatter)
312a6744ebSBarry Smith {
322a6744ebSBarry Smith   Mat_Scatter *mscatter;
332a6744ebSBarry Smith 
342a6744ebSBarry Smith   PetscFunctionBegin;
350700a824SBarry Smith   PetscValidHeaderSpecific(mat,MAT_CLASSID,1);
362a6744ebSBarry Smith   PetscValidPointer(scatter,2);
372a6744ebSBarry Smith   mscatter = (Mat_Scatter*)mat->data;
382a6744ebSBarry Smith   *scatter = mscatter->scatter;
392a6744ebSBarry Smith   PetscFunctionReturn(0);
402a6744ebSBarry Smith }
412a6744ebSBarry Smith 
422a6744ebSBarry Smith PetscErrorCode MatDestroy_Scatter(Mat mat)
432a6744ebSBarry Smith {
442a6744ebSBarry Smith   PetscErrorCode ierr;
452a6744ebSBarry Smith   Mat_Scatter    *scatter = (Mat_Scatter*)mat->data;
462a6744ebSBarry Smith 
472a6744ebSBarry Smith   PetscFunctionBegin;
486bf464f9SBarry Smith   ierr = VecScatterDestroy(&scatter->scatter);CHKERRQ(ierr);
496bf464f9SBarry Smith   ierr = PetscFree(mat->data);CHKERRQ(ierr);
502a6744ebSBarry Smith   PetscFunctionReturn(0);
512a6744ebSBarry Smith }
522a6744ebSBarry Smith 
532a6744ebSBarry Smith PetscErrorCode MatMult_Scatter(Mat A,Vec x,Vec y)
542a6744ebSBarry Smith {
552a6744ebSBarry Smith   Mat_Scatter    *scatter = (Mat_Scatter*)A->data;
562a6744ebSBarry Smith   PetscErrorCode ierr;
572a6744ebSBarry Smith 
582a6744ebSBarry Smith   PetscFunctionBegin;
59ce94432eSBarry Smith   if (!scatter->scatter) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONGSTATE,"Need to first call MatScatterSetScatter()");
6074d95942SJed Brown   ierr = VecZeroEntries(y);CHKERRQ(ierr);
6174d95942SJed Brown   ierr = VecScatterBegin(scatter->scatter,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
6274d95942SJed Brown   ierr = VecScatterEnd(scatter->scatter,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
632a6744ebSBarry Smith   PetscFunctionReturn(0);
642a6744ebSBarry Smith }
652a6744ebSBarry Smith 
662a6744ebSBarry Smith PetscErrorCode MatMultAdd_Scatter(Mat A,Vec x,Vec y,Vec z)
672a6744ebSBarry Smith {
682a6744ebSBarry Smith   Mat_Scatter    *scatter = (Mat_Scatter*)A->data;
692a6744ebSBarry Smith   PetscErrorCode ierr;
702a6744ebSBarry Smith 
712a6744ebSBarry Smith   PetscFunctionBegin;
72ce94432eSBarry Smith   if (!scatter->scatter) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONGSTATE,"Need to first call MatScatterSetScatter()");
732a6744ebSBarry Smith   if (z != y) {ierr = VecCopy(y,z);CHKERRQ(ierr);}
74ca9f406cSSatish Balay   ierr = VecScatterBegin(scatter->scatter,x,z,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
75ca9f406cSSatish Balay   ierr = VecScatterEnd(scatter->scatter,x,z,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
762a6744ebSBarry Smith   PetscFunctionReturn(0);
772a6744ebSBarry Smith }
782a6744ebSBarry Smith 
792a6744ebSBarry Smith PetscErrorCode MatMultTranspose_Scatter(Mat A,Vec x,Vec y)
802a6744ebSBarry Smith {
812a6744ebSBarry Smith   Mat_Scatter    *scatter = (Mat_Scatter*)A->data;
822a6744ebSBarry Smith   PetscErrorCode ierr;
832a6744ebSBarry Smith 
842a6744ebSBarry Smith   PetscFunctionBegin;
85ce94432eSBarry Smith   if (!scatter->scatter) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONGSTATE,"Need to first call MatScatterSetScatter()");
8674d95942SJed Brown   ierr = VecZeroEntries(y);CHKERRQ(ierr);
8774d95942SJed Brown   ierr = VecScatterBegin(scatter->scatter,x,y,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
8874d95942SJed Brown   ierr = VecScatterEnd(scatter->scatter,x,y,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
892a6744ebSBarry Smith   PetscFunctionReturn(0);
902a6744ebSBarry Smith }
912a6744ebSBarry Smith 
922a6744ebSBarry Smith PetscErrorCode MatMultTransposeAdd_Scatter(Mat A,Vec x,Vec y,Vec z)
932a6744ebSBarry Smith {
942a6744ebSBarry Smith   Mat_Scatter    *scatter = (Mat_Scatter*)A->data;
952a6744ebSBarry Smith   PetscErrorCode ierr;
962a6744ebSBarry Smith 
972a6744ebSBarry Smith   PetscFunctionBegin;
98ce94432eSBarry Smith   if (!scatter->scatter) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONGSTATE,"Need to first call MatScatterSetScatter()");
992a6744ebSBarry Smith   if (z != y) {ierr = VecCopy(y,z);CHKERRQ(ierr);}
100ca9f406cSSatish Balay   ierr = VecScatterBegin(scatter->scatter,x,z,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
101ca9f406cSSatish Balay   ierr = VecScatterEnd(scatter->scatter,x,z,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
1022a6744ebSBarry Smith   PetscFunctionReturn(0);
1032a6744ebSBarry Smith }
1042a6744ebSBarry Smith 
1052a6744ebSBarry Smith static struct _MatOps MatOps_Values = {0,
1062a6744ebSBarry Smith                                        0,
1072a6744ebSBarry Smith                                        0,
1082a6744ebSBarry Smith                                        MatMult_Scatter,
1092a6744ebSBarry Smith                                /*  4*/ MatMultAdd_Scatter,
1102a6744ebSBarry Smith                                        MatMultTranspose_Scatter,
1112a6744ebSBarry Smith                                        MatMultTransposeAdd_Scatter,
1122a6744ebSBarry Smith                                        0,
1132a6744ebSBarry Smith                                        0,
1142a6744ebSBarry Smith                                        0,
1152a6744ebSBarry Smith                                /* 10*/ 0,
1162a6744ebSBarry Smith                                        0,
1172a6744ebSBarry Smith                                        0,
1182a6744ebSBarry Smith                                        0,
1192a6744ebSBarry Smith                                        0,
1202a6744ebSBarry Smith                                /* 15*/ 0,
1212a6744ebSBarry Smith                                        0,
1222a6744ebSBarry Smith                                        0,
1232a6744ebSBarry Smith                                        0,
1242a6744ebSBarry Smith                                        0,
1252a6744ebSBarry Smith                                /* 20*/ 0,
1262a6744ebSBarry Smith                                        0,
1272a6744ebSBarry Smith                                        0,
1282a6744ebSBarry Smith                                        0,
129d519adbfSMatthew Knepley                                /* 24*/ 0,
1302a6744ebSBarry Smith                                        0,
1312a6744ebSBarry Smith                                        0,
1322a6744ebSBarry Smith                                        0,
1332a6744ebSBarry Smith                                        0,
134d519adbfSMatthew Knepley                                /* 29*/ 0,
1352a6744ebSBarry Smith                                        0,
1362a6744ebSBarry Smith                                        0,
1372a6744ebSBarry Smith                                        0,
1382a6744ebSBarry Smith                                        0,
139d519adbfSMatthew Knepley                                /* 34*/ 0,
1402a6744ebSBarry Smith                                        0,
1412a6744ebSBarry Smith                                        0,
1422a6744ebSBarry Smith                                        0,
1432a6744ebSBarry Smith                                        0,
144d519adbfSMatthew Knepley                                /* 39*/ 0,
1452a6744ebSBarry Smith                                        0,
1462a6744ebSBarry Smith                                        0,
1472a6744ebSBarry Smith                                        0,
1482a6744ebSBarry Smith                                        0,
149d519adbfSMatthew Knepley                                /* 44*/ 0,
1502a6744ebSBarry Smith                                        0,
1517d68702bSBarry Smith                                        MatShift_Basic,
1522a6744ebSBarry Smith                                        0,
1532a6744ebSBarry Smith                                        0,
154d519adbfSMatthew Knepley                                /* 49*/ 0,
1552a6744ebSBarry Smith                                        0,
1562a6744ebSBarry Smith                                        0,
1572a6744ebSBarry Smith                                        0,
1582a6744ebSBarry Smith                                        0,
159d519adbfSMatthew Knepley                                /* 54*/ 0,
1602a6744ebSBarry Smith                                        0,
1612a6744ebSBarry Smith                                        0,
1622a6744ebSBarry Smith                                        0,
1632a6744ebSBarry Smith                                        0,
164d519adbfSMatthew Knepley                                /* 59*/ 0,
1652a6744ebSBarry Smith                                        MatDestroy_Scatter,
1662a6744ebSBarry Smith                                        0,
1672a6744ebSBarry Smith                                        0,
1682a6744ebSBarry Smith                                        0,
169d519adbfSMatthew Knepley                                /* 64*/ 0,
1702a6744ebSBarry Smith                                        0,
1712a6744ebSBarry Smith                                        0,
1722a6744ebSBarry Smith                                        0,
1732a6744ebSBarry Smith                                        0,
174d519adbfSMatthew Knepley                                /* 69*/ 0,
1752a6744ebSBarry Smith                                        0,
1762a6744ebSBarry Smith                                        0,
1772a6744ebSBarry Smith                                        0,
1782a6744ebSBarry Smith                                        0,
179d519adbfSMatthew Knepley                                /* 74*/ 0,
1802a6744ebSBarry Smith                                        0,
1812a6744ebSBarry Smith                                        0,
1822a6744ebSBarry Smith                                        0,
1832a6744ebSBarry Smith                                        0,
184d519adbfSMatthew Knepley                                /* 79*/ 0,
1852a6744ebSBarry Smith                                        0,
1862a6744ebSBarry Smith                                        0,
1872a6744ebSBarry Smith                                        0,
1882a6744ebSBarry Smith                                        0,
189d519adbfSMatthew Knepley                                /* 84*/ 0,
1902a6744ebSBarry Smith                                        0,
1912a6744ebSBarry Smith                                        0,
1922a6744ebSBarry Smith                                        0,
1932a6744ebSBarry Smith                                        0,
194d519adbfSMatthew Knepley                                /* 89*/ 0,
1952a6744ebSBarry Smith                                        0,
1962a6744ebSBarry Smith                                        0,
1972a6744ebSBarry Smith                                        0,
1982a6744ebSBarry Smith                                        0,
199d519adbfSMatthew Knepley                                /* 94*/ 0,
2002a6744ebSBarry Smith                                        0,
2012a6744ebSBarry Smith                                        0,
2023964eb88SJed Brown                                        0,
2033964eb88SJed Brown                                        0,
2043964eb88SJed Brown                                 /*99*/ 0,
2053964eb88SJed Brown                                        0,
2063964eb88SJed Brown                                        0,
2073964eb88SJed Brown                                        0,
2083964eb88SJed Brown                                        0,
2093964eb88SJed Brown                                /*104*/ 0,
2103964eb88SJed Brown                                        0,
2113964eb88SJed Brown                                        0,
2123964eb88SJed Brown                                        0,
2133964eb88SJed Brown                                        0,
2143964eb88SJed Brown                                /*109*/ 0,
2153964eb88SJed Brown                                        0,
2163964eb88SJed Brown                                        0,
2173964eb88SJed Brown                                        0,
2183964eb88SJed Brown                                        0,
2193964eb88SJed Brown                                /*114*/ 0,
2203964eb88SJed Brown                                        0,
2213964eb88SJed Brown                                        0,
2223964eb88SJed Brown                                        0,
2233964eb88SJed Brown                                        0,
2243964eb88SJed Brown                                /*119*/ 0,
2253964eb88SJed Brown                                        0,
2263964eb88SJed Brown                                        0,
2273964eb88SJed Brown                                        0,
2283964eb88SJed Brown                                        0,
2293964eb88SJed Brown                                /*124*/ 0,
2303964eb88SJed Brown                                        0,
2313964eb88SJed Brown                                        0,
2323964eb88SJed Brown                                        0,
2333964eb88SJed Brown                                        0,
2343964eb88SJed Brown                                /*129*/ 0,
2353964eb88SJed Brown                                        0,
2363964eb88SJed Brown                                        0,
2373964eb88SJed Brown                                        0,
2383964eb88SJed Brown                                        0,
2393964eb88SJed Brown                                /*134*/ 0,
2403964eb88SJed Brown                                        0,
2413964eb88SJed Brown                                        0,
2423964eb88SJed Brown                                        0,
2433964eb88SJed Brown                                        0,
2443964eb88SJed Brown                                /*139*/ 0,
245f9426fe0SMark Adams                                        0,
2463964eb88SJed Brown                                        0
2473964eb88SJed Brown };
2482a6744ebSBarry Smith 
2492a6744ebSBarry Smith /*MC
2504a440b9bSBarry Smith    MATSCATTER - MATSCATTER = "scatter" - A matrix type that simply applies a VecScatterBegin/End()
2512a6744ebSBarry Smith 
2522a6744ebSBarry Smith   Level: advanced
2532a6744ebSBarry Smith 
2542a6744ebSBarry Smith .seealso: MatCreateScatter(), MatScatterSetVecScatter(), MatScatterGetVecScatter()
2552a6744ebSBarry Smith 
2562a6744ebSBarry Smith M*/
2572a6744ebSBarry Smith 
2588cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_Scatter(Mat A)
2592a6744ebSBarry Smith {
2602a6744ebSBarry Smith   Mat_Scatter    *b;
2612a6744ebSBarry Smith   PetscErrorCode ierr;
2622a6744ebSBarry Smith 
2632a6744ebSBarry Smith   PetscFunctionBegin;
2642a6744ebSBarry Smith   ierr = PetscMemcpy(A->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
265b00a9115SJed Brown   ierr = PetscNewLog(A,&b);CHKERRQ(ierr);
2662a6744ebSBarry Smith 
2672a6744ebSBarry Smith   A->data = (void*)b;
2682a6744ebSBarry Smith 
26926283091SBarry Smith   ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr);
27026283091SBarry Smith   ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr);
2712a6744ebSBarry Smith 
2722a6744ebSBarry Smith   A->assembled    = PETSC_TRUE;
2732a6744ebSBarry Smith   A->preallocated = PETSC_FALSE;
27474d95942SJed Brown 
27574d95942SJed Brown   ierr = PetscObjectChangeTypeName((PetscObject)A,MATSCATTER);CHKERRQ(ierr);
2762a6744ebSBarry Smith   PetscFunctionReturn(0);
2772a6744ebSBarry Smith }
2782a6744ebSBarry Smith 
279*6eb45d04SBarry Smith #include <petsc/private/vecscatterimpl.h>
2802a6744ebSBarry Smith /*@C
2812a6744ebSBarry Smith    MatCreateScatter - Creates a new matrix based on a VecScatter
2822a6744ebSBarry Smith 
2832a6744ebSBarry Smith   Collective on MPI_Comm
2842a6744ebSBarry Smith 
2852a6744ebSBarry Smith    Input Parameters:
2862a6744ebSBarry Smith +  comm - MPI communicator
2872a6744ebSBarry Smith -  scatter - a VecScatterContext
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
2972a6744ebSBarry 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 
303*6eb45d04SBarry Smith   Developer Notes: This directly accesses information inside the VecScatter associated with the matrix-vector product
304*6eb45d04SBarry Smith    for this matrix. This is not desirable..
305*6eb45d04SBarry Smith 
306*6eb45d04SBarry Smith 
3072a6744ebSBarry Smith .keywords: matrix, scatter, create
3082a6744ebSBarry Smith 
3092a6744ebSBarry Smith .seealso: MatScatterSetVecScatter(), MatScatterGetVecScatter(), MATSCATTER
3102a6744ebSBarry Smith @*/
3117087cfbeSBarry Smith PetscErrorCode  MatCreateScatter(MPI_Comm comm,VecScatter scatter,Mat *A)
3122a6744ebSBarry Smith {
3132a6744ebSBarry Smith   PetscErrorCode ierr;
3142a6744ebSBarry Smith 
3152a6744ebSBarry Smith   PetscFunctionBegin;
3162a6744ebSBarry Smith   ierr = MatCreate(comm,A);CHKERRQ(ierr);
3172a6744ebSBarry Smith   ierr = MatSetSizes(*A,scatter->to_n,scatter->from_n,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr);
3182a6744ebSBarry Smith   ierr = MatSetType(*A,MATSCATTER);CHKERRQ(ierr);
3192a6744ebSBarry Smith   ierr = MatScatterSetVecScatter(*A,scatter);CHKERRQ(ierr);
32037e1895aSJed Brown   ierr = MatSetUp(*A);CHKERRQ(ierr);
3212a6744ebSBarry Smith   PetscFunctionReturn(0);
3222a6744ebSBarry Smith }
3232a6744ebSBarry Smith 
3242a6744ebSBarry Smith /*@
3252a6744ebSBarry Smith     MatScatterSetVecScatter - sets that scatter that the matrix is to apply as its linear operator
3262a6744ebSBarry Smith 
3272a6744ebSBarry Smith    Collective on Mat
3282a6744ebSBarry Smith 
3292a6744ebSBarry Smith     Input Parameters:
3302a6744ebSBarry Smith +   mat - the scatter matrix
3312a6744ebSBarry Smith -   scatter - the scatter context create with VecScatterCreate()
3322a6744ebSBarry Smith 
3332a6744ebSBarry Smith    Level: advanced
3342a6744ebSBarry Smith 
3352a6744ebSBarry Smith 
3362a6744ebSBarry Smith .seealso: MatCreateScatter(), MATSCATTER
3372a6744ebSBarry Smith @*/
3387087cfbeSBarry Smith PetscErrorCode  MatScatterSetVecScatter(Mat mat,VecScatter scatter)
3392a6744ebSBarry Smith {
3402a6744ebSBarry Smith   Mat_Scatter    *mscatter = (Mat_Scatter*)mat->data;
3412a6744ebSBarry Smith   PetscErrorCode ierr;
3422a6744ebSBarry Smith 
3432a6744ebSBarry Smith   PetscFunctionBegin;
3440700a824SBarry Smith   PetscValidHeaderSpecific(mat,MAT_CLASSID,1);
3450700a824SBarry Smith   PetscValidHeaderSpecific(scatter,VEC_SCATTER_CLASSID,2);
3464067f9b5SMatthew Knepley   PetscCheckSameComm((PetscObject)scatter,1,(PetscObject)mat,2);
347e32f2f54SBarry Smith   if (mat->rmap->n != scatter->to_n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Number of local rows in matrix %D not equal local scatter size %D",mat->rmap->n,scatter->to_n);
348e32f2f54SBarry Smith   if (mat->cmap->n != scatter->from_n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Number of local columns in matrix %D not equal local scatter size %D",mat->cmap->n,scatter->from_n);
3492a6744ebSBarry Smith 
350c3122656SLisandro Dalcin   ierr = PetscObjectReference((PetscObject)scatter);CHKERRQ(ierr);
3516bf464f9SBarry Smith   ierr = VecScatterDestroy(&mscatter->scatter);CHKERRQ(ierr);
35226fbe8dcSKarl Rupp 
3532a6744ebSBarry Smith   mscatter->scatter = scatter;
3542a6744ebSBarry Smith   PetscFunctionReturn(0);
3552a6744ebSBarry Smith }
3562a6744ebSBarry Smith 
3572a6744ebSBarry Smith 
358