147c6ae99SBarry Smith 247c6ae99SBarry Smith /* 347c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 447c6ae99SBarry Smith */ 547c6ae99SBarry Smith 6af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 747c6ae99SBarry Smith 87087cfbeSBarry Smith PetscErrorCode DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l) 947c6ae99SBarry Smith { 1047c6ae99SBarry Smith PetscErrorCode ierr; 1147c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 1247c6ae99SBarry Smith 1347c6ae99SBarry Smith PetscFunctionBegin; 1447c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1547c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 1647c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 1747c6ae99SBarry Smith ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 1847c6ae99SBarry Smith PetscFunctionReturn(0); 1947c6ae99SBarry Smith } 2047c6ae99SBarry Smith 2147c6ae99SBarry Smith 227087cfbeSBarry Smith PetscErrorCode DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l) 2347c6ae99SBarry Smith { 2447c6ae99SBarry Smith PetscErrorCode ierr; 2547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 2647c6ae99SBarry Smith 2747c6ae99SBarry Smith PetscFunctionBegin; 2847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 2947c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 3047c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 3147c6ae99SBarry Smith ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 3247c6ae99SBarry Smith PetscFunctionReturn(0); 3347c6ae99SBarry Smith } 3447c6ae99SBarry Smith 357087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g) 369a42bb27SBarry Smith { 379a42bb27SBarry Smith PetscErrorCode ierr; 389a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 399a42bb27SBarry Smith 409a42bb27SBarry Smith PetscFunctionBegin; 419a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 429a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 439a42bb27SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,3); 449a42bb27SBarry Smith if (mode == ADD_VALUES) { 459a42bb27SBarry Smith ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 469a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 47*ba302962SPatrick 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"); 48*ba302962SPatrick 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"); 49*ba302962SPatrick 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"); 50bd1fc5aeSBarry Smith ierr = VecScatterBegin(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr); 51ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented"); 529a42bb27SBarry Smith PetscFunctionReturn(0); 539a42bb27SBarry Smith } 549a42bb27SBarry Smith 557087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g) 569a42bb27SBarry Smith { 579a42bb27SBarry Smith PetscErrorCode ierr; 589a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 599a42bb27SBarry Smith 609a42bb27SBarry Smith PetscFunctionBegin; 619a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 629a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 639a42bb27SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,3); 649a42bb27SBarry Smith if (mode == ADD_VALUES) { 659a42bb27SBarry Smith ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 669a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 67bd1fc5aeSBarry Smith ierr = VecScatterEnd(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr); 68ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented"); 699a42bb27SBarry Smith PetscFunctionReturn(0); 709a42bb27SBarry Smith } 719a42bb27SBarry Smith 7209573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*); 7347c6ae99SBarry Smith /* 74aa219208SBarry Smith DMDAGlobalToNatural_Create - Create the global to natural scatter object 7547c6ae99SBarry Smith 76aa219208SBarry Smith Collective on DMDA 7747c6ae99SBarry Smith 7847c6ae99SBarry Smith Input Parameter: 7947c6ae99SBarry Smith . da - the distributed array context 8047c6ae99SBarry Smith 8147c6ae99SBarry Smith Level: developer 8247c6ae99SBarry Smith 83aa219208SBarry Smith Notes: This is an internal routine called by DMDAGlobalToNatural() to 8447c6ae99SBarry Smith create the scatter context. 8547c6ae99SBarry Smith 8647c6ae99SBarry Smith .keywords: distributed array, global to local, begin 8747c6ae99SBarry Smith 88aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 89aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 9047c6ae99SBarry Smith */ 91aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da) 9247c6ae99SBarry Smith { 9347c6ae99SBarry Smith PetscErrorCode ierr; 9447c6ae99SBarry Smith PetscInt m,start,Nlocal; 9547c6ae99SBarry Smith IS from,to; 9647c6ae99SBarry Smith Vec global; 9747c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 9847c6ae99SBarry Smith 9947c6ae99SBarry Smith PetscFunctionBegin; 10047c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 101ce94432eSBarry Smith if (!dd->natural) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it"); 10247c6ae99SBarry Smith 10347c6ae99SBarry Smith /* create the scatter context */ 10447c6ae99SBarry Smith ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr); 1050298fd71SBarry Smith ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr); 10647c6ae99SBarry Smith 107aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr); 10847c6ae99SBarry Smith if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m); 109ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr); 110ce94432eSBarry Smith ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr); 11147c6ae99SBarry Smith ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr); 112fcfd50ebSBarry Smith ierr = VecDestroy(&global);CHKERRQ(ierr); 113fcfd50ebSBarry Smith ierr = ISDestroy(&from);CHKERRQ(ierr); 114fcfd50ebSBarry Smith ierr = ISDestroy(&to);CHKERRQ(ierr); 11547c6ae99SBarry Smith PetscFunctionReturn(0); 11647c6ae99SBarry Smith } 11747c6ae99SBarry Smith 11847c6ae99SBarry Smith /*@ 119aa219208SBarry Smith DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector 12047c6ae99SBarry Smith in the "natural" grid ordering. Must be followed by 121aa219208SBarry Smith DMDAGlobalToNaturalEnd() to complete the exchange. 12247c6ae99SBarry Smith 123aa219208SBarry Smith Neighbor-wise Collective on DMDA 12447c6ae99SBarry Smith 12547c6ae99SBarry Smith Input Parameters: 12647c6ae99SBarry Smith + da - the distributed array context 12747c6ae99SBarry Smith . g - the global vector 12847c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 12947c6ae99SBarry Smith 13047c6ae99SBarry Smith Output Parameter: 13147c6ae99SBarry Smith . l - the natural ordering values 13247c6ae99SBarry Smith 13347c6ae99SBarry Smith Level: advanced 13447c6ae99SBarry Smith 13547c6ae99SBarry Smith Notes: 13647c6ae99SBarry Smith The global and natrual vectors used here need not be the same as those 137aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 13847c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 139aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 14047c6ae99SBarry Smith 141aa219208SBarry Smith You must call DMDACreateNaturalVector() before using this routine 14247c6ae99SBarry Smith 14347c6ae99SBarry Smith .keywords: distributed array, global to local, begin 14447c6ae99SBarry Smith 145aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 146aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1479a42bb27SBarry Smith 14847c6ae99SBarry Smith @*/ 1497087cfbeSBarry Smith PetscErrorCode DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec l) 15047c6ae99SBarry Smith { 15147c6ae99SBarry Smith PetscErrorCode ierr; 15247c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 15347c6ae99SBarry Smith 15447c6ae99SBarry Smith PetscFunctionBegin; 15547c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 15647c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 15747c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 15847c6ae99SBarry Smith if (!dd->gton) { 15947c6ae99SBarry Smith /* create the scatter context */ 160aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 16147c6ae99SBarry Smith } 16247c6ae99SBarry Smith ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 16347c6ae99SBarry Smith PetscFunctionReturn(0); 16447c6ae99SBarry Smith } 16547c6ae99SBarry Smith 16647c6ae99SBarry Smith /*@ 167aa219208SBarry Smith DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector 168aa219208SBarry Smith in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin(). 16947c6ae99SBarry Smith 170aa219208SBarry Smith Neighbor-wise Collective on DMDA 17147c6ae99SBarry Smith 17247c6ae99SBarry Smith Input Parameters: 17347c6ae99SBarry Smith + da - the distributed array context 17447c6ae99SBarry Smith . g - the global vector 17547c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 17647c6ae99SBarry Smith 17747c6ae99SBarry Smith Output Parameter: 17847c6ae99SBarry Smith . l - the global values in the natural ordering 17947c6ae99SBarry Smith 18047c6ae99SBarry Smith Level: advanced 18147c6ae99SBarry Smith 18247c6ae99SBarry Smith Notes: 18347c6ae99SBarry Smith The global and local vectors used here need not be the same as those 184aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 18547c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 186aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 18747c6ae99SBarry Smith 18847c6ae99SBarry Smith .keywords: distributed array, global to local, end 18947c6ae99SBarry Smith 190aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 191aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1929a42bb27SBarry Smith 19347c6ae99SBarry Smith @*/ 1947087cfbeSBarry Smith PetscErrorCode DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec l) 19547c6ae99SBarry Smith { 19647c6ae99SBarry Smith PetscErrorCode ierr; 19747c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 19847c6ae99SBarry Smith 19947c6ae99SBarry Smith PetscFunctionBegin; 20047c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 20147c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 20247c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 20347c6ae99SBarry Smith ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 20447c6ae99SBarry Smith PetscFunctionReturn(0); 20547c6ae99SBarry Smith } 20647c6ae99SBarry Smith 20747c6ae99SBarry Smith /*@ 208aa219208SBarry Smith DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering 209aa219208SBarry Smith to a global vector in the PETSc DMDA grid ordering. Must be followed by 210aa219208SBarry Smith DMDANaturalToGlobalEnd() to complete the exchange. 21147c6ae99SBarry Smith 212aa219208SBarry Smith Neighbor-wise Collective on DMDA 21347c6ae99SBarry Smith 21447c6ae99SBarry Smith Input Parameters: 21547c6ae99SBarry Smith + da - the distributed array context 21647c6ae99SBarry Smith . g - the global vector in a natural ordering 21747c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 21847c6ae99SBarry Smith 21947c6ae99SBarry Smith Output Parameter: 220aa219208SBarry Smith . l - the values in the DMDA ordering 22147c6ae99SBarry Smith 22247c6ae99SBarry Smith Level: advanced 22347c6ae99SBarry Smith 22447c6ae99SBarry Smith Notes: 22547c6ae99SBarry Smith The global and natural vectors used here need not be the same as those 226aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 22747c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 228aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 22947c6ae99SBarry Smith 23047c6ae99SBarry Smith .keywords: distributed array, global to local, begin 23147c6ae99SBarry Smith 232aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 233aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 23447c6ae99SBarry Smith 23547c6ae99SBarry Smith @*/ 2367087cfbeSBarry Smith PetscErrorCode DMDANaturalToGlobalBegin(DM da,Vec g,InsertMode mode,Vec l) 23747c6ae99SBarry Smith { 23847c6ae99SBarry Smith PetscErrorCode ierr; 23947c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 24047c6ae99SBarry Smith 24147c6ae99SBarry Smith PetscFunctionBegin; 24247c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 24347c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 24447c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 24547c6ae99SBarry Smith if (!dd->gton) { 24647c6ae99SBarry Smith /* create the scatter context */ 247aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 24847c6ae99SBarry Smith } 24947c6ae99SBarry Smith ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 25047c6ae99SBarry Smith PetscFunctionReturn(0); 25147c6ae99SBarry Smith } 25247c6ae99SBarry Smith 25347c6ae99SBarry Smith /*@ 254aa219208SBarry Smith DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector 255aa219208SBarry Smith to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin(). 25647c6ae99SBarry Smith 257aa219208SBarry Smith Neighbor-wise Collective on DMDA 25847c6ae99SBarry Smith 25947c6ae99SBarry Smith Input Parameters: 26047c6ae99SBarry Smith + da - the distributed array context 26147c6ae99SBarry Smith . g - the global vector in a natural ordering 26247c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 26347c6ae99SBarry Smith 26447c6ae99SBarry Smith Output Parameter: 265aa219208SBarry Smith . l - the global values in the PETSc DMDA ordering 26647c6ae99SBarry Smith 26747c6ae99SBarry Smith Level: intermediate 26847c6ae99SBarry Smith 26947c6ae99SBarry Smith Notes: 27047c6ae99SBarry Smith The global and local vectors used here need not be the same as those 271aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 27247c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 273aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 27447c6ae99SBarry Smith 27547c6ae99SBarry Smith .keywords: distributed array, global to local, end 27647c6ae99SBarry Smith 277aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 278aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 27947c6ae99SBarry Smith 28047c6ae99SBarry Smith @*/ 2817087cfbeSBarry Smith PetscErrorCode DMDANaturalToGlobalEnd(DM da,Vec g,InsertMode mode,Vec l) 28247c6ae99SBarry Smith { 28347c6ae99SBarry Smith PetscErrorCode ierr; 28447c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 28547c6ae99SBarry Smith 28647c6ae99SBarry Smith PetscFunctionBegin; 28747c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 28847c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 28947c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 29047c6ae99SBarry Smith ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 29147c6ae99SBarry Smith PetscFunctionReturn(0); 29247c6ae99SBarry Smith } 29347c6ae99SBarry Smith 294