xref: /petsc/src/vec/is/sf/tests/ex1.c (revision 327415f76d85372a4417cf1aaa14db707d4d6c04)
1c4762a1bSJed Brown static const char help[] = "Test star forest communication (PetscSF)\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscsf.h>
4c4762a1bSJed Brown #include <petsc/private/sfimpl.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown static PetscErrorCode CheckGraphNotSet(PetscSF sf)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   PetscInt          nroots,nleaves;
9c4762a1bSJed Brown   const PetscInt    *ilocal;
10c4762a1bSJed Brown   const PetscSFNode *iremote;
11c4762a1bSJed Brown 
12c4762a1bSJed Brown   PetscFunctionBegin;
1328b400f6SJacob Faibussowitsch   PetscCheck(!sf->graphset,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set");
149566063dSJacob Faibussowitsch   PetscCall(PetscSFGetGraph(sf,&nroots,&nleaves,&ilocal,&iremote));
1508401ef6SPierre Jolivet   PetscCheck(nroots  < 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set");
1608401ef6SPierre Jolivet   PetscCheck(nleaves < 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set");
1728b400f6SJacob Faibussowitsch   PetscCheck(!ilocal,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set");
1828b400f6SJacob Faibussowitsch   PetscCheck(!iremote,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is set");
1908401ef6SPierre Jolivet   PetscCheck(sf->minleaf == PETSC_MAX_INT,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF minimum leaf is not PETSC_MAX_INT");
2008401ef6SPierre Jolivet   PetscCheck(sf->maxleaf == PETSC_MIN_INT,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF minimum leaf is not PETSC_MIN_INT");
21c4762a1bSJed Brown   PetscFunctionReturn(0);
22c4762a1bSJed Brown }
23c4762a1bSJed Brown 
24c4762a1bSJed Brown static PetscErrorCode CheckGraphEmpty(PetscSF sf)
25c4762a1bSJed Brown {
26c4762a1bSJed Brown   PetscInt          nroots,nleaves;
27c4762a1bSJed Brown   const PetscInt    *ilocal;
28c4762a1bSJed Brown   const PetscSFNode *iremote;
29c4762a1bSJed Brown   PetscInt          minleaf,maxleaf;
30c4762a1bSJed Brown 
31c4762a1bSJed Brown   PetscFunctionBegin;
329566063dSJacob Faibussowitsch   PetscCall(PetscSFGetGraph(sf,&nroots,&nleaves,&ilocal,&iremote));
3328b400f6SJacob Faibussowitsch   PetscCheck(!nroots,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty");
3428b400f6SJacob Faibussowitsch   PetscCheck(!nleaves,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty");
3528b400f6SJacob Faibussowitsch   PetscCheck(!ilocal,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty");
3628b400f6SJacob Faibussowitsch   PetscCheck(!iremote,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF graph is not empty");
379566063dSJacob Faibussowitsch   PetscCall(PetscSFGetLeafRange(sf,&minleaf,&maxleaf));
3808401ef6SPierre Jolivet   PetscCheck(minleaf ==  0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF minimum leaf is not 0");
3908401ef6SPierre Jolivet   PetscCheck(maxleaf == -1,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF maximum leaf is not -1");
40c4762a1bSJed Brown   PetscFunctionReturn(0);
41c4762a1bSJed Brown }
42c4762a1bSJed Brown 
43c4762a1bSJed Brown static PetscErrorCode CheckRanksNotSet(PetscSF sf)
44c4762a1bSJed Brown {
45c4762a1bSJed Brown   PetscFunctionBegin;
4608401ef6SPierre Jolivet   PetscCheck(sf->nranks == -1,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF ranks are set");
4708401ef6SPierre Jolivet   PetscCheck(sf->ranks  == NULL,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF ranks are set");
48c4762a1bSJed Brown   PetscFunctionReturn(0);
49c4762a1bSJed Brown }
50c4762a1bSJed Brown 
51c4762a1bSJed Brown static PetscErrorCode CheckRanksEmpty(PetscSF sf)
52c4762a1bSJed Brown {
53c4762a1bSJed Brown   PetscFunctionBegin;
5408401ef6SPierre Jolivet   PetscCheck(sf->nranks == 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"SF ranks not empty");
55c4762a1bSJed Brown   PetscFunctionReturn(0);
56c4762a1bSJed Brown }
57c4762a1bSJed Brown 
58c4762a1bSJed Brown int main(int argc,char **argv)
59c4762a1bSJed Brown {
60c4762a1bSJed Brown   PetscSF        sf,sfDup,sfInv,sfEmbed,sfA,sfB,sfBA;
61c4762a1bSJed Brown   const PetscInt *degree;
62c4762a1bSJed Brown   char           sftype[64] = PETSCSFBASIC;
63c4762a1bSJed Brown 
64*327415f7SBarry Smith   PetscFunctionBeginUser;
659566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&argv,NULL,help));
669566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL,NULL,"-user_sf_type",sftype,sizeof(sftype),NULL));
67c4762a1bSJed Brown 
689566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
699566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
709566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
71c4762a1bSJed Brown 
729566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
739566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
749566063dSJacob Faibussowitsch   PetscCall(PetscSFReset(sf));
759566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
769566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
77c4762a1bSJed Brown 
789566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
799566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
809566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
819566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
829566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
83c4762a1bSJed Brown 
849566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
859566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
869566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
879566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
889566063dSJacob Faibussowitsch   PetscCall(PetscSFReset(sf));
899566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
909566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
91c4762a1bSJed Brown 
929566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
939566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
949566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sf));
959566063dSJacob Faibussowitsch   PetscCall(PetscSFReset(sf));
969566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
979566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
98c4762a1bSJed Brown 
999566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1009566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1019566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1029566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sf));
1039566063dSJacob Faibussowitsch   PetscCall(PetscSFReset(sf));
1049566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
1059566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
106c4762a1bSJed Brown 
107c4762a1bSJed Brown   /* Test setup */
1089566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1099566063dSJacob Faibussowitsch   PetscCall(CheckRanksNotSet(sf));
1109566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1119566063dSJacob Faibussowitsch   PetscCall(CheckRanksNotSet(sf));
1129566063dSJacob Faibussowitsch   PetscCall(PetscSFSetUp(sf));
1139566063dSJacob Faibussowitsch   PetscCall(CheckRanksEmpty(sf));
1149566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
115c4762a1bSJed Brown 
116c4762a1bSJed Brown   /* Test setup then reset */
1179566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1189566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1199566063dSJacob Faibussowitsch   PetscCall(PetscSFSetUp(sf));
1209566063dSJacob Faibussowitsch   PetscCall(PetscSFReset(sf));
1219566063dSJacob Faibussowitsch   PetscCall(CheckRanksNotSet(sf));
1229566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
123c4762a1bSJed Brown 
124c4762a1bSJed Brown   /* Test view (no graph set, no type set) */
1259566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1269566063dSJacob Faibussowitsch   PetscCall(PetscSFView(sf,NULL));
1279566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
128c4762a1bSJed Brown 
129c4762a1bSJed Brown   /* Test set graph then view (no type set) */
1309566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1319566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1329566063dSJacob Faibussowitsch   PetscCall(PetscSFView(sf,NULL));
1339566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
134c4762a1bSJed Brown 
135c4762a1bSJed Brown   /* Test set type then view (no graph set) */
1369566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1379566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1389566063dSJacob Faibussowitsch   PetscCall(PetscSFView(sf,NULL));
1399566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
140c4762a1bSJed Brown 
141c4762a1bSJed Brown   /* Test set type then graph then view */
1429566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1439566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1449566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1459566063dSJacob Faibussowitsch   PetscCall(PetscSFView(sf,NULL));
1469566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
147c4762a1bSJed Brown 
148c4762a1bSJed Brown   /* Test set graph then type */
1499566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1509566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1519566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1529566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sf));
1539566063dSJacob Faibussowitsch   PetscCall(PetscSFReset(sf));
1549566063dSJacob Faibussowitsch   PetscCall(CheckGraphNotSet(sf));
1559566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
156c4762a1bSJed Brown 
157c4762a1bSJed Brown   /* Test Bcast (we call setfromoptions) */
1589566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1599566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1609566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
1619566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1629566063dSJacob Faibussowitsch   PetscCall(PetscSFBcastBegin(sf,MPI_INT,NULL,NULL,MPI_REPLACE));
1639566063dSJacob Faibussowitsch   PetscCall(PetscSFBcastEnd  (sf,MPI_INT,NULL,NULL,MPI_REPLACE));
1649566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
165c4762a1bSJed Brown 
166c4762a1bSJed Brown   /* From now on we also call SetFromOptions */
167c4762a1bSJed Brown 
168c4762a1bSJed Brown   /* Test Reduce */
1699566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1709566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1719566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1729566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
1739566063dSJacob Faibussowitsch   PetscCall(PetscSFReduceBegin(sf,MPI_INT,NULL,NULL,MPI_REPLACE));
1749566063dSJacob Faibussowitsch   PetscCall(PetscSFReduceEnd  (sf,MPI_INT,NULL,NULL,MPI_REPLACE));
1759566063dSJacob Faibussowitsch   PetscCall(PetscSFReduceBegin(sf,MPI_INT,NULL,NULL,MPI_SUM));
1769566063dSJacob Faibussowitsch   PetscCall(PetscSFReduceEnd  (sf,MPI_INT,NULL,NULL,MPI_SUM));
1779566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
178c4762a1bSJed Brown 
179c4762a1bSJed Brown   /* Test FetchAndOp */
1809566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1819566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1829566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1839566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
1849566063dSJacob Faibussowitsch   PetscCall(PetscSFFetchAndOpBegin(sf,MPI_INT,NULL,NULL,NULL,MPI_SUM));
1859566063dSJacob Faibussowitsch   PetscCall(PetscSFFetchAndOpEnd  (sf,MPI_INT,NULL,NULL,NULL,MPI_SUM));
1869566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
187c4762a1bSJed Brown 
188c4762a1bSJed Brown   /* Test ComputeDegree */
1899566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1909566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
1919566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_COPY_VALUES,NULL,PETSC_COPY_VALUES));
1929566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
1939566063dSJacob Faibussowitsch   PetscCall(PetscSFComputeDegreeBegin(sf,&degree));
1949566063dSJacob Faibussowitsch   PetscCall(PetscSFComputeDegreeEnd(sf,&degree));
1959566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
196c4762a1bSJed Brown 
197c4762a1bSJed Brown   /* Test PetscSFDuplicate() */
1989566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
1999566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
2009566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER));
2019566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
2029566063dSJacob Faibussowitsch   PetscCall(PetscSFDuplicate(sf,PETSCSF_DUPLICATE_GRAPH,&sfDup));
2039566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sfDup));
2049566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sfDup));
2059566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
206c4762a1bSJed Brown 
207c4762a1bSJed Brown   /* Test PetscSFCreateInverseSF() */
2089566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
2099566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
2109566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER));
2119566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
2129566063dSJacob Faibussowitsch   PetscCall(PetscSFCreateInverseSF(sf,&sfInv));
2139566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sfInv));
2149566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sfInv));
2159566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
216c4762a1bSJed Brown 
21772502a1fSJunchao Zhang   /* Test PetscSFCreateEmbeddedRootSF() */
2189566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
2199566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
2209566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER));
2219566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
2229566063dSJacob Faibussowitsch   PetscCall(PetscSFCreateEmbeddedRootSF(sf,0,NULL,&sfEmbed));
2239566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sfEmbed));
2249566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sfEmbed));
2259566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
226c4762a1bSJed Brown 
227c4762a1bSJed Brown   /* Test PetscSFCreateEmbeddedLeafSF() */
2289566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sf));
2299566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sf,sftype));
2309566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sf,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER));
2319566063dSJacob Faibussowitsch   PetscCall(PetscSFSetFromOptions(sf));
2329566063dSJacob Faibussowitsch   PetscCall(PetscSFCreateEmbeddedLeafSF(sf,0,NULL,&sfEmbed));
2339566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sfEmbed));
2349566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sfEmbed));
2359566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
236c4762a1bSJed Brown 
237c4762a1bSJed Brown   /* Test PetscSFCompose() */
2389566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sfA));
2399566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sfA,sftype));
2409566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sfA,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER));
2419566063dSJacob Faibussowitsch   PetscCall(PetscSFCreate(PETSC_COMM_WORLD,&sfB));
2429566063dSJacob Faibussowitsch   PetscCall(PetscSFSetType(sfB,sftype));
2439566063dSJacob Faibussowitsch   PetscCall(PetscSFSetGraph(sfB,0,0,NULL,PETSC_USE_POINTER,NULL,PETSC_USE_POINTER));
2449566063dSJacob Faibussowitsch   PetscCall(PetscSFCompose(sfA,sfB,&sfBA));
2459566063dSJacob Faibussowitsch   PetscCall(CheckGraphEmpty(sfBA));
2469566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sfBA));
2479566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sfA));
2489566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sfB));
249c4762a1bSJed Brown 
2509566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
251b122ec5aSJacob Faibussowitsch   return 0;
252c4762a1bSJed Brown }
253c4762a1bSJed Brown 
254c4762a1bSJed Brown /*TEST
255c4762a1bSJed Brown 
256c4762a1bSJed Brown    test:
257c4762a1bSJed Brown       suffix: basic_1
258c4762a1bSJed Brown       nsize: 1
259c4762a1bSJed Brown 
260c4762a1bSJed Brown    test:
261c4762a1bSJed Brown       suffix: basic_2
262c4762a1bSJed Brown       nsize: 2
263c4762a1bSJed Brown 
264c4762a1bSJed Brown    test:
265c4762a1bSJed Brown       suffix: basic_3
266c4762a1bSJed Brown       nsize: 3
267c4762a1bSJed Brown 
268c4762a1bSJed Brown    test:
269c4762a1bSJed Brown       suffix: window
270c4762a1bSJed Brown       args: -user_sf_type window -sf_type window -sf_window_flavor {{create dynamic allocate}} -sf_window_sync {{fence active lock}}
271c4762a1bSJed Brown       nsize: {{1 2 3}separate output}
272dfd57a17SPierre Jolivet       requires: defined(PETSC_HAVE_MPI_ONE_SIDED) defined(PETSC_HAVE_MPI_FEATURE_DYNAMIC_WINDOW)
273c4762a1bSJed Brown 
274c4762a1bSJed Brown    # The nightly test suite with MPICH uses ch3:sock, which is broken when winsize == 0 in some of the processes
275c4762a1bSJed Brown    test:
276c4762a1bSJed Brown       suffix: window_shared
277c4762a1bSJed Brown       args: -user_sf_type window -sf_type window -sf_window_flavor shared -sf_window_sync {{fence active lock}}
278c4762a1bSJed Brown       nsize: {{1 2 3}separate output}
279dfd57a17SPierre 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)
280c4762a1bSJed Brown 
281c4762a1bSJed Brown TEST*/
282