xref: /petsc/src/vec/is/sf/tests/ex1.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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,&degree);CHKERRQ(ierr);
200*c4762a1bSJed Brown   ierr = PetscSFComputeDegreeEnd(sf,&degree);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