xref: /petsc/src/dm/impls/plex/tests/ex37.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
1*c4762a1bSJed Brown static const char help[] = "Test of EGADSLite CAD functionality";
2*c4762a1bSJed Brown 
3*c4762a1bSJed Brown #include <petscdmplex.h>
4*c4762a1bSJed Brown 
5*c4762a1bSJed Brown #include <egads.h>
6*c4762a1bSJed Brown #include <petsc.h>
7*c4762a1bSJed Brown 
8*c4762a1bSJed Brown typedef struct {
9*c4762a1bSJed Brown   char filename[PETSC_MAX_PATH_LEN];
10*c4762a1bSJed Brown } AppCtx;
11*c4762a1bSJed Brown 
12*c4762a1bSJed Brown static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
13*c4762a1bSJed Brown {
14*c4762a1bSJed Brown   PetscErrorCode ierr;
15*c4762a1bSJed Brown 
16*c4762a1bSJed Brown   PetscFunctionBeginUser;
17*c4762a1bSJed Brown   options->filename[0] = '\0';
18*c4762a1bSJed Brown 
19*c4762a1bSJed Brown   ierr = PetscOptionsBegin(comm, "", "EGADSPlex Problem Options", "EGADSLite");CHKERRQ(ierr);
20*c4762a1bSJed Brown   ierr = PetscOptionsString("-filename", "The EGADSLite file", "ex9.c", options->filename, options->filename, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr);
21*c4762a1bSJed Brown   ierr = PetscOptionsEnd();
22*c4762a1bSJed Brown   PetscFunctionReturn(0);
23*c4762a1bSJed Brown }
24*c4762a1bSJed Brown 
25*c4762a1bSJed Brown int main(int argc, char *argv[])
26*c4762a1bSJed Brown {
27*c4762a1bSJed Brown   DMLabel        bodyLabel, faceLabel, edgeLabel;
28*c4762a1bSJed Brown   PetscInt       cStart, cEnd, c;
29*c4762a1bSJed Brown   /* EGADSLite variables */
30*c4762a1bSJed Brown   ego            context, model, geom, *bodies, *objs, *nobjs, *mobjs, *lobjs;
31*c4762a1bSJed Brown   int            oclass, mtype, nbodies, *senses;
32*c4762a1bSJed Brown   int            b;
33*c4762a1bSJed Brown   /* PETSc variables */
34*c4762a1bSJed Brown   DM             dm;
35*c4762a1bSJed Brown   PetscInt       dim = -1, cdim = -1, numCorners = 0, numVertices = 0, numCells = 0;
36*c4762a1bSJed Brown   PetscInt      *cells  = NULL;
37*c4762a1bSJed Brown   PetscReal     *coords = NULL;
38*c4762a1bSJed Brown   MPI_Comm       comm;
39*c4762a1bSJed Brown   PetscMPIInt    rank;
40*c4762a1bSJed Brown   AppCtx         ctx;
41*c4762a1bSJed Brown   PetscErrorCode ierr;
42*c4762a1bSJed Brown 
43*c4762a1bSJed Brown   ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr;
44*c4762a1bSJed Brown   comm = PETSC_COMM_WORLD;
45*c4762a1bSJed Brown   ierr = ProcessOptions(comm, &ctx);CHKERRQ(ierr);
46*c4762a1bSJed Brown   ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
47*c4762a1bSJed Brown   if (!rank) {
48*c4762a1bSJed Brown     /* Open EGADs file and load EGADs model data */
49*c4762a1bSJed Brown     ierr = EG_open(&context);CHKERRQ(ierr);
50*c4762a1bSJed Brown     ierr = EG_loadModel(context, 0, ctx.filename, &model);CHKERRQ(ierr);
51*c4762a1bSJed Brown 
52*c4762a1bSJed Brown     /* test bodyTopo functions */
53*c4762a1bSJed Brown     ierr = EG_getTopology(model, &geom, &oclass, &mtype, NULL, &nbodies, &bodies, &senses);CHKERRQ(ierr);
54*c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_SELF, " Number of BODIES (nbodies): %d \n", nbodies);CHKERRQ(ierr);
55*c4762a1bSJed Brown 
56*c4762a1bSJed Brown     for (b = 0; b < nbodies; ++b) {
57*c4762a1bSJed Brown       ego body = bodies[b];
58*c4762a1bSJed Brown       int id, Nsh, Nf, Nl, l, Ne, e, Nv, v;
59*c4762a1bSJed Brown 
60*c4762a1bSJed Brown       /* Output Basic Model Topology */
61*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, SHELL, &Nsh, &objs);CHKERRQ(ierr);
62*c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_SELF, "   Number of SHELLS: %d \n", Nsh);CHKERRQ(ierr);
63*c4762a1bSJed Brown 
64*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, FACE,  &Nf, &objs);CHKERRQ(ierr);
65*c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_SELF, "   Number of FACES: %d \n", Nf);CHKERRQ(ierr);
66*c4762a1bSJed Brown 
67*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, LOOP,  &Nl, &lobjs);CHKERRQ(ierr);
68*c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_SELF, "   Number of LOOPS: %d \n", Nl);CHKERRQ(ierr);
69*c4762a1bSJed Brown 
70*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, EDGE,  &Ne, &objs);CHKERRQ(ierr);
71*c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_SELF, "   Number of EDGES: %d \n", Ne);CHKERRQ(ierr);
72*c4762a1bSJed Brown 
73*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, NODE,  &Nv, &objs);CHKERRQ(ierr);
74*c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_SELF, "   Number of NODES: %d \n", Nv);CHKERRQ(ierr);
75*c4762a1bSJed Brown 
76*c4762a1bSJed Brown       for (l = 0; l < Nl; ++l) {
77*c4762a1bSJed Brown         ego loop = lobjs[l];
78*c4762a1bSJed Brown 
79*c4762a1bSJed Brown         id   = EG_indexBodyTopo(body, loop);
80*c4762a1bSJed Brown         ierr = PetscPrintf(PETSC_COMM_SELF, "          LOOP ID: %d\n", id);CHKERRQ(ierr);
81*c4762a1bSJed Brown 
82*c4762a1bSJed Brown         /* Get EDGE info which associated with the current LOOP */
83*c4762a1bSJed Brown         ierr = EG_getTopology(loop, &geom, &oclass, &mtype, NULL, &Ne, &objs, &senses);CHKERRQ(ierr);
84*c4762a1bSJed Brown 
85*c4762a1bSJed Brown         for (e = 0; e < Ne; ++e) {
86*c4762a1bSJed Brown           ego edge = objs[e];
87*c4762a1bSJed Brown 
88*c4762a1bSJed Brown           id = EG_indexBodyTopo(body, edge);CHKERRQ(ierr);
89*c4762a1bSJed Brown           ierr = PetscPrintf(PETSC_COMM_SELF, "            EDGE ID: %d\n", id);CHKERRQ(ierr);
90*c4762a1bSJed Brown 
91*c4762a1bSJed Brown           double range[4] = {0., 0., 0., 0.};
92*c4762a1bSJed Brown           double point[3] = {0., 0., 0.};
93*c4762a1bSJed Brown           int    peri;
94*c4762a1bSJed Brown 
95*c4762a1bSJed Brown           ierr = EG_getRange(objs[e], range, &peri);
96*c4762a1bSJed Brown           ierr = PetscPrintf(PETSC_COMM_SELF, " Range = %lf, %lf, %lf, %lf \n", range[0], range[1], range[2], range[3]);
97*c4762a1bSJed Brown 
98*c4762a1bSJed Brown           /* Get NODE info which associated with the current EDGE */
99*c4762a1bSJed Brown           ierr = EG_getTopology(edge, &geom, &oclass, &mtype, NULL, &Nv, &nobjs, &senses);CHKERRQ(ierr);
100*c4762a1bSJed Brown 
101*c4762a1bSJed Brown           for (v = 0; v < Nv; ++v) {
102*c4762a1bSJed Brown             ego    vertex = nobjs[v];
103*c4762a1bSJed Brown             double limits[4];
104*c4762a1bSJed Brown             int    dummy;
105*c4762a1bSJed Brown 
106*c4762a1bSJed Brown             ierr = EG_getTopology(vertex, &geom, &oclass, &mtype, limits, &dummy, &mobjs, &senses);CHKERRQ(ierr);
107*c4762a1bSJed Brown             id   = EG_indexBodyTopo(body, vertex);
108*c4762a1bSJed Brown             ierr = PetscPrintf(PETSC_COMM_SELF, "              NODE ID: %d \n", id);CHKERRQ(ierr);
109*c4762a1bSJed Brown             ierr = PetscPrintf(PETSC_COMM_SELF, "                 (x, y, z) = (%lf, %lf, %lf) \n", limits[0], limits[1], limits[2]);
110*c4762a1bSJed Brown 
111*c4762a1bSJed Brown             point[0] = point[0] + limits[0];
112*c4762a1bSJed Brown             point[1] = point[1] + limits[1];
113*c4762a1bSJed Brown             point[2] = point[2] + limits[2];
114*c4762a1bSJed Brown           }
115*c4762a1bSJed Brown         }
116*c4762a1bSJed Brown       }
117*c4762a1bSJed Brown     }
118*c4762a1bSJed Brown 
119*c4762a1bSJed Brown     /* ---------------------------------------------------------------------------------------------------
120*c4762a1bSJed Brown     Generate Petsc Plex
121*c4762a1bSJed Brown       Get all Nodes in model, record coordinates in a correctly formatted array
122*c4762a1bSJed Brown       Cycle through bodies, cycle through loops, recorde NODE IDs in a correctly formatted array */
123*c4762a1bSJed Brown 
124*c4762a1bSJed Brown     /* Calculate cell and vertex sizes */
125*c4762a1bSJed Brown     ierr = EG_getTopology(model, &geom, &oclass, &mtype, NULL, &nbodies, &bodies, &senses);CHKERRQ(ierr);
126*c4762a1bSJed Brown     numCells    = 0;
127*c4762a1bSJed Brown     numVertices = 0;
128*c4762a1bSJed Brown     for (b = 0; b < nbodies; ++b) {
129*c4762a1bSJed Brown       ego body = bodies[b];
130*c4762a1bSJed Brown       int id, Nl, l, Nv, v;
131*c4762a1bSJed Brown 
132*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, LOOP, &Nl, &lobjs);CHKERRQ(ierr);
133*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, NODE, &Nv, &nobjs);CHKERRQ(ierr);
134*c4762a1bSJed Brown       for (l = 0; l < Nl; ++l) {
135*c4762a1bSJed Brown         ego loop = lobjs[l];
136*c4762a1bSJed Brown 
137*c4762a1bSJed Brown         id = EG_indexBodyTopo(body, loop);
138*c4762a1bSJed Brown         /* TODO: Instead of assuming contiguous ids, we could use a hash table */
139*c4762a1bSJed Brown         numCells = PetscMax(id, numCells);
140*c4762a1bSJed Brown       }
141*c4762a1bSJed Brown       for (v = 0; v < Nv; ++v) {
142*c4762a1bSJed Brown         ego vertex = nobjs[v];
143*c4762a1bSJed Brown 
144*c4762a1bSJed Brown         id = EG_indexBodyTopo(body, vertex);
145*c4762a1bSJed Brown         /* TODO: Instead of assuming contiguous ids, we could use a hash table */
146*c4762a1bSJed Brown         numVertices = PetscMax(id, numVertices);
147*c4762a1bSJed Brown       }
148*c4762a1bSJed Brown     }
149*c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_SELF, "\nPLEX Input Array Checkouts\n");CHKERRQ(ierr);
150*c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_SELF, " Total Number of Unique Cells    = %d \n", numCells);CHKERRQ(ierr);
151*c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_SELF, " Total Number of Unique Vertices = %d \n", numVertices);CHKERRQ(ierr);
152*c4762a1bSJed Brown 
153*c4762a1bSJed Brown     dim        = 2; /* Assume 3D Models :: Need to update to handle 2D Models in the future */
154*c4762a1bSJed Brown     cdim       = 3; /* Assume 3D Models :: Need to update to handle 2D Models in the future */
155*c4762a1bSJed Brown     numCorners = 3; /* TODO Check number of cell corners from EGADSLite */
156*c4762a1bSJed Brown     ierr = PetscMalloc2(numVertices*cdim, &coords, numCells*numCorners, &cells);CHKERRQ(ierr);
157*c4762a1bSJed Brown 
158*c4762a1bSJed Brown     /* Get vertex coordinates */
159*c4762a1bSJed Brown     for (b = 0; b < nbodies; ++b) {
160*c4762a1bSJed Brown       ego body = bodies[b];
161*c4762a1bSJed Brown       int id, Nv, v;
162*c4762a1bSJed Brown 
163*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, NODE, &Nv, &nobjs);CHKERRQ(ierr);
164*c4762a1bSJed Brown       for (v = 0; v < Nv; ++v) {
165*c4762a1bSJed Brown         ego    vertex = nobjs[v];
166*c4762a1bSJed Brown         double limits[4];
167*c4762a1bSJed Brown         int    dummy;
168*c4762a1bSJed Brown 
169*c4762a1bSJed Brown         ierr = EG_getTopology(vertex, &geom, &oclass, &mtype, limits, &dummy, &mobjs, &senses);CHKERRQ(ierr);
170*c4762a1bSJed Brown         id   = EG_indexBodyTopo(body, vertex);CHKERRQ(ierr);
171*c4762a1bSJed Brown         coords[(id-1)*cdim+0] = limits[0];
172*c4762a1bSJed Brown         coords[(id-1)*cdim+1] = limits[1];
173*c4762a1bSJed Brown         coords[(id-1)*cdim+2] = limits[2];
174*c4762a1bSJed Brown         ierr = PetscPrintf(PETSC_COMM_SELF, "    Node ID = %d \n", id);
175*c4762a1bSJed Brown         ierr = PetscPrintf(PETSC_COMM_SELF, "      (x,y,z) = (%lf, %lf, %lf) \n \n", coords[(id-1)*cdim+0], coords[(id-1)*cdim+1],coords[(id-1)*cdim+2]);
176*c4762a1bSJed Brown       }
177*c4762a1bSJed Brown     }
178*c4762a1bSJed Brown 
179*c4762a1bSJed Brown     /* Get cell vertices by traversing loops */
180*c4762a1bSJed Brown     for (b = 0; b < nbodies; ++b) {
181*c4762a1bSJed Brown       ego body = bodies[b];
182*c4762a1bSJed Brown       int id, Nl, l;
183*c4762a1bSJed Brown 
184*c4762a1bSJed Brown       ierr = EG_getBodyTopos(body, NULL, LOOP, &Nl, &lobjs);CHKERRQ(ierr);
185*c4762a1bSJed Brown       for (l = 0; l < Nl; ++l) {
186*c4762a1bSJed Brown         ego loop = lobjs[l];
187*c4762a1bSJed Brown         int lid, Ne, e, nc = 0, c;
188*c4762a1bSJed Brown 
189*c4762a1bSJed Brown         lid  = EG_indexBodyTopo(body, loop);CHKERRQ(ierr);
190*c4762a1bSJed Brown         ierr = PetscPrintf(PETSC_COMM_SELF, "    LOOP ID: %d \n", lid);CHKERRQ(ierr);
191*c4762a1bSJed Brown         ierr = EG_getTopology(loop, &geom, &oclass, &mtype, NULL, &Ne, &objs, &senses);CHKERRQ(ierr);
192*c4762a1bSJed Brown 
193*c4762a1bSJed Brown         for (e = 0; e < Ne; ++e) {
194*c4762a1bSJed Brown           ego edge = objs[e];
195*c4762a1bSJed Brown           int Nv, v;
196*c4762a1bSJed Brown 
197*c4762a1bSJed Brown           id   = EG_indexBodyTopo(body, edge);
198*c4762a1bSJed Brown           ierr = PetscPrintf(PETSC_COMM_SELF, "      EDGE ID: %d \n", id);CHKERRQ(ierr);
199*c4762a1bSJed Brown           if (mtype == DEGENERATE) {ierr = PetscPrintf(PETSC_COMM_SELF, "        EGDE %d is DEGENERATE \n", id);CHKERRQ(ierr);}
200*c4762a1bSJed Brown           ierr = EG_getTopology(edge, &geom, &oclass, &mtype, NULL, &Nv, &nobjs, &senses);
201*c4762a1bSJed Brown 
202*c4762a1bSJed Brown           /* Add unique vertices to cells, this handles mtype == DEGENERATE fine */
203*c4762a1bSJed Brown           for (v = 0; v < Nv; ++v) {
204*c4762a1bSJed Brown             ego vertex = nobjs[v];
205*c4762a1bSJed Brown 
206*c4762a1bSJed Brown             id = EG_indexBodyTopo(body, vertex);
207*c4762a1bSJed Brown             for (c = 0; c < nc; ++c) if (cells[(lid-1)*numCorners+c] == id-1) break;
208*c4762a1bSJed Brown             if (c == nc) cells[(lid-1)*numCorners+nc++] = id-1;
209*c4762a1bSJed Brown           }
210*c4762a1bSJed Brown         }
211*c4762a1bSJed Brown         if (nc != numCorners) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid number of cell corners %D, should be %D", nc, numCorners);
212*c4762a1bSJed Brown         ierr = PetscPrintf(PETSC_COMM_SELF, "      LOOP Corner NODEs (");
213*c4762a1bSJed Brown         for (c = 0; c < numCorners; ++c) {
214*c4762a1bSJed Brown           if (c > 0) {ierr = PetscPrintf(PETSC_COMM_SELF, ", ");}
215*c4762a1bSJed Brown           ierr = PetscPrintf(PETSC_COMM_SELF, "%D", cells[(lid-1)*numCorners+c]);
216*c4762a1bSJed Brown         }
217*c4762a1bSJed Brown         ierr = PetscPrintf(PETSC_COMM_SELF, ")\n");
218*c4762a1bSJed Brown       }
219*c4762a1bSJed Brown     }
220*c4762a1bSJed Brown   }
221*c4762a1bSJed Brown   ierr = DMPlexCreateFromCellList(PETSC_COMM_WORLD, dim, numCells, numVertices, numCorners, PETSC_TRUE, cells, cdim, coords, &dm);CHKERRQ(ierr);
222*c4762a1bSJed Brown   ierr = PetscFree2(coords, cells);CHKERRQ(ierr);
223*c4762a1bSJed Brown   {
224*c4762a1bSJed Brown     PetscContainer modelObj;
225*c4762a1bSJed Brown 
226*c4762a1bSJed Brown     ierr = PetscContainerCreate(PETSC_COMM_SELF, &modelObj);CHKERRQ(ierr);
227*c4762a1bSJed Brown     ierr = PetscContainerSetPointer(modelObj, model);CHKERRQ(ierr);
228*c4762a1bSJed Brown     ierr = PetscObjectCompose((PetscObject) dm, "EGADS Model", (PetscObject) modelObj);CHKERRQ(ierr);
229*c4762a1bSJed Brown     ierr = PetscContainerDestroy(&modelObj);CHKERRQ(ierr);
230*c4762a1bSJed Brown   }
231*c4762a1bSJed Brown   ierr = DMCreateLabel(dm, "EGADS Body ID");CHKERRQ(ierr);
232*c4762a1bSJed Brown   ierr = DMGetLabel(dm, "EGADS Body ID", &bodyLabel);CHKERRQ(ierr);
233*c4762a1bSJed Brown   ierr = DMCreateLabel(dm, "EGADS Face ID");CHKERRQ(ierr);
234*c4762a1bSJed Brown   ierr = DMGetLabel(dm, "EGADS Face ID", &faceLabel);CHKERRQ(ierr);
235*c4762a1bSJed Brown   ierr = DMCreateLabel(dm, "EGADS Edge ID");CHKERRQ(ierr);
236*c4762a1bSJed Brown   ierr = DMGetLabel(dm, "EGADS Edge ID", &edgeLabel);CHKERRQ(ierr);
237*c4762a1bSJed Brown   for (b = 0; b < nbodies; ++b) {
238*c4762a1bSJed Brown     ego body = bodies[b];
239*c4762a1bSJed Brown     int id, Nl, l;
240*c4762a1bSJed Brown 
241*c4762a1bSJed Brown     ierr = EG_getBodyTopos(body, NULL, LOOP, &Nl, &lobjs);CHKERRQ(ierr);
242*c4762a1bSJed Brown     for (l = 0; l < Nl; ++l) {
243*c4762a1bSJed Brown       ego loop = lobjs[l];
244*c4762a1bSJed Brown       int lid, cell, Ne, e;
245*c4762a1bSJed Brown 
246*c4762a1bSJed Brown       lid  = EG_indexBodyTopo(body, loop);CHKERRQ(ierr);
247*c4762a1bSJed Brown       cell = lid-1;
248*c4762a1bSJed Brown       ierr = DMLabelSetValue(bodyLabel, cell, b);CHKERRQ(ierr);
249*c4762a1bSJed Brown       {
250*c4762a1bSJed Brown         ego *fobjs;
251*c4762a1bSJed Brown         int  Nf, fid;
252*c4762a1bSJed Brown 
253*c4762a1bSJed Brown         ierr = EG_getBodyTopos(body, loop, FACE, &Nf, &fobjs);CHKERRQ(ierr);
254*c4762a1bSJed Brown         fid  = EG_indexBodyTopo(body, fobjs[0]);CHKERRQ(ierr);
255*c4762a1bSJed Brown         ierr = DMLabelSetValue(faceLabel, cell, fid);CHKERRQ(ierr);
256*c4762a1bSJed Brown       }
257*c4762a1bSJed Brown 
258*c4762a1bSJed Brown       ierr = EG_getTopology(loop, &geom, &oclass, &mtype, NULL, &Ne, &objs, &senses);CHKERRQ(ierr);
259*c4762a1bSJed Brown       for (e = 0; e < Ne; ++e) {
260*c4762a1bSJed Brown         ego             edge = objs[e];
261*c4762a1bSJed Brown         int             eid, Nv, v;
262*c4762a1bSJed Brown         PetscInt        support[2], numEdges;
263*c4762a1bSJed Brown         const PetscInt *edges;
264*c4762a1bSJed Brown 
265*c4762a1bSJed Brown         eid  = EG_indexBodyTopo(body, edge);
266*c4762a1bSJed Brown         ierr = EG_getTopology(edge, &geom, &oclass, &mtype, NULL, &Nv, &nobjs, &senses);
267*c4762a1bSJed Brown         if (Nv > 2) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Edge %d has %d vertices > 2", eid, Nv);
268*c4762a1bSJed Brown         for (v = 0; v < Nv; ++v) {
269*c4762a1bSJed Brown           ego vertex = nobjs[v];
270*c4762a1bSJed Brown 
271*c4762a1bSJed Brown           id   = EG_indexBodyTopo(body, vertex);
272*c4762a1bSJed Brown           ierr = DMLabelSetValue(edgeLabel, numCells + id-1, eid);CHKERRQ(ierr);
273*c4762a1bSJed Brown           support[v] = numCells + id-1;
274*c4762a1bSJed Brown         }
275*c4762a1bSJed Brown         if (Nv == 2) {
276*c4762a1bSJed Brown           ierr = DMPlexGetJoin(dm, 2, support, &numEdges, &edges);CHKERRQ(ierr);
277*c4762a1bSJed Brown           if (numEdges != 1) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "2 vertices should only bound 1 edge, not %D", numEdges);
278*c4762a1bSJed Brown           ierr = DMLabelSetValue(edgeLabel, edges[0], eid);CHKERRQ(ierr);
279*c4762a1bSJed Brown           ierr = DMPlexRestoreJoin(dm, 2, support, &numEdges, &edges);CHKERRQ(ierr);
280*c4762a1bSJed Brown         }
281*c4762a1bSJed Brown       }
282*c4762a1bSJed Brown     }
283*c4762a1bSJed Brown   }
284*c4762a1bSJed Brown   ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr);
285*c4762a1bSJed Brown   for (c = cStart; c < cEnd; ++c) {
286*c4762a1bSJed Brown     PetscInt *closure = NULL;
287*c4762a1bSJed Brown     PetscInt  clSize, cl, bval, fval;
288*c4762a1bSJed Brown 
289*c4762a1bSJed Brown     ierr = DMPlexGetTransitiveClosure(dm, c, PETSC_TRUE, &clSize, &closure);CHKERRQ(ierr);
290*c4762a1bSJed Brown     ierr = DMLabelGetValue(bodyLabel, c, &bval);CHKERRQ(ierr);
291*c4762a1bSJed Brown     ierr = DMLabelGetValue(faceLabel, c, &fval);CHKERRQ(ierr);
292*c4762a1bSJed Brown     for (cl = 0; cl < clSize*2; cl += 2) {
293*c4762a1bSJed Brown       ierr = DMLabelSetValue(bodyLabel, closure[cl], bval);CHKERRQ(ierr);
294*c4762a1bSJed Brown       ierr = DMLabelSetValue(faceLabel, closure[cl], fval);CHKERRQ(ierr);
295*c4762a1bSJed Brown     }
296*c4762a1bSJed Brown     ierr = DMPlexRestoreTransitiveClosure(dm, c, PETSC_TRUE, &clSize, &closure);CHKERRQ(ierr);
297*c4762a1bSJed Brown   }
298*c4762a1bSJed Brown   ierr = DMLabelView(bodyLabel, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
299*c4762a1bSJed Brown   ierr = DMLabelView(faceLabel, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
300*c4762a1bSJed Brown   ierr = DMLabelView(edgeLabel, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
301*c4762a1bSJed Brown   ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
302*c4762a1bSJed Brown 
303*c4762a1bSJed Brown   ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr);
304*c4762a1bSJed Brown   ierr = DMDestroy(&dm);CHKERRQ(ierr);
305*c4762a1bSJed Brown 
306*c4762a1bSJed Brown   /* Close EGADSlite file */
307*c4762a1bSJed Brown   ierr = EG_close(context);CHKERRQ(ierr);
308*c4762a1bSJed Brown   ierr = PetscFinalize();
309*c4762a1bSJed Brown   return ierr;
310*c4762a1bSJed Brown }
311*c4762a1bSJed Brown 
312*c4762a1bSJed Brown /*TEST
313*c4762a1bSJed Brown 
314*c4762a1bSJed Brown   build:
315*c4762a1bSJed Brown     requires: egads
316*c4762a1bSJed Brown 
317*c4762a1bSJed Brown   test:
318*c4762a1bSJed Brown     suffix: sphere_0
319*c4762a1bSJed Brown     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.egadslite -dm_view ::ascii_info_detail
320*c4762a1bSJed Brown 
321*c4762a1bSJed Brown TEST*/
322