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*d083f849SBarry Smith Collective on da 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 26aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 27aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 2847c6ae99SBarry Smith @*/ 297087cfbeSBarry Smith PetscErrorCode DMDAGlobalToNaturalAllCreate(DM da,VecScatter *scatter) 3047c6ae99SBarry Smith { 3147c6ae99SBarry Smith PetscErrorCode ierr; 3247c6ae99SBarry Smith PetscInt N; 3347c6ae99SBarry Smith IS from,to; 3447c6ae99SBarry Smith Vec tmplocal,global; 3547c6ae99SBarry Smith AO ao; 3647c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 3747c6ae99SBarry Smith 3847c6ae99SBarry Smith PetscFunctionBegin; 39a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 4047c6ae99SBarry Smith PetscValidPointer(scatter,2); 41aa219208SBarry Smith ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr); 4247c6ae99SBarry Smith 4347c6ae99SBarry Smith /* create the scatter context */ 44ce94432eSBarry Smith ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 4547c6ae99SBarry Smith ierr = VecGetSize(global,&N);CHKERRQ(ierr); 46ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&to);CHKERRQ(ierr); 4747c6ae99SBarry Smith ierr = AOPetscToApplicationIS(ao,to);CHKERRQ(ierr); 48ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&from);CHKERRQ(ierr); 49778a2246SBarry Smith ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,N,0,&tmplocal);CHKERRQ(ierr); 509448b7f1SJunchao Zhang ierr = VecScatterCreate(global,from,tmplocal,to,scatter);CHKERRQ(ierr); 51fcfd50ebSBarry Smith ierr = VecDestroy(&tmplocal);CHKERRQ(ierr); 52fcfd50ebSBarry Smith ierr = VecDestroy(&global);CHKERRQ(ierr); 53fcfd50ebSBarry Smith ierr = ISDestroy(&from);CHKERRQ(ierr); 54fcfd50ebSBarry Smith ierr = ISDestroy(&to);CHKERRQ(ierr); 5547c6ae99SBarry Smith PetscFunctionReturn(0); 5647c6ae99SBarry Smith } 5747c6ae99SBarry Smith 5847c6ae99SBarry Smith /*@ 59aa219208SBarry Smith DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy 6047c6ae99SBarry Smith of the entire vector on each processor to its local part in the global vector. 6147c6ae99SBarry Smith 62*d083f849SBarry Smith Collective on da 6347c6ae99SBarry Smith 6447c6ae99SBarry Smith Input Parameter: 6547c6ae99SBarry Smith . da - the distributed array context 6647c6ae99SBarry Smith 6747c6ae99SBarry Smith Output Parameter: 6847c6ae99SBarry Smith . scatter - the scatter context 6947c6ae99SBarry Smith 7047c6ae99SBarry Smith Level: advanced 7147c6ae99SBarry Smith 72aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 73aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 7447c6ae99SBarry Smith @*/ 757087cfbeSBarry Smith PetscErrorCode DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter) 7647c6ae99SBarry Smith { 7747c6ae99SBarry Smith PetscErrorCode ierr; 7847c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 7947c6ae99SBarry Smith PetscInt M,m = dd->Nlocal,start; 8047c6ae99SBarry Smith IS from,to; 8147c6ae99SBarry Smith Vec tmplocal,global; 8247c6ae99SBarry Smith AO ao; 8347c6ae99SBarry Smith 8447c6ae99SBarry Smith PetscFunctionBegin; 85a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 8647c6ae99SBarry Smith PetscValidPointer(scatter,2); 87aa219208SBarry Smith ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr); 8847c6ae99SBarry Smith 8947c6ae99SBarry Smith /* create the scatter context */ 90b2566f29SBarry Smith ierr = MPIU_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)da));CHKERRQ(ierr); 91ce94432eSBarry Smith ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,m,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 920298fd71SBarry Smith ierr = VecGetOwnershipRange(global,&start,NULL);CHKERRQ(ierr); 93ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr); 9447c6ae99SBarry Smith ierr = AOPetscToApplicationIS(ao,from);CHKERRQ(ierr); 95ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&to);CHKERRQ(ierr); 96778a2246SBarry Smith ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,M,0,&tmplocal);CHKERRQ(ierr); 979448b7f1SJunchao Zhang ierr = VecScatterCreate(tmplocal,from,global,to,scatter);CHKERRQ(ierr); 98fcfd50ebSBarry Smith ierr = VecDestroy(&tmplocal);CHKERRQ(ierr); 99fcfd50ebSBarry Smith ierr = VecDestroy(&global);CHKERRQ(ierr); 100fcfd50ebSBarry Smith ierr = ISDestroy(&from);CHKERRQ(ierr); 101fcfd50ebSBarry Smith ierr = ISDestroy(&to);CHKERRQ(ierr); 10247c6ae99SBarry Smith PetscFunctionReturn(0); 10347c6ae99SBarry Smith } 10447c6ae99SBarry Smith 105