static char help[]= "Test PetscSFFetchAndOp on patterned SF graphs. PetscSFFetchAndOp internally uses PetscSFBcastAndOp \n\ and PetscSFReduce. So it is a good test to see if they all work for patterned graphs.\n\ Run with ./prog -op [replace | sum]\n\n"; #include #include int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt i,N=10,low,high,nleaves; PetscMPIInt size,rank; Vec x,y,y2,gy2; PetscScalar *rootdata,*leafdata,*leafupdate; PetscLayout layout; PetscSF gathersf,allgathersf,alltoallsf; MPI_Op op=MPI_SUM; char opname[64]; const char *mpiopname; PetscBool flag,isreplace,issum; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); ierr = PetscOptionsGetString(NULL,NULL,"-op",opname,sizeof(opname),&flag);CHKERRQ(ierr); ierr = PetscStrcmp(opname,"replace",&isreplace);CHKERRQ(ierr); ierr = PetscStrcmp(opname,"sum",&issum);CHKERRQ(ierr); if (isreplace) {op = MPI_REPLACE; mpiopname = "MPI_REPLACE";} else if (issum) {op = MPIU_SUM; mpiopname = "MPI_SUM";} else SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,"Unsupported argument (%s) to -op, which must be 'replace' or 'sum'",opname); ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,N);CHKERRQ(ierr); /*-------------------------------------*/ /* PETSCSF_PATTERN_GATHER */ /*-------------------------------------*/ /* set MPI vec x to [1, 2, .., N] */ ierr = VecGetOwnershipRange(x,&low,&high);CHKERRQ(ierr); for (i=low; i