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(PetscObjectComm((PetscObject)win),win->map->n*sizeof(PetscScalar),win->map->N*sizeof(PetscScalar),(void**)&array);CHKERRQ(ierr); ierr = VecCreate(PetscObjectComm((PetscObject)win),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 = PetscObjectListDuplicate(((PetscObject)win)->olist,&((PetscObject)*v)->olist);CHKERRQ(ierr); ierr = PetscFunctionListDuplicate(((PetscObject)win)->qlist,&((PetscObject)*v)->qlist);CHKERRQ(ierr); (*v)->ops->duplicate = VecDuplicate_Shared; (*v)->bstash.bs = win->bstash.bs; PetscFunctionReturn(0); }
PetscErrorCode VecDuplicate_Seq(Vec win,Vec *V) { PetscErrorCode ierr; PetscFunctionBegin; ierr = VecCreate(PetscObjectComm((PetscObject)win),V);CHKERRQ(ierr); ierr = VecSetSizes(*V,win->map->n,win->map->n);CHKERRQ(ierr); ierr = VecSetType(*V,((PetscObject)win)->type_name);CHKERRQ(ierr); ierr = PetscLayoutReference(win->map,&(*V)->map);CHKERRQ(ierr); ierr = PetscObjectListDuplicate(((PetscObject)win)->olist,&((PetscObject)(*V))->olist);CHKERRQ(ierr); ierr = PetscFunctionListDuplicate(((PetscObject)win)->qlist,&((PetscObject)(*V))->qlist);CHKERRQ(ierr); (*V)->ops->view = win->ops->view; (*V)->stash.ignorenegidx = win->stash.ignorenegidx; PetscFunctionReturn(0); }
static PetscErrorCode VecDuplicate_MPI(Vec win,Vec *v) { PetscErrorCode ierr; Vec_MPI *vw,*w = (Vec_MPI*)win->data; PetscScalar *array; PetscFunctionBegin; ierr = VecCreate(PetscObjectComm((PetscObject)win),v);CHKERRQ(ierr); ierr = PetscLayoutReference(win->map,&(*v)->map);CHKERRQ(ierr); ierr = VecCreate_MPI_Private(*v,PETSC_TRUE,w->nghost,0);CHKERRQ(ierr); vw = (Vec_MPI*)(*v)->data; ierr = PetscMemcpy((*v)->ops,win->ops,sizeof(struct _VecOps));CHKERRQ(ierr); /* save local representation of the parallel vector (and scatter) if it exists */ if (w->localrep) { ierr = VecGetArray(*v,&array);CHKERRQ(ierr); ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,win->map->bs,win->map->n+w->nghost,array,&vw->localrep);CHKERRQ(ierr); ierr = PetscMemcpy(vw->localrep->ops,w->localrep->ops,sizeof(struct _VecOps));CHKERRQ(ierr); ierr = VecRestoreArray(*v,&array);CHKERRQ(ierr); ierr = PetscLogObjectParent(*v,vw->localrep);CHKERRQ(ierr); vw->localupdate = w->localupdate; if (vw->localupdate) { ierr = PetscObjectReference((PetscObject)vw->localupdate);CHKERRQ(ierr); } } /* New vector should inherit stashing property of parent */ (*v)->stash.donotstash = win->stash.donotstash; (*v)->stash.ignorenegidx = win->stash.ignorenegidx; ierr = PetscObjectListDuplicate(((PetscObject)win)->olist,&((PetscObject)(*v))->olist);CHKERRQ(ierr); ierr = PetscFunctionListDuplicate(((PetscObject)win)->qlist,&((PetscObject)(*v))->qlist);CHKERRQ(ierr); (*v)->map->bs = win->map->bs; (*v)->bstash.bs = win->bstash.bs; PetscFunctionReturn(0); }
void PETSC_STDCALL petscfunctionlistduplicate_(PetscFunctionList *fl,PetscFunctionList *nl, int *__ierr ){ *__ierr = PetscFunctionListDuplicate(*fl, (PetscFunctionList* )PetscToPointer((nl) )); }