#include #include PetscErrorCode VecScan(Vec x,Vec b) { PetscErrorCode ierr; PetscInt nlocal; PetscScalar ssum; PetscMPIInt rank,size,tag; MPI_Status status; MPI_Comm comm; PetscScalar *bb; const PetscScalar *xx; PetscInt i; PetscFunctionBegin; PetscValidHeaderSpecific(x,VEC_CLASSID,1); PetscValidHeaderSpecific(b,VEC_CLASSID,2); PetscValidType(x,1); PetscValidType(b,2); PetscCheckSameTypeAndComm(x,1,b,2); VecCheckSameSize(x,1,b,1); ierr = PetscObjectGetComm((PetscObject)x,&comm);CHKERRQ(ierr); ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); ierr = PetscObjectGetNewTag((PetscObject)x,&tag);CHKERRQ(ierr); if (rank) { ierr = MPI_Recv(&ssum,1,MPIU_SCALAR,rank-1,tag,comm,&status);CHKERRQ(ierr); } else { ssum = 0; } ierr = VecGetLocalSize(x,&nlocal);CHKERRQ(ierr); ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); ierr = VecGetArray(b,&bb);CHKERRQ(ierr); for (i=0; i