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); 41*dd9d0712SPatrick 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); 61*dd9d0712SPatrick 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 74aa219208SBarry Smith Collective on DMDA 7547c6ae99SBarry Smith 7647c6ae99SBarry Smith Input Parameter: 7747c6ae99SBarry Smith . da - the distributed array context 7847c6ae99SBarry Smith 7947c6ae99SBarry Smith Level: developer 8047c6ae99SBarry Smith 81aa219208SBarry Smith Notes: This is an internal routine called by DMDAGlobalToNatural() to 8247c6ae99SBarry Smith create the scatter context. 8347c6ae99SBarry Smith 8447c6ae99SBarry Smith .keywords: distributed array, global to local, begin 8547c6ae99SBarry Smith 86aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 87aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 8847c6ae99SBarry Smith */ 89aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da) 9047c6ae99SBarry Smith { 9147c6ae99SBarry Smith PetscErrorCode ierr; 9247c6ae99SBarry Smith PetscInt m,start,Nlocal; 9347c6ae99SBarry Smith IS from,to; 9447c6ae99SBarry Smith Vec global; 9547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 9647c6ae99SBarry Smith 9747c6ae99SBarry Smith PetscFunctionBegin; 9847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 99ce94432eSBarry Smith if (!dd->natural) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it"); 10047c6ae99SBarry Smith 10147c6ae99SBarry Smith /* create the scatter context */ 10247c6ae99SBarry Smith ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr); 1030298fd71SBarry Smith ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr); 10447c6ae99SBarry Smith 105aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr); 10647c6ae99SBarry Smith if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m); 107ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr); 108ce94432eSBarry Smith ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 10947c6ae99SBarry Smith ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr); 110fcfd50ebSBarry Smith ierr = VecDestroy(&global);CHKERRQ(ierr); 111fcfd50ebSBarry Smith ierr = ISDestroy(&from);CHKERRQ(ierr); 112fcfd50ebSBarry Smith ierr = ISDestroy(&to);CHKERRQ(ierr); 11347c6ae99SBarry Smith PetscFunctionReturn(0); 11447c6ae99SBarry Smith } 11547c6ae99SBarry Smith 11647c6ae99SBarry Smith /*@ 117aa219208SBarry Smith DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector 11847c6ae99SBarry Smith in the "natural" grid ordering. Must be followed by 119aa219208SBarry Smith DMDAGlobalToNaturalEnd() to complete the exchange. 12047c6ae99SBarry Smith 121aa219208SBarry Smith Neighbor-wise Collective on DMDA 12247c6ae99SBarry Smith 12347c6ae99SBarry Smith Input Parameters: 12447c6ae99SBarry Smith + da - the distributed array context 12547c6ae99SBarry Smith . g - the global vector 12647c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 12747c6ae99SBarry Smith 12847c6ae99SBarry Smith Output Parameter: 12947c6ae99SBarry Smith . l - the natural ordering values 13047c6ae99SBarry Smith 13147c6ae99SBarry Smith Level: advanced 13247c6ae99SBarry Smith 13347c6ae99SBarry Smith Notes: 13447c6ae99SBarry Smith The global and natrual vectors used here need not be the same as those 135aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 13647c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 137aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 13847c6ae99SBarry Smith 139aa219208SBarry Smith You must call DMDACreateNaturalVector() before using this routine 14047c6ae99SBarry Smith 14147c6ae99SBarry Smith .keywords: distributed array, global to local, begin 14247c6ae99SBarry Smith 143aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 144aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1459a42bb27SBarry Smith 14647c6ae99SBarry Smith @*/ 147*dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n) 14847c6ae99SBarry Smith { 14947c6ae99SBarry Smith PetscErrorCode ierr; 15047c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 15147c6ae99SBarry Smith 15247c6ae99SBarry Smith PetscFunctionBegin; 15347c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 154*dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 155*dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 15647c6ae99SBarry Smith if (!dd->gton) { 15747c6ae99SBarry Smith /* create the scatter context */ 158aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 15947c6ae99SBarry Smith } 160*dd9d0712SPatrick Sanan ierr = VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr); 16147c6ae99SBarry Smith PetscFunctionReturn(0); 16247c6ae99SBarry Smith } 16347c6ae99SBarry Smith 16447c6ae99SBarry Smith /*@ 165aa219208SBarry Smith DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector 166aa219208SBarry Smith in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin(). 16747c6ae99SBarry Smith 168aa219208SBarry Smith Neighbor-wise Collective on DMDA 16947c6ae99SBarry Smith 17047c6ae99SBarry Smith Input Parameters: 17147c6ae99SBarry Smith + da - the distributed array context 17247c6ae99SBarry Smith . g - the global vector 17347c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 17447c6ae99SBarry Smith 17547c6ae99SBarry Smith Output Parameter: 17647c6ae99SBarry Smith . l - the global values in the natural ordering 17747c6ae99SBarry Smith 17847c6ae99SBarry Smith Level: advanced 17947c6ae99SBarry Smith 18047c6ae99SBarry Smith Notes: 18147c6ae99SBarry Smith The global and local vectors used here need not be the same as those 182aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 18347c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 184aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 18547c6ae99SBarry Smith 18647c6ae99SBarry Smith .keywords: distributed array, global to local, end 18747c6ae99SBarry Smith 188aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 189aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1909a42bb27SBarry Smith 19147c6ae99SBarry Smith @*/ 192*dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n) 19347c6ae99SBarry Smith { 19447c6ae99SBarry Smith PetscErrorCode ierr; 19547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 19647c6ae99SBarry Smith 19747c6ae99SBarry Smith PetscFunctionBegin; 19847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 199*dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 200*dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 201*dd9d0712SPatrick Sanan ierr = VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr); 20247c6ae99SBarry Smith PetscFunctionReturn(0); 20347c6ae99SBarry Smith } 20447c6ae99SBarry Smith 20547c6ae99SBarry Smith /*@ 206aa219208SBarry Smith DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering 207aa219208SBarry Smith to a global vector in the PETSc DMDA grid ordering. Must be followed by 208aa219208SBarry Smith DMDANaturalToGlobalEnd() to complete the exchange. 20947c6ae99SBarry Smith 210aa219208SBarry Smith Neighbor-wise Collective on DMDA 21147c6ae99SBarry Smith 21247c6ae99SBarry Smith Input Parameters: 21347c6ae99SBarry Smith + da - the distributed array context 21447c6ae99SBarry Smith . g - the global vector in a natural ordering 21547c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 21647c6ae99SBarry Smith 21747c6ae99SBarry Smith Output Parameter: 218aa219208SBarry Smith . l - the values in the DMDA ordering 21947c6ae99SBarry Smith 22047c6ae99SBarry Smith Level: advanced 22147c6ae99SBarry Smith 22247c6ae99SBarry Smith Notes: 22347c6ae99SBarry Smith The global and natural vectors used here need not be the same as those 224aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 22547c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 226aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 22747c6ae99SBarry Smith 22847c6ae99SBarry Smith .keywords: distributed array, global to local, begin 22947c6ae99SBarry Smith 230aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 231aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 23247c6ae99SBarry Smith 23347c6ae99SBarry Smith @*/ 234*dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g) 23547c6ae99SBarry Smith { 23647c6ae99SBarry Smith PetscErrorCode ierr; 23747c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 23847c6ae99SBarry Smith 23947c6ae99SBarry Smith PetscFunctionBegin; 24047c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 241*dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 24247c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 24347c6ae99SBarry Smith if (!dd->gton) { 24447c6ae99SBarry Smith /* create the scatter context */ 245aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 24647c6ae99SBarry Smith } 247*dd9d0712SPatrick Sanan ierr = VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 24847c6ae99SBarry Smith PetscFunctionReturn(0); 24947c6ae99SBarry Smith } 25047c6ae99SBarry Smith 25147c6ae99SBarry Smith /*@ 252aa219208SBarry Smith DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector 253aa219208SBarry Smith to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin(). 25447c6ae99SBarry Smith 255aa219208SBarry Smith Neighbor-wise Collective on DMDA 25647c6ae99SBarry Smith 25747c6ae99SBarry Smith Input Parameters: 25847c6ae99SBarry Smith + da - the distributed array context 25947c6ae99SBarry Smith . g - the global vector in a natural ordering 26047c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 26147c6ae99SBarry Smith 26247c6ae99SBarry Smith Output Parameter: 263aa219208SBarry Smith . l - the global values in the PETSc DMDA ordering 26447c6ae99SBarry Smith 26547c6ae99SBarry Smith Level: intermediate 26647c6ae99SBarry Smith 26747c6ae99SBarry Smith Notes: 26847c6ae99SBarry Smith The global and local vectors used here need not be the same as those 269aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 27047c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 271aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 27247c6ae99SBarry Smith 27347c6ae99SBarry Smith .keywords: distributed array, global to local, end 27447c6ae99SBarry Smith 275aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 276aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 27747c6ae99SBarry Smith 27847c6ae99SBarry Smith @*/ 279*dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g) 28047c6ae99SBarry Smith { 28147c6ae99SBarry Smith PetscErrorCode ierr; 28247c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 28347c6ae99SBarry Smith 28447c6ae99SBarry Smith PetscFunctionBegin; 28547c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 286*dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 28747c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 288*dd9d0712SPatrick Sanan ierr = VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 28947c6ae99SBarry Smith PetscFunctionReturn(0); 29047c6ae99SBarry Smith } 291