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); }
PetscErrorCode VecDuplicate_MPI_DA(Vec g,Vec* gg) { PetscErrorCode ierr; DM da; PetscFunctionBegin; ierr = VecGetDM(g, &da);CHKERRQ(ierr); ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr); ierr = PetscLayoutReference(g->map,&(*gg)->map);CHKERRQ(ierr); 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 dErr VecDuplicate_Dohp(Vec x,Vec *iny) { Vec y,xc,yc; Vec_MPI *ympi; dScalar *a; dErr err; dFunctionBegin; dValidHeader(x,VEC_CLASSID,1); dValidPointer(iny,2); *iny = 0; err = VecDohpGetClosure(x,&xc);dCHK(err); err = VecDuplicate(xc,&yc);dCHK(err); err = VecDohpRestoreClosure(x,&xc);dCHK(err); /* The rest is mostly the same as VecDuplicate_MPI, but we can't call that because it allocates memory. * Unfortunately, this is fragile if the VecMPI implementation changes. I think this part of PETSc is quite stable and * I will be sufficiently involved to notice changes here. Famous last words. */ err = VecCreate(((dObject)x)->comm,&y);dCHK(err); err = PetscLayoutReference(x->map,&y->map);dCHK(err); err = VecGetArray(yc,&a);dCHK(err); err = VecCreate_MPI_Private(y,PETSC_FALSE,0,a);dCHK(err); err = VecRestoreArray(yc,&a);dCHK(err); ympi = y->data; err = dMemcpy(y->ops,x->ops,sizeof(struct _VecOps));dCHK(err); ympi->localrep = yc; /* subverting .localrep to mean closed form */ y->stash.donotstash = x->stash.donotstash; y->stash.ignorenegidx = x->stash.ignorenegidx; err = PetscOListDuplicate(((dObject)x)->olist,&((dObject)y)->olist);dCHK(err); err = PetscFListDuplicate(((dObject)x)->qlist,&((dObject)y)->qlist);dCHK(err); y->map->bs = x->map->bs; y->bstash.bs = x->bstash.bs; err = PetscObjectChangeTypeName((dObject)y,VECDOHP);dCHK(err); *iny = y; dFunctionReturn(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); }