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