xref: /petsc/src/dm/impls/da/dagtona.c (revision d8e47b638cf8f604a99e9678e1df24f82d959cd7)
147c6ae99SBarry Smith /*
247c6ae99SBarry Smith      Tools to help solve the coarse grid problem redundantly.
347c6ae99SBarry Smith   Provides two scatter contexts that (1) map from the usual global vector
447c6ae99SBarry Smith   to all processors the entire vector in NATURAL numbering and (2)
547c6ae99SBarry Smith   from the entire vector on each processor in natural numbering extracts
647c6ae99SBarry Smith   out this processors piece in GLOBAL numbering
747c6ae99SBarry Smith */
847c6ae99SBarry Smith 
9af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I   "petscdmda.h"   I*/
1047c6ae99SBarry Smith 
1147c6ae99SBarry Smith /*@
1212b4a537SBarry Smith   DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from a
1372fd0fbdSBarry Smith   global vector, obtained with `DMCreateGlobalVector()`, to the entire vector to each processor in natural numbering
1447c6ae99SBarry Smith 
1520f4b53cSBarry Smith   Collective
1647c6ae99SBarry Smith 
1747c6ae99SBarry Smith   Input Parameter:
1872fd0fbdSBarry Smith . da - the `DMDA` context
1947c6ae99SBarry Smith 
2047c6ae99SBarry Smith   Output Parameter:
2147c6ae99SBarry Smith . scatter - the scatter context
2247c6ae99SBarry Smith 
2347c6ae99SBarry Smith   Level: advanced
2447c6ae99SBarry Smith 
2512b4a537SBarry Smith .seealso: [](sec_struct), `DM`, `DMDA`, `DMDANaturalAllToGlobalCreate()`, `DMDAGlobalToNaturalEnd()`, `DMLocalToGlobalBegin()`, `DMDACreate2d()`,
26db781477SPatrick Sanan           `DMGlobalToLocalBegin()`, `DMGlobalToLocalEnd()`, `DMDACreateNaturalVector()`
2747c6ae99SBarry Smith @*/
DMDAGlobalToNaturalAllCreate(DM da,VecScatter * scatter)28d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGlobalToNaturalAllCreate(DM da, VecScatter *scatter)
29d71ae5a4SJacob Faibussowitsch {
3047c6ae99SBarry Smith   PetscInt N;
3147c6ae99SBarry Smith   IS       from, to;
3247c6ae99SBarry Smith   Vec      tmplocal, global;
3347c6ae99SBarry Smith   AO       ao;
3447c6ae99SBarry Smith   DM_DA   *dd = (DM_DA *)da->data;
3547c6ae99SBarry Smith 
3647c6ae99SBarry Smith   PetscFunctionBegin;
37a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
384f572ea9SToby Isaac   PetscAssertPointer(scatter, 2);
399566063dSJacob Faibussowitsch   PetscCall(DMDAGetAO(da, &ao));
4047c6ae99SBarry Smith 
4147c6ae99SBarry Smith   /* create the scatter context */
429566063dSJacob Faibussowitsch   PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da), dd->w, dd->Nlocal, PETSC_DETERMINE, NULL, &global));
439566063dSJacob Faibussowitsch   PetscCall(VecGetSize(global, &N));
449566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), N, 0, 1, &to));
459566063dSJacob Faibussowitsch   PetscCall(AOPetscToApplicationIS(ao, to));
469566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), N, 0, 1, &from));
479566063dSJacob Faibussowitsch   PetscCall(VecCreateSeqWithArray(PETSC_COMM_SELF, dd->w, N, NULL, &tmplocal));
489566063dSJacob Faibussowitsch   PetscCall(VecScatterCreate(global, from, tmplocal, to, scatter));
499566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tmplocal));
509566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&global));
519566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&from));
529566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&to));
533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5447c6ae99SBarry Smith }
5547c6ae99SBarry Smith 
5647c6ae99SBarry Smith /*@
57aa219208SBarry Smith   DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy
5872fd0fbdSBarry Smith   of the entire vector on each processor (in the natural ordering) to its local part in the global vector, obtained with `DMCreateGlobalVector()`.
5947c6ae99SBarry Smith 
6020f4b53cSBarry Smith   Collective
6147c6ae99SBarry Smith 
6247c6ae99SBarry Smith   Input Parameter:
6372fd0fbdSBarry Smith . da - the `DMDA` context
6447c6ae99SBarry Smith 
6547c6ae99SBarry Smith   Output Parameter:
6647c6ae99SBarry Smith . scatter - the scatter context
6747c6ae99SBarry Smith 
6847c6ae99SBarry Smith   Level: advanced
6947c6ae99SBarry Smith 
7012b4a537SBarry Smith .seealso: [](sec_struct), `DM`, `DMDA`, `DMDAGlobalToNaturalAllCreate()`, `DMDAGlobalToNaturalEnd()`, `DMLocalToGlobalBegin()`, `DMDACreate2d()`,
71db781477SPatrick Sanan           `DMGlobalToLocalBegin()`, `DMGlobalToLocalEnd()`, `DMDACreateNaturalVector()`
7247c6ae99SBarry Smith @*/
DMDANaturalAllToGlobalCreate(DM da,VecScatter * scatter)73d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDANaturalAllToGlobalCreate(DM da, VecScatter *scatter)
74d71ae5a4SJacob Faibussowitsch {
7547c6ae99SBarry Smith   DM_DA   *dd = (DM_DA *)da->data;
7647c6ae99SBarry Smith   PetscInt M, m = dd->Nlocal, start;
7747c6ae99SBarry Smith   IS       from, to;
7847c6ae99SBarry Smith   Vec      tmplocal, global;
7947c6ae99SBarry Smith   AO       ao;
8047c6ae99SBarry Smith 
8147c6ae99SBarry Smith   PetscFunctionBegin;
82a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
834f572ea9SToby Isaac   PetscAssertPointer(scatter, 2);
849566063dSJacob Faibussowitsch   PetscCall(DMDAGetAO(da, &ao));
8547c6ae99SBarry Smith 
8647c6ae99SBarry Smith   /* create the scatter context */
87*462c564dSBarry Smith   PetscCallMPI(MPIU_Allreduce(&m, &M, 1, MPIU_INT, MPI_SUM, PetscObjectComm((PetscObject)da)));
889566063dSJacob Faibussowitsch   PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da), dd->w, m, PETSC_DETERMINE, NULL, &global));
899566063dSJacob Faibussowitsch   PetscCall(VecGetOwnershipRange(global, &start, NULL));
909566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), m, start, 1, &from));
919566063dSJacob Faibussowitsch   PetscCall(AOPetscToApplicationIS(ao, from));
929566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), m, start, 1, &to));
939566063dSJacob Faibussowitsch   PetscCall(VecCreateSeqWithArray(PETSC_COMM_SELF, dd->w, M, NULL, &tmplocal));
949566063dSJacob Faibussowitsch   PetscCall(VecScatterCreate(tmplocal, from, global, to, scatter));
959566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tmplocal));
969566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&global));
979566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&from));
989566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&to));
993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10047c6ae99SBarry Smith }
101