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 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 81*95452b02SPatrick Sanan Notes: 82*95452b02SPatrick Sanan This is an internal routine called by DMDAGlobalToNatural() to 8347c6ae99SBarry Smith create the scatter context. 8447c6ae99SBarry Smith 8547c6ae99SBarry Smith .keywords: distributed array, global to local, begin 8647c6ae99SBarry Smith 87aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 88aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 8947c6ae99SBarry Smith */ 90aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da) 9147c6ae99SBarry Smith { 9247c6ae99SBarry Smith PetscErrorCode ierr; 9347c6ae99SBarry Smith PetscInt m,start,Nlocal; 9447c6ae99SBarry Smith IS from,to; 9547c6ae99SBarry Smith Vec global; 9647c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 9747c6ae99SBarry Smith 9847c6ae99SBarry Smith PetscFunctionBegin; 9947c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 100ce94432eSBarry Smith if (!dd->natural) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it"); 10147c6ae99SBarry Smith 10247c6ae99SBarry Smith /* create the scatter context */ 10347c6ae99SBarry Smith ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr); 1040298fd71SBarry Smith ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr); 10547c6ae99SBarry Smith 106aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr); 10747c6ae99SBarry Smith if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m); 108ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr); 109ce94432eSBarry Smith ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 11047c6ae99SBarry Smith ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr); 111fcfd50ebSBarry Smith ierr = VecDestroy(&global);CHKERRQ(ierr); 112fcfd50ebSBarry Smith ierr = ISDestroy(&from);CHKERRQ(ierr); 113fcfd50ebSBarry Smith ierr = ISDestroy(&to);CHKERRQ(ierr); 11447c6ae99SBarry Smith PetscFunctionReturn(0); 11547c6ae99SBarry Smith } 11647c6ae99SBarry Smith 11747c6ae99SBarry Smith /*@ 118aa219208SBarry Smith DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector 11947c6ae99SBarry Smith in the "natural" grid ordering. Must be followed by 120aa219208SBarry Smith DMDAGlobalToNaturalEnd() to complete the exchange. 12147c6ae99SBarry Smith 122aa219208SBarry Smith Neighbor-wise Collective on DMDA 12347c6ae99SBarry Smith 12447c6ae99SBarry Smith Input Parameters: 12547c6ae99SBarry Smith + da - the distributed array context 12647c6ae99SBarry Smith . g - the global vector 12747c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 12847c6ae99SBarry Smith 12947c6ae99SBarry Smith Output Parameter: 13047c6ae99SBarry Smith . l - the natural ordering values 13147c6ae99SBarry Smith 13247c6ae99SBarry Smith Level: advanced 13347c6ae99SBarry Smith 13447c6ae99SBarry Smith Notes: 13547c6ae99SBarry Smith The global and natrual vectors used here need not be the same as those 136aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 13747c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 138aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 13947c6ae99SBarry Smith 140aa219208SBarry Smith You must call DMDACreateNaturalVector() before using this routine 14147c6ae99SBarry Smith 14247c6ae99SBarry Smith .keywords: distributed array, global to local, begin 14347c6ae99SBarry Smith 144aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 145aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1469a42bb27SBarry Smith 14747c6ae99SBarry Smith @*/ 148dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n) 14947c6ae99SBarry Smith { 15047c6ae99SBarry Smith PetscErrorCode ierr; 15147c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 15247c6ae99SBarry Smith 15347c6ae99SBarry Smith PetscFunctionBegin; 15447c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 155dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 156dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 15747c6ae99SBarry Smith if (!dd->gton) { 15847c6ae99SBarry Smith /* create the scatter context */ 159aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 16047c6ae99SBarry Smith } 161dd9d0712SPatrick Sanan ierr = VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr); 16247c6ae99SBarry Smith PetscFunctionReturn(0); 16347c6ae99SBarry Smith } 16447c6ae99SBarry Smith 16547c6ae99SBarry Smith /*@ 166aa219208SBarry Smith DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector 167aa219208SBarry Smith in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin(). 16847c6ae99SBarry Smith 169aa219208SBarry Smith Neighbor-wise Collective on DMDA 17047c6ae99SBarry Smith 17147c6ae99SBarry Smith Input Parameters: 17247c6ae99SBarry Smith + da - the distributed array context 17347c6ae99SBarry Smith . g - the global vector 17447c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 17547c6ae99SBarry Smith 17647c6ae99SBarry Smith Output Parameter: 17747c6ae99SBarry Smith . l - the global values in the natural ordering 17847c6ae99SBarry Smith 17947c6ae99SBarry Smith Level: advanced 18047c6ae99SBarry Smith 18147c6ae99SBarry Smith Notes: 18247c6ae99SBarry Smith The global and local vectors used here need not be the same as those 183aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 18447c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 185aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 18647c6ae99SBarry Smith 18747c6ae99SBarry Smith .keywords: distributed array, global to local, end 18847c6ae99SBarry Smith 189aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 190aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1919a42bb27SBarry Smith 19247c6ae99SBarry Smith @*/ 193dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n) 19447c6ae99SBarry Smith { 19547c6ae99SBarry Smith PetscErrorCode ierr; 19647c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 19747c6ae99SBarry Smith 19847c6ae99SBarry Smith PetscFunctionBegin; 19947c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 200dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 201dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 202dd9d0712SPatrick Sanan ierr = VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr); 20347c6ae99SBarry Smith PetscFunctionReturn(0); 20447c6ae99SBarry Smith } 20547c6ae99SBarry Smith 20647c6ae99SBarry Smith /*@ 207aa219208SBarry Smith DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering 208aa219208SBarry Smith to a global vector in the PETSc DMDA grid ordering. Must be followed by 209aa219208SBarry Smith DMDANaturalToGlobalEnd() to complete the exchange. 21047c6ae99SBarry Smith 211aa219208SBarry Smith Neighbor-wise Collective on DMDA 21247c6ae99SBarry Smith 21347c6ae99SBarry Smith Input Parameters: 21447c6ae99SBarry Smith + da - the distributed array context 21547c6ae99SBarry Smith . g - the global vector in a natural ordering 21647c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 21747c6ae99SBarry Smith 21847c6ae99SBarry Smith Output Parameter: 219aa219208SBarry Smith . l - the values in the DMDA ordering 22047c6ae99SBarry Smith 22147c6ae99SBarry Smith Level: advanced 22247c6ae99SBarry Smith 22347c6ae99SBarry Smith Notes: 22447c6ae99SBarry Smith The global and natural vectors used here need not be the same as those 225aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 22647c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 227aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 22847c6ae99SBarry Smith 22947c6ae99SBarry Smith .keywords: distributed array, global to local, begin 23047c6ae99SBarry Smith 231aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 232aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 23347c6ae99SBarry Smith 23447c6ae99SBarry Smith @*/ 235dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g) 23647c6ae99SBarry Smith { 23747c6ae99SBarry Smith PetscErrorCode ierr; 23847c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 23947c6ae99SBarry Smith 24047c6ae99SBarry Smith PetscFunctionBegin; 24147c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 242dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 24347c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 24447c6ae99SBarry Smith if (!dd->gton) { 24547c6ae99SBarry Smith /* create the scatter context */ 246aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 24747c6ae99SBarry Smith } 248dd9d0712SPatrick Sanan ierr = VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 24947c6ae99SBarry Smith PetscFunctionReturn(0); 25047c6ae99SBarry Smith } 25147c6ae99SBarry Smith 25247c6ae99SBarry Smith /*@ 253aa219208SBarry Smith DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector 254aa219208SBarry Smith to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin(). 25547c6ae99SBarry Smith 256aa219208SBarry Smith Neighbor-wise Collective on DMDA 25747c6ae99SBarry Smith 25847c6ae99SBarry Smith Input Parameters: 25947c6ae99SBarry Smith + da - the distributed array context 26047c6ae99SBarry Smith . g - the global vector in a natural ordering 26147c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 26247c6ae99SBarry Smith 26347c6ae99SBarry Smith Output Parameter: 264aa219208SBarry Smith . l - the global values in the PETSc DMDA ordering 26547c6ae99SBarry Smith 266a47bb602SJed Brown Level: advanced 26747c6ae99SBarry Smith 26847c6ae99SBarry Smith Notes: 26947c6ae99SBarry Smith The global and local vectors used here need not be the same as those 270aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 27147c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 272aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 27347c6ae99SBarry Smith 27447c6ae99SBarry Smith .keywords: distributed array, global to local, end 27547c6ae99SBarry Smith 276aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 277aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 27847c6ae99SBarry Smith 27947c6ae99SBarry Smith @*/ 280dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g) 28147c6ae99SBarry Smith { 28247c6ae99SBarry Smith PetscErrorCode ierr; 28347c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 28447c6ae99SBarry Smith 28547c6ae99SBarry Smith PetscFunctionBegin; 28647c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 287dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 28847c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 289dd9d0712SPatrick Sanan ierr = VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 29047c6ae99SBarry Smith PetscFunctionReturn(0); 29147c6ae99SBarry Smith } 292