xref: /petsc/src/dm/impls/plex/tests/ex11.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1c4762a1bSJed Brown static char help[] = "Tests for DMLabel\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdmplex.h>
40fdc7489SMatthew Knepley #include <petsc/private/dmimpl.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown static PetscErrorCode TestInsertion()
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   DMLabel        label, label2;
9c4762a1bSJed Brown   const PetscInt values[5] = {0, 3, 4, -1, 176}, N = 10000;
10c4762a1bSJed Brown   PetscInt       i, v;
11c4762a1bSJed Brown 
12c4762a1bSJed Brown   PetscFunctionBegin;
13*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelCreate(PETSC_COMM_SELF, "Test Label", &label));
14*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelSetDefaultValue(label, -100));
15c4762a1bSJed Brown   for (i = 0; i < N; ++i) {
16*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelSetValue(label, i, values[i%5]));
17c4762a1bSJed Brown   }
18c4762a1bSJed Brown   /* Test get in hash mode */
19c4762a1bSJed Brown   for (i = 0; i < N; ++i) {
20c4762a1bSJed Brown     PetscInt val;
21c4762a1bSJed Brown 
22*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(label, i, &val));
232c71b3e2SJacob Faibussowitsch     PetscCheckFalse(val != values[i%5],PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Value %d for point %d should be %d", val, i, values[i%5]);
24c4762a1bSJed Brown   }
25c4762a1bSJed Brown   /* Test stratum */
26c4762a1bSJed Brown   for (v = 0; v < 5; ++v) {
27c4762a1bSJed Brown     IS              stratum;
28c4762a1bSJed Brown     const PetscInt *points;
29c4762a1bSJed Brown     PetscInt        n;
30c4762a1bSJed Brown 
31*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetStratumIS(label, values[v], &stratum));
322c71b3e2SJacob Faibussowitsch     PetscCheckFalse(!stratum,PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Stratum %d is empty!", v);
33*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISGetIndices(stratum, &points));
34*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISGetLocalSize(stratum, &n));
35c4762a1bSJed Brown     for (i = 0; i < n; ++i) {
362c71b3e2SJacob Faibussowitsch       PetscCheckFalse(points[i] != i*5+v,PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Point %d should be %d", points[i], i*5+v);
37c4762a1bSJed Brown     }
38*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISRestoreIndices(stratum, &points));
39*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISDestroy(&stratum));
40c4762a1bSJed Brown   }
41c4762a1bSJed Brown   /* Test get in array mode */
42c4762a1bSJed Brown   for (i = 0; i < N; ++i) {
43c4762a1bSJed Brown     PetscInt val;
44c4762a1bSJed Brown 
45*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(label, i, &val));
462c71b3e2SJacob Faibussowitsch     PetscCheckFalse(val != values[i%5],PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Value %d should be %d", val, values[i%5]);
47c4762a1bSJed Brown   }
48c4762a1bSJed Brown   /* Test Duplicate */
49*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelDuplicate(label, &label2));
50c4762a1bSJed Brown   for (i = 0; i < N; ++i) {
51c4762a1bSJed Brown     PetscInt val;
52c4762a1bSJed Brown 
53*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(label2, i, &val));
542c71b3e2SJacob Faibussowitsch     PetscCheckFalse(val != values[i%5],PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Value %d should be %d", val, values[i%5]);
55c4762a1bSJed Brown   }
56*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelDestroy(&label2));
57*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelDestroy(&label));
58c4762a1bSJed Brown   PetscFunctionReturn(0);
59c4762a1bSJed Brown }
60c4762a1bSJed Brown 
61c4762a1bSJed Brown static PetscErrorCode TestEmptyStrata(MPI_Comm comm)
62c4762a1bSJed Brown {
63c4762a1bSJed Brown   DM               dm, dmDist;
64c4762a1bSJed Brown   PetscPartitioner part;
65c4762a1bSJed Brown   PetscInt         c0[6]  = {2,3,6,7,9,11};
66c4762a1bSJed Brown   PetscInt         c1[6]  = {4,5,7,8,10,12};
67c4762a1bSJed Brown   PetscInt         c2[4]  = {13,15,19,21};
68c4762a1bSJed Brown   PetscInt         c3[4]  = {14,16,20,22};
69c4762a1bSJed Brown   PetscInt         c4[4]  = {15,17,21,23};
70c4762a1bSJed Brown   PetscInt         c5[4]  = {16,18,22,24};
71c4762a1bSJed Brown   PetscInt         c6[4]  = {13,14,19,20};
72c4762a1bSJed Brown   PetscInt         c7[4]  = {15,16,21,22};
73c4762a1bSJed Brown   PetscInt         c8[4]  = {17,18,23,24};
74c4762a1bSJed Brown   PetscInt         c9[4]  = {13,14,15,16};
75c4762a1bSJed Brown   PetscInt         c10[4] = {15,16,17,18};
76c4762a1bSJed Brown   PetscInt         c11[4] = {19,20,21,22};
77c4762a1bSJed Brown   PetscInt         c12[4] = {21,22,23,24};
78c4762a1bSJed Brown   PetscInt         dim    = 3;
79c4762a1bSJed Brown   PetscMPIInt      rank;
80c4762a1bSJed Brown 
81c4762a1bSJed Brown   PetscFunctionBegin;
82*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(comm, &rank));
83c4762a1bSJed Brown   /* A 3D box with two adjacent cells, sharing one face and four vertices */
84*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreate(comm, &dm));
85*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetType(dm, DMPLEX));
86*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetDimension(dm, dim));
87dd400576SPatrick Sanan   if (rank == 0) {
88*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetChart(dm, 0, 25));
89*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 0, 6));
90*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 1, 6));
91*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 2, 4));
92*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 3, 4));
93*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 4, 4));
94*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 5, 4));
95*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 6, 4));
96*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 7, 4));
97*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 8, 4));
98*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 9, 4));
99*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 10, 4));
100*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 11, 4));
101*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetConeSize(dm, 12, 4));
102c4762a1bSJed Brown   }
103*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetUp(dm));
104dd400576SPatrick Sanan   if (rank == 0) {
105*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 0, c0));
106*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 1, c1));
107*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 2, c2));
108*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 3, c3));
109*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 4, c4));
110*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 5, c5));
111*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 6, c6));
112*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 7, c7));
113*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 8, c8));
114*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 9, c9));
115*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 10, c10));
116*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 11, c11));
117*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetCone(dm, 12, c12));
118c4762a1bSJed Brown   }
119*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexSymmetrize(dm));
120c4762a1bSJed Brown   /* Create a user managed depth label, so that we can leave out edges */
121c4762a1bSJed Brown   {
122c4762a1bSJed Brown     DMLabel label;
123c4762a1bSJed Brown     PetscInt numValues, maxValues = 0, v;
124c4762a1bSJed Brown 
125*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreateLabel(dm, "depth"));
126*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexGetDepthLabel(dm, &label));
127dd400576SPatrick Sanan     if (rank == 0) {
128c4762a1bSJed Brown       PetscInt i;
129c4762a1bSJed Brown 
130c4762a1bSJed Brown       for (i = 0; i < 25; ++i) {
131*5f80ce2aSJacob Faibussowitsch         if (i < 2)       CHKERRQ(DMLabelSetValue(label, i, 3));
132*5f80ce2aSJacob Faibussowitsch         else if (i < 13) CHKERRQ(DMLabelSetValue(label, i, 2));
133c4762a1bSJed Brown         else             {
134*5f80ce2aSJacob Faibussowitsch           if (i==13) CHKERRQ(DMLabelAddStratum(label, 1));
135*5f80ce2aSJacob Faibussowitsch           CHKERRQ(DMLabelSetValue(label, i, 0));
136c4762a1bSJed Brown         }
137c4762a1bSJed Brown       }
138c4762a1bSJed Brown     }
139*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetNumValues(label, &numValues));
140*5f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Allreduce(&numValues, &maxValues, 1, MPIU_INT, MPI_MAX, PetscObjectComm((PetscObject) dm)));
141*5f80ce2aSJacob Faibussowitsch     for (v = numValues; v < maxValues; ++v) CHKERRQ(DMLabelAddStratum(label,v));
142c4762a1bSJed Brown   }
143c4762a1bSJed Brown   {
144c4762a1bSJed Brown     DMLabel label;
145*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexGetDepthLabel(dm, &label));
146*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelView(label, PETSC_VIEWER_STDOUT_(comm)));
147c4762a1bSJed Brown   }
148*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetPartitioner(dm,&part));
149*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPartitionerSetFromOptions(part));
150*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexDistribute(dm, 1, NULL, &dmDist));
151c4762a1bSJed Brown   if (dmDist) {
152*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMDestroy(&dm));
153c4762a1bSJed Brown     dm   = dmDist;
154c4762a1bSJed Brown   }
155c4762a1bSJed Brown   {
156c4762a1bSJed Brown     DMLabel label;
157*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexGetDepthLabel(dm, &label));
158*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelView(label, PETSC_VIEWER_STDOUT_(comm)));
159c4762a1bSJed Brown   }
160c4762a1bSJed Brown   /* Create a cell vector */
161c4762a1bSJed Brown   {
162c4762a1bSJed Brown     Vec          v;
163c4762a1bSJed Brown     PetscSection s;
164c4762a1bSJed Brown     PetscInt     numComp[] = {1};
165c4762a1bSJed Brown     PetscInt     dof[]     = {0,0,0,1};
166c4762a1bSJed Brown     PetscInt     N;
167c4762a1bSJed Brown 
168*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetNumFields(dm, 1));
169*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexCreateSection(dm, NULL, numComp, dof, 0, NULL, NULL, NULL, NULL, &s));
170*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetLocalSection(dm, s));
171*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&s));
172*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreateGlobalVector(dm, &v));
173*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetSize(v, &N));
174c4762a1bSJed Brown     if (N != 2) {
175*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMView(dm, PETSC_VIEWER_STDOUT_(comm)));
17698921bdaSJacob Faibussowitsch       SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "FAIL: Vector size %d != 2", N);
177c4762a1bSJed Brown     }
178*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecDestroy(&v));
179c4762a1bSJed Brown   }
180*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&dm));
181c4762a1bSJed Brown   PetscFunctionReturn(0);
182c4762a1bSJed Brown }
183c4762a1bSJed Brown 
184c4762a1bSJed Brown static PetscErrorCode TestDistribution(MPI_Comm comm)
185c4762a1bSJed Brown {
186c4762a1bSJed Brown   DM               dm, dmDist;
187c4762a1bSJed Brown   PetscPartitioner part;
188c4762a1bSJed Brown   DMLabel          label;
1890fdc7489SMatthew Knepley   char             filename[PETSC_MAX_PATH_LEN];
190c4762a1bSJed Brown   const char      *name    = "test label";
191c4762a1bSJed Brown   PetscInt         overlap = 0, cStart, cEnd, c;
192c4762a1bSJed Brown   PetscMPIInt      rank;
193c4762a1bSJed Brown   PetscBool        flg;
194c4762a1bSJed Brown 
195c4762a1bSJed Brown   PetscFunctionBegin;
196*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(comm, &rank));
197*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(NULL, NULL, "-filename", filename, sizeof(filename), &flg));
198c4762a1bSJed Brown   if (!flg) PetscFunctionReturn(0);
199*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL, NULL, "-overlap", &overlap, NULL));
200*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexCreateFromFile(comm, filename, "ex11_plex", PETSC_TRUE, &dm));
201*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetBasicAdjacency(dm, PETSC_TRUE, PETSC_FALSE));
202*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreateLabel(dm, name));
203*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetLabel(dm, name, &label));
204*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd));
205c4762a1bSJed Brown   for (c = cStart; c < cEnd; ++c) {
206*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelSetValue(label, c, c));
207c4762a1bSJed Brown   }
208*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelView(label, PETSC_VIEWER_STDOUT_WORLD));
209*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetPartitioner(dm,&part));
210*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPartitionerSetFromOptions(part));
211*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexDistribute(dm, overlap, NULL, &dmDist));
212c4762a1bSJed Brown   if (dmDist) {
213*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMDestroy(&dm));
214c4762a1bSJed Brown     dm   = dmDist;
215c4762a1bSJed Brown   }
216*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject) dm, "Mesh"));
217*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMViewFromOptions(dm, NULL, "-dm_view"));
218*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetLabel(dm, name, &label));
219*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelView(label, PETSC_VIEWER_STDOUT_WORLD));
220*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&dm));
221c4762a1bSJed Brown   PetscFunctionReturn(0);
222c4762a1bSJed Brown }
223c4762a1bSJed Brown 
2240fdc7489SMatthew Knepley static PetscErrorCode TestUniversalLabel(MPI_Comm comm)
2250fdc7489SMatthew Knepley {
2260fdc7489SMatthew Knepley   DM               dm1, dm2;
2270fdc7489SMatthew Knepley   DMLabel          bd1, bd2, ulabel;
2280fdc7489SMatthew Knepley   DMUniversalLabel universal;
2290fdc7489SMatthew Knepley   PetscInt         pStart, pEnd, p;
23030602db0SMatthew G. Knepley   PetscBool        run = PETSC_FALSE, notFile;
2310fdc7489SMatthew Knepley 
2320fdc7489SMatthew Knepley   PetscFunctionBeginUser;
233*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL, NULL, "-universal", &run, NULL));
2340fdc7489SMatthew Knepley   if (!run) PetscFunctionReturn(0);
23530602db0SMatthew G. Knepley 
23630602db0SMatthew G. Knepley   char filename[PETSC_MAX_PATH_LEN];
23730602db0SMatthew G. Knepley   PetscBool flg;
23830602db0SMatthew G. Knepley 
239*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(NULL, NULL, "-filename", filename, sizeof(filename), &flg));
2400fdc7489SMatthew Knepley   if (flg) {
241*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexCreateFromFile(comm, filename, "ex11_plex", PETSC_TRUE, &dm1));
2420fdc7489SMatthew Knepley   } else {
243*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreate(comm, &dm1));
244*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetType(dm1, DMPLEX));
245*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetFromOptions(dm1));
24630602db0SMatthew G. Knepley   }
247*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMHasLabel(dm1, "marker", &notFile));
24830602db0SMatthew G. Knepley   if (notFile) {
249*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreateLabel(dm1, "Boundary Faces"));
250*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm1, "Boundary Faces", &bd1));
251*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexMarkBoundaryFaces(dm1, 13, bd1));
252*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreateLabel(dm1, "Boundary"));
253*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm1, "Boundary", &bd2));
254*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexMarkBoundaryFaces(dm1, 121, bd2));
255*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexLabelComplete(dm1, bd2));
2560fdc7489SMatthew Knepley   }
257*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject) dm1, "First Mesh"));
258*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMViewFromOptions(dm1, NULL, "-dm_view"));
2590fdc7489SMatthew Knepley 
260*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMUniversalLabelCreate(dm1, &universal));
261*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMUniversalLabelGetLabel(universal, &ulabel));
262*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectViewFromOptions((PetscObject) ulabel, NULL, "-universal_view"));
2630fdc7489SMatthew Knepley 
26430602db0SMatthew G. Knepley   if (!notFile) {
2650fdc7489SMatthew Knepley     PetscInt Nl, l;
2660fdc7489SMatthew Knepley 
267*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMClone(dm1, &dm2));
268*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetNumLabels(dm2, &Nl));
2690fdc7489SMatthew Knepley     for (l = Nl-1; l >= 0; --l) {
2700fdc7489SMatthew Knepley       PetscBool   isdepth, iscelltype;
2710fdc7489SMatthew Knepley       const char *name;
2720fdc7489SMatthew Knepley 
273*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMGetLabelName(dm2, l, &name));
274*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrncmp(name, "depth", 6, &isdepth));
275*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrncmp(name, "celltype", 9, &iscelltype));
276*5f80ce2aSJacob Faibussowitsch       if (!isdepth && !iscelltype) CHKERRQ(DMRemoveLabel(dm2, name, NULL));
2770fdc7489SMatthew Knepley     }
2780fdc7489SMatthew Knepley   } else {
279*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreate(comm, &dm2));
280*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetType(dm2, DMPLEX));
281*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetFromOptions(dm2));
2820fdc7489SMatthew Knepley   }
283*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject) dm2, "Second Mesh"));
284*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMUniversalLabelCreateLabels(universal, PETSC_TRUE, dm2));
285*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetChart(dm2, &pStart, &pEnd));
2860fdc7489SMatthew Knepley   for (p = pStart; p < pEnd; ++p) {
2870fdc7489SMatthew Knepley     PetscInt val;
2880fdc7489SMatthew Knepley 
289*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(ulabel, p, &val));
2900fdc7489SMatthew Knepley     if (val < 0) continue;
291*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMUniversalLabelSetLabelValue(universal, dm2, PETSC_TRUE, p, val));
2920fdc7489SMatthew Knepley   }
293*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMViewFromOptions(dm2, NULL, "-dm_view"));
2940fdc7489SMatthew Knepley 
295*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMUniversalLabelDestroy(&universal));
296*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&dm1));
297*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&dm2));
2980fdc7489SMatthew Knepley   PetscFunctionReturn(0);
2990fdc7489SMatthew Knepley }
3000fdc7489SMatthew Knepley 
301c4762a1bSJed Brown int main(int argc, char **argv)
302c4762a1bSJed Brown {
303c4762a1bSJed Brown   PetscErrorCode ierr;
304c4762a1bSJed Brown 
305c4762a1bSJed Brown   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
306*5f80ce2aSJacob Faibussowitsch   /*CHKERRQ(ProcessOptions(PETSC_COMM_WORLD, &user));*/
307*5f80ce2aSJacob Faibussowitsch   CHKERRQ(TestInsertion());
308*5f80ce2aSJacob Faibussowitsch   CHKERRQ(TestEmptyStrata(PETSC_COMM_WORLD));
309*5f80ce2aSJacob Faibussowitsch   CHKERRQ(TestDistribution(PETSC_COMM_WORLD));
310*5f80ce2aSJacob Faibussowitsch   CHKERRQ(TestUniversalLabel(PETSC_COMM_WORLD));
311c4762a1bSJed Brown   ierr = PetscFinalize();
312c4762a1bSJed Brown   return ierr;
313c4762a1bSJed Brown }
314c4762a1bSJed Brown 
315c4762a1bSJed Brown /*TEST
316c4762a1bSJed Brown 
317c4762a1bSJed Brown   test:
318c4762a1bSJed Brown     suffix: 0
3190fdc7489SMatthew Knepley     requires: triangle
320c4762a1bSJed Brown   test:
321c4762a1bSJed Brown     suffix: 1
3220fdc7489SMatthew Knepley     requires: triangle
323c4762a1bSJed Brown     nsize: 2
324c4762a1bSJed Brown     args: -petscpartitioner_type simple
325c4762a1bSJed Brown 
326c4762a1bSJed Brown   testset:
327c4762a1bSJed Brown     suffix: gmsh
328c4762a1bSJed Brown     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.msh -petscpartitioner_type simple
329c4762a1bSJed Brown     test:
330c4762a1bSJed Brown       suffix: 1
331c4762a1bSJed Brown       nsize: 1
332c4762a1bSJed Brown     test:
333c4762a1bSJed Brown       suffix: 2
334c4762a1bSJed Brown       nsize: 2
335c4762a1bSJed Brown 
336c4762a1bSJed Brown   testset:
337c4762a1bSJed Brown     suffix: exodusii
338c4762a1bSJed Brown     requires: exodusii
339c4762a1bSJed Brown     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/2Dgrd.exo -petscpartitioner_type simple
340c4762a1bSJed Brown     test:
341c4762a1bSJed Brown       suffix: 1
342c4762a1bSJed Brown       nsize: 1
343c4762a1bSJed Brown     test:
344c4762a1bSJed Brown       suffix: 2
345c4762a1bSJed Brown       nsize: 2
346c4762a1bSJed Brown 
3470fdc7489SMatthew Knepley   test:
3480fdc7489SMatthew Knepley     suffix: univ
3490fdc7489SMatthew Knepley     requires: triangle
3500fdc7489SMatthew Knepley     args: -universal -dm_view -universal_view
3510fdc7489SMatthew Knepley 
3520fdc7489SMatthew Knepley   test:
3530fdc7489SMatthew Knepley     # Note that the labels differ because we have multiply-marked some points during EGADS creation
3540fdc7489SMatthew Knepley     suffix: univ_egads_sphere
3550fdc7489SMatthew Knepley     requires: egads
35630602db0SMatthew G. Knepley     args: -universal -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.egadslite -dm_view -universal_view
3570fdc7489SMatthew Knepley 
3580fdc7489SMatthew Knepley   test:
3590fdc7489SMatthew Knepley     # Note that the labels differ because we have multiply-marked some points during EGADS creation
3600fdc7489SMatthew Knepley     suffix: univ_egads_ball
3610fdc7489SMatthew Knepley     requires: egads ctetgen
36230602db0SMatthew G. Knepley     args: -universal -dm_plex_boundary_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.egadslite -dm_view -universal_view
3630fdc7489SMatthew Knepley 
364c4762a1bSJed Brown TEST*/
365