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