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 DM_DA *dd = (DM_DA*)da->data; 1047c6ae99SBarry Smith 1147c6ae99SBarry Smith PetscFunctionBegin; 1247c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1347c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 1447c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 159566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD)); 1647c6ae99SBarry Smith PetscFunctionReturn(0); 1747c6ae99SBarry Smith } 1847c6ae99SBarry Smith 197087cfbeSBarry Smith PetscErrorCode DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l) 2047c6ae99SBarry Smith { 2147c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 2247c6ae99SBarry Smith 2347c6ae99SBarry Smith PetscFunctionBegin; 2447c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 2547c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 2647c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 279566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD)); 2847c6ae99SBarry Smith PetscFunctionReturn(0); 2947c6ae99SBarry Smith } 3047c6ae99SBarry Smith 317087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g) 329a42bb27SBarry Smith { 339a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 349a42bb27SBarry Smith 359a42bb27SBarry Smith PetscFunctionBegin; 369a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 379a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 38dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,4); 399a42bb27SBarry Smith if (mode == ADD_VALUES) { 409566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE)); 419a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 42*1dca8a05SBarry Smith PetscCheck(dd->bx == DM_BOUNDARY_GHOSTED || dd->bx == DM_BOUNDARY_NONE || dd->s <= 0 || dd->m != 1,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in x direction"); 43*1dca8a05SBarry Smith PetscCheck(dd->bx == DM_BOUNDARY_GHOSTED || dd->by == DM_BOUNDARY_NONE || dd->s <= 0 || dd->n != 1,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in y direction"); 44*1dca8a05SBarry Smith PetscCheck(dd->bx == DM_BOUNDARY_GHOSTED || dd->bz == DM_BOUNDARY_NONE || dd->s <= 0 || dd->p != 1,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in z direction"); 459566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL)); 46ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented"); 479a42bb27SBarry Smith PetscFunctionReturn(0); 489a42bb27SBarry Smith } 499a42bb27SBarry Smith 507087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g) 519a42bb27SBarry Smith { 529a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 539a42bb27SBarry Smith 549a42bb27SBarry Smith PetscFunctionBegin; 559a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 569a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 57dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,4); 589a42bb27SBarry Smith if (mode == ADD_VALUES) { 599566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE)); 609a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 619566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL)); 62ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented"); 639a42bb27SBarry Smith PetscFunctionReturn(0); 649a42bb27SBarry Smith } 659a42bb27SBarry Smith 6609573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*); 6747c6ae99SBarry Smith /* 68aa219208SBarry Smith DMDAGlobalToNatural_Create - Create the global to natural scatter object 6947c6ae99SBarry Smith 70d083f849SBarry Smith Collective on da 7147c6ae99SBarry Smith 7247c6ae99SBarry Smith Input Parameter: 7347c6ae99SBarry Smith . da - the distributed array context 7447c6ae99SBarry Smith 7547c6ae99SBarry Smith Level: developer 7647c6ae99SBarry Smith 7795452b02SPatrick Sanan Notes: 7895452b02SPatrick Sanan This is an internal routine called by DMDAGlobalToNatural() to 7947c6ae99SBarry Smith create the scatter context. 8047c6ae99SBarry Smith 81aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 82aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 8347c6ae99SBarry Smith */ 84aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da) 8547c6ae99SBarry Smith { 8647c6ae99SBarry Smith PetscInt m,start,Nlocal; 8747c6ae99SBarry Smith IS from,to; 8847c6ae99SBarry Smith Vec global; 8947c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 9047c6ae99SBarry Smith 9147c6ae99SBarry Smith PetscFunctionBegin; 9247c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 937a8be351SBarry Smith PetscCheck(dd->natural,PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it"); 9447c6ae99SBarry Smith 9547c6ae99SBarry Smith /* create the scatter context */ 969566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(dd->natural,&m)); 979566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(dd->natural,&start,NULL)); 9847c6ae99SBarry Smith 999566063dSJacob Faibussowitsch PetscCall(DMDAGetNatural_Private(da,&Nlocal,&to)); 10063a3b9bcSJacob Faibussowitsch PetscCheck(Nlocal == m,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %" PetscInt_FMT " local vector size %" PetscInt_FMT,Nlocal,m); 1019566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from)); 1029566063dSJacob Faibussowitsch PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,NULL,&global)); 1039566063dSJacob Faibussowitsch PetscCall(VecScatterCreate(global,from,dd->natural,to,&dd->gton)); 1049566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global)); 1059566063dSJacob Faibussowitsch PetscCall(ISDestroy(&from)); 1069566063dSJacob Faibussowitsch PetscCall(ISDestroy(&to)); 10747c6ae99SBarry Smith PetscFunctionReturn(0); 10847c6ae99SBarry Smith } 10947c6ae99SBarry Smith 11047c6ae99SBarry Smith /*@ 111aa219208SBarry Smith DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector 11247c6ae99SBarry Smith in the "natural" grid ordering. Must be followed by 113aa219208SBarry Smith DMDAGlobalToNaturalEnd() to complete the exchange. 11447c6ae99SBarry Smith 115d083f849SBarry Smith Neighbor-wise Collective on da 11647c6ae99SBarry Smith 11747c6ae99SBarry Smith Input Parameters: 11847c6ae99SBarry Smith + da - the distributed array context 11947c6ae99SBarry Smith . g - the global vector 12047c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 12147c6ae99SBarry Smith 12247c6ae99SBarry Smith Output Parameter: 12347c6ae99SBarry Smith . l - the natural ordering values 12447c6ae99SBarry Smith 12547c6ae99SBarry Smith Level: advanced 12647c6ae99SBarry Smith 12747c6ae99SBarry Smith Notes: 12847c6ae99SBarry Smith The global and natrual vectors used here need not be the same as those 129aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 13047c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 131aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 13247c6ae99SBarry Smith 133aa219208SBarry Smith You must call DMDACreateNaturalVector() before using this routine 13447c6ae99SBarry Smith 135aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 136aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1379a42bb27SBarry Smith 13847c6ae99SBarry Smith @*/ 139dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n) 14047c6ae99SBarry Smith { 14147c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 14247c6ae99SBarry Smith 14347c6ae99SBarry Smith PetscFunctionBegin; 144a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 145dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 146dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 14747c6ae99SBarry Smith if (!dd->gton) { 14847c6ae99SBarry Smith /* create the scatter context */ 1499566063dSJacob Faibussowitsch PetscCall(DMDAGlobalToNatural_Create(da)); 15047c6ae99SBarry Smith } 1519566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD)); 15247c6ae99SBarry Smith PetscFunctionReturn(0); 15347c6ae99SBarry Smith } 15447c6ae99SBarry Smith 15547c6ae99SBarry Smith /*@ 156aa219208SBarry Smith DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector 157a5b23f4aSJose E. Roman in the natural ordering. Must be preceded by DMDAGlobalToNaturalBegin(). 15847c6ae99SBarry Smith 159d083f849SBarry Smith Neighbor-wise Collective on da 16047c6ae99SBarry Smith 16147c6ae99SBarry Smith Input Parameters: 16247c6ae99SBarry Smith + da - the distributed array context 16347c6ae99SBarry Smith . g - the global vector 16447c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 16547c6ae99SBarry Smith 16647c6ae99SBarry Smith Output Parameter: 16747c6ae99SBarry Smith . l - the global values in the natural ordering 16847c6ae99SBarry Smith 16947c6ae99SBarry Smith Level: advanced 17047c6ae99SBarry Smith 17147c6ae99SBarry Smith Notes: 17247c6ae99SBarry Smith The global and local vectors used here need not be the same as those 173aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 17447c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 175aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 17647c6ae99SBarry Smith 177aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 178aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1799a42bb27SBarry Smith 18047c6ae99SBarry Smith @*/ 181dd9d0712SPatrick Sanan PetscErrorCode DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n) 18247c6ae99SBarry Smith { 18347c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 18447c6ae99SBarry Smith 18547c6ae99SBarry Smith PetscFunctionBegin; 186a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 187dd9d0712SPatrick Sanan PetscValidHeaderSpecific(g,VEC_CLASSID,2); 188dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,4); 1899566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD)); 19047c6ae99SBarry Smith PetscFunctionReturn(0); 19147c6ae99SBarry Smith } 19247c6ae99SBarry Smith 19347c6ae99SBarry Smith /*@ 194aa219208SBarry Smith DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering 195aa219208SBarry Smith to a global vector in the PETSc DMDA grid ordering. Must be followed by 196aa219208SBarry Smith DMDANaturalToGlobalEnd() to complete the exchange. 19747c6ae99SBarry Smith 198d083f849SBarry Smith Neighbor-wise Collective on da 19947c6ae99SBarry Smith 20047c6ae99SBarry Smith Input Parameters: 20147c6ae99SBarry Smith + da - the distributed array context 20247c6ae99SBarry Smith . g - the global vector in a natural ordering 20347c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 20447c6ae99SBarry Smith 20547c6ae99SBarry Smith Output Parameter: 206aa219208SBarry Smith . l - the values in the DMDA ordering 20747c6ae99SBarry Smith 20847c6ae99SBarry Smith Level: advanced 20947c6ae99SBarry Smith 21047c6ae99SBarry Smith Notes: 21147c6ae99SBarry Smith The global and natural vectors used here need not be the same as those 212aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 21347c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 214aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 21547c6ae99SBarry Smith 216aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 217aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 21847c6ae99SBarry Smith 21947c6ae99SBarry Smith @*/ 220dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g) 22147c6ae99SBarry Smith { 22247c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 22347c6ae99SBarry Smith 22447c6ae99SBarry Smith PetscFunctionBegin; 225a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 226dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 22747c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 22847c6ae99SBarry Smith if (!dd->gton) { 22947c6ae99SBarry Smith /* create the scatter context */ 2309566063dSJacob Faibussowitsch PetscCall(DMDAGlobalToNatural_Create(da)); 23147c6ae99SBarry Smith } 2329566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE)); 23347c6ae99SBarry Smith PetscFunctionReturn(0); 23447c6ae99SBarry Smith } 23547c6ae99SBarry Smith 23647c6ae99SBarry Smith /*@ 237aa219208SBarry Smith DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector 238a5b23f4aSJose E. Roman to a global vector in the PETSc DMDA ordering. Must be preceded by DMDANaturalToGlobalBegin(). 23947c6ae99SBarry Smith 240d083f849SBarry Smith Neighbor-wise Collective on da 24147c6ae99SBarry Smith 24247c6ae99SBarry Smith Input Parameters: 24347c6ae99SBarry Smith + da - the distributed array context 24447c6ae99SBarry Smith . g - the global vector in a natural ordering 24547c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 24647c6ae99SBarry Smith 24747c6ae99SBarry Smith Output Parameter: 248aa219208SBarry Smith . l - the global values in the PETSc DMDA ordering 24947c6ae99SBarry Smith 250a47bb602SJed Brown Level: advanced 25147c6ae99SBarry Smith 25247c6ae99SBarry Smith Notes: 25347c6ae99SBarry Smith The global and local vectors used here need not be the same as those 254aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 25547c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 256aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 25747c6ae99SBarry Smith 258aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 259aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 26047c6ae99SBarry Smith 26147c6ae99SBarry Smith @*/ 262dd9d0712SPatrick Sanan PetscErrorCode DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g) 26347c6ae99SBarry Smith { 26447c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 26547c6ae99SBarry Smith 26647c6ae99SBarry Smith PetscFunctionBegin; 267a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 268dd9d0712SPatrick Sanan PetscValidHeaderSpecific(n,VEC_CLASSID,2); 26947c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 2709566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE)); 27147c6ae99SBarry Smith PetscFunctionReturn(0); 27247c6ae99SBarry Smith } 273