147c6ae99SBarry Smith 247c6ae99SBarry Smith /* 347c6ae99SBarry Smith Tools to help solve the coarse grid problem redundantly. 447c6ae99SBarry Smith Provides two scatter contexts that (1) map from the usual global vector 547c6ae99SBarry Smith to all processors the entire vector in NATURAL numbering and (2) 647c6ae99SBarry Smith from the entire vector on each processor in natural numbering extracts 747c6ae99SBarry Smith out this processors piece in GLOBAL numbering 847c6ae99SBarry Smith */ 947c6ae99SBarry Smith 10af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 1147c6ae99SBarry Smith 1247c6ae99SBarry Smith /*@ 13aa219208SBarry Smith DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from the 1447c6ae99SBarry Smith global vector the entire vector to each processor in natural numbering 1547c6ae99SBarry Smith 16*20f4b53cSBarry Smith Collective 1747c6ae99SBarry Smith 1847c6ae99SBarry Smith Input Parameter: 1947c6ae99SBarry Smith . da - the distributed array context 2047c6ae99SBarry Smith 2147c6ae99SBarry Smith Output Parameter: 2247c6ae99SBarry Smith . scatter - the scatter context 2347c6ae99SBarry Smith 2447c6ae99SBarry Smith Level: advanced 2547c6ae99SBarry Smith 26dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGlobalToNaturalEnd()`, `DMLocalToGlobalBegin()`, `DMDACreate2d()`, 27db781477SPatrick Sanan `DMGlobalToLocalBegin()`, `DMGlobalToLocalEnd()`, `DMDACreateNaturalVector()` 2847c6ae99SBarry Smith @*/ 29d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGlobalToNaturalAllCreate(DM da, VecScatter *scatter) 30d71ae5a4SJacob Faibussowitsch { 3147c6ae99SBarry Smith PetscInt N; 3247c6ae99SBarry Smith IS from, to; 3347c6ae99SBarry Smith Vec tmplocal, global; 3447c6ae99SBarry Smith AO ao; 3547c6ae99SBarry Smith DM_DA *dd = (DM_DA *)da->data; 3647c6ae99SBarry Smith 3747c6ae99SBarry Smith PetscFunctionBegin; 38a9a02de4SBarry Smith PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 3947c6ae99SBarry Smith PetscValidPointer(scatter, 2); 409566063dSJacob Faibussowitsch PetscCall(DMDAGetAO(da, &ao)); 4147c6ae99SBarry Smith 4247c6ae99SBarry Smith /* create the scatter context */ 439566063dSJacob Faibussowitsch PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da), dd->w, dd->Nlocal, PETSC_DETERMINE, NULL, &global)); 449566063dSJacob Faibussowitsch PetscCall(VecGetSize(global, &N)); 459566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), N, 0, 1, &to)); 469566063dSJacob Faibussowitsch PetscCall(AOPetscToApplicationIS(ao, to)); 479566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), N, 0, 1, &from)); 489566063dSJacob Faibussowitsch PetscCall(VecCreateSeqWithArray(PETSC_COMM_SELF, dd->w, N, NULL, &tmplocal)); 499566063dSJacob Faibussowitsch PetscCall(VecScatterCreate(global, from, tmplocal, to, scatter)); 509566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tmplocal)); 519566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global)); 529566063dSJacob Faibussowitsch PetscCall(ISDestroy(&from)); 539566063dSJacob Faibussowitsch PetscCall(ISDestroy(&to)); 543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5547c6ae99SBarry Smith } 5647c6ae99SBarry Smith 5747c6ae99SBarry Smith /*@ 58aa219208SBarry Smith DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy 5947c6ae99SBarry Smith of the entire vector on each processor to its local part in the global vector. 6047c6ae99SBarry Smith 61*20f4b53cSBarry Smith Collective 6247c6ae99SBarry Smith 6347c6ae99SBarry Smith Input Parameter: 6447c6ae99SBarry Smith . da - the distributed array context 6547c6ae99SBarry Smith 6647c6ae99SBarry Smith Output Parameter: 6747c6ae99SBarry Smith . scatter - the scatter context 6847c6ae99SBarry Smith 6947c6ae99SBarry Smith Level: advanced 7047c6ae99SBarry Smith 71dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGlobalToNaturalEnd()`, `DMLocalToGlobalBegin()`, `DMDACreate2d()`, 72db781477SPatrick Sanan `DMGlobalToLocalBegin()`, `DMGlobalToLocalEnd()`, `DMDACreateNaturalVector()` 7347c6ae99SBarry Smith @*/ 74d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDANaturalAllToGlobalCreate(DM da, VecScatter *scatter) 75d71ae5a4SJacob Faibussowitsch { 7647c6ae99SBarry Smith DM_DA *dd = (DM_DA *)da->data; 7747c6ae99SBarry Smith PetscInt M, m = dd->Nlocal, start; 7847c6ae99SBarry Smith IS from, to; 7947c6ae99SBarry Smith Vec tmplocal, global; 8047c6ae99SBarry Smith AO ao; 8147c6ae99SBarry Smith 8247c6ae99SBarry Smith PetscFunctionBegin; 83a9a02de4SBarry Smith PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 8447c6ae99SBarry Smith PetscValidPointer(scatter, 2); 859566063dSJacob Faibussowitsch PetscCall(DMDAGetAO(da, &ao)); 8647c6ae99SBarry Smith 8747c6ae99SBarry Smith /* create the scatter context */ 881c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&m, &M, 1, MPIU_INT, MPI_SUM, PetscObjectComm((PetscObject)da))); 899566063dSJacob Faibussowitsch PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da), dd->w, m, PETSC_DETERMINE, NULL, &global)); 909566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(global, &start, NULL)); 919566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), m, start, 1, &from)); 929566063dSJacob Faibussowitsch PetscCall(AOPetscToApplicationIS(ao, from)); 939566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da), m, start, 1, &to)); 949566063dSJacob Faibussowitsch PetscCall(VecCreateSeqWithArray(PETSC_COMM_SELF, dd->w, M, NULL, &tmplocal)); 959566063dSJacob Faibussowitsch PetscCall(VecScatterCreate(tmplocal, from, global, to, scatter)); 969566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tmplocal)); 979566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global)); 989566063dSJacob Faibussowitsch PetscCall(ISDestroy(&from)); 999566063dSJacob Faibussowitsch PetscCall(ISDestroy(&to)); 1003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10147c6ae99SBarry Smith } 102