EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "VecMax_MPI" PetscErrorCode VecMax_MPI(Vec xin,PetscInt *idx,PetscReal *z) { PetscErrorCode ierr; PetscReal work; PetscFunctionBegin; /* Find the local max */ ierr = VecMax_Seq(xin,idx,&work);CHKERRQ(ierr); /* Find the global max */ if (!idx) { ierr = MPI_Allreduce(&work,z,1,MPIU_REAL,MPIU_MAX,((PetscObject)xin)->comm);CHKERRQ(ierr); } else { PetscReal work2[2],z2[2]; PetscInt rstart; rstart = xin->map->rstart; work2[0] = work; work2[1] = *idx + rstart; ierr = MPI_Allreduce(work2,z2,2,MPIU_REAL,VecMax_Local_Op,((PetscObject)xin)->comm);CHKERRQ(ierr); *z = z2[0]; *idx = (PetscInt)z2[1]; } PetscFunctionReturn(0); }
PetscErrorCode VecMax_MPI(Vec xin,PetscInt *idx,PetscReal *z) { PetscErrorCode ierr; PetscReal work; PetscFunctionBegin; /* Find the local max */ ierr = VecMax_Seq(xin,idx,&work);CHKERRQ(ierr); /* Find the global max */ if (!idx) { ierr = MPIU_Allreduce(&work,z,1,MPIU_REAL,MPIU_MAX,PetscObjectComm((PetscObject)xin));CHKERRQ(ierr); } else { PetscReal work2[2],z2[2]; PetscInt rstart; rstart = xin->map->rstart; work2[0] = work; work2[1] = *idx + rstart; ierr = MPIU_Allreduce(work2,z2,2,MPIU_REAL,MPIU_MAXINDEX_OP,PetscObjectComm((PetscObject)xin));CHKERRQ(ierr); *z = z2[0]; *idx = (PetscInt)z2[1]; } PetscFunctionReturn(0); }