/* DMLocalToLocalCreate_DA - Creates the local to local scatter Collective on DMDA Input Parameter: . da - the distributed array */ PetscErrorCode DMLocalToLocalCreate_DA(DM da) { PetscErrorCode ierr; PetscInt *idx,left,j,count,up,down,i,bottom,top,k,dim=da->dim; DM_DA *dd = (DM_DA*)da->data; PetscFunctionBegin; PetscValidHeaderSpecific(da,DM_CLASSID,1); if (dd->ltol) PetscFunctionReturn(0); /* We simply remap the values in the from part of global to local to read from an array with the ghost values rather then from the plain array. */ ierr = VecScatterCopy(dd->gtol,&dd->ltol);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)da,(PetscObject)dd->ltol);CHKERRQ(ierr); if (dim == 1) { left = dd->xs - dd->Xs; ierr = PetscMalloc1(dd->xe-dd->xs,&idx);CHKERRQ(ierr); for (j=0; j<dd->xe-dd->xs; j++) idx[j] = left + j; } else if (dim == 2) { left = dd->xs - dd->Xs; down = dd->ys - dd->Ys; up = down + dd->ye-dd->ys; ierr = PetscMalloc1((dd->xe-dd->xs)*(up - down),&idx);CHKERRQ(ierr); count = 0; for (i=down; i<up; i++) { for (j=0; j<dd->xe-dd->xs; j++) { idx[count++] = left + i*(dd->Xe-dd->Xs) + j; } } } else if (dim == 3) { left = dd->xs - dd->Xs; bottom = dd->ys - dd->Ys; top = bottom + dd->ye-dd->ys; down = dd->zs - dd->Zs; up = down + dd->ze-dd->zs; count = (dd->xe-dd->xs)*(top-bottom)*(up-down); ierr = PetscMalloc1(count,&idx);CHKERRQ(ierr); count = 0; for (i=down; i<up; i++) { for (j=bottom; j<top; j++) { for (k=0; k<dd->xe-dd->xs; k++) { idx[count++] = (left+j*(dd->Xe-dd->Xs))+i*(dd->Xe-dd->Xs)*(dd->Ye-dd->Ys) + k; } } } } else SETERRQ1(PetscObjectComm((PetscObject)da),PETSC_ERR_ARG_CORRUPT,"DMDA has invalid dimension %D",dim); ierr = VecScatterRemap(dd->ltol,idx,NULL);CHKERRQ(ierr); ierr = PetscFree(idx);CHKERRQ(ierr); PetscFunctionReturn(0); }
uses block index sets\n\n"; #include <petscvec.h> #undef __FUNCT__ #define __FUNCT__ "main" int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt bs = 1,n = 5,ix0[3] = {5,7,9},ix1[3] = {2,3,4},i,iy0[3] = {1,2,4},iy1[3] = {0,1,3}; PetscMPIInt size,rank; PetscScalar value; Vec x,y; IS isx,isy; VecScatter ctx = 0,newctx; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); if (size != 2) SETERRQ(PETSC_COMM_SELF,1,"Must run with 2 processors"); ierr = PetscOptionsGetInt(PETSC_NULL,"-bs",&bs,PETSC_NULL);CHKERRQ(ierr); n = bs*n; /* create two vectors */ ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,size*n);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,n,&y);CHKERRQ(ierr); /* create two index sets */ if (!rank) { ierr = ISCreateBlock(PETSC_COMM_SELF,bs,3,ix0,PETSC_COPY_VALUES,&isx);CHKERRQ(ierr); ierr = ISCreateBlock(PETSC_COMM_SELF,bs,3,iy0,PETSC_COPY_VALUES,&isy);CHKERRQ(ierr); } else { ierr = ISCreateBlock(PETSC_COMM_SELF,bs,3,ix1,PETSC_COPY_VALUES,&isx);CHKERRQ(ierr); ierr = ISCreateBlock(PETSC_COMM_SELF,bs,3,iy1,PETSC_COPY_VALUES,&isy);CHKERRQ(ierr); } /* fill local part of parallel vector */ for (i=n*rank; i<n*(rank+1); i++) { value = (PetscScalar) i; ierr = VecSetValues(x,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* fill local part of parallel vector */ for (i=0; i<n; i++) { value = -(PetscScalar) (i + 100*rank); ierr = VecSetValues(y,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(y);CHKERRQ(ierr); ierr = VecAssemblyEnd(y);CHKERRQ(ierr); ierr = VecScatterCreate(x,isx,y,isy,&ctx);CHKERRQ(ierr); ierr = VecScatterCopy(ctx,&newctx);CHKERRQ(ierr); ierr = VecScatterDestroy(&ctx);CHKERRQ(ierr); ierr = VecScatterBegin(newctx,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); ierr = VecScatterEnd(newctx,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); ierr = VecScatterDestroy(&newctx);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = ISDestroy(&isx);CHKERRQ(ierr); ierr = ISDestroy(&isy);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&y);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
void PETSC_STDCALL vecscattercopy_(VecScatter sctx,VecScatter *ctx, int *__ierr ){ *__ierr = VecScatterCopy( (VecScatter)PetscToPointer((sctx) ),ctx); }