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