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 <private/daimpl.h> /*I "petscdmda.h" I*/ 11 12 #undef __FUNCT__ 13 #define __FUNCT__ "DMDAGlobalToNaturalAllCreate" 14 /*@ 15 DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from the 16 global vector the entire vector to each processor in natural numbering 17 18 Collective on DMDA 19 20 Input Parameter: 21 . da - the distributed array context 22 23 Output Parameter: 24 . scatter - the scatter context 25 26 Level: advanced 27 28 .keywords: distributed array, global to local, begin, coarse problem 29 30 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 31 DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 32 @*/ 33 PetscErrorCode DMDAGlobalToNaturalAllCreate(DM da,VecScatter *scatter) 34 { 35 PetscErrorCode ierr; 36 PetscInt N; 37 IS from,to; 38 Vec tmplocal,global; 39 AO ao; 40 DM_DA *dd = (DM_DA*)da->data; 41 42 PetscFunctionBegin; 43 PetscValidHeaderSpecific(da,DM_CLASSID,1); 44 PetscValidPointer(scatter,2); 45 ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr); 46 47 /* create the scatter context */ 48 ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 49 ierr = VecGetSize(global,&N);CHKERRQ(ierr); 50 ierr = ISCreateStride(((PetscObject)da)->comm,N,0,1,&to);CHKERRQ(ierr); 51 ierr = AOPetscToApplicationIS(ao,to);CHKERRQ(ierr); 52 ierr = ISCreateStride(((PetscObject)da)->comm,N,0,1,&from);CHKERRQ(ierr); 53 ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,N,0,&tmplocal);CHKERRQ(ierr); 54 ierr = VecSetBlockSize(tmplocal,dd->w);CHKERRQ(ierr); 55 ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr); 56 ierr = VecScatterCreate(global,from,tmplocal,to,scatter);CHKERRQ(ierr); 57 ierr = VecDestroy(&tmplocal);CHKERRQ(ierr); 58 ierr = VecDestroy(&global);CHKERRQ(ierr); 59 ierr = ISDestroy(&from);CHKERRQ(ierr); 60 ierr = ISDestroy(&to);CHKERRQ(ierr); 61 PetscFunctionReturn(0); 62 } 63 64 #undef __FUNCT__ 65 #define __FUNCT__ "DMDANaturalAllToGlobalCreate" 66 /*@ 67 DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy 68 of the entire vector on each processor to its local part in the global vector. 69 70 Collective on DMDA 71 72 Input Parameter: 73 . da - the distributed array context 74 75 Output Parameter: 76 . scatter - the scatter context 77 78 Level: advanced 79 80 .keywords: distributed array, global to local, begin, coarse problem 81 82 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 83 DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 84 @*/ 85 PetscErrorCode DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter) 86 { 87 PetscErrorCode ierr; 88 DM_DA *dd = (DM_DA*)da->data; 89 PetscInt M,m = dd->Nlocal,start; 90 IS from,to; 91 Vec tmplocal,global; 92 AO ao; 93 94 PetscFunctionBegin; 95 PetscValidHeaderSpecific(da,DM_CLASSID,1); 96 PetscValidPointer(scatter,2); 97 ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr); 98 99 /* create the scatter context */ 100 ierr = MPI_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,((PetscObject)da)->comm);CHKERRQ(ierr); 101 ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,m,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 102 ierr = VecGetOwnershipRange(global,&start,PETSC_NULL);CHKERRQ(ierr); 103 ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&from);CHKERRQ(ierr); 104 ierr = AOPetscToApplicationIS(ao,from);CHKERRQ(ierr); 105 ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&to);CHKERRQ(ierr); 106 ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,M,0,&tmplocal);CHKERRQ(ierr); 107 ierr = VecSetBlockSize(tmplocal,dd->w);CHKERRQ(ierr); 108 ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr); 109 ierr = VecScatterCreate(tmplocal,from,global,to,scatter);CHKERRQ(ierr); 110 ierr = VecDestroy(&tmplocal);CHKERRQ(ierr); 111 ierr = VecDestroy(&global);CHKERRQ(ierr); 112 ierr = ISDestroy(&from);CHKERRQ(ierr); 113 ierr = ISDestroy(&to);CHKERRQ(ierr); 114 PetscFunctionReturn(0); 115 } 116 117