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