diff -r dbf7f6332ca8 include/private/vecimpl.h --- a/include/private/vecimpl.h Wed Jun 30 09:22:41 2010 -0500 +++ b/include/private/vecimpl.h Wed Jul 07 19:14:26 2010 +0200 @@ -104,6 +104,7 @@ PetscErrorCode (*pointwisemaxabs)(Vec,Vec,Vec); PetscErrorCode (*pointwisemin)(Vec,Vec,Vec); PetscErrorCode (*getvalues)(Vec,PetscInt,const PetscInt[],PetscScalar[]); + PetscErrorCode (*dotnorm2)(Vec,Vec,PetscScalar*,PetscScalar*); PetscErrorCode (*sqrt)(Vec); PetscErrorCode (*abs)(Vec); PetscErrorCode (*exp)(Vec); diff -r dbf7f6332ca8 src/vec/vec/utils/vinv.c --- a/src/vec/vec/utils/vinv.c Wed Jun 30 09:22:41 2010 -0500 +++ b/src/vec/vec/utils/vinv.c Wed Jul 07 19:14:26 2010 +0200 @@ -1205,25 +1205,36 @@ PetscFunctionBegin; PetscValidHeaderSpecific(s, VEC_COOKIE,1); PetscValidHeaderSpecific(t, VEC_COOKIE,2); + PetscValidScalarPointer(dp,3); + PetscValidScalarPointer(nm,4); + PetscValidType(s,1); + PetscValidType(t,2); + PetscCheckSameTypeAndComm(s,1,t,2); + if (s->map->N != t->map->N) SETERRQ(PETSC_ERR_ARG_INCOMP,"Incompatible vector global lengths"); + if (s->map->n != t->map->n) SETERRQ(PETSC_ERR_ARG_INCOMP,"Incompatible vector local lengths"); ierr = PetscLogEventBarrierBegin(VEC_DotNormBarrier,s,t,0,0,((PetscObject)s)->comm);CHKERRQ(ierr); - ierr = VecGetLocalSize(s, &n);CHKERRQ(ierr); - ierr = VecGetArray(s, &sx);CHKERRQ(ierr); - ierr = VecGetArray(t, &tx);CHKERRQ(ierr); - - for (i = 0; iops->dotnorm2) { + ierr = (*s->ops->dotnorm2)(s,t,dp,nm);CHKERRQ(ierr); + } else { + ierr = VecGetLocalSize(s, &n);CHKERRQ(ierr); + ierr = VecGetArray(s, &sx);CHKERRQ(ierr); + ierr = VecGetArray(t, &tx);CHKERRQ(ierr); + + for (i = 0; icomm);CHKERRQ(ierr); + *dp = sum[0]; + *nm = sum[1]; + + ierr = VecRestoreArray(t, &tx);CHKERRQ(ierr); + ierr = VecRestoreArray(s, &sx);CHKERRQ(ierr); + ierr = PetscLogFlops(4.0*n);CHKERRQ(ierr); } - work[0] = dpx; - work[1] = nmx; - ierr = MPI_Allreduce(&work,&sum,2,MPIU_SCALAR,MPIU_SUM,((PetscObject)s)->comm);CHKERRQ(ierr); - *dp = sum[0]; - *nm = sum[1]; - - ierr = VecRestoreArray(t, &tx);CHKERRQ(ierr); - ierr = VecRestoreArray(s, &sx);CHKERRQ(ierr); - ierr = PetscLogFlops(4.0*n);CHKERRQ(ierr); ierr = PetscLogEventBarrierEnd(VEC_DotNormBarrier,s,t,0,0,((PetscObject)s)->comm);CHKERRQ(ierr); PetscFunctionReturn(0); }