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
CheckGraphNotSet(PetscSF sf)6d71ae5a4SJacob Faibussowitsch static PetscErrorCode CheckGraphNotSet(PetscSF sf)
7d71ae5a4SJacob Faibussowitsch {
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");
19*1690c2aeSBarry Smith PetscCheck(sf->minleaf == PETSC_INT_MAX, PETSC_COMM_SELF, PETSC_ERR_PLIB, "SF minimum leaf is not PETSC_INT_MAX");
20*1690c2aeSBarry Smith PetscCheck(sf->maxleaf == PETSC_INT_MIN, PETSC_COMM_SELF, PETSC_ERR_PLIB, "SF minimum leaf is not PETSC_INT_MIN");
213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
22c4762a1bSJed Brown }
23c4762a1bSJed Brown
CheckGraphEmpty(PetscSF sf)24d71ae5a4SJacob Faibussowitsch static PetscErrorCode CheckGraphEmpty(PetscSF sf)
25d71ae5a4SJacob Faibussowitsch {
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");
403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
41c4762a1bSJed Brown }
42c4762a1bSJed Brown
CheckRanksNotSet(PetscSF sf)43d71ae5a4SJacob Faibussowitsch static PetscErrorCode CheckRanksNotSet(PetscSF sf)
44d71ae5a4SJacob Faibussowitsch {
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");
483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
49c4762a1bSJed Brown }
50c4762a1bSJed Brown
CheckRanksEmpty(PetscSF sf)51d71ae5a4SJacob Faibussowitsch static PetscErrorCode CheckRanksEmpty(PetscSF sf)
52d71ae5a4SJacob Faibussowitsch {
53c4762a1bSJed Brown PetscFunctionBegin;
5408401ef6SPierre Jolivet PetscCheck(sf->nranks == 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "SF ranks not empty");
553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
56c4762a1bSJed Brown }
57c4762a1bSJed Brown
main(int argc,char ** argv)58d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
59d71ae5a4SJacob Faibussowitsch {
60c4762a1bSJed Brown PetscSF sf, sfDup, sfInv, sfEmbed, sfA, sfB, sfBA;
61c4762a1bSJed Brown const PetscInt *degree;
62c4762a1bSJed Brown char sftype[64] = PETSCSFBASIC;
63c4762a1bSJed Brown
64327415f7SBarry 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, °ree));
1949566063dSJacob Faibussowitsch PetscCall(PetscSFComputeDegreeEnd(sf, °ree));
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}
279e3c15826SJunchao Zhang requires: defined(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY) !defined(PETSC_HAVE_MPICH) defined(PETSC_HAVE_MPI_ONE_SIDED) defined(PETSC_HAVE_MPI_FEATURE_DYNAMIC_WINDOW)
280c4762a1bSJed Brown
281c4762a1bSJed Brown TEST*/
282