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