1 2 /* 3 Tools to help solve the coarse grid problem redundantly. 4 Provides two scatter contexts that (1) map from the usual global vector 5 to all processors the entire vector in NATURAL numbering and (2) 6 from the entire vector on each processor in natural numbering extracts 7 out this processors piece in GLOBAL numbering 8 */ 9 10 #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 11 12 /*@ 13 DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from the 14 global vector the entire vector to each processor in natural numbering 15 16 Collective on DMDA 17 18 Input Parameter: 19 . da - the distributed array context 20 21 Output Parameter: 22 . scatter - the scatter context 23 24 Level: advanced 25 26 .keywords: distributed array, global to local, begin, coarse problem 27 28 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 29 DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 30 @*/ 31 PetscErrorCode DMDAGlobalToNaturalAllCreate(DM da,VecScatter *scatter) 32 { 33 PetscErrorCode ierr; 34 PetscInt N; 35 IS from,to; 36 Vec tmplocal,global; 37 AO ao; 38 DM_DA *dd = (DM_DA*)da->data; 39 40 PetscFunctionBegin; 41 PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 42 PetscValidPointer(scatter,2); 43 ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr); 44 45 /* create the scatter context */ 46 ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 47 ierr = VecGetSize(global,&N);CHKERRQ(ierr); 48 ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&to);CHKERRQ(ierr); 49 ierr = AOPetscToApplicationIS(ao,to);CHKERRQ(ierr); 50 ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&from);CHKERRQ(ierr); 51 ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,N,0,&tmplocal);CHKERRQ(ierr); 52 ierr = VecScatterCreateWithData(global,from,tmplocal,to,scatter);CHKERRQ(ierr); 53 ierr = VecDestroy(&tmplocal);CHKERRQ(ierr); 54 ierr = VecDestroy(&global);CHKERRQ(ierr); 55 ierr = ISDestroy(&from);CHKERRQ(ierr); 56 ierr = ISDestroy(&to);CHKERRQ(ierr); 57 PetscFunctionReturn(0); 58 } 59 60 /*@ 61 DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy 62 of the entire vector on each processor to its local part in the global vector. 63 64 Collective on DMDA 65 66 Input Parameter: 67 . da - the distributed array context 68 69 Output Parameter: 70 . scatter - the scatter context 71 72 Level: advanced 73 74 .keywords: distributed array, global to local, begin, coarse problem 75 76 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 77 DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 78 @*/ 79 PetscErrorCode DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter) 80 { 81 PetscErrorCode ierr; 82 DM_DA *dd = (DM_DA*)da->data; 83 PetscInt M,m = dd->Nlocal,start; 84 IS from,to; 85 Vec tmplocal,global; 86 AO ao; 87 88 PetscFunctionBegin; 89 PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 90 PetscValidPointer(scatter,2); 91 ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr); 92 93 /* create the scatter context */ 94 ierr = MPIU_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)da));CHKERRQ(ierr); 95 ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,m,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 96 ierr = VecGetOwnershipRange(global,&start,NULL);CHKERRQ(ierr); 97 ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr); 98 ierr = AOPetscToApplicationIS(ao,from);CHKERRQ(ierr); 99 ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&to);CHKERRQ(ierr); 100 ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,M,0,&tmplocal);CHKERRQ(ierr); 101 ierr = VecScatterCreateWithData(tmplocal,from,global,to,scatter);CHKERRQ(ierr); 102 ierr = VecDestroy(&tmplocal);CHKERRQ(ierr); 103 ierr = VecDestroy(&global);CHKERRQ(ierr); 104 ierr = ISDestroy(&from);CHKERRQ(ierr); 105 ierr = ISDestroy(&to);CHKERRQ(ierr); 106 PetscFunctionReturn(0); 107 } 108 109