147c6ae99SBarry Smith #define PETSCDM_DLL 247c6ae99SBarry Smith 347c6ae99SBarry Smith /* 447c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 547c6ae99SBarry Smith */ 647c6ae99SBarry Smith 747c6ae99SBarry Smith #include "private/daimpl.h" /*I "petscda.h" I*/ 847c6ae99SBarry Smith 947c6ae99SBarry Smith #undef __FUNCT__ 10*9a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalBegin_DA" 11*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l) 1247c6ae99SBarry Smith { 1347c6ae99SBarry Smith PetscErrorCode ierr; 1447c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 1547c6ae99SBarry Smith 1647c6ae99SBarry Smith PetscFunctionBegin; 1747c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1847c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 1947c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 2047c6ae99SBarry Smith ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 2147c6ae99SBarry Smith PetscFunctionReturn(0); 2247c6ae99SBarry Smith } 2347c6ae99SBarry Smith 2447c6ae99SBarry Smith 2547c6ae99SBarry Smith #undef __FUNCT__ 26*9a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalEnd_DA" 27*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l) 2847c6ae99SBarry Smith { 2947c6ae99SBarry Smith PetscErrorCode ierr; 3047c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 3147c6ae99SBarry Smith 3247c6ae99SBarry Smith PetscFunctionBegin; 3347c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 3447c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,2); 3547c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,4); 3647c6ae99SBarry Smith ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 3747c6ae99SBarry Smith PetscFunctionReturn(0); 3847c6ae99SBarry Smith } 3947c6ae99SBarry Smith 40*9a42bb27SBarry Smith #undef __FUNCT__ 41*9a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalBegin_DA" 42*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g) 43*9a42bb27SBarry Smith { 44*9a42bb27SBarry Smith PetscErrorCode ierr; 45*9a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 46*9a42bb27SBarry Smith 47*9a42bb27SBarry Smith PetscFunctionBegin; 48*9a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 49*9a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 50*9a42bb27SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,3); 51*9a42bb27SBarry Smith if (mode == ADD_VALUES) { 52*9a42bb27SBarry Smith ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 53*9a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 54*9a42bb27SBarry Smith ierr = VecScatterBegin(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr); 55*9a42bb27SBarry Smith } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented"); 56*9a42bb27SBarry Smith PetscFunctionReturn(0); 57*9a42bb27SBarry Smith } 58*9a42bb27SBarry Smith 59*9a42bb27SBarry Smith #undef __FUNCT__ 60*9a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalEnd_DA" 61*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g) 62*9a42bb27SBarry Smith { 63*9a42bb27SBarry Smith PetscErrorCode ierr; 64*9a42bb27SBarry Smith DM_DA *dd = (DM_DA*)da->data; 65*9a42bb27SBarry Smith 66*9a42bb27SBarry Smith PetscFunctionBegin; 67*9a42bb27SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 68*9a42bb27SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 69*9a42bb27SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,3); 70*9a42bb27SBarry Smith if (mode == ADD_VALUES) { 71*9a42bb27SBarry Smith ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 72*9a42bb27SBarry Smith } else if (mode == INSERT_VALUES) { 73*9a42bb27SBarry Smith ierr = VecScatterEnd(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr); 74*9a42bb27SBarry Smith } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented"); 75*9a42bb27SBarry Smith PetscFunctionReturn(0); 76*9a42bb27SBarry Smith } 77*9a42bb27SBarry Smith 78*9a42bb27SBarry Smith EXTERN PetscErrorCode DAGetNatural_Private(DM,PetscInt*,IS*); 7947c6ae99SBarry Smith #undef __FUNCT__ 8047c6ae99SBarry Smith #define __FUNCT__ "DAGlobalToNatural_Create" 8147c6ae99SBarry Smith /* 8247c6ae99SBarry Smith DAGlobalToNatural_Create - Create the global to natural scatter object 8347c6ae99SBarry Smith 8447c6ae99SBarry Smith Collective on DA 8547c6ae99SBarry Smith 8647c6ae99SBarry Smith Input Parameter: 8747c6ae99SBarry Smith . da - the distributed array context 8847c6ae99SBarry Smith 8947c6ae99SBarry Smith Level: developer 9047c6ae99SBarry Smith 9147c6ae99SBarry Smith Notes: This is an internal routine called by DAGlobalToNatural() to 9247c6ae99SBarry Smith create the scatter context. 9347c6ae99SBarry Smith 9447c6ae99SBarry Smith .keywords: distributed array, global to local, begin 9547c6ae99SBarry Smith 96*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalBegin(), DAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DACreate2d(), 97*9a42bb27SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector() 9847c6ae99SBarry Smith */ 99*9a42bb27SBarry Smith PetscErrorCode DAGlobalToNatural_Create(DM da) 10047c6ae99SBarry Smith { 10147c6ae99SBarry Smith PetscErrorCode ierr; 10247c6ae99SBarry Smith PetscInt m,start,Nlocal; 10347c6ae99SBarry Smith IS from,to; 10447c6ae99SBarry Smith Vec global; 10547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 10647c6ae99SBarry Smith 10747c6ae99SBarry Smith PetscFunctionBegin; 10847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 10947c6ae99SBarry Smith if (!dd->natural) { 11047c6ae99SBarry Smith SETERRQ(((PetscObject)da)->comm,PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it"); 11147c6ae99SBarry Smith } 11247c6ae99SBarry Smith 11347c6ae99SBarry Smith /* create the scatter context */ 11447c6ae99SBarry Smith ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr); 11547c6ae99SBarry Smith ierr = VecGetOwnershipRange(dd->natural,&start,PETSC_NULL);CHKERRQ(ierr); 11647c6ae99SBarry Smith 11747c6ae99SBarry Smith ierr = DAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr); 11847c6ae99SBarry Smith if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m); 11947c6ae99SBarry Smith ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&from);CHKERRQ(ierr); 12047c6ae99SBarry Smith ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,0,&global); 12147c6ae99SBarry Smith ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr); 12247c6ae99SBarry Smith ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr); 12347c6ae99SBarry Smith ierr = VecDestroy(global);CHKERRQ(ierr); 12447c6ae99SBarry Smith ierr = ISDestroy(from);CHKERRQ(ierr); 12547c6ae99SBarry Smith ierr = ISDestroy(to);CHKERRQ(ierr); 12647c6ae99SBarry Smith PetscFunctionReturn(0); 12747c6ae99SBarry Smith } 12847c6ae99SBarry Smith 12947c6ae99SBarry Smith #undef __FUNCT__ 13047c6ae99SBarry Smith #define __FUNCT__ "DAGlobalToNaturalBegin" 13147c6ae99SBarry Smith /*@ 13247c6ae99SBarry Smith DAGlobalToNaturalBegin - Maps values from the global vector to a global vector 13347c6ae99SBarry Smith in the "natural" grid ordering. Must be followed by 13447c6ae99SBarry Smith DAGlobalToNaturalEnd() to complete the exchange. 13547c6ae99SBarry Smith 13647c6ae99SBarry Smith Neighbor-wise Collective on DA 13747c6ae99SBarry Smith 13847c6ae99SBarry Smith Input Parameters: 13947c6ae99SBarry Smith + da - the distributed array context 14047c6ae99SBarry Smith . g - the global vector 14147c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 14247c6ae99SBarry Smith 14347c6ae99SBarry Smith Output Parameter: 14447c6ae99SBarry Smith . l - the natural ordering values 14547c6ae99SBarry Smith 14647c6ae99SBarry Smith Level: advanced 14747c6ae99SBarry Smith 14847c6ae99SBarry Smith Notes: 14947c6ae99SBarry Smith The global and natrual vectors used here need not be the same as those 15047c6ae99SBarry Smith obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they 15147c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 15247c6ae99SBarry Smith obtained with VecDuplicate() from the DA originating vectors. 15347c6ae99SBarry Smith 15447c6ae99SBarry Smith You must call DACreateNaturalVector() before using this routine 15547c6ae99SBarry Smith 15647c6ae99SBarry Smith .keywords: distributed array, global to local, begin 15747c6ae99SBarry Smith 158*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DACreate2d(), 159*9a42bb27SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector() 160*9a42bb27SBarry Smith 16147c6ae99SBarry Smith @*/ 162*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec l) 16347c6ae99SBarry Smith { 16447c6ae99SBarry Smith PetscErrorCode ierr; 16547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 16647c6ae99SBarry Smith 16747c6ae99SBarry Smith PetscFunctionBegin; 16847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 16947c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 17047c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 17147c6ae99SBarry Smith if (!dd->gton) { 17247c6ae99SBarry Smith /* create the scatter context */ 17347c6ae99SBarry Smith ierr = DAGlobalToNatural_Create(da);CHKERRQ(ierr); 17447c6ae99SBarry Smith } 17547c6ae99SBarry Smith ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 17647c6ae99SBarry Smith PetscFunctionReturn(0); 17747c6ae99SBarry Smith } 17847c6ae99SBarry Smith 17947c6ae99SBarry Smith #undef __FUNCT__ 18047c6ae99SBarry Smith #define __FUNCT__ "DAGlobalToNaturalEnd" 18147c6ae99SBarry Smith /*@ 18247c6ae99SBarry Smith DAGlobalToNaturalEnd - Maps values from the global vector to a global vector 18347c6ae99SBarry Smith in the natural ordering. Must be preceeded by DAGlobalToNaturalBegin(). 18447c6ae99SBarry Smith 18547c6ae99SBarry Smith Neighbor-wise Collective on DA 18647c6ae99SBarry Smith 18747c6ae99SBarry Smith Input Parameters: 18847c6ae99SBarry Smith + da - the distributed array context 18947c6ae99SBarry Smith . g - the global vector 19047c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 19147c6ae99SBarry Smith 19247c6ae99SBarry Smith Output Parameter: 19347c6ae99SBarry Smith . l - the global values in the natural ordering 19447c6ae99SBarry Smith 19547c6ae99SBarry Smith Level: advanced 19647c6ae99SBarry Smith 19747c6ae99SBarry Smith Notes: 19847c6ae99SBarry Smith The global and local vectors used here need not be the same as those 19947c6ae99SBarry Smith obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they 20047c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 20147c6ae99SBarry Smith obtained with VecDuplicate() from the DA originating vectors. 20247c6ae99SBarry Smith 20347c6ae99SBarry Smith .keywords: distributed array, global to local, end 20447c6ae99SBarry Smith 205*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DACreate2d(), 206*9a42bb27SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector() 207*9a42bb27SBarry Smith 20847c6ae99SBarry Smith @*/ 209*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec l) 21047c6ae99SBarry Smith { 21147c6ae99SBarry Smith PetscErrorCode ierr; 21247c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 21347c6ae99SBarry Smith 21447c6ae99SBarry Smith PetscFunctionBegin; 21547c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 21647c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 21747c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 21847c6ae99SBarry Smith ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr); 21947c6ae99SBarry Smith PetscFunctionReturn(0); 22047c6ae99SBarry Smith } 22147c6ae99SBarry Smith 22247c6ae99SBarry Smith #undef __FUNCT__ 22347c6ae99SBarry Smith #define __FUNCT__ "DANaturalToGlobalBegin" 22447c6ae99SBarry Smith /*@ 22547c6ae99SBarry Smith DANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering 22647c6ae99SBarry Smith to a global vector in the PETSc DA grid ordering. Must be followed by 22747c6ae99SBarry Smith DANaturalToGlobalEnd() to complete the exchange. 22847c6ae99SBarry Smith 22947c6ae99SBarry Smith Neighbor-wise Collective on DA 23047c6ae99SBarry Smith 23147c6ae99SBarry Smith Input Parameters: 23247c6ae99SBarry Smith + da - the distributed array context 23347c6ae99SBarry Smith . g - the global vector in a natural ordering 23447c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 23547c6ae99SBarry Smith 23647c6ae99SBarry Smith Output Parameter: 23747c6ae99SBarry Smith . l - the values in the DA ordering 23847c6ae99SBarry Smith 23947c6ae99SBarry Smith Level: advanced 24047c6ae99SBarry Smith 24147c6ae99SBarry Smith Notes: 24247c6ae99SBarry Smith The global and natural vectors used here need not be the same as those 24347c6ae99SBarry Smith obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they 24447c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 24547c6ae99SBarry Smith obtained with VecDuplicate() from the DA originating vectors. 24647c6ae99SBarry Smith 24747c6ae99SBarry Smith .keywords: distributed array, global to local, begin 24847c6ae99SBarry Smith 249*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalEnd(), DAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DACreate2d(), 250*9a42bb27SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector() 25147c6ae99SBarry Smith 25247c6ae99SBarry Smith @*/ 253*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DANaturalToGlobalBegin(DM da,Vec g,InsertMode mode,Vec l) 25447c6ae99SBarry Smith { 25547c6ae99SBarry Smith PetscErrorCode ierr; 25647c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 25747c6ae99SBarry Smith 25847c6ae99SBarry Smith PetscFunctionBegin; 25947c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 26047c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 26147c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 26247c6ae99SBarry Smith if (!dd->gton) { 26347c6ae99SBarry Smith /* create the scatter context */ 26447c6ae99SBarry Smith ierr = DAGlobalToNatural_Create(da);CHKERRQ(ierr); 26547c6ae99SBarry Smith } 26647c6ae99SBarry Smith ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 26747c6ae99SBarry Smith PetscFunctionReturn(0); 26847c6ae99SBarry Smith } 26947c6ae99SBarry Smith 27047c6ae99SBarry Smith #undef __FUNCT__ 27147c6ae99SBarry Smith #define __FUNCT__ "DANaturalToGlobalEnd" 27247c6ae99SBarry Smith /*@ 27347c6ae99SBarry Smith DANaturalToGlobalEnd - Maps values from the natural ordering global vector 27447c6ae99SBarry Smith to a global vector in the PETSc DA ordering. Must be preceeded by DANaturalToGlobalBegin(). 27547c6ae99SBarry Smith 27647c6ae99SBarry Smith Neighbor-wise Collective on DA 27747c6ae99SBarry Smith 27847c6ae99SBarry Smith Input Parameters: 27947c6ae99SBarry Smith + da - the distributed array context 28047c6ae99SBarry Smith . g - the global vector in a natural ordering 28147c6ae99SBarry Smith - mode - one of INSERT_VALUES or ADD_VALUES 28247c6ae99SBarry Smith 28347c6ae99SBarry Smith Output Parameter: 28447c6ae99SBarry Smith . l - the global values in the PETSc DA ordering 28547c6ae99SBarry Smith 28647c6ae99SBarry Smith Level: intermediate 28747c6ae99SBarry Smith 28847c6ae99SBarry Smith Notes: 28947c6ae99SBarry Smith The global and local vectors used here need not be the same as those 29047c6ae99SBarry Smith obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they 29147c6ae99SBarry Smith must have the same parallel data layout; they could, for example, be 29247c6ae99SBarry Smith obtained with VecDuplicate() from the DA originating vectors. 29347c6ae99SBarry Smith 29447c6ae99SBarry Smith .keywords: distributed array, global to local, end 29547c6ae99SBarry Smith 296*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalBegin(), DAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DACreate2d(), 297*9a42bb27SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector() 29847c6ae99SBarry Smith 29947c6ae99SBarry Smith @*/ 300*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DANaturalToGlobalEnd(DM da,Vec g,InsertMode mode,Vec l) 30147c6ae99SBarry Smith { 30247c6ae99SBarry Smith PetscErrorCode ierr; 30347c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 30447c6ae99SBarry Smith 30547c6ae99SBarry Smith PetscFunctionBegin; 30647c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 30747c6ae99SBarry Smith PetscValidHeaderSpecific(l,VEC_CLASSID,2); 30847c6ae99SBarry Smith PetscValidHeaderSpecific(g,VEC_CLASSID,4); 30947c6ae99SBarry Smith ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr); 31047c6ae99SBarry Smith PetscFunctionReturn(0); 31147c6ae99SBarry Smith } 31247c6ae99SBarry Smith 313