1*c4762a1bSJed Brown static const char help[] = "Test star forest communication (PetscSF)\n\n"; 2*c4762a1bSJed Brown 3*c4762a1bSJed Brown /*T 4*c4762a1bSJed Brown Description: This example creates empty star forests to test the API. 5*c4762a1bSJed Brown T*/ 6*c4762a1bSJed Brown 7*c4762a1bSJed Brown #include <petscsf.h> 8*c4762a1bSJed Brown #include <petsc/private/sfimpl.h> 9*c4762a1bSJed Brown 10*c4762a1bSJed Brown static PetscErrorCode CheckGraphNotSet(PetscSF sf) 11*c4762a1bSJed Brown { 12*c4762a1bSJed Brown PetscInt nroots,nleaves; 13*c4762a1bSJed Brown const PetscInt *ilocal; 14*c4762a1bSJed Brown const PetscSFNode *iremote; 15*c4762a1bSJed Brown PetscErrorCode ierr; 16*c4762a1bSJed Brown 17*c4762a1bSJed Brown PetscFunctionBegin; 18*c4762a1bSJed Brown if (sf->graphset) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set"); 19*c4762a1bSJed Brown ierr = PetscSFGetGraph(sf,&nroots,&nleaves,&ilocal,&iremote);CHKERRQ(ierr); 20*c4762a1bSJed Brown if (nroots >= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set"); 21*c4762a1bSJed Brown if (nleaves >= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set"); 22*c4762a1bSJed Brown if (ilocal) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set"); 23*c4762a1bSJed Brown if (iremote) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set"); 24*c4762a1bSJed Brown if (sf->minleaf != PETSC_MAX_INT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF minimum leaf is not PETSC_MAX_INT"); 25*c4762a1bSJed Brown if (sf->maxleaf != PETSC_MIN_INT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF minimum leaf is not PETSC_MIN_INT"); 26*c4762a1bSJed Brown PetscFunctionReturn(0); 27*c4762a1bSJed Brown } 28*c4762a1bSJed Brown 29*c4762a1bSJed Brown static PetscErrorCode CheckGraphEmpty(PetscSF sf) 30*c4762a1bSJed Brown { 31*c4762a1bSJed Brown PetscInt nroots,nleaves; 32*c4762a1bSJed Brown const PetscInt *ilocal; 33*c4762a1bSJed Brown const PetscSFNode *iremote; 34*c4762a1bSJed Brown PetscInt minleaf,maxleaf; 35*c4762a1bSJed Brown PetscErrorCode ierr; 36*c4762a1bSJed Brown 37*c4762a1bSJed Brown PetscFunctionBegin; 38*c4762a1bSJed Brown ierr = PetscSFGetGraph(sf,&nroots,&nleaves,&ilocal,&iremote);CHKERRQ(ierr); 39*c4762a1bSJed Brown if (nroots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty"); 40*c4762a1bSJed Brown if (nleaves) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty"); 41*c4762a1bSJed Brown if (ilocal) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty"); 42*c4762a1bSJed Brown if (iremote) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty"); 43*c4762a1bSJed Brown ierr = PetscSFGetLeafRange(sf,&minleaf,&maxleaf);CHKERRQ(ierr); 44*c4762a1bSJed Brown if (minleaf != 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF minimum leaf is not 0"); 45*c4762a1bSJed Brown if (maxleaf != -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF maximum leaf is not -1"); 46*c4762a1bSJed Brown PetscFunctionReturn(0); 47*c4762a1bSJed Brown } 48*c4762a1bSJed Brown 49*c4762a1bSJed Brown static PetscErrorCode CheckRanksNotSet(PetscSF sf) 50*c4762a1bSJed Brown { 51*c4762a1bSJed Brown PetscFunctionBegin; 52*c4762a1bSJed Brown if (sf->nranks != -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF ranks are set"); 53*c4762a1bSJed Brown if (sf->ranks != NULL) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF ranks are set"); 54*c4762a1bSJed Brown PetscFunctionReturn(0); 55*c4762a1bSJed Brown } 56*c4762a1bSJed Brown 57*c4762a1bSJed Brown static PetscErrorCode CheckRanksEmpty(PetscSF sf) 58*c4762a1bSJed Brown { 59*c4762a1bSJed Brown PetscFunctionBegin; 60*c4762a1bSJed Brown if (sf->nranks != 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF ranks not empty"); 61*c4762a1bSJed Brown PetscFunctionReturn(0); 62*c4762a1bSJed Brown } 63*c4762a1bSJed Brown 64*c4762a1bSJed Brown int main(int argc,char **argv) 65*c4762a1bSJed Brown { 66*c4762a1bSJed Brown PetscSF sf,sfDup,sfInv,sfEmbed,sfA,sfB,sfBA; 67*c4762a1bSJed Brown const PetscInt *degree; 68*c4762a1bSJed Brown PetscErrorCode ierr; 69*c4762a1bSJed Brown char sftype[64] = PETSCSFBASIC; 70*c4762a1bSJed Brown 71*c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 72*c4762a1bSJed Brown ierr = PetscOptionsGetString(NULL,NULL,"-user_sf_type",sftype,sizeof(sftype),NULL);CHKERRQ(ierr); 73*c4762a1bSJed Brown 74*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 75*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 76*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 77*c4762a1bSJed Brown 78*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 79*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 80*c4762a1bSJed Brown ierr = PetscSFReset(sf);CHKERRQ(ierr); 81*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 82*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 83*c4762a1bSJed Brown 84*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 85*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 86*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 87*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 88*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 89*c4762a1bSJed Brown 90*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 91*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 92*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 93*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 94*c4762a1bSJed Brown ierr = PetscSFReset(sf);CHKERRQ(ierr); 95*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 96*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 97*c4762a1bSJed Brown 98*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 99*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 100*c4762a1bSJed Brown ierr = CheckGraphEmpty(sf);CHKERRQ(ierr); 101*c4762a1bSJed Brown ierr = PetscSFReset(sf);CHKERRQ(ierr); 102*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 103*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 104*c4762a1bSJed Brown 105*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 106*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 107*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 108*c4762a1bSJed Brown ierr = CheckGraphEmpty(sf);CHKERRQ(ierr); 109*c4762a1bSJed Brown ierr = PetscSFReset(sf);CHKERRQ(ierr); 110*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 111*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 112*c4762a1bSJed Brown 113*c4762a1bSJed Brown /* Test setup */ 114*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 115*c4762a1bSJed Brown ierr = CheckRanksNotSet(sf);CHKERRQ(ierr); 116*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 117*c4762a1bSJed Brown ierr = CheckRanksNotSet(sf);CHKERRQ(ierr); 118*c4762a1bSJed Brown ierr = PetscSFSetUp(sf);CHKERRQ(ierr); 119*c4762a1bSJed Brown ierr = CheckRanksEmpty(sf);CHKERRQ(ierr); 120*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 121*c4762a1bSJed Brown 122*c4762a1bSJed Brown /* Test setup then reset */ 123*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 124*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 125*c4762a1bSJed Brown ierr = PetscSFSetUp(sf);CHKERRQ(ierr); 126*c4762a1bSJed Brown ierr = PetscSFReset(sf);CHKERRQ(ierr); 127*c4762a1bSJed Brown ierr = CheckRanksNotSet(sf);CHKERRQ(ierr); 128*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 129*c4762a1bSJed Brown 130*c4762a1bSJed Brown /* Test view (no graph set, no type set) */ 131*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 132*c4762a1bSJed Brown ierr = PetscSFView(sf,NULL);CHKERRQ(ierr); 133*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 134*c4762a1bSJed Brown 135*c4762a1bSJed Brown /* Test set graph then view (no type set) */ 136*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 137*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 138*c4762a1bSJed Brown ierr = PetscSFView(sf,NULL);CHKERRQ(ierr); 139*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 140*c4762a1bSJed Brown 141*c4762a1bSJed Brown /* Test set type then view (no graph set) */ 142*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 143*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 144*c4762a1bSJed Brown ierr = PetscSFView(sf,NULL);CHKERRQ(ierr); 145*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 146*c4762a1bSJed Brown 147*c4762a1bSJed Brown /* Test set type then graph then view */ 148*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 149*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 150*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 151*c4762a1bSJed Brown ierr = PetscSFView(sf,NULL);CHKERRQ(ierr); 152*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 153*c4762a1bSJed Brown 154*c4762a1bSJed Brown /* Test set graph then type */ 155*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 156*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 157*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 158*c4762a1bSJed Brown ierr = CheckGraphEmpty(sf);CHKERRQ(ierr); 159*c4762a1bSJed Brown ierr = PetscSFReset(sf);CHKERRQ(ierr); 160*c4762a1bSJed Brown ierr = CheckGraphNotSet(sf);CHKERRQ(ierr); 161*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 162*c4762a1bSJed Brown 163*c4762a1bSJed Brown /* Test Bcast (we call setfromoptions) */ 164*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 165*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 166*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 167*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 168*c4762a1bSJed Brown ierr = PetscSFBcastBegin(sf,MPI_INT,NULL,NULL);CHKERRQ(ierr); 169*c4762a1bSJed Brown ierr = PetscSFBcastEnd (sf,MPI_INT,NULL,NULL);CHKERRQ(ierr); 170*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 171*c4762a1bSJed Brown 172*c4762a1bSJed Brown /* From now on we also call SetFromOptions */ 173*c4762a1bSJed Brown 174*c4762a1bSJed Brown /* Test Reduce */ 175*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 176*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 177*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 178*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 179*c4762a1bSJed Brown ierr = PetscSFReduceBegin(sf,MPI_INT,NULL,NULL,MPIU_REPLACE);CHKERRQ(ierr); 180*c4762a1bSJed Brown ierr = PetscSFReduceEnd (sf,MPI_INT,NULL,NULL,MPIU_REPLACE);CHKERRQ(ierr); 181*c4762a1bSJed Brown ierr = PetscSFReduceBegin(sf,MPI_INT,NULL,NULL,MPI_SUM);CHKERRQ(ierr); 182*c4762a1bSJed Brown ierr = PetscSFReduceEnd (sf,MPI_INT,NULL,NULL,MPI_SUM);CHKERRQ(ierr); 183*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 184*c4762a1bSJed Brown 185*c4762a1bSJed Brown /* Test FetchAndOp */ 186*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 187*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 188*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 189*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 190*c4762a1bSJed Brown ierr = PetscSFFetchAndOpBegin(sf,MPI_INT,NULL,NULL,NULL,MPI_SUM);CHKERRQ(ierr); 191*c4762a1bSJed Brown ierr = PetscSFFetchAndOpEnd (sf,MPI_INT,NULL,NULL,NULL,MPI_SUM);CHKERRQ(ierr); 192*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 193*c4762a1bSJed Brown 194*c4762a1bSJed Brown /* Test ComputeDegree */ 195*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 196*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 197*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES);CHKERRQ(ierr); 198*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 199*c4762a1bSJed Brown ierr = PetscSFComputeDegreeBegin(sf,°ree);CHKERRQ(ierr); 200*c4762a1bSJed Brown ierr = PetscSFComputeDegreeEnd(sf,°ree);CHKERRQ(ierr); 201*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 202*c4762a1bSJed Brown 203*c4762a1bSJed Brown /* Test PetscSFDuplicate() */ 204*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 205*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 206*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER);CHKERRQ(ierr); 207*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 208*c4762a1bSJed Brown ierr = PetscSFDuplicate(sf,PETSCSF_DUPLICATE_GRAPH,&sfDup);CHKERRQ(ierr); 209*c4762a1bSJed Brown ierr = CheckGraphEmpty(sfDup);CHKERRQ(ierr); 210*c4762a1bSJed Brown ierr = PetscSFDestroy(&sfDup);CHKERRQ(ierr); 211*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 212*c4762a1bSJed Brown 213*c4762a1bSJed Brown /* Test PetscSFCreateInverseSF() */ 214*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 215*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 216*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER);CHKERRQ(ierr); 217*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 218*c4762a1bSJed Brown ierr = PetscSFCreateInverseSF(sf,&sfInv);CHKERRQ(ierr); 219*c4762a1bSJed Brown ierr = CheckGraphEmpty(sfInv);CHKERRQ(ierr); 220*c4762a1bSJed Brown ierr = PetscSFDestroy(&sfInv);CHKERRQ(ierr); 221*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 222*c4762a1bSJed Brown 223*c4762a1bSJed Brown /* Test PetscSFCreateEmbeddedSF() */ 224*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 225*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 226*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER);CHKERRQ(ierr); 227*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 228*c4762a1bSJed Brown ierr = PetscSFCreateEmbeddedSF(sf,0,NULL,&sfEmbed);CHKERRQ(ierr); 229*c4762a1bSJed Brown ierr = CheckGraphEmpty(sfEmbed);CHKERRQ(ierr); 230*c4762a1bSJed Brown ierr = PetscSFDestroy(&sfEmbed);CHKERRQ(ierr); 231*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 232*c4762a1bSJed Brown 233*c4762a1bSJed Brown /* Test PetscSFCreateEmbeddedLeafSF() */ 234*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sf);CHKERRQ(ierr); 235*c4762a1bSJed Brown ierr = PetscSFSetType(sf,sftype);CHKERRQ(ierr); 236*c4762a1bSJed Brown ierr = PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER);CHKERRQ(ierr); 237*c4762a1bSJed Brown ierr = PetscSFSetFromOptions(sf);CHKERRQ(ierr); 238*c4762a1bSJed Brown ierr = PetscSFCreateEmbeddedLeafSF(sf,0,NULL,&sfEmbed);CHKERRQ(ierr); 239*c4762a1bSJed Brown ierr = CheckGraphEmpty(sfEmbed);CHKERRQ(ierr); 240*c4762a1bSJed Brown ierr = PetscSFDestroy(&sfEmbed);CHKERRQ(ierr); 241*c4762a1bSJed Brown ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 242*c4762a1bSJed Brown 243*c4762a1bSJed Brown /* Test PetscSFCompose() */ 244*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sfA);CHKERRQ(ierr); 245*c4762a1bSJed Brown ierr = PetscSFSetType(sfA,sftype);CHKERRQ(ierr); 246*c4762a1bSJed Brown ierr = PetscSFSetGraph(sfA,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER);CHKERRQ(ierr); 247*c4762a1bSJed Brown ierr = PetscSFCreate(PETSC_COMM_WORLD,&sfB);CHKERRQ(ierr); 248*c4762a1bSJed Brown ierr = PetscSFSetType(sfB,sftype);CHKERRQ(ierr); 249*c4762a1bSJed Brown ierr = PetscSFSetGraph(sfB,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER);CHKERRQ(ierr); 250*c4762a1bSJed Brown ierr = PetscSFCompose(sfA,sfB,&sfBA);CHKERRQ(ierr); 251*c4762a1bSJed Brown ierr = CheckGraphEmpty(sfBA);CHKERRQ(ierr); 252*c4762a1bSJed Brown ierr = PetscSFDestroy(&sfBA);CHKERRQ(ierr); 253*c4762a1bSJed Brown ierr = PetscSFDestroy(&sfA);CHKERRQ(ierr); 254*c4762a1bSJed Brown ierr = PetscSFDestroy(&sfB);CHKERRQ(ierr); 255*c4762a1bSJed Brown 256*c4762a1bSJed Brown ierr = PetscFinalize(); 257*c4762a1bSJed Brown return ierr; 258*c4762a1bSJed Brown } 259*c4762a1bSJed Brown 260*c4762a1bSJed Brown /*TEST 261*c4762a1bSJed Brown 262*c4762a1bSJed Brown test: 263*c4762a1bSJed Brown suffix: basic_1 264*c4762a1bSJed Brown nsize: 1 265*c4762a1bSJed Brown 266*c4762a1bSJed Brown test: 267*c4762a1bSJed Brown suffix: basic_2 268*c4762a1bSJed Brown nsize: 2 269*c4762a1bSJed Brown 270*c4762a1bSJed Brown test: 271*c4762a1bSJed Brown suffix: basic_3 272*c4762a1bSJed Brown nsize: 3 273*c4762a1bSJed Brown 274*c4762a1bSJed Brown test: 275*c4762a1bSJed Brown suffix: window 276*c4762a1bSJed Brown args: -user_sf_type window -sf_type window -sf_window_flavor {{create dynamic allocate}} -sf_window_sync {{fence active lock}} 277*c4762a1bSJed Brown nsize: {{1 2 3}separate output} 278*c4762a1bSJed Brown requires: define(PETSC_HAVE_MPI_ONE_SIDED) 279*c4762a1bSJed Brown 280*c4762a1bSJed Brown # The nightly test suite with MPICH uses ch3:sock, which is broken when winsize == 0 in some of the processes 281*c4762a1bSJed Brown test: 282*c4762a1bSJed Brown suffix: window_shared 283*c4762a1bSJed Brown args: -user_sf_type window -sf_type window -sf_window_flavor shared -sf_window_sync {{fence active lock}} 284*c4762a1bSJed Brown nsize: {{1 2 3}separate output} 285*c4762a1bSJed Brown requires: define(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY) !define(PETSC_HAVE_MPICH_NUMVERSION) define(PETSC_HAVE_MPI_ONE_SIDED) 286*c4762a1bSJed Brown 287*c4762a1bSJed Brown TEST*/ 288