147c6ae99SBarry Smith 247c6ae99SBarry Smith /* 347c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 447c6ae99SBarry Smith */ 547c6ae99SBarry Smith 6*b45d2f2cSJed Brown #include <petsc-private/daimpl.h> /*I "petscdmda.h" I*/ 747c6ae99SBarry Smith 847c6ae99SBarry Smith #undef __FUNCT__ 99a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalBegin_DA" 107087cfbeSBarry Smith PetscErrorCode DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l) 1147c6ae99SBarry Smith { 1247c6ae99SBarry Smith PetscErrorCode ierr; 1347c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 1447c6ae99SBarry Smith 1547c6ae99SBarry Smith PetscFunctionBegin; 1647c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1747c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 1847c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 1947c6ae99SBarry Smith ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 2047c6ae99SBarry Smith PetscFunctionReturn(0); 2147c6ae99SBarry Smith } 2247c6ae99SBarry Smith 2347c6ae99SBarry Smith 2447c6ae99SBarry Smith #undef __FUNCT__ 259a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalEnd_DA" 267087cfbeSBarry Smith PetscErrorCode DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l) 2747c6ae99SBarry Smith { 2847c6ae99SBarry Smith PetscErrorCode ierr; 2947c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 3047c6ae99SBarry Smith 3147c6ae99SBarry Smith PetscFunctionBegin; 3247c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 3347c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 3447c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 3547c6ae99SBarry Smith ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 3647c6ae99SBarry Smith PetscFunctionReturn(0); 3747c6ae99SBarry Smith } 3847c6ae99SBarry Smith 399a42bb27SBarry Smith #undef __FUNCT__ 409a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalBegin_DA" 417087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g) 429a42bb27SBarry Smith { 439a42bb27SBarry Smith PetscErrorCode ierr; 449a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 459a42bb27SBarry Smith 469a42bb27SBarry Smith PetscFunctionBegin; 479a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 489a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 499a42bb27SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,3); 509a42bb27SBarry Smith if (mode == ADD_VALUES) { 519a42bb27SBarry Smith ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 529a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 539a42bb27SBarry Smith ierr = VecScatterBegin(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr); 549a42bb27SBarry Smith } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented"); 559a42bb27SBarry Smith PetscFunctionReturn(0); 569a42bb27SBarry Smith } 579a42bb27SBarry Smith 589a42bb27SBarry Smith #undef __FUNCT__ 599a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalEnd_DA" 607087cfbeSBarry Smith PetscErrorCode DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g) 619a42bb27SBarry Smith { 629a42bb27SBarry Smith PetscErrorCode ierr; 639a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 649a42bb27SBarry Smith 659a42bb27SBarry Smith PetscFunctionBegin; 669a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 679a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 689a42bb27SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,3); 699a42bb27SBarry Smith if (mode == ADD_VALUES) { 709a42bb27SBarry Smith ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 719a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 729a42bb27SBarry Smith ierr = VecScatterEnd(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr); 739a42bb27SBarry Smith } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented"); 749a42bb27SBarry Smith PetscFunctionReturn(0); 759a42bb27SBarry Smith } 769a42bb27SBarry Smith 7709573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*); 7847c6ae99SBarry Smith #undef __FUNCT__ 79aa219208SBarry Smith #define __FUNCT__ "DMDAGlobalToNatural_Create" 8047c6ae99SBarry Smith /* 81aa219208SBarry Smith DMDAGlobalToNatural_Create - Create the global to natural scatter object 8247c6ae99SBarry Smith 83aa219208SBarry Smith Collective on DMDA 8447c6ae99SBarry Smith 8547c6ae99SBarry Smith Input Parameter: 8647c6ae99SBarry Smith . da - the distributed array context 8747c6ae99SBarry Smith 8847c6ae99SBarry Smith Level: developer 8947c6ae99SBarry Smith 90aa219208SBarry Smith Notes: This is an internal routine called by DMDAGlobalToNatural() to 9147c6ae99SBarry Smith create the scatter context. 9247c6ae99SBarry Smith 9347c6ae99SBarry Smith .keywords: distributed array, global to local, begin 9447c6ae99SBarry Smith 95aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 96aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 9747c6ae99SBarry Smith */ 98aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da) 9947c6ae99SBarry Smith { 10047c6ae99SBarry Smith PetscErrorCode ierr; 10147c6ae99SBarry Smith PetscInt m,start,Nlocal; 10247c6ae99SBarry Smith IS from,to; 10347c6ae99SBarry Smith Vec global; 10447c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 10547c6ae99SBarry Smith 10647c6ae99SBarry Smith PetscFunctionBegin; 10747c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 10847c6ae99SBarry Smith if (!dd->natural) { 10947c6ae99SBarry Smith SETERRQ(((PetscObject)da)->comm,PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it"); 11047c6ae99SBarry Smith } 11147c6ae99SBarry Smith 11247c6ae99SBarry Smith /* create the scatter context */ 11347c6ae99SBarry Smith ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr); 11447c6ae99SBarry Smith ierr = VecGetOwnershipRange(dd->natural,&start,PETSC_NULL);CHKERRQ(ierr); 11547c6ae99SBarry Smith 116aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr); 11747c6ae99SBarry Smith if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m); 11847c6ae99SBarry Smith ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&from);CHKERRQ(ierr); 11947c6ae99SBarry Smith ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,0,&global); 12047c6ae99SBarry Smith ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr); 12147c6ae99SBarry Smith ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr); 122fcfd50ebSBarry Smith ierr = VecDestroy(&global);CHKERRQ(ierr); 123fcfd50ebSBarry Smith ierr = ISDestroy(&from);CHKERRQ(ierr); 124fcfd50ebSBarry Smith ierr = ISDestroy(&to);CHKERRQ(ierr); 12547c6ae99SBarry Smith PetscFunctionReturn(0); 12647c6ae99SBarry Smith } 12747c6ae99SBarry Smith 12847c6ae99SBarry Smith #undef __FUNCT__ 129aa219208SBarry Smith #define __FUNCT__ "DMDAGlobalToNaturalBegin" 13047c6ae99SBarry Smith /*@ 131aa219208SBarry Smith DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector 13247c6ae99SBarry Smith in the "natural" grid ordering. Must be followed by 133aa219208SBarry Smith DMDAGlobalToNaturalEnd() to complete the exchange. 13447c6ae99SBarry Smith 135aa219208SBarry Smith Neighbor-wise Collective on DMDA 13647c6ae99SBarry Smith 13747c6ae99SBarry Smith Input Parameters: 13847c6ae99SBarry Smith + da - the distributed array context 13947c6ae99SBarry Smith . g - the global vector 14047c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 14147c6ae99SBarry Smith 14247c6ae99SBarry Smith Output Parameter: 14347c6ae99SBarry Smith . l - the natural ordering values 14447c6ae99SBarry Smith 14547c6ae99SBarry Smith Level: advanced 14647c6ae99SBarry Smith 14747c6ae99SBarry Smith Notes: 14847c6ae99SBarry Smith The global and natrual vectors used here need not be the same as those 149aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 15047c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 151aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 15247c6ae99SBarry Smith 153aa219208SBarry Smith You must call DMDACreateNaturalVector() before using this routine 15447c6ae99SBarry Smith 15547c6ae99SBarry Smith .keywords: distributed array, global to local, begin 15647c6ae99SBarry Smith 157aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 158aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 1599a42bb27SBarry Smith 16047c6ae99SBarry Smith @*/ 1617087cfbeSBarry Smith PetscErrorCode DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec l) 16247c6ae99SBarry Smith { 16347c6ae99SBarry Smith PetscErrorCode ierr; 16447c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 16547c6ae99SBarry Smith 16647c6ae99SBarry Smith PetscFunctionBegin; 16747c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 16847c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 16947c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 17047c6ae99SBarry Smith if (!dd->gton) { 17147c6ae99SBarry Smith /* create the scatter context */ 172aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 17347c6ae99SBarry Smith } 17447c6ae99SBarry Smith ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 17547c6ae99SBarry Smith PetscFunctionReturn(0); 17647c6ae99SBarry Smith } 17747c6ae99SBarry Smith 17847c6ae99SBarry Smith #undef __FUNCT__ 179aa219208SBarry Smith #define __FUNCT__ "DMDAGlobalToNaturalEnd" 18047c6ae99SBarry Smith /*@ 181aa219208SBarry Smith DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector 182aa219208SBarry Smith in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin(). 18347c6ae99SBarry Smith 184aa219208SBarry Smith Neighbor-wise Collective on DMDA 18547c6ae99SBarry Smith 18647c6ae99SBarry Smith Input Parameters: 18747c6ae99SBarry Smith + da - the distributed array context 18847c6ae99SBarry Smith . g - the global vector 18947c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 19047c6ae99SBarry Smith 19147c6ae99SBarry Smith Output Parameter: 19247c6ae99SBarry Smith . l - the global values in the natural ordering 19347c6ae99SBarry Smith 19447c6ae99SBarry Smith Level: advanced 19547c6ae99SBarry Smith 19647c6ae99SBarry Smith Notes: 19747c6ae99SBarry Smith The global and local vectors used here need not be the same as those 198aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 19947c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 200aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 20147c6ae99SBarry Smith 20247c6ae99SBarry Smith .keywords: distributed array, global to local, end 20347c6ae99SBarry Smith 204aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 205aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 2069a42bb27SBarry Smith 20747c6ae99SBarry Smith @*/ 2087087cfbeSBarry Smith PetscErrorCode DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec l) 20947c6ae99SBarry Smith { 21047c6ae99SBarry Smith PetscErrorCode ierr; 21147c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 21247c6ae99SBarry Smith 21347c6ae99SBarry Smith PetscFunctionBegin; 21447c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 21547c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 21647c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 21747c6ae99SBarry Smith ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 21847c6ae99SBarry Smith PetscFunctionReturn(0); 21947c6ae99SBarry Smith } 22047c6ae99SBarry Smith 22147c6ae99SBarry Smith #undef __FUNCT__ 222aa219208SBarry Smith #define __FUNCT__ "DMDANaturalToGlobalBegin" 22347c6ae99SBarry Smith /*@ 224aa219208SBarry Smith DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering 225aa219208SBarry Smith to a global vector in the PETSc DMDA grid ordering. Must be followed by 226aa219208SBarry Smith DMDANaturalToGlobalEnd() to complete the exchange. 22747c6ae99SBarry Smith 228aa219208SBarry Smith Neighbor-wise Collective on DMDA 22947c6ae99SBarry Smith 23047c6ae99SBarry Smith Input Parameters: 23147c6ae99SBarry Smith + da - the distributed array context 23247c6ae99SBarry Smith . g - the global vector in a natural ordering 23347c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 23447c6ae99SBarry Smith 23547c6ae99SBarry Smith Output Parameter: 236aa219208SBarry Smith . l - the values in the DMDA ordering 23747c6ae99SBarry Smith 23847c6ae99SBarry Smith Level: advanced 23947c6ae99SBarry Smith 24047c6ae99SBarry Smith Notes: 24147c6ae99SBarry Smith The global and natural vectors used here need not be the same as those 242aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 24347c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 244aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 24547c6ae99SBarry Smith 24647c6ae99SBarry Smith .keywords: distributed array, global to local, begin 24747c6ae99SBarry Smith 248aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(), 249aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 25047c6ae99SBarry Smith 25147c6ae99SBarry Smith @*/ 2527087cfbeSBarry Smith PetscErrorCode DMDANaturalToGlobalBegin(DM da,Vec g,InsertMode mode,Vec l) 25347c6ae99SBarry Smith { 25447c6ae99SBarry Smith PetscErrorCode ierr; 25547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 25647c6ae99SBarry Smith 25747c6ae99SBarry Smith PetscFunctionBegin; 25847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 25947c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 26047c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 26147c6ae99SBarry Smith if (!dd->gton) { 26247c6ae99SBarry Smith /* create the scatter context */ 263aa219208SBarry Smith ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr); 26447c6ae99SBarry Smith } 26547c6ae99SBarry Smith ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 26647c6ae99SBarry Smith PetscFunctionReturn(0); 26747c6ae99SBarry Smith } 26847c6ae99SBarry Smith 26947c6ae99SBarry Smith #undef __FUNCT__ 270aa219208SBarry Smith #define __FUNCT__ "DMDANaturalToGlobalEnd" 27147c6ae99SBarry Smith /*@ 272aa219208SBarry Smith DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector 273aa219208SBarry Smith to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin(). 27447c6ae99SBarry Smith 275aa219208SBarry Smith Neighbor-wise Collective on DMDA 27647c6ae99SBarry Smith 27747c6ae99SBarry Smith Input Parameters: 27847c6ae99SBarry Smith + da - the distributed array context 27947c6ae99SBarry Smith . g - the global vector in a natural ordering 28047c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 28147c6ae99SBarry Smith 28247c6ae99SBarry Smith Output Parameter: 283aa219208SBarry Smith . l - the global values in the PETSc DMDA ordering 28447c6ae99SBarry Smith 28547c6ae99SBarry Smith Level: intermediate 28647c6ae99SBarry Smith 28747c6ae99SBarry Smith Notes: 28847c6ae99SBarry Smith The global and local vectors used here need not be the same as those 289aa219208SBarry Smith obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they 29047c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 291aa219208SBarry Smith obtained with VecDuplicate() from the DMDA originating vectors. 29247c6ae99SBarry Smith 29347c6ae99SBarry Smith .keywords: distributed array, global to local, end 29447c6ae99SBarry Smith 295aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(), 296aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector() 29747c6ae99SBarry Smith 29847c6ae99SBarry Smith @*/ 2997087cfbeSBarry Smith PetscErrorCode DMDANaturalToGlobalEnd(DM da,Vec g,InsertMode mode,Vec l) 30047c6ae99SBarry Smith { 30147c6ae99SBarry Smith PetscErrorCode ierr; 30247c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 30347c6ae99SBarry Smith 30447c6ae99SBarry Smith PetscFunctionBegin; 30547c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 30647c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 30747c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 30847c6ae99SBarry Smith ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 30947c6ae99SBarry Smith PetscFunctionReturn(0); 31047c6ae99SBarry Smith } 31147c6ae99SBarry Smith 312