PetscErrorCode VecDuplicate_Shared(Vec win,Vec *v) { PetscErrorCode ierr; Vec_MPI *w = (Vec_MPI *)win->data; PetscScalar *array; PetscFunctionBegin; /* first processor allocates entire array and sends it's address to the others */ ierr = PetscSharedMalloc(((PetscObject)win)->comm,win->map->n*sizeof(PetscScalar),win->map->N*sizeof(PetscScalar),(void**)&array);CHKERRQ(ierr); ierr = VecCreate(((PetscObject)win)->comm,v);CHKERRQ(ierr); ierr = VecSetSizes(*v,win->map->n,win->map->N);CHKERRQ(ierr); ierr = VecCreate_MPI_Private(*v,PETSC_FALSE,w->nghost,array);CHKERRQ(ierr); ierr = PetscLayoutReference(win->map,&(*v)->map);CHKERRQ(ierr); /* New vector should inherit stashing property of parent */ (*v)->stash.donotstash = win->stash.donotstash; (*v)->stash.ignorenegidx = win->stash.ignorenegidx; ierr = PetscOListDuplicate(((PetscObject)win)->olist,&((PetscObject)*v)->olist);CHKERRQ(ierr); ierr = PetscFListDuplicate(((PetscObject)win)->qlist,&((PetscObject)*v)->qlist);CHKERRQ(ierr); (*v)->ops->duplicate = VecDuplicate_Shared; (*v)->bstash.bs = win->bstash.bs; PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode VecCreate_Shared(Vec vv) { PetscErrorCode ierr; PetscScalar *array; PetscFunctionBegin; ierr = PetscSplitOwnership(PetscObjectComm((PetscObject)vv),&vv->map->n,&vv->map->N);CHKERRQ(ierr); ierr = PetscSharedMalloc(PetscObjectComm((PetscObject)vv),vv->map->n*sizeof(PetscScalar),vv->map->N*sizeof(PetscScalar),(void**)&array);CHKERRQ(ierr); ierr = VecCreate_MPI_Private(vv,PETSC_FALSE,0,array);CHKERRQ(ierr); vv->ops->duplicate = VecDuplicate_Shared; PetscFunctionReturn(0); }
EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "VecCreate_Shared" PetscErrorCode VecCreate_Shared(Vec vv) { PetscErrorCode ierr; PetscScalar *array; PetscFunctionBegin; ierr = PetscSplitOwnership(((PetscObject)vv)->comm,&vv->map->n,&vv->map->N);CHKERRQ(ierr); ierr = PetscSharedMalloc(((PetscObject)vv)->comm,vv->map->n*sizeof(PetscScalar),vv->map->N*sizeof(PetscScalar),(void**)&array);CHKERRQ(ierr); ierr = VecCreate_MPI_Private(vv,PETSC_FALSE,0,array);CHKERRQ(ierr); vv->ops->duplicate = VecDuplicate_Shared; PetscFunctionReturn(0); }