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 @*/ 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 @*/ 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