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