xref: /petsc/src/dm/tutorials/swarm_ex1.c (revision c8025a5415d73fd1c6005393f2b0e60677bf5915)
1c4762a1bSJed Brown static char help[] = "Tests DMSwarm\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdm.h>
4c4762a1bSJed Brown #include <petscdmda.h>
5c4762a1bSJed Brown #include <petscdmswarm.h>
6c4762a1bSJed Brown 
7c4762a1bSJed Brown PETSC_EXTERN PetscErrorCode DMSwarmCollect_General(DM, PetscErrorCode (*)(DM, void *, PetscInt *, PetscInt **), size_t, void *, PetscInt *);
8c4762a1bSJed Brown PETSC_EXTERN PetscErrorCode DMSwarmCollect_DMDABoundingBox(DM, PetscInt *);
9c4762a1bSJed Brown 
10d71ae5a4SJacob Faibussowitsch PetscErrorCode ex1_1(void)
11d71ae5a4SJacob Faibussowitsch {
12c4762a1bSJed Brown   DM          dms;
13c4762a1bSJed Brown   Vec         x;
14c4762a1bSJed Brown   PetscMPIInt rank, size;
15c4762a1bSJed Brown   PetscInt    p;
16c4762a1bSJed Brown 
17362febeeSStefano Zampini   PetscFunctionBegin;
189566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
199566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
20d5b43468SJose E. Roman   PetscCheck(!(size > 1) || !(size != 4), PETSC_COMM_WORLD, PETSC_ERR_SUP, "Must be run with 4 MPI ranks");
21c4762a1bSJed Brown 
229566063dSJacob Faibussowitsch   PetscCall(DMCreate(PETSC_COMM_WORLD, &dms));
239566063dSJacob Faibussowitsch   PetscCall(DMSetType(dms, DMSWARM));
246a5217c0SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)dms, "Particles"));
25c4762a1bSJed Brown 
269566063dSJacob Faibussowitsch   PetscCall(DMSwarmInitializeFieldRegister(dms));
279566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "viscosity", 1, PETSC_REAL));
289566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "strain", 1, PETSC_REAL));
299566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(dms));
309566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(dms, 5 + rank, 4));
319566063dSJacob Faibussowitsch   PetscCall(DMView(dms, PETSC_VIEWER_STDOUT_WORLD));
32c4762a1bSJed Brown 
33c4762a1bSJed Brown   {
34c4762a1bSJed Brown     PetscReal *array;
359566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "viscosity", NULL, NULL, (void **)&array));
36ad540459SPierre Jolivet     for (p = 0; p < 5 + rank; p++) array[p] = 11.1 + p * 0.1 + rank * 100.0;
379566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "viscosity", NULL, NULL, (void **)&array));
38c4762a1bSJed Brown   }
39c4762a1bSJed Brown 
40c4762a1bSJed Brown   {
41c4762a1bSJed Brown     PetscReal *array;
429566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "strain", NULL, NULL, (void **)&array));
43ad540459SPierre Jolivet     for (p = 0; p < 5 + rank; p++) array[p] = 2.0e-2 + p * 0.001 + rank * 1.0;
449566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "strain", NULL, NULL, (void **)&array));
45c4762a1bSJed Brown   }
46c4762a1bSJed Brown 
479566063dSJacob Faibussowitsch   PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "viscosity", &x));
489566063dSJacob Faibussowitsch   PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "viscosity", &x));
49c4762a1bSJed Brown 
509566063dSJacob Faibussowitsch   PetscCall(DMSwarmVectorDefineField(dms, "strain"));
519566063dSJacob Faibussowitsch   PetscCall(DMCreateGlobalVector(dms, &x));
529566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&x));
53c4762a1bSJed Brown 
54c4762a1bSJed Brown   {
55c4762a1bSJed Brown     PetscInt *rankval;
56c4762a1bSJed Brown     PetscInt  npoints[2], npoints_orig[2];
57c4762a1bSJed Brown 
589566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints_orig[0]));
599566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints_orig[1]));
609566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "DMSwarm_rank", NULL, NULL, (void **)&rankval));
61c4762a1bSJed Brown     if ((rank == 0) && (size > 1)) {
62c4762a1bSJed Brown       rankval[0] = 1;
63c4762a1bSJed Brown       rankval[3] = 1;
64c4762a1bSJed Brown     }
65ad540459SPierre Jolivet     if (rank == 3) rankval[2] = 1;
669566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "DMSwarm_rank", NULL, NULL, (void **)&rankval));
679566063dSJacob Faibussowitsch     PetscCall(DMSwarmMigrate(dms, PETSC_TRUE));
689566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints[0]));
699566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints[1]));
709566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
7163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] before(%" PetscInt_FMT ",%" PetscInt_FMT ") after(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints_orig[0], npoints_orig[1], npoints[0], npoints[1]));
729566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
739566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
74c4762a1bSJed Brown   }
75c4762a1bSJed Brown   {
769566063dSJacob Faibussowitsch     PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "viscosity", &x));
779566063dSJacob Faibussowitsch     PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
789566063dSJacob Faibussowitsch     PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "viscosity", &x));
79c4762a1bSJed Brown   }
80c4762a1bSJed Brown   {
819566063dSJacob Faibussowitsch     PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "strain", &x));
829566063dSJacob Faibussowitsch     PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
839566063dSJacob Faibussowitsch     PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "strain", &x));
84c4762a1bSJed Brown   }
85c4762a1bSJed Brown 
869566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dms));
873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
88c4762a1bSJed Brown }
89c4762a1bSJed Brown 
90d71ae5a4SJacob Faibussowitsch PetscErrorCode ex1_2(void)
91d71ae5a4SJacob Faibussowitsch {
92c4762a1bSJed Brown   DM          dms;
93c4762a1bSJed Brown   Vec         x;
94c4762a1bSJed Brown   PetscMPIInt rank, size;
95c4762a1bSJed Brown   PetscInt    p;
96c4762a1bSJed Brown 
97362febeeSStefano Zampini   PetscFunctionBegin;
989566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
999566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1009566063dSJacob Faibussowitsch   PetscCall(DMCreate(PETSC_COMM_WORLD, &dms));
1019566063dSJacob Faibussowitsch   PetscCall(DMSetType(dms, DMSWARM));
1026a5217c0SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)dms, "Particles"));
1039566063dSJacob Faibussowitsch   PetscCall(DMSwarmInitializeFieldRegister(dms));
104c4762a1bSJed Brown 
1059566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "viscosity", 1, PETSC_REAL));
1069566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "strain", 1, PETSC_REAL));
1079566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(dms));
1089566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(dms, 5 + rank, 4));
1099566063dSJacob Faibussowitsch   PetscCall(DMView(dms, PETSC_VIEWER_STDOUT_WORLD));
110c4762a1bSJed Brown   {
111c4762a1bSJed Brown     PetscReal *array;
1129566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "viscosity", NULL, NULL, (void **)&array));
113ad540459SPierre Jolivet     for (p = 0; p < 5 + rank; p++) array[p] = 11.1 + p * 0.1 + rank * 100.0;
1149566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "viscosity", NULL, NULL, (void **)&array));
115c4762a1bSJed Brown   }
116c4762a1bSJed Brown   {
117c4762a1bSJed Brown     PetscReal *array;
1189566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "strain", NULL, NULL, (void **)&array));
119ad540459SPierre Jolivet     for (p = 0; p < 5 + rank; p++) array[p] = 2.0e-2 + p * 0.001 + rank * 1.0;
1209566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "strain", NULL, NULL, (void **)&array));
121c4762a1bSJed Brown   }
122c4762a1bSJed Brown   {
123c4762a1bSJed Brown     PetscInt *rankval;
124c4762a1bSJed Brown     PetscInt  npoints[2], npoints_orig[2];
125c4762a1bSJed Brown 
1269566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints_orig[0]));
1279566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints_orig[1]));
1289566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
12963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] before(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints_orig[0], npoints_orig[1]));
1309566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
1319566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
132c4762a1bSJed Brown 
1339566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "DMSwarm_rank", NULL, NULL, (void **)&rankval));
134c4762a1bSJed Brown 
135ad540459SPierre Jolivet     if (rank == 1) rankval[0] = -1;
136ad540459SPierre Jolivet     if (rank == 2) rankval[1] = -1;
137c4762a1bSJed Brown     if (rank == 3) {
138c4762a1bSJed Brown       rankval[3] = -1;
139c4762a1bSJed Brown       rankval[4] = -1;
140c4762a1bSJed Brown     }
1419566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "DMSwarm_rank", NULL, NULL, (void **)&rankval));
1429566063dSJacob Faibussowitsch     PetscCall(DMSwarmCollectViewCreate(dms));
1439566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints[0]));
1449566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints[1]));
1459566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
14663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] after(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints[0], npoints[1]));
1479566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
1489566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
149c4762a1bSJed Brown 
1509566063dSJacob Faibussowitsch     PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "viscosity", &x));
1519566063dSJacob Faibussowitsch     PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
1529566063dSJacob Faibussowitsch     PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "viscosity", &x));
153c4762a1bSJed Brown 
1549566063dSJacob Faibussowitsch     PetscCall(DMSwarmCollectViewDestroy(dms));
1559566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints[0]));
1569566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints[1]));
1579566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
15863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] after_v(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints[0], npoints[1]));
1599566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
1609566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
161c4762a1bSJed Brown 
1629566063dSJacob Faibussowitsch     PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "viscosity", &x));
1639566063dSJacob Faibussowitsch     PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
1649566063dSJacob Faibussowitsch     PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "viscosity", &x));
165c4762a1bSJed Brown   }
1669566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dms));
1673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
168c4762a1bSJed Brown }
169c4762a1bSJed Brown 
170c4762a1bSJed Brown /*
171c4762a1bSJed Brown  splot "c-rank0.gp","c-rank1.gp","c-rank2.gp","c-rank3.gp"
172c4762a1bSJed Brown */
173d71ae5a4SJacob Faibussowitsch PetscErrorCode ex1_3(void)
174d71ae5a4SJacob Faibussowitsch {
175c4762a1bSJed Brown   DM          dms;
176c4762a1bSJed Brown   PetscMPIInt rank, size;
177c4762a1bSJed Brown   PetscInt    is, js, ni, nj, overlap;
178c4762a1bSJed Brown   DM          dmcell;
179c4762a1bSJed Brown 
180362febeeSStefano Zampini   PetscFunctionBegin;
1819566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
1829566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
183c4762a1bSJed Brown   overlap = 2;
1849566063dSJacob Faibussowitsch   PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, 13, 13, PETSC_DECIDE, PETSC_DECIDE, 1, overlap, NULL, NULL, &dmcell));
1859566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(dmcell));
1869566063dSJacob Faibussowitsch   PetscCall(DMSetUp(dmcell));
1879566063dSJacob Faibussowitsch   PetscCall(DMDASetUniformCoordinates(dmcell, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0));
1889566063dSJacob Faibussowitsch   PetscCall(DMDAGetCorners(dmcell, &is, &js, NULL, &ni, &nj, NULL));
1899566063dSJacob Faibussowitsch   PetscCall(DMCreate(PETSC_COMM_WORLD, &dms));
1909566063dSJacob Faibussowitsch   PetscCall(DMSetType(dms, DMSWARM));
1916a5217c0SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)dms, "Particles"));
1929566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetCellDM(dms, dmcell));
193c4762a1bSJed Brown 
194c4762a1bSJed Brown   /* load in data types */
1959566063dSJacob Faibussowitsch   PetscCall(DMSwarmInitializeFieldRegister(dms));
1969566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "viscosity", 1, PETSC_REAL));
1979566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "coorx", 1, PETSC_REAL));
1989566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "coory", 1, PETSC_REAL));
1999566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(dms));
2009566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(dms, ni * nj * 4, 4));
2019566063dSJacob Faibussowitsch   PetscCall(DMView(dms, PETSC_VIEWER_STDOUT_WORLD));
202c4762a1bSJed Brown 
203c4762a1bSJed Brown   /* set values within the swarm */
204c4762a1bSJed Brown   {
205c4762a1bSJed Brown     PetscReal   *array_x, *array_y;
206c4762a1bSJed Brown     PetscInt     npoints, i, j, cnt;
207c4762a1bSJed Brown     DMDACoor2d **LA_coor;
208c4762a1bSJed Brown     Vec          coor;
209c4762a1bSJed Brown     DM           dmcellcdm;
210c4762a1bSJed Brown 
2119566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinateDM(dmcell, &dmcellcdm));
2129566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinates(dmcell, &coor));
2139566063dSJacob Faibussowitsch     PetscCall(DMDAVecGetArray(dmcellcdm, coor, &LA_coor));
2149566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints));
2159566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coorx", NULL, NULL, (void **)&array_x));
2169566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coory", NULL, NULL, (void **)&array_y));
217c4762a1bSJed Brown     cnt = 0;
218c4762a1bSJed Brown     for (j = js; j < js + nj; j++) {
219c4762a1bSJed Brown       for (i = is; i < is + ni; i++) {
220c4762a1bSJed Brown         PetscReal xp, yp;
221c4762a1bSJed Brown         xp                   = PetscRealPart(LA_coor[j][i].x);
222c4762a1bSJed Brown         yp                   = PetscRealPart(LA_coor[j][i].y);
2239371c9d4SSatish Balay         array_x[4 * cnt + 0] = xp - 0.05;
224ad540459SPierre Jolivet         if (array_x[4 * cnt + 0] < -1.0) array_x[4 * cnt + 0] = -1.0 + 1.0e-12;
2259371c9d4SSatish Balay         array_x[4 * cnt + 1] = xp + 0.05;
226ad540459SPierre Jolivet         if (array_x[4 * cnt + 1] > 1.0) array_x[4 * cnt + 1] = 1.0 - 1.0e-12;
2279371c9d4SSatish Balay         array_x[4 * cnt + 2] = xp - 0.05;
228ad540459SPierre Jolivet         if (array_x[4 * cnt + 2] < -1.0) array_x[4 * cnt + 2] = -1.0 + 1.0e-12;
2299371c9d4SSatish Balay         array_x[4 * cnt + 3] = xp + 0.05;
230ad540459SPierre Jolivet         if (array_x[4 * cnt + 3] > 1.0) array_x[4 * cnt + 3] = 1.0 - 1.0e-12;
231c4762a1bSJed Brown 
2329371c9d4SSatish Balay         array_y[4 * cnt + 0] = yp - 0.05;
233ad540459SPierre Jolivet         if (array_y[4 * cnt + 0] < -1.0) array_y[4 * cnt + 0] = -1.0 + 1.0e-12;
2349371c9d4SSatish Balay         array_y[4 * cnt + 1] = yp - 0.05;
235ad540459SPierre Jolivet         if (array_y[4 * cnt + 1] < -1.0) array_y[4 * cnt + 1] = -1.0 + 1.0e-12;
2369371c9d4SSatish Balay         array_y[4 * cnt + 2] = yp + 0.05;
237ad540459SPierre Jolivet         if (array_y[4 * cnt + 2] > 1.0) array_y[4 * cnt + 2] = 1.0 - 1.0e-12;
2389371c9d4SSatish Balay         array_y[4 * cnt + 3] = yp + 0.05;
239ad540459SPierre Jolivet         if (array_y[4 * cnt + 3] > 1.0) array_y[4 * cnt + 3] = 1.0 - 1.0e-12;
240c4762a1bSJed Brown         cnt++;
241c4762a1bSJed Brown       }
242c4762a1bSJed Brown     }
2439566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coory", NULL, NULL, (void **)&array_y));
2449566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coorx", NULL, NULL, (void **)&array_x));
2459566063dSJacob Faibussowitsch     PetscCall(DMDAVecRestoreArray(dmcellcdm, coor, &LA_coor));
246c4762a1bSJed Brown   }
247c4762a1bSJed Brown   {
248c4762a1bSJed Brown     PetscInt npoints[2], npoints_orig[2], ng;
249c4762a1bSJed Brown 
2509566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints_orig[0]));
2519566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints_orig[1]));
2529566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
25363a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] before(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints_orig[0], npoints_orig[1]));
2549566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
2559566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
2569566063dSJacob Faibussowitsch     PetscCall(DMSwarmCollect_DMDABoundingBox(dms, &ng));
257c4762a1bSJed Brown 
2589566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints[0]));
2599566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints[1]));
2609566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
26163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] after(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints[0], npoints[1]));
2629566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
2639566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
264c4762a1bSJed Brown   }
265c4762a1bSJed Brown   {
266c4762a1bSJed Brown     PetscReal *array_x, *array_y;
267c4762a1bSJed Brown     PetscInt   npoints, p;
268c4762a1bSJed Brown     FILE      *fp = NULL;
269c4762a1bSJed Brown     char       name[PETSC_MAX_PATH_LEN];
270c4762a1bSJed Brown 
2719566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(name, PETSC_MAX_PATH_LEN - 1, "c-rank%d.gp", rank));
272c4762a1bSJed Brown     fp = fopen(name, "w");
27328b400f6SJacob Faibussowitsch     PetscCheck(fp, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Cannot open file %s", name);
2749566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints));
2759566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coorx", NULL, NULL, (void **)&array_x));
2769566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coory", NULL, NULL, (void **)&array_y));
277ad540459SPierre Jolivet     for (p = 0; p < npoints; p++) fprintf(fp, "%+1.4e %+1.4e %1.4e\n", array_x[p], array_y[p], (double)rank);
2789566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coory", NULL, NULL, (void **)&array_y));
2799566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coorx", NULL, NULL, (void **)&array_x));
280c4762a1bSJed Brown     fclose(fp);
281c4762a1bSJed Brown   }
2829566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dmcell));
2839566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dms));
2843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
285c4762a1bSJed Brown }
286c4762a1bSJed Brown 
287c4762a1bSJed Brown typedef struct {
288c4762a1bSJed Brown   PetscReal cx[2];
289c4762a1bSJed Brown   PetscReal radius;
290c4762a1bSJed Brown } CollectZoneCtx;
291c4762a1bSJed Brown 
292d71ae5a4SJacob Faibussowitsch PetscErrorCode collect_zone(DM dm, void *ctx, PetscInt *nfound, PetscInt **foundlist)
293d71ae5a4SJacob Faibussowitsch {
294c4762a1bSJed Brown   CollectZoneCtx *zone = (CollectZoneCtx *)ctx;
295c4762a1bSJed Brown   PetscInt        p, npoints;
296c4762a1bSJed Brown   PetscReal      *array_x, *array_y, r2;
297c4762a1bSJed Brown   PetscInt        p2collect, *plist;
298c4762a1bSJed Brown   PetscMPIInt     rank;
299c4762a1bSJed Brown 
300362febeeSStefano Zampini   PetscFunctionBegin;
3019566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
3029566063dSJacob Faibussowitsch   PetscCall(DMSwarmGetLocalSize(dm, &npoints));
3039566063dSJacob Faibussowitsch   PetscCall(DMSwarmGetField(dm, "coorx", NULL, NULL, (void **)&array_x));
3049566063dSJacob Faibussowitsch   PetscCall(DMSwarmGetField(dm, "coory", NULL, NULL, (void **)&array_y));
305c4762a1bSJed Brown 
306c4762a1bSJed Brown   r2        = zone->radius * zone->radius;
307c4762a1bSJed Brown   p2collect = 0;
308c4762a1bSJed Brown   for (p = 0; p < npoints; p++) {
309c4762a1bSJed Brown     PetscReal sep2;
310c4762a1bSJed Brown 
311c4762a1bSJed Brown     sep2 = (array_x[p] - zone->cx[0]) * (array_x[p] - zone->cx[0]);
312c4762a1bSJed Brown     sep2 += (array_y[p] - zone->cx[1]) * (array_y[p] - zone->cx[1]);
313ad540459SPierre Jolivet     if (sep2 < r2) p2collect++;
314c4762a1bSJed Brown   }
315c4762a1bSJed Brown 
3169566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(p2collect + 1, &plist));
317c4762a1bSJed Brown   p2collect = 0;
318c4762a1bSJed Brown   for (p = 0; p < npoints; p++) {
319c4762a1bSJed Brown     PetscReal sep2;
320c4762a1bSJed Brown 
321c4762a1bSJed Brown     sep2 = (array_x[p] - zone->cx[0]) * (array_x[p] - zone->cx[0]);
322c4762a1bSJed Brown     sep2 += (array_y[p] - zone->cx[1]) * (array_y[p] - zone->cx[1]);
323c4762a1bSJed Brown     if (sep2 < r2) {
324c4762a1bSJed Brown       plist[p2collect] = p;
325c4762a1bSJed Brown       p2collect++;
326c4762a1bSJed Brown     }
327c4762a1bSJed Brown   }
3289566063dSJacob Faibussowitsch   PetscCall(DMSwarmRestoreField(dm, "coory", NULL, NULL, (void **)&array_y));
3299566063dSJacob Faibussowitsch   PetscCall(DMSwarmRestoreField(dm, "coorx", NULL, NULL, (void **)&array_x));
330c4762a1bSJed Brown 
331c4762a1bSJed Brown   *nfound    = p2collect;
332c4762a1bSJed Brown   *foundlist = plist;
3333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
334c4762a1bSJed Brown }
335c4762a1bSJed Brown 
336d71ae5a4SJacob Faibussowitsch PetscErrorCode ex1_4(void)
337d71ae5a4SJacob Faibussowitsch {
338c4762a1bSJed Brown   DM              dms;
339c4762a1bSJed Brown   PetscMPIInt     rank, size;
340c4762a1bSJed Brown   PetscInt        is, js, ni, nj, overlap, nn;
341c4762a1bSJed Brown   DM              dmcell;
342c4762a1bSJed Brown   CollectZoneCtx *zone;
343c4762a1bSJed Brown   PetscReal       dx;
344c4762a1bSJed Brown 
345362febeeSStefano Zampini   PetscFunctionBegin;
3469566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
3479566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
348c4762a1bSJed Brown   nn      = 101;
349c4762a1bSJed Brown   dx      = 2.0 / (PetscReal)(nn - 1);
350c4762a1bSJed Brown   overlap = 0;
3519566063dSJacob Faibussowitsch   PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, nn, nn, PETSC_DECIDE, PETSC_DECIDE, 1, overlap, NULL, NULL, &dmcell));
3529566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(dmcell));
3539566063dSJacob Faibussowitsch   PetscCall(DMSetUp(dmcell));
3549566063dSJacob Faibussowitsch   PetscCall(DMDASetUniformCoordinates(dmcell, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0));
3559566063dSJacob Faibussowitsch   PetscCall(DMDAGetCorners(dmcell, &is, &js, NULL, &ni, &nj, NULL));
3569566063dSJacob Faibussowitsch   PetscCall(DMCreate(PETSC_COMM_WORLD, &dms));
3579566063dSJacob Faibussowitsch   PetscCall(DMSetType(dms, DMSWARM));
3586a5217c0SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)dms, "Particles"));
359c4762a1bSJed Brown 
360c4762a1bSJed Brown   /* load in data types */
3619566063dSJacob Faibussowitsch   PetscCall(DMSwarmInitializeFieldRegister(dms));
3629566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "viscosity", 1, PETSC_REAL));
3639566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "coorx", 1, PETSC_REAL));
3649566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "coory", 1, PETSC_REAL));
3659566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(dms));
3669566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(dms, ni * nj * 4, 4));
3679566063dSJacob Faibussowitsch   PetscCall(DMView(dms, PETSC_VIEWER_STDOUT_WORLD));
368c4762a1bSJed Brown 
369c4762a1bSJed Brown   /* set values within the swarm */
370c4762a1bSJed Brown   {
371c4762a1bSJed Brown     PetscReal   *array_x, *array_y;
372c4762a1bSJed Brown     PetscInt     npoints, i, j, cnt;
373c4762a1bSJed Brown     DMDACoor2d **LA_coor;
374c4762a1bSJed Brown     Vec          coor;
375c4762a1bSJed Brown     DM           dmcellcdm;
376c4762a1bSJed Brown 
3779566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinateDM(dmcell, &dmcellcdm));
3789566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinates(dmcell, &coor));
3799566063dSJacob Faibussowitsch     PetscCall(DMDAVecGetArray(dmcellcdm, coor, &LA_coor));
3809566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints));
3819566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coorx", NULL, NULL, (void **)&array_x));
3829566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coory", NULL, NULL, (void **)&array_y));
383c4762a1bSJed Brown     cnt = 0;
384c4762a1bSJed Brown     for (j = js; j < js + nj; j++) {
385c4762a1bSJed Brown       for (i = is; i < is + ni; i++) {
386c4762a1bSJed Brown         PetscReal xp, yp;
387c4762a1bSJed Brown 
388c4762a1bSJed Brown         xp                   = PetscRealPart(LA_coor[j][i].x);
389c4762a1bSJed Brown         yp                   = PetscRealPart(LA_coor[j][i].y);
390ad540459SPierre Jolivet         array_x[4 * cnt + 0] = xp - dx * 0.1; /*if (array_x[4*cnt+0] < -1.0) array_x[4*cnt+0] = -1.0+1.0e-12;*/
391c4762a1bSJed Brown         array_x[4 * cnt + 1] = xp + dx * 0.1; /*if (array_x[4*cnt+1] > 1.0)  { array_x[4*cnt+1] =  1.0-1.0e-12; }*/
392ad540459SPierre Jolivet         array_x[4 * cnt + 2] = xp - dx * 0.1; /*if (array_x[4*cnt+2] < -1.0) array_x[4*cnt+2] = -1.0+1.0e-12;*/
393c4762a1bSJed Brown         array_x[4 * cnt + 3] = xp + dx * 0.1; /*if (array_x[4*cnt+3] > 1.0)  { array_x[4*cnt+3] =  1.0-1.0e-12; }*/
394ad540459SPierre Jolivet         array_y[4 * cnt + 0] = yp - dx * 0.1; /*if (array_y[4*cnt+0] < -1.0) array_y[4*cnt+0] = -1.0+1.0e-12;*/
395ad540459SPierre Jolivet         array_y[4 * cnt + 1] = yp - dx * 0.1; /*if (array_y[4*cnt+1] < -1.0) array_y[4*cnt+1] = -1.0+1.0e-12;*/
396c4762a1bSJed Brown         array_y[4 * cnt + 2] = yp + dx * 0.1; /*if (array_y[4*cnt+2] > 1.0)  { array_y[4*cnt+2] =  1.0-1.0e-12; }*/
397c4762a1bSJed Brown         array_y[4 * cnt + 3] = yp + dx * 0.1; /*if (array_y[4*cnt+3] > 1.0)  { array_y[4*cnt+3] =  1.0-1.0e-12; }*/
398c4762a1bSJed Brown         cnt++;
399c4762a1bSJed Brown       }
400c4762a1bSJed Brown     }
4019566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coory", NULL, NULL, (void **)&array_y));
4029566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coorx", NULL, NULL, (void **)&array_x));
4039566063dSJacob Faibussowitsch     PetscCall(DMDAVecRestoreArray(dmcellcdm, coor, &LA_coor));
404c4762a1bSJed Brown   }
4059566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(1, &zone));
406c4762a1bSJed Brown   if (size == 4) {
407c4762a1bSJed Brown     if (rank == 0) {
408c4762a1bSJed Brown       zone->cx[0]  = 0.5;
409c4762a1bSJed Brown       zone->cx[1]  = 0.5;
410c4762a1bSJed Brown       zone->radius = 0.3;
411c4762a1bSJed Brown     }
412c4762a1bSJed Brown     if (rank == 1) {
413c4762a1bSJed Brown       zone->cx[0]  = -0.5;
414c4762a1bSJed Brown       zone->cx[1]  = 0.5;
415c4762a1bSJed Brown       zone->radius = 0.25;
416c4762a1bSJed Brown     }
417c4762a1bSJed Brown     if (rank == 2) {
418c4762a1bSJed Brown       zone->cx[0]  = 0.5;
419c4762a1bSJed Brown       zone->cx[1]  = -0.5;
420c4762a1bSJed Brown       zone->radius = 0.2;
421c4762a1bSJed Brown     }
422c4762a1bSJed Brown     if (rank == 3) {
423c4762a1bSJed Brown       zone->cx[0]  = -0.5;
424c4762a1bSJed Brown       zone->cx[1]  = -0.5;
425c4762a1bSJed Brown       zone->radius = 0.1;
426c4762a1bSJed Brown     }
427c4762a1bSJed Brown   } else {
428c4762a1bSJed Brown     if (rank == 0) {
429c4762a1bSJed Brown       zone->cx[0]  = 0.5;
430c4762a1bSJed Brown       zone->cx[1]  = 0.5;
431c4762a1bSJed Brown       zone->radius = 0.8;
432c4762a1bSJed Brown     } else {
433c4762a1bSJed Brown       zone->cx[0]  = 10.0;
434c4762a1bSJed Brown       zone->cx[1]  = 10.0;
435c4762a1bSJed Brown       zone->radius = 0.0;
436c4762a1bSJed Brown     }
437c4762a1bSJed Brown   }
438c4762a1bSJed Brown   {
439c4762a1bSJed Brown     PetscInt npoints[2], npoints_orig[2], ng;
440c4762a1bSJed Brown 
4419566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints_orig[0]));
4429566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints_orig[1]));
4439566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
44463a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] before(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints_orig[0], npoints_orig[1]));
4459566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
4469566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
4479566063dSJacob Faibussowitsch     PetscCall(DMSwarmCollect_General(dms, collect_zone, sizeof(CollectZoneCtx), zone, &ng));
4489566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints[0]));
4499566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetSize(dms, &npoints[1]));
4509566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
45163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "rank[%d] after(%" PetscInt_FMT ",%" PetscInt_FMT ")\n", rank, npoints[0], npoints[1]));
4529566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
4539566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
454c4762a1bSJed Brown   }
455c4762a1bSJed Brown   {
456c4762a1bSJed Brown     PetscReal *array_x, *array_y;
457c4762a1bSJed Brown     PetscInt   npoints, p;
458c4762a1bSJed Brown     FILE      *fp = NULL;
459c4762a1bSJed Brown     char       name[PETSC_MAX_PATH_LEN];
460c4762a1bSJed Brown 
4619566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(name, PETSC_MAX_PATH_LEN - 1, "c-rank%d.gp", rank));
462c4762a1bSJed Brown     fp = fopen(name, "w");
46328b400f6SJacob Faibussowitsch     PetscCheck(fp, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Cannot open file %s", name);
4649566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetLocalSize(dms, &npoints));
4659566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coorx", NULL, NULL, (void **)&array_x));
4669566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dms, "coory", NULL, NULL, (void **)&array_y));
467ad540459SPierre Jolivet     for (p = 0; p < npoints; p++) fprintf(fp, "%+1.4e %+1.4e %1.4e\n", array_x[p], array_y[p], (double)rank);
4689566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coory", NULL, NULL, (void **)&array_y));
4699566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dms, "coorx", NULL, NULL, (void **)&array_x));
470c4762a1bSJed Brown     fclose(fp);
471c4762a1bSJed Brown   }
4729566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dmcell));
4739566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dms));
4749566063dSJacob Faibussowitsch   PetscCall(PetscFree(zone));
4753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
476c4762a1bSJed Brown }
477c4762a1bSJed Brown 
478d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
479d71ae5a4SJacob Faibussowitsch {
480c4762a1bSJed Brown   PetscInt test_mode = 4;
481c4762a1bSJed Brown 
482327415f7SBarry Smith   PetscFunctionBeginUser;
483*c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
4849566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-test_mode", &test_mode, NULL));
485c4762a1bSJed Brown   if (test_mode == 1) {
4869566063dSJacob Faibussowitsch     PetscCall(ex1_1());
487c4762a1bSJed Brown   } else if (test_mode == 2) {
4889566063dSJacob Faibussowitsch     PetscCall(ex1_2());
489c4762a1bSJed Brown   } else if (test_mode == 3) {
4909566063dSJacob Faibussowitsch     PetscCall(ex1_3());
491c4762a1bSJed Brown   } else if (test_mode == 4) {
4929566063dSJacob Faibussowitsch     PetscCall(ex1_4());
493c4762a1bSJed Brown   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_USER, "Unknown test_mode value, should be 1,2,3,4");
4949566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
495b122ec5aSJacob Faibussowitsch   return 0;
496c4762a1bSJed Brown }
497c4762a1bSJed Brown 
498c4762a1bSJed Brown /*TEST
499c4762a1bSJed Brown 
500c4762a1bSJed Brown    build:
501c4762a1bSJed Brown       requires: !complex double
502c4762a1bSJed Brown 
503c4762a1bSJed Brown    test:
504c4762a1bSJed Brown       args: -test_mode 1
505c4762a1bSJed Brown       filter: grep -v atomic
506c4762a1bSJed Brown       filter_output: grep -v atomic
507c4762a1bSJed Brown 
508c4762a1bSJed Brown    test:
509c4762a1bSJed Brown       suffix: 2
510c4762a1bSJed Brown       args: -test_mode 2
511c4762a1bSJed Brown       filter: grep -v atomic
512c4762a1bSJed Brown       filter_output: grep -v atomic
513c4762a1bSJed Brown 
514c4762a1bSJed Brown    test:
515c4762a1bSJed Brown       suffix: 3
516c4762a1bSJed Brown       args: -test_mode 3
517c4762a1bSJed Brown       filter: grep -v atomic
518c4762a1bSJed Brown       filter_output: grep -v atomic
519c4762a1bSJed Brown       TODO: broken
520c4762a1bSJed Brown 
521c4762a1bSJed Brown    test:
522c4762a1bSJed Brown       suffix: 4
523c4762a1bSJed Brown       args: -test_mode 4
524c4762a1bSJed Brown       filter: grep -v atomic
525c4762a1bSJed Brown       filter_output: grep -v atomic
526c4762a1bSJed Brown 
527c4762a1bSJed Brown    test:
528c4762a1bSJed Brown       suffix: 5
529c4762a1bSJed Brown       nsize: 4
530c4762a1bSJed Brown       args: -test_mode 1
531c4762a1bSJed Brown       filter: grep -v atomic
532c4762a1bSJed Brown       filter_output: grep -v atomic
533c4762a1bSJed Brown 
534c4762a1bSJed Brown    test:
535c4762a1bSJed Brown       suffix: 6
536c4762a1bSJed Brown       nsize: 4
537c4762a1bSJed Brown       args: -test_mode 2
538c4762a1bSJed Brown       filter: grep -v atomic
539c4762a1bSJed Brown       filter_output: grep -v atomic
540c4762a1bSJed Brown 
541c4762a1bSJed Brown    test:
542c4762a1bSJed Brown       suffix: 7
543c4762a1bSJed Brown       nsize: 4
544c4762a1bSJed Brown       args: -test_mode 3
545c4762a1bSJed Brown       filter: grep -v atomic
546c4762a1bSJed Brown       filter_output: grep -v atomic
547c4762a1bSJed Brown       TODO: broken
548c4762a1bSJed Brown 
549c4762a1bSJed Brown    test:
550c4762a1bSJed Brown       suffix: 8
551c4762a1bSJed Brown       nsize: 4
552c4762a1bSJed Brown       args: -test_mode 4
553c4762a1bSJed Brown       filter: grep -v atomic
554c4762a1bSJed Brown       filter_output: grep -v atomic
555c4762a1bSJed Brown 
556c4762a1bSJed Brown TEST*/
557