diff -r 7f0211769daf src/vec/vec/impls/mpi/pmap.c --- a/src/vec/vec/impls/mpi/pmap.c Wed Mar 28 13:34:25 2012 -0500 +++ b/src/vec/vec/impls/mpi/pmap.c Fri Mar 30 18:59:22 2012 +0300 @@ -188,6 +188,8 @@ ierr = PetscMemcpy(*out,in,sizeof(struct _n_PetscLayout));CHKERRQ(ierr); ierr = PetscMalloc((size+1)*sizeof(PetscInt),&(*out)->range);CHKERRQ(ierr); ierr = PetscMemcpy((*out)->range,in->range,(size+1)*sizeof(PetscInt));CHKERRQ(ierr); + if (in->mapping) {ierr = PetscObjectReference((PetscObject)in->mapping);CHKERRQ(ierr);} + if (in->bmapping) {ierr = PetscObjectReference((PetscObject)in->bmapping);CHKERRQ(ierr);} (*out)->refcnt = 0; PetscFunctionReturn(0); } diff -r 7f0211769daf src/vec/vec/interface/vector.c --- a/src/vec/vec/interface/vector.c Wed Mar 28 13:34:25 2012 -0500 +++ b/src/vec/vec/interface/vector.c Fri Mar 30 18:59:22 2012 +0300 @@ -1487,6 +1487,7 @@ @*/ PetscErrorCode VecSetBlockSize(Vec v,PetscInt bs) { + PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(v,VEC_CLASSID,1); if (bs <= 0) bs = 1; @@ -1496,7 +1497,16 @@ Try setting blocksize before setting the vector type",v->map->n,bs); PetscValidLogicalCollectiveInt(v,bs,2); - v->map->bs = bs; + if (v->map->refcnt > 0) { + PetscLayout map = PETSC_NULL; + ierr = PetscLayoutCopy(v->map,&map);CHKERRQ(ierr); + ierr = PetscLayoutDestroy(&v->map);CHKERRQ(ierr); + v->map = map; + } + if (v->map->bmapping) { + ierr = ISLocalToGlobalMappingDestroy(&v->map->bmapping);CHKERRQ(ierr); + } + v->map->bs = bs; v->bstash.bs = bs; /* use the same blocksize for the vec's block-stash */ PetscFunctionReturn(0); }