147c6ae99SBarry Smith /* 247c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 347c6ae99SBarry Smith */ 447c6ae99SBarry Smith 5af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 647c6ae99SBarry Smith 77087cfbeSBarry Smith PetscErrorCode DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l) 847c6ae99SBarry Smith { 947c6ae99SBarry Smith PetscErrorCode ierr; 1047c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 1147c6ae99SBarry Smith 1247c6ae99SBarry Smith PetscFunctionBegin; 1347c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1447c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 1547c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 1647c6ae99SBarry Smith ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 1747c6ae99SBarry Smith PetscFunctionReturn(0); 1847c6ae99SBarry Smith } 1947c6ae99SBarry Smith 207087cfbeSBarry Smith PetscErrorCode DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l) 2147c6ae99SBarry Smith { 2247c6ae99SBarry Smith PetscErrorCode ierr; 2347c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 2447c6ae99SBarry Smith 2547c6ae99SBarry Smith PetscFunctionBegin; 2647c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 2747c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 2847c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 2947c6ae99SBarry Smith ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 3047c6ae99SBarry Smith PetscFunctionReturn(0); 3147c6ae99SBarry Smith } 3247c6ae99SBarry Smith 337087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g) 349a42bb27SBarry Smith { 359a42bb27SBarry Smith PetscErrorCode ierr; 369a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 379a42bb27SBarry Smith 389a42bb27SBarry Smith PetscFunctionBegin; 399a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 409a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 41dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,4); 429a42bb27SBarry Smith if (mode == ADD_VALUES) { 439a42bb27SBarry Smith ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 449a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 45ba302962SPatrick Sanan if (dd->bx != DM_BOUNDARY_GHOSTED && dd->bx != DM_BOUNDARY_NONE && dd->s > 0 && dd->m == 1) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in x direction"); 46ba302962SPatrick Sanan if (dd->bx != DM_BOUNDARY_GHOSTED && dd->by != DM_BOUNDARY_NONE && dd->s > 0 && dd->n == 1) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in y direction"); 47ba302962SPatrick Sanan if (dd->bx != DM_BOUNDARY_GHOSTED && dd->bz != DM_BOUNDARY_NONE && dd->s > 0 && dd->p == 1) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in z direction"); 48bd1fc5aeSBarry Smith ierr = VecScatterBegin(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr); 49ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented"); 509a42bb27SBarry Smith PetscFunctionReturn(0); 519a42bb27SBarry Smith } 529a42bb27SBarry Smith 537087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g) 549a42bb27SBarry Smith { 559a42bb27SBarry Smith PetscErrorCode ierr; 569a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 579a42bb27SBarry Smith 589a42bb27SBarry Smith PetscFunctionBegin; 599a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 609a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 61dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,4); 629a42bb27SBarry Smith if (mode == ADD_VALUES) { 639a42bb27SBarry Smith ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 649a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 65bd1fc5aeSBarry Smith ierr = VecScatterEnd(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr); 66ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented"); 679a42bb27SBarry Smith PetscFunctionReturn(0); 689a42bb27SBarry Smith } 699a42bb27SBarry Smith 7009573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*); 7147c6ae99SBarry Smith /* 72aa219208SBarry Smith DMDAGlobalToNatural_Create - Create the global to natural scatter object 7347c6ae99SBarry Smith 74d083f849SBarry Smith Collective on da 7547c6ae99SBarry Smith 7647c6ae99SBarry Smith Input Parameter: 7747c6ae99SBarry Smith . da - the distributed array context 7847c6ae99SBarry Smith 7947c6ae99SBarry Smith Level: developer 8047c6ae99SBarry Smith 8195452b02SPatrick Sanan Notes: 8295452b02SPatrick Sanan This is an internal routine called by DMDAGlobalToNatural() to 8347c6ae99SBarry Smith create the scatter context. 8447c6ae99SBarry Smith 85aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 86aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 8747c6ae99SBarry Smith */ 88aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da) 8947c6ae99SBarry Smith { 9047c6ae99SBarry Smith PetscErrorCode ierr; 9147c6ae99SBarry Smith PetscInt m,start,Nlocal; 9247c6ae99SBarry Smith IS from,to; 9347c6ae99SBarry Smith Vec global; 9447c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 9547c6ae99SBarry Smith 9647c6ae99SBarry Smith PetscFunctionBegin; 9747c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 98ce94432eSBarry Smith if (!dd->natural) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it"); 9947c6ae99SBarry Smith 10047c6ae99SBarry Smith /* create the scatter context */ 10147c6ae99SBarry Smith ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr); 1020298fd71SBarry Smith ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr); 10347c6ae99SBarry Smith 104aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr); 10547c6ae99SBarry Smith if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m); 106ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr); 107*ea78f98cSLisandro Dalcin ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,NULL,&global);CHKERRQ(ierr); 1089448b7f1SJunchao Zhang ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr); 109fcfd50ebSBarry Smith ierr = VecDestroy(&global);CHKERRQ(ierr); 110fcfd50ebSBarry Smith ierr = ISDestroy(&from);CHKERRQ(ierr); 111fcfd50ebSBarry Smith ierr = ISDestroy(&to);CHKERRQ(ierr); 11247c6ae99SBarry Smith PetscFunctionReturn(0); 11347c6ae99SBarry Smith } 11447c6ae99SBarry Smith 11547c6ae99SBarry Smith /*@ 116aa219208SBarry Smith DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector 11747c6ae99SBarry Smith in the "natural" grid ordering. Must be followed by 118aa219208SBarry Smith DMDAGlobalToNaturalEnd() to complete the exchange. 11947c6ae99SBarry Smith 120d083f849SBarry Smith Neighbor-wise Collective on da 12147c6ae99SBarry Smith 12247c6ae99SBarry Smith Input Parameters: 12347c6ae99SBarry Smith + da - the distributed array context 12447c6ae99SBarry Smith . g - the global vector 12547c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 12647c6ae99SBarry Smith 12747c6ae99SBarry Smith Output Parameter: 12847c6ae99SBarry Smith . l - the natural ordering values 12947c6ae99SBarry Smith 13047c6ae99SBarry Smith Level: advanced 13147c6ae99SBarry Smith 13247c6ae99SBarry Smith Notes: 13347c6ae99SBarry Smith The global and natrual vectors used here need not be the same as those 134aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 13547c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 136aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 13747c6ae99SBarry Smith 138aa219208SBarry Smith You must call DMDACreateNaturalVector() before using this routine 13947c6ae99SBarry Smith 140aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 141aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1429a42bb27SBarry Smith 14347c6ae99SBarry Smith @*/ 144dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n) 14547c6ae99SBarry Smith { 14647c6ae99SBarry Smith PetscErrorCode ierr; 14747c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 14847c6ae99SBarry Smith 14947c6ae99SBarry Smith PetscFunctionBegin; 150a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 151dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 152dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 15347c6ae99SBarry Smith if (!dd->gton) { 15447c6ae99SBarry Smith /* create the scatter context */ 155aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 15647c6ae99SBarry Smith } 157dd9d0712SPatrick Sanan ierr = VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr); 15847c6ae99SBarry Smith PetscFunctionReturn(0); 15947c6ae99SBarry Smith } 16047c6ae99SBarry Smith 16147c6ae99SBarry Smith /*@ 162aa219208SBarry Smith DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector 163aa219208SBarry Smith in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin(). 16447c6ae99SBarry Smith 165d083f849SBarry Smith Neighbor-wise Collective on da 16647c6ae99SBarry Smith 16747c6ae99SBarry Smith Input Parameters: 16847c6ae99SBarry Smith + da - the distributed array context 16947c6ae99SBarry Smith . g - the global vector 17047c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 17147c6ae99SBarry Smith 17247c6ae99SBarry Smith Output Parameter: 17347c6ae99SBarry Smith . l - the global values in the natural ordering 17447c6ae99SBarry Smith 17547c6ae99SBarry Smith Level: advanced 17647c6ae99SBarry Smith 17747c6ae99SBarry Smith Notes: 17847c6ae99SBarry Smith The global and local vectors used here need not be the same as those 179aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 18047c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 181aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 18247c6ae99SBarry Smith 183aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 184aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1859a42bb27SBarry Smith 18647c6ae99SBarry Smith @*/ 187dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n) 18847c6ae99SBarry Smith { 18947c6ae99SBarry Smith PetscErrorCode ierr; 19047c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 19147c6ae99SBarry Smith 19247c6ae99SBarry Smith PetscFunctionBegin; 193a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 194dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 195dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 196dd9d0712SPatrick Sanan ierr = VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr); 19747c6ae99SBarry Smith PetscFunctionReturn(0); 19847c6ae99SBarry Smith } 19947c6ae99SBarry Smith 20047c6ae99SBarry Smith /*@ 201aa219208SBarry Smith DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering 202aa219208SBarry Smith to a global vector in the PETSc DMDA grid ordering. Must be followed by 203aa219208SBarry Smith DMDANaturalToGlobalEnd() to complete the exchange. 20447c6ae99SBarry Smith 205d083f849SBarry Smith Neighbor-wise Collective on da 20647c6ae99SBarry Smith 20747c6ae99SBarry Smith Input Parameters: 20847c6ae99SBarry Smith + da - the distributed array context 20947c6ae99SBarry Smith . g - the global vector in a natural ordering 21047c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 21147c6ae99SBarry Smith 21247c6ae99SBarry Smith Output Parameter: 213aa219208SBarry Smith . l - the values in the DMDA ordering 21447c6ae99SBarry Smith 21547c6ae99SBarry Smith Level: advanced 21647c6ae99SBarry Smith 21747c6ae99SBarry Smith Notes: 21847c6ae99SBarry Smith The global and natural vectors used here need not be the same as those 219aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 22047c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 221aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 22247c6ae99SBarry Smith 223aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 224aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 22547c6ae99SBarry Smith 22647c6ae99SBarry Smith @*/ 227dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g) 22847c6ae99SBarry Smith { 22947c6ae99SBarry Smith PetscErrorCode ierr; 23047c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 23147c6ae99SBarry Smith 23247c6ae99SBarry Smith PetscFunctionBegin; 233a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 234dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 23547c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 23647c6ae99SBarry Smith if (!dd->gton) { 23747c6ae99SBarry Smith /* create the scatter context */ 238aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 23947c6ae99SBarry Smith } 240dd9d0712SPatrick Sanan ierr = VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 24147c6ae99SBarry Smith PetscFunctionReturn(0); 24247c6ae99SBarry Smith } 24347c6ae99SBarry Smith 24447c6ae99SBarry Smith /*@ 245aa219208SBarry Smith DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector 246aa219208SBarry Smith to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin(). 24747c6ae99SBarry Smith 248d083f849SBarry Smith Neighbor-wise Collective on da 24947c6ae99SBarry Smith 25047c6ae99SBarry Smith Input Parameters: 25147c6ae99SBarry Smith + da - the distributed array context 25247c6ae99SBarry Smith . g - the global vector in a natural ordering 25347c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 25447c6ae99SBarry Smith 25547c6ae99SBarry Smith Output Parameter: 256aa219208SBarry Smith . l - the global values in the PETSc DMDA ordering 25747c6ae99SBarry Smith 258a47bb602SJed Brown Level: advanced 25947c6ae99SBarry Smith 26047c6ae99SBarry Smith Notes: 26147c6ae99SBarry Smith The global and local vectors used here need not be the same as those 262aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 26347c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 264aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 26547c6ae99SBarry Smith 266aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 267aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 26847c6ae99SBarry Smith 26947c6ae99SBarry Smith @*/ 270dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g) 27147c6ae99SBarry Smith { 27247c6ae99SBarry Smith PetscErrorCode ierr; 27347c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 27447c6ae99SBarry Smith 27547c6ae99SBarry Smith PetscFunctionBegin; 276a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 277dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 27847c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 279dd9d0712SPatrick Sanan ierr = VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 28047c6ae99SBarry Smith PetscFunctionReturn(0); 28147c6ae99SBarry Smith } 282