175d3a19aSMatthew G. Knepley #include <petsc-private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 275d3a19aSMatthew G. Knepley #include <petscsf.h> 375d3a19aSMatthew G. Knepley 475d3a19aSMatthew G. Knepley #undef __FUNCT__ 575d3a19aSMatthew G. Knepley #define __FUNCT__ "GetDepthStart_Private" 675d3a19aSMatthew G. Knepley PETSC_STATIC_INLINE PetscErrorCode GetDepthStart_Private(PetscInt depth, PetscInt depthSize[], PetscInt *cStart, PetscInt *fStart, PetscInt *eStart, PetscInt *vStart) 775d3a19aSMatthew G. Knepley { 875d3a19aSMatthew G. Knepley PetscFunctionBegin; 975d3a19aSMatthew G. Knepley if (cStart) *cStart = 0; 1075d3a19aSMatthew G. Knepley if (vStart) *vStart = depthSize[depth]; 1175d3a19aSMatthew G. Knepley if (fStart) *fStart = depthSize[depth] + depthSize[0]; 1275d3a19aSMatthew G. Knepley if (eStart) *eStart = depthSize[depth] + depthSize[0] + depthSize[depth-1]; 1375d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 1475d3a19aSMatthew G. Knepley } 1575d3a19aSMatthew G. Knepley 1675d3a19aSMatthew G. Knepley #undef __FUNCT__ 1775d3a19aSMatthew G. Knepley #define __FUNCT__ "GetDepthEnd_Private" 1875d3a19aSMatthew G. Knepley PETSC_STATIC_INLINE PetscErrorCode GetDepthEnd_Private(PetscInt depth, PetscInt depthSize[], PetscInt *cEnd, PetscInt *fEnd, PetscInt *eEnd, PetscInt *vEnd) 1975d3a19aSMatthew G. Knepley { 2075d3a19aSMatthew G. Knepley PetscFunctionBegin; 2175d3a19aSMatthew G. Knepley if (cEnd) *cEnd = depthSize[depth]; 2275d3a19aSMatthew G. Knepley if (vEnd) *vEnd = depthSize[depth] + depthSize[0]; 2375d3a19aSMatthew G. Knepley if (fEnd) *fEnd = depthSize[depth] + depthSize[0] + depthSize[depth-1]; 2475d3a19aSMatthew G. Knepley if (eEnd) *eEnd = depthSize[depth] + depthSize[0] + depthSize[depth-1] + depthSize[1]; 2575d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 2675d3a19aSMatthew G. Knepley } 2775d3a19aSMatthew G. Knepley 2875d3a19aSMatthew G. Knepley #undef __FUNCT__ 29b5da9499SMatthew G. Knepley #define __FUNCT__ "DMPlexGetNumHybridFaces_Internal" 30b5da9499SMatthew G. Knepley /* This is a stopgap since we do not currently keep track of faces for hybrid cells */ 31b5da9499SMatthew G. Knepley static PetscErrorCode DMPlexGetNumHybridFaces_Internal(DM dm, PetscInt *numHybridFaces) 32b5da9499SMatthew G. Knepley { 33b5da9499SMatthew G. Knepley PetscInt eStart, eEnd, eMax, cEnd, cMax, c, hEdges = 0; 34b5da9499SMatthew G. Knepley PetscErrorCode ierr; 35b5da9499SMatthew G. Knepley 36b5da9499SMatthew G. Knepley PetscFunctionBegin; 37b5da9499SMatthew G. Knepley *numHybridFaces = 0; 38b5da9499SMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 39b5da9499SMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, NULL, &cEnd);CHKERRQ(ierr); 40b5da9499SMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, NULL, &eMax, NULL);CHKERRQ(ierr); 41b5da9499SMatthew G. Knepley if (cMax < 0) PetscFunctionReturn(0); 42b5da9499SMatthew G. Knepley /* Count interior edges in hybrid cells */ 43b5da9499SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 44b5da9499SMatthew G. Knepley PetscInt *closure = NULL, closureSize, cl; 45b5da9499SMatthew G. Knepley 46b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &closure);CHKERRQ(ierr); 47b5da9499SMatthew G. Knepley for (cl = 0; cl < closureSize*2; cl += 2) { 48b5da9499SMatthew G. Knepley const PetscInt p = closure[cl]; 49b5da9499SMatthew G. Knepley 50b5da9499SMatthew G. Knepley if ((p >= eStart) && (p < eMax)) ++hEdges; 51b5da9499SMatthew G. Knepley } 52b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &closure);CHKERRQ(ierr); 53b5da9499SMatthew G. Knepley } 54b5da9499SMatthew G. Knepley if (hEdges%2) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Number of interior edges in hybrid cells cannot be odd: %d", hEdges); 55b5da9499SMatthew G. Knepley *numHybridFaces = hEdges/2; 56b5da9499SMatthew G. Knepley PetscFunctionReturn(0); 57b5da9499SMatthew G. Knepley } 58b5da9499SMatthew G. Knepley 59b5da9499SMatthew G. Knepley #undef __FUNCT__ 6075d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerGetSizes" 6175d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerGetSizes(CellRefiner refiner, DM dm, PetscInt depthSize[]) 6275d3a19aSMatthew G. Knepley { 63b5da9499SMatthew G. Knepley PetscInt numHybridFaces, cStart, cEnd, cMax, vStart, vEnd, vMax, fStart, fEnd, fMax, eStart, eEnd, eMax; 6475d3a19aSMatthew G. Knepley PetscErrorCode ierr; 6575d3a19aSMatthew G. Knepley 6675d3a19aSMatthew G. Knepley PetscFunctionBegin; 6775d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 6875d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 6975d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 7075d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 7175d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 7275d3a19aSMatthew G. Knepley switch (refiner) { 7375d3a19aSMatthew G. Knepley case 1: 7475d3a19aSMatthew G. Knepley /* Simplicial 2D */ 7575d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + fEnd - fStart; /* Add a vertex on every face */ 7675d3a19aSMatthew G. Knepley depthSize[1] = 2*(fEnd - fStart) + 3*(cEnd - cStart); /* Every face is split into 2 faces and 3 faces are added for each cell */ 7775d3a19aSMatthew G. Knepley depthSize[2] = 4*(cEnd - cStart); /* Every cell split into 4 cells */ 7875d3a19aSMatthew G. Knepley break; 7975d3a19aSMatthew G. Knepley case 3: 80d963de37SMatthew G. Knepley /* Hybrid Simplicial 2D */ 8175d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 8275d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 8375d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 8475d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 8575d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + fMax - fStart; /* Add a vertex on every face, but not hybrid faces */ 8675d3a19aSMatthew G. Knepley depthSize[1] = 2*(fMax - fStart) + 3*(cMax - cStart) + (fEnd - fMax) + (cEnd - cMax); /* Every interior face is split into 2 faces, 3 faces are added for each interior cell, and one in each hybrid cell */ 8775d3a19aSMatthew G. Knepley depthSize[2] = 4*(cMax - cStart) + 2*(cEnd - cMax); /* Interior cells split into 4 cells, Hybrid cells split into 2 cells */ 8875d3a19aSMatthew G. Knepley break; 8975d3a19aSMatthew G. Knepley case 2: 9075d3a19aSMatthew G. Knepley /* Hex 2D */ 9175d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + cEnd - cStart + fEnd - fStart; /* Add a vertex on every face and cell */ 9275d3a19aSMatthew G. Knepley depthSize[1] = 2*(fEnd - fStart) + 4*(cEnd - cStart); /* Every face is split into 2 faces and 4 faces are added for each cell */ 9375d3a19aSMatthew G. Knepley depthSize[2] = 4*(cEnd - cStart); /* Every cell split into 4 cells */ 9475d3a19aSMatthew G. Knepley break; 95b5da9499SMatthew G. Knepley case 5: 96b5da9499SMatthew G. Knepley /* Simplicial 3D */ 97b5da9499SMatthew G. Knepley depthSize[0] = vEnd - vStart + eEnd - eStart; /* Add a vertex on every edge */ 98b5da9499SMatthew G. Knepley depthSize[1] = 2*(eEnd - eStart) + 3*(fEnd - fStart) + (cEnd - cStart); /* Every edge is split into 2 edges, 3 edges are added for each face, and 1 edge for each cell */ 99b5da9499SMatthew G. Knepley depthSize[2] = 4*(fEnd - fStart) + 8*(cEnd - cStart); /* Every face split into 4 faces and 8 faces are added for each cell */ 100b5da9499SMatthew G. Knepley depthSize[3] = 8*(cEnd - cStart); /* Every cell split into 8 cells */ 101b5da9499SMatthew G. Knepley break; 102*2eabf88fSMatthew G. Knepley case 6: 103*2eabf88fSMatthew G. Knepley /* Hex 3D */ 104*2eabf88fSMatthew G. Knepley depthSize[0] = vEnd - vStart + eEnd - eStart + fEnd - fStart + cEnd - cStart; /* Add a vertex on every edge, face and cell */ 105*2eabf88fSMatthew G. Knepley depthSize[1] = 2*(eEnd - eStart) + 4*(fEnd - fStart) + 6*(cEnd - cStart); /* Every edge is split into 2 edge, 4 edges are added for each face, and 6 edges for each cell */ 106*2eabf88fSMatthew G. Knepley depthSize[2] = 4*(fEnd - fStart) + 12*(cEnd - cStart); /* Every face is split into 4 faces, and 12 faces are added for each cell */ 107*2eabf88fSMatthew G. Knepley depthSize[3] = 8*(cEnd - cStart); /* Every cell split into 8 cells */ 108*2eabf88fSMatthew G. Knepley break; 109b5da9499SMatthew G. Knepley case 7: 110b5da9499SMatthew G. Knepley /* Hybrid Simplicial 3D */ 111b5da9499SMatthew G. Knepley ierr = DMPlexGetNumHybridFaces_Internal(dm, &numHybridFaces);CHKERRQ(ierr); 112b5da9499SMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 113b5da9499SMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 114b5da9499SMatthew G. Knepley if (eMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No edge maximum specified in hybrid mesh"); 115b5da9499SMatthew G. Knepley eMax = PetscMin(eEnd, eMax); 116b5da9499SMatthew G. Knepley depthSize[0] = vEnd - vStart + eMax - eStart; /* Add a vertex on every edge, but not hybrid edges */ 117b5da9499SMatthew G. Knepley depthSize[1] = 2*(eMax - eStart) + 13*(cMax - cStart) + (eEnd - eMax) + numHybridFaces; /* Every interior edge is split into 2 edges and 13 edges are added for each interior cell, each hybrid edge stays intact, and one new hybrid edge for each two interior edges (hybrid face) on a hybrid cell */ 118b5da9499SMatthew G. Knepley depthSize[2] = 4*(fEnd - fStart) + 8*(cEnd - cStart); /* Every face split into 4 faces and 8 faces are added for each cell */ 119b5da9499SMatthew G. Knepley depthSize[3] = 8*(cMax - cStart) + 4*(cEnd - cMax); /* Every interior cell split into 8 cells, and every hybrid cell split into 4 cells */ 120b5da9499SMatthew G. Knepley break; 12175d3a19aSMatthew G. Knepley default: 12275d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 12375d3a19aSMatthew G. Knepley } 12475d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 12575d3a19aSMatthew G. Knepley } 12675d3a19aSMatthew G. Knepley 12775d3a19aSMatthew G. Knepley #undef __FUNCT__ 12875d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetConeSizes" 12975d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerSetConeSizes(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 13075d3a19aSMatthew G. Knepley { 131b5da9499SMatthew G. Knepley PetscInt depth, cStart, cStartNew, cEnd, cMax, c, vStart, vStartNew, vEnd, vMax, v, fStart, fStartNew, fEnd, fMax, f, eStart, eStartNew, eEnd, eMax, e, r; 13275d3a19aSMatthew G. Knepley PetscErrorCode ierr; 13375d3a19aSMatthew G. Knepley 13475d3a19aSMatthew G. Knepley PetscFunctionBegin; 13575d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 13675d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 13775d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 13875d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 13975d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 14075d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 14175d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr); 14275d3a19aSMatthew G. Knepley switch (refiner) { 14375d3a19aSMatthew G. Knepley case 1: 14475d3a19aSMatthew G. Knepley /* Simplicial 2D */ 14575d3a19aSMatthew G. Knepley /* All cells have 3 faces */ 14675d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 14775d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 14875d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4 + r; 14975d3a19aSMatthew G. Knepley 15075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 15175d3a19aSMatthew G. Knepley } 15275d3a19aSMatthew G. Knepley } 15375d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 15475d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 15575d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 15675d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 15775d3a19aSMatthew G. Knepley PetscInt size; 15875d3a19aSMatthew G. Knepley 15975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 16075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 16175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 16275d3a19aSMatthew G. Knepley } 16375d3a19aSMatthew G. Knepley } 16475d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 16575d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 16675d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 16775d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + r; 16875d3a19aSMatthew G. Knepley 16975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 17075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 17175d3a19aSMatthew G. Knepley } 17275d3a19aSMatthew G. Knepley } 17375d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 17475d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 17575d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 17675d3a19aSMatthew G. Knepley PetscInt size; 17775d3a19aSMatthew G. Knepley 17875d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 17975d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 18075d3a19aSMatthew G. Knepley } 18175d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells*2 supports */ 18275d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 18375d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 18475d3a19aSMatthew G. Knepley PetscInt size; 18575d3a19aSMatthew G. Knepley 18675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 18775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size*2);CHKERRQ(ierr); 18875d3a19aSMatthew G. Knepley } 18975d3a19aSMatthew G. Knepley break; 19075d3a19aSMatthew G. Knepley case 2: 19175d3a19aSMatthew G. Knepley /* Hex 2D */ 19275d3a19aSMatthew G. Knepley /* All cells have 4 faces */ 19375d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 19475d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 19575d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4 + r; 19675d3a19aSMatthew G. Knepley 19775d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 19875d3a19aSMatthew G. Knepley } 19975d3a19aSMatthew G. Knepley } 20075d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 20175d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 20275d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 20375d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 20475d3a19aSMatthew G. Knepley PetscInt size; 20575d3a19aSMatthew G. Knepley 20675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 20775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 20875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 20975d3a19aSMatthew G. Knepley } 21075d3a19aSMatthew G. Knepley } 21175d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 21275d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 21375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 21475d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 21575d3a19aSMatthew G. Knepley 21675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 21775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 21875d3a19aSMatthew G. Knepley } 21975d3a19aSMatthew G. Knepley } 22075d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 22175d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 22275d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 22375d3a19aSMatthew G. Knepley PetscInt size; 22475d3a19aSMatthew G. Knepley 22575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 22675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 22775d3a19aSMatthew G. Knepley } 22875d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells supports */ 22975d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 23075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 23175d3a19aSMatthew G. Knepley PetscInt size; 23275d3a19aSMatthew G. Knepley 23375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 23475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 23575d3a19aSMatthew G. Knepley } 23675d3a19aSMatthew G. Knepley /* Cell vertices have 4 supports */ 23775d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 23875d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 23975d3a19aSMatthew G. Knepley 24075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 24175d3a19aSMatthew G. Knepley } 24275d3a19aSMatthew G. Knepley break; 24375d3a19aSMatthew G. Knepley case 3: 244d963de37SMatthew G. Knepley /* Hybrid Simplicial 2D */ 24575d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 24675d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 24775d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 24875d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 24975d3a19aSMatthew G. Knepley ierr = DMPlexSetHybridBounds(rdm, cStartNew + (cMax - cStart)*4, fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3, PETSC_DETERMINE, PETSC_DETERMINE);CHKERRQ(ierr); 25075d3a19aSMatthew G. Knepley /* Interior cells have 3 faces */ 25175d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 25275d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 25375d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4 + r; 25475d3a19aSMatthew G. Knepley 25575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 25675d3a19aSMatthew G. Knepley } 25775d3a19aSMatthew G. Knepley } 25875d3a19aSMatthew G. Knepley /* Hybrid cells have 4 faces */ 25975d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 26075d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 26175d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2 + r; 26275d3a19aSMatthew G. Knepley 26375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 26475d3a19aSMatthew G. Knepley } 26575d3a19aSMatthew G. Knepley } 26675d3a19aSMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 26775d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 26875d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 26975d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 27075d3a19aSMatthew G. Knepley PetscInt size; 27175d3a19aSMatthew G. Knepley 27275d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 27375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 27475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 27575d3a19aSMatthew G. Knepley } 27675d3a19aSMatthew G. Knepley } 27775d3a19aSMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 27875d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 27975d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 28075d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + r; 28175d3a19aSMatthew G. Knepley 28275d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 28375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 28475d3a19aSMatthew G. Knepley } 28575d3a19aSMatthew G. Knepley } 28675d3a19aSMatthew G. Knepley /* Hybrid faces have 2 vertices and the same cells */ 28775d3a19aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 28875d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (f - fMax); 28975d3a19aSMatthew G. Knepley PetscInt size; 29075d3a19aSMatthew G. Knepley 29175d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 29275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 29375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 29475d3a19aSMatthew G. Knepley } 29575d3a19aSMatthew G. Knepley /* Hybrid cell faces have 2 vertices and 2 cells */ 29675d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 29775d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 29875d3a19aSMatthew G. Knepley 29975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 30075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 30175d3a19aSMatthew G. Knepley } 30275d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 30375d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 30475d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 30575d3a19aSMatthew G. Knepley PetscInt size; 30675d3a19aSMatthew G. Knepley 30775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 30875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 30975d3a19aSMatthew G. Knepley } 31075d3a19aSMatthew G. Knepley /* Face vertices have 2 + (2 interior, 1 hybrid) supports */ 31175d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 31275d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 31375d3a19aSMatthew G. Knepley const PetscInt *support; 31475d3a19aSMatthew G. Knepley PetscInt size, newSize = 2, s; 31575d3a19aSMatthew G. Knepley 31675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 31775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 31875d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 31975d3a19aSMatthew G. Knepley if (support[s] >= cMax) newSize += 1; 32075d3a19aSMatthew G. Knepley else newSize += 2; 32175d3a19aSMatthew G. Knepley } 32275d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, newSize);CHKERRQ(ierr); 32375d3a19aSMatthew G. Knepley } 32475d3a19aSMatthew G. Knepley break; 325b5da9499SMatthew G. Knepley case 5: 326b5da9499SMatthew G. Knepley /* Simplicial 3D */ 327b5da9499SMatthew G. Knepley /* All cells have 4 faces */ 328b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 329b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 330b5da9499SMatthew G. Knepley const PetscInt newp = (c - cStart)*8 + r; 331b5da9499SMatthew G. Knepley 332b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 333b5da9499SMatthew G. Knepley } 334b5da9499SMatthew G. Knepley } 335b5da9499SMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 336b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 337b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 338b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 339b5da9499SMatthew G. Knepley PetscInt size; 340b5da9499SMatthew G. Knepley 341b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 342b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 343b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 344b5da9499SMatthew G. Knepley } 345b5da9499SMatthew G. Knepley } 346b5da9499SMatthew G. Knepley /* Interior faces have 3 edges and 2 cells */ 347b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 348b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 349b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + r; 350b5da9499SMatthew G. Knepley 351b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 352b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 353b5da9499SMatthew G. Knepley } 354b5da9499SMatthew G. Knepley } 355b5da9499SMatthew G. Knepley /* Split edges have 2 vertices and the same faces */ 356b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 357b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 358b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 359b5da9499SMatthew G. Knepley PetscInt size; 360b5da9499SMatthew G. Knepley 361b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 362b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 363b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 364b5da9499SMatthew G. Knepley } 365b5da9499SMatthew G. Knepley } 366b5da9499SMatthew G. Knepley /* Face edges have 2 vertices and 2+cells*(1/2) faces */ 367b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 368b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 369b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + r; 370b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support, eint[4] = {1, 0, 2, 0}; 371b5da9499SMatthew G. Knepley PetscInt coneSize, c, supportSize, s, er, intFaces = 0; 372b5da9499SMatthew G. Knepley 373b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 374b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 375b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 376b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 377b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 378b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 379b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 380b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 38186f0afeeSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 38286f0afeeSMatthew G. Knepley er = ornt[c] < 0 ? (-(ornt[c]+1) + 2-r)%3 : (ornt[c] + r)%3; 383b5da9499SMatthew G. Knepley if (er == eint[c]) { 384b5da9499SMatthew G. Knepley intFaces += 1; 385b5da9499SMatthew G. Knepley } else { 386b5da9499SMatthew G. Knepley intFaces += 2; 387b5da9499SMatthew G. Knepley } 388b5da9499SMatthew G. Knepley } 389b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+intFaces);CHKERRQ(ierr); 390b5da9499SMatthew G. Knepley } 391b5da9499SMatthew G. Knepley } 392b5da9499SMatthew G. Knepley /* Interior edges have 2 vertices and 4 faces */ 393b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 394b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 395b5da9499SMatthew G. Knepley 396b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 397b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 398b5da9499SMatthew G. Knepley } 399b5da9499SMatthew G. Knepley /* Old vertices have identical supports */ 400b5da9499SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 401b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 402b5da9499SMatthew G. Knepley PetscInt size; 403b5da9499SMatthew G. Knepley 404b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 405b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 406b5da9499SMatthew G. Knepley } 407b5da9499SMatthew G. Knepley /* Edge vertices have 2 + faces*2 + cells*0/1 supports */ 408b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 409b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 410b5da9499SMatthew G. Knepley PetscInt size, *star = NULL, starSize, s, cellSize = 0; 411b5da9499SMatthew G. Knepley 412b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 413b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 414b5da9499SMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 415b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 416b5da9499SMatthew G. Knepley PetscInt e01, e23; 417b5da9499SMatthew G. Knepley 418b5da9499SMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cEnd)) { 419b5da9499SMatthew G. Knepley /* Check edge 0-1 */ 420b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 421b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 422b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 423b5da9499SMatthew G. Knepley e01 = cone[ornt[0] < 0 ? (-(ornt[0]+1) + 0)%3 : ornt[0]]; 424b5da9499SMatthew G. Knepley /* Check edge 2-3 */ 425b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 426b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 427b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[3], &cone);CHKERRQ(ierr); 428b5da9499SMatthew G. Knepley e23 = cone[ornt[3] < 0 ? (-(ornt[3]+1) + 2)%3 : (ornt[3] + 2)%3]; 429b5da9499SMatthew G. Knepley if ((e01 == e) || (e23 == e)) ++cellSize; 430b5da9499SMatthew G. Knepley } 431b5da9499SMatthew G. Knepley } 432b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 433b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size*2 + cellSize);CHKERRQ(ierr); 434b5da9499SMatthew G. Knepley } 435b5da9499SMatthew G. Knepley break; 436*2eabf88fSMatthew G. Knepley case 6: 437*2eabf88fSMatthew G. Knepley /* Hex 3D */ 438*2eabf88fSMatthew G. Knepley /* All cells have 6 faces */ 439*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 440*2eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r) { 441*2eabf88fSMatthew G. Knepley const PetscInt newp = (c - cStart)*8 + r; 442*2eabf88fSMatthew G. Knepley 443*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 6);CHKERRQ(ierr); 444*2eabf88fSMatthew G. Knepley } 445*2eabf88fSMatthew G. Knepley } 446*2eabf88fSMatthew G. Knepley /* Split faces have 4 edges and the same cells as the parent */ 447*2eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 448*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 449*2eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 450*2eabf88fSMatthew G. Knepley PetscInt size; 451*2eabf88fSMatthew G. Knepley 452*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 453*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 454*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 455*2eabf88fSMatthew G. Knepley } 456*2eabf88fSMatthew G. Knepley } 457*2eabf88fSMatthew G. Knepley /* Interior faces have 4 edges and 2 cells */ 458*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 459*2eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r) { 460*2eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + r; 461*2eabf88fSMatthew G. Knepley 462*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 463*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 464*2eabf88fSMatthew G. Knepley } 465*2eabf88fSMatthew G. Knepley } 466*2eabf88fSMatthew G. Knepley /* Split edges have 2 vertices and the same faces as the parent */ 467*2eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 468*2eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 469*2eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 470*2eabf88fSMatthew G. Knepley PetscInt size; 471*2eabf88fSMatthew G. Knepley 472*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 473*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 474*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 475*2eabf88fSMatthew G. Knepley } 476*2eabf88fSMatthew G. Knepley } 477*2eabf88fSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells faces */ 478*2eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 479*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 480*2eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 481*2eabf88fSMatthew G. Knepley PetscInt size; 482*2eabf88fSMatthew G. Knepley 483*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 484*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 485*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+size);CHKERRQ(ierr); 486*2eabf88fSMatthew G. Knepley } 487*2eabf88fSMatthew G. Knepley } 488*2eabf88fSMatthew G. Knepley /* Cell edges have 2 vertices and 4 faces */ 489*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 490*2eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 491*2eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 492*2eabf88fSMatthew G. Knepley 493*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 494*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 495*2eabf88fSMatthew G. Knepley } 496*2eabf88fSMatthew G. Knepley } 497*2eabf88fSMatthew G. Knepley /* Old vertices have identical supports */ 498*2eabf88fSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 499*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 500*2eabf88fSMatthew G. Knepley PetscInt size; 501*2eabf88fSMatthew G. Knepley 502*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 503*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 504*2eabf88fSMatthew G. Knepley } 505*2eabf88fSMatthew G. Knepley /* Edge vertices have 2 + faces supports */ 506*2eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 507*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 508*2eabf88fSMatthew G. Knepley PetscInt size; 509*2eabf88fSMatthew G. Knepley 510*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 511*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 512*2eabf88fSMatthew G. Knepley } 513*2eabf88fSMatthew G. Knepley /* Face vertices have 4 + cells supports */ 514*2eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 515*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 516*2eabf88fSMatthew G. Knepley PetscInt size; 517*2eabf88fSMatthew G. Knepley 518*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 519*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4 + size);CHKERRQ(ierr); 520*2eabf88fSMatthew G. Knepley } 521*2eabf88fSMatthew G. Knepley /* Cell vertices have 6 supports */ 522*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 523*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 524*2eabf88fSMatthew G. Knepley 525*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 6);CHKERRQ(ierr); 526*2eabf88fSMatthew G. Knepley } 527*2eabf88fSMatthew G. Knepley break; 52875d3a19aSMatthew G. Knepley default: 52975d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 53075d3a19aSMatthew G. Knepley } 53175d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 53275d3a19aSMatthew G. Knepley } 53375d3a19aSMatthew G. Knepley 534*2eabf88fSMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetRefHexFace_Static(PetscInt o, PetscInt r) { 535*2eabf88fSMatthew G. Knepley return (o < 0 ? (-(o+1)+4-r)%4 : (o+r)%4); 536*2eabf88fSMatthew G. Knepley } 537*2eabf88fSMatthew G. Knepley 53875d3a19aSMatthew G. Knepley #undef __FUNCT__ 53975d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetCones" 54075d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerSetCones(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 54175d3a19aSMatthew G. Knepley { 542b5da9499SMatthew G. Knepley const PetscInt *faces, cellInd[4] = {0, 1, 2, 3}; 543b5da9499SMatthew G. Knepley PetscInt depth, cStart, cEnd, cMax, cStartNew, cEndNew, c, vStart, vEnd, vMax, vStartNew, vEndNew, v, fStart, fEnd, fMax, fStartNew, fEndNew, f, eStart, eEnd, eMax, eStartNew, eEndNew, e, r, p; 54475d3a19aSMatthew G. Knepley PetscInt maxSupportSize, *supportRef; 54575d3a19aSMatthew G. Knepley PetscErrorCode ierr; 54675d3a19aSMatthew G. Knepley 54775d3a19aSMatthew G. Knepley PetscFunctionBegin; 54875d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 54975d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 55075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 55175d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 55275d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 55375d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 55475d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr); 55575d3a19aSMatthew G. Knepley ierr = GetDepthEnd_Private(depth, depthSize, &cEndNew, &fEndNew, &eEndNew, &vEndNew);CHKERRQ(ierr); 55675d3a19aSMatthew G. Knepley switch (refiner) { 55775d3a19aSMatthew G. Knepley case 1: 55875d3a19aSMatthew G. Knepley /* Simplicial 2D */ 55975d3a19aSMatthew G. Knepley /* 56075d3a19aSMatthew G. Knepley 2 56175d3a19aSMatthew G. Knepley |\ 56275d3a19aSMatthew G. Knepley | \ 56375d3a19aSMatthew G. Knepley | \ 56475d3a19aSMatthew G. Knepley | \ 56575d3a19aSMatthew G. Knepley | C \ 56675d3a19aSMatthew G. Knepley | \ 56775d3a19aSMatthew G. Knepley | \ 56875d3a19aSMatthew G. Knepley 2---1---1 56975d3a19aSMatthew G. Knepley |\ D / \ 57075d3a19aSMatthew G. Knepley | 2 0 \ 57175d3a19aSMatthew G. Knepley |A \ / B \ 57275d3a19aSMatthew G. Knepley 0---0-------1 57375d3a19aSMatthew G. Knepley */ 57475d3a19aSMatthew G. Knepley /* All cells have 3 faces */ 57575d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 57675d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4; 57775d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 57875d3a19aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 57975d3a19aSMatthew G. Knepley 58075d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 58175d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 58275d3a19aSMatthew G. Knepley /* A triangle */ 58375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 58475d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 58575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 2; 58675d3a19aSMatthew G. Knepley orntNew[1] = -2; 58775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 58875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 58975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 59075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 59175d3a19aSMatthew G. Knepley #if 1 59275d3a19aSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cEndNew); 59375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 59475d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 59575d3a19aSMatthew G. Knepley } 59675d3a19aSMatthew G. Knepley #endif 59775d3a19aSMatthew G. Knepley /* B triangle */ 59875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 59975d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 60075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 60175d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 60275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 0; 60375d3a19aSMatthew G. Knepley orntNew[2] = -2; 60475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 60575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 60675d3a19aSMatthew G. Knepley #if 1 60775d3a19aSMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cEndNew); 60875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 60975d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 61075d3a19aSMatthew G. Knepley } 61175d3a19aSMatthew G. Knepley #endif 61275d3a19aSMatthew G. Knepley /* C triangle */ 61375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 1; 61475d3a19aSMatthew G. Knepley orntNew[0] = -2; 61575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 61675d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 61775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 61875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 61975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 62075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 62175d3a19aSMatthew G. Knepley #if 1 62275d3a19aSMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+2, cStartNew, cEndNew); 62375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 62475d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 62575d3a19aSMatthew G. Knepley } 62675d3a19aSMatthew G. Knepley #endif 62775d3a19aSMatthew G. Knepley /* D triangle */ 62875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 0; 62975d3a19aSMatthew G. Knepley orntNew[0] = 0; 63075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 1; 63175d3a19aSMatthew G. Knepley orntNew[1] = 0; 63275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 2; 63375d3a19aSMatthew G. Knepley orntNew[2] = 0; 63475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 63575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 63675d3a19aSMatthew G. Knepley #if 1 63775d3a19aSMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+3, cStartNew, cEndNew); 63875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 63975d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 64075d3a19aSMatthew G. Knepley } 64175d3a19aSMatthew G. Knepley #endif 64275d3a19aSMatthew G. Knepley } 64375d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 64475d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 64575d3a19aSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 64675d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 64775d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 64875d3a19aSMatthew G. Knepley 64975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 65075d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 651297d2bf4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 65275d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 65375d3a19aSMatthew G. Knepley 65475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 65575d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 65675d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 65775d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 65875d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 65975d3a19aSMatthew G. Knepley #if 1 66075d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 66175d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 66275d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 66375d3a19aSMatthew G. Knepley } 66475d3a19aSMatthew G. Knepley #endif 66575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 66675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 66775d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 66875d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 66975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 670297d2bf4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 67175d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 67275d3a19aSMatthew G. Knepley if (cone[c] == f) break; 67375d3a19aSMatthew G. Knepley } 674297d2bf4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%3 : (c+r)%3); 67575d3a19aSMatthew G. Knepley } 67675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 67775d3a19aSMatthew G. Knepley #if 1 67875d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 67975d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 68075d3a19aSMatthew G. Knepley if ((supportRef[p] < cStartNew) || (supportRef[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportRef[p], cStartNew, cEndNew); 68175d3a19aSMatthew G. Knepley } 68275d3a19aSMatthew G. Knepley #endif 68375d3a19aSMatthew G. Knepley } 68475d3a19aSMatthew G. Knepley } 68575d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 68675d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 68775d3a19aSMatthew G. Knepley const PetscInt *cone; 68875d3a19aSMatthew G. Knepley 68975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 69075d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 69175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + r; 69275d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 69375d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 69475d3a19aSMatthew G. Knepley 69575d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 69675d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - fStart); 69775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 69875d3a19aSMatthew G. Knepley #if 1 69975d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 70075d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 70175d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 70275d3a19aSMatthew G. Knepley } 70375d3a19aSMatthew G. Knepley #endif 70475d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + (r+1)%3; 70575d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + 3; 70675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 70775d3a19aSMatthew G. Knepley #if 1 70875d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 70975d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 71075d3a19aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 71175d3a19aSMatthew G. Knepley } 71275d3a19aSMatthew G. Knepley #endif 71375d3a19aSMatthew G. Knepley } 71475d3a19aSMatthew G. Knepley } 71575d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 71675d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 71775d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 71875d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 71975d3a19aSMatthew G. Knepley PetscInt size, s; 72075d3a19aSMatthew G. Knepley 72175d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 72275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 72375d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 72475d3a19aSMatthew G. Knepley PetscInt r = 0; 72575d3a19aSMatthew G. Knepley 72675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 72775d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 72875d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 72975d3a19aSMatthew G. Knepley } 73075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 73175d3a19aSMatthew G. Knepley #if 1 73275d3a19aSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 73375d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 73475d3a19aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 73575d3a19aSMatthew G. Knepley } 73675d3a19aSMatthew G. Knepley #endif 73775d3a19aSMatthew G. Knepley } 73875d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells*2 supports */ 73975d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 74075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 74175d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 74275d3a19aSMatthew G. Knepley PetscInt size, s; 74375d3a19aSMatthew G. Knepley 74475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 74575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 74675d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 74775d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 74875d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 74975d3a19aSMatthew G. Knepley PetscInt r = 0; 75075d3a19aSMatthew G. Knepley 75175d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 75275d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 75375d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 75475d3a19aSMatthew G. Knepley supportRef[2+s*2+0] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*3 + (r+2)%3; 75575d3a19aSMatthew G. Knepley supportRef[2+s*2+1] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*3 + r; 75675d3a19aSMatthew G. Knepley } 75775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 75875d3a19aSMatthew G. Knepley #if 1 75975d3a19aSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 76075d3a19aSMatthew G. Knepley for (p = 0; p < 2+size*2; ++p) { 76175d3a19aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 76275d3a19aSMatthew G. Knepley } 76375d3a19aSMatthew G. Knepley #endif 76475d3a19aSMatthew G. Knepley } 76575d3a19aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 76675d3a19aSMatthew G. Knepley break; 76775d3a19aSMatthew G. Knepley case 2: 76875d3a19aSMatthew G. Knepley /* Hex 2D */ 76975d3a19aSMatthew G. Knepley /* 77075d3a19aSMatthew G. Knepley 3---------2---------2 77175d3a19aSMatthew G. Knepley | | | 77275d3a19aSMatthew G. Knepley | D 2 C | 77375d3a19aSMatthew G. Knepley | | | 77475d3a19aSMatthew G. Knepley 3----3----0----1----1 77575d3a19aSMatthew G. Knepley | | | 77675d3a19aSMatthew G. Knepley | A 0 B | 77775d3a19aSMatthew G. Knepley | | | 77875d3a19aSMatthew G. Knepley 0---------0---------1 77975d3a19aSMatthew G. Knepley */ 78075d3a19aSMatthew G. Knepley /* All cells have 4 faces */ 78175d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 78275d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4; 78375d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 78475d3a19aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 78575d3a19aSMatthew G. Knepley 78675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 78775d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 78875d3a19aSMatthew G. Knepley /* A quad */ 78975d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 79075d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 79175d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 0; 79275d3a19aSMatthew G. Knepley orntNew[1] = 0; 79375d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 3; 79475d3a19aSMatthew G. Knepley orntNew[2] = -2; 79575d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 0 : 1); 79675d3a19aSMatthew G. Knepley orntNew[3] = ornt[3]; 79775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 79875d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 79975d3a19aSMatthew G. Knepley #if 1 80075d3a19aSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cEndNew); 80175d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 80275d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 80375d3a19aSMatthew G. Knepley } 80475d3a19aSMatthew G. Knepley #endif 80575d3a19aSMatthew G. Knepley /* B quad */ 80675d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 80775d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 80875d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 80975d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 81075d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 1; 81175d3a19aSMatthew G. Knepley orntNew[2] = 0; 81275d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 0; 81375d3a19aSMatthew G. Knepley orntNew[3] = -2; 81475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 81575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 81675d3a19aSMatthew G. Knepley #if 1 81775d3a19aSMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cEndNew); 81875d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 81975d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 82075d3a19aSMatthew G. Knepley } 82175d3a19aSMatthew G. Knepley #endif 82275d3a19aSMatthew G. Knepley /* C quad */ 82375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 1; 82475d3a19aSMatthew G. Knepley orntNew[0] = -2; 82575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 82675d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 82775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 82875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 82975d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 2; 83075d3a19aSMatthew G. Knepley orntNew[3] = 0; 83175d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 83275d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 83375d3a19aSMatthew G. Knepley #if 1 83475d3a19aSMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+2, cStartNew, cEndNew); 83575d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 83675d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 83775d3a19aSMatthew G. Knepley } 83875d3a19aSMatthew G. Knepley #endif 83975d3a19aSMatthew G. Knepley /* D quad */ 84075d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 3; 84175d3a19aSMatthew G. Knepley orntNew[0] = 0; 84275d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 2; 84375d3a19aSMatthew G. Knepley orntNew[1] = -2; 84475d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 84575d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 84675d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 1 : 0); 84775d3a19aSMatthew G. Knepley orntNew[3] = ornt[3]; 84875d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 84975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 85075d3a19aSMatthew G. Knepley #if 1 85175d3a19aSMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+3, cStartNew, cEndNew); 85275d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 85375d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 85475d3a19aSMatthew G. Knepley } 85575d3a19aSMatthew G. Knepley #endif 85675d3a19aSMatthew G. Knepley } 85775d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 85875d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 85975d3a19aSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 86075d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 86175d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 86275d3a19aSMatthew G. Knepley 86375d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 86475d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 865455d6cd4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 86675d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 86775d3a19aSMatthew G. Knepley 86875d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 86975d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 87075d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 87175d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 87275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 87375d3a19aSMatthew G. Knepley #if 1 87475d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 87575d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 87675d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 87775d3a19aSMatthew G. Knepley } 87875d3a19aSMatthew G. Knepley #endif 87975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 88075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 88175d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 88275d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 88375d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 884455d6cd4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 88575d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 88675d3a19aSMatthew G. Knepley if (cone[c] == f) break; 88775d3a19aSMatthew G. Knepley } 888455d6cd4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%4 : (c+r)%4); 88975d3a19aSMatthew G. Knepley } 89075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 89175d3a19aSMatthew G. Knepley #if 1 89275d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 89375d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 89475d3a19aSMatthew G. Knepley if ((supportRef[p] < cStartNew) || (supportRef[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportRef[p], cStartNew, cEndNew); 89575d3a19aSMatthew G. Knepley } 89675d3a19aSMatthew G. Knepley #endif 89775d3a19aSMatthew G. Knepley } 89875d3a19aSMatthew G. Knepley } 89975d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 90075d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 90175d3a19aSMatthew G. Knepley const PetscInt *cone; 90275d3a19aSMatthew G. Knepley PetscInt coneNew[2], supportNew[2]; 90375d3a19aSMatthew G. Knepley 90475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 90575d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 90675d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 90775d3a19aSMatthew G. Knepley 90875d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 90975d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 91075d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 91175d3a19aSMatthew G. Knepley #if 1 91275d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 91375d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 91475d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 91575d3a19aSMatthew G. Knepley } 91675d3a19aSMatthew G. Knepley #endif 91775d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + r; 91875d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + (r+1)%4; 91975d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 92075d3a19aSMatthew G. Knepley #if 1 92175d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 92275d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 92375d3a19aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 92475d3a19aSMatthew G. Knepley } 92575d3a19aSMatthew G. Knepley #endif 92675d3a19aSMatthew G. Knepley } 92775d3a19aSMatthew G. Knepley } 92875d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 92975d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 93075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 93175d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 93275d3a19aSMatthew G. Knepley PetscInt size, s; 93375d3a19aSMatthew G. Knepley 93475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 93575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 93675d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 93775d3a19aSMatthew G. Knepley PetscInt r = 0; 93875d3a19aSMatthew G. Knepley 93975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 94075d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 94175d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 94275d3a19aSMatthew G. Knepley } 94375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 94475d3a19aSMatthew G. Knepley #if 1 94575d3a19aSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 94675d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 94775d3a19aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 94875d3a19aSMatthew G. Knepley } 94975d3a19aSMatthew G. Knepley #endif 95075d3a19aSMatthew G. Knepley } 95175d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells supports */ 95275d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 95375d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 95475d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 95575d3a19aSMatthew G. Knepley PetscInt size, s; 95675d3a19aSMatthew G. Knepley 95775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 95875d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 95975d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 96075d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 96175d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 96275d3a19aSMatthew G. Knepley PetscInt r = 0; 96375d3a19aSMatthew G. Knepley 96475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 96575d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 96675d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 96775d3a19aSMatthew G. Knepley else if (cone[3] == f) r = 3; 96875d3a19aSMatthew G. Knepley supportRef[2+s] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*4 + r; 96975d3a19aSMatthew G. Knepley } 97075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 97175d3a19aSMatthew G. Knepley #if 1 97275d3a19aSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 97375d3a19aSMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 97475d3a19aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 97575d3a19aSMatthew G. Knepley } 97675d3a19aSMatthew G. Knepley #endif 97775d3a19aSMatthew G. Knepley } 97875d3a19aSMatthew G. Knepley /* Cell vertices have 4 supports */ 97975d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 98075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 98175d3a19aSMatthew G. Knepley PetscInt supportNew[4]; 98275d3a19aSMatthew G. Knepley 98375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 98475d3a19aSMatthew G. Knepley supportNew[r] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 98575d3a19aSMatthew G. Knepley } 98675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 98775d3a19aSMatthew G. Knepley } 98875d3a19aSMatthew G. Knepley break; 98975d3a19aSMatthew G. Knepley case 3: 99075d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 99175d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 99275d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 99375d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 99475d3a19aSMatthew G. Knepley /* Interior cells have 3 faces */ 99575d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 99675d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4; 99775d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 99875d3a19aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 99975d3a19aSMatthew G. Knepley 100075d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 100175d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 100275d3a19aSMatthew G. Knepley /* A triangle */ 100375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 100475d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 100575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 2; 100675d3a19aSMatthew G. Knepley orntNew[1] = -2; 100775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 100875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 100975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 101075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 101175d3a19aSMatthew G. Knepley #if 1 101275d3a19aSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cEndNew); 101375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 101475d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 101575d3a19aSMatthew G. Knepley } 101675d3a19aSMatthew G. Knepley #endif 101775d3a19aSMatthew G. Knepley /* B triangle */ 101875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 101975d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 102075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 102175d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 102275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 0; 102375d3a19aSMatthew G. Knepley orntNew[2] = -2; 102475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 102575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 102675d3a19aSMatthew G. Knepley #if 1 102775d3a19aSMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cEndNew); 102875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 102975d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 103075d3a19aSMatthew G. Knepley } 103175d3a19aSMatthew G. Knepley #endif 103275d3a19aSMatthew G. Knepley /* C triangle */ 103375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 1; 103475d3a19aSMatthew G. Knepley orntNew[0] = -2; 103575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 103675d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 103775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 103875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 103975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 104075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 104175d3a19aSMatthew G. Knepley #if 1 104275d3a19aSMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+2, cStartNew, cEndNew); 104375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 104475d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 104575d3a19aSMatthew G. Knepley } 104675d3a19aSMatthew G. Knepley #endif 104775d3a19aSMatthew G. Knepley /* D triangle */ 104875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 0; 104975d3a19aSMatthew G. Knepley orntNew[0] = 0; 105075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 1; 105175d3a19aSMatthew G. Knepley orntNew[1] = 0; 105275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 2; 105375d3a19aSMatthew G. Knepley orntNew[2] = 0; 105475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 105575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 105675d3a19aSMatthew G. Knepley #if 1 105775d3a19aSMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+3, cStartNew, cEndNew); 105875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 105975d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 106075d3a19aSMatthew G. Knepley } 106175d3a19aSMatthew G. Knepley #endif 106275d3a19aSMatthew G. Knepley } 106375d3a19aSMatthew G. Knepley /* 106475d3a19aSMatthew G. Knepley 2----3----3 106575d3a19aSMatthew G. Knepley | | 106675d3a19aSMatthew G. Knepley | B | 106775d3a19aSMatthew G. Knepley | | 106875d3a19aSMatthew G. Knepley 0----4--- 1 106975d3a19aSMatthew G. Knepley | | 107075d3a19aSMatthew G. Knepley | A | 107175d3a19aSMatthew G. Knepley | | 107275d3a19aSMatthew G. Knepley 0----2----1 107375d3a19aSMatthew G. Knepley */ 107475d3a19aSMatthew G. Knepley /* Hybrid cells have 4 faces */ 107575d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 107675d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2; 107775d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 107875d3a19aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 107975d3a19aSMatthew G. Knepley 108075d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 108175d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 108275d3a19aSMatthew G. Knepley /* A quad */ 108375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 108475d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 108575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 108675d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 108775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (cone[2] - fMax); 108875d3a19aSMatthew G. Knepley orntNew[2] = 0; 108975d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 109075d3a19aSMatthew G. Knepley orntNew[3] = 0; 109175d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 109275d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 109375d3a19aSMatthew G. Knepley #if 1 109475d3a19aSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cEndNew); 109575d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 109675d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 109775d3a19aSMatthew G. Knepley } 109875d3a19aSMatthew G. Knepley #endif 109975d3a19aSMatthew G. Knepley /* B quad */ 110075d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 110175d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 110275d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 110375d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 110475d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 110575d3a19aSMatthew G. Knepley orntNew[2] = 0; 110675d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (cone[3] - fMax); 110775d3a19aSMatthew G. Knepley orntNew[3] = 0; 110875d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 110975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 111075d3a19aSMatthew G. Knepley #if 1 111175d3a19aSMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cEndNew); 111275d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 111375d3a19aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 111475d3a19aSMatthew G. Knepley } 111575d3a19aSMatthew G. Knepley #endif 111675d3a19aSMatthew G. Knepley } 111775d3a19aSMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 111875d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 111975d3a19aSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 112075d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 112175d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 112275d3a19aSMatthew G. Knepley 112375d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 112475d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 1125297d2bf4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 112675d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 112775d3a19aSMatthew G. Knepley 112875d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 112975d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 113075d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 113175d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 113275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 113375d3a19aSMatthew G. Knepley #if 1 113475d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 113575d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 113675d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 113775d3a19aSMatthew G. Knepley } 113875d3a19aSMatthew G. Knepley #endif 113975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 114075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 114175d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 114275d3a19aSMatthew G. Knepley if (support[s] >= cMax) { 114375d3a19aSMatthew G. Knepley supportRef[s] = cStartNew + (cMax - cStart)*4 + (support[s] - cMax)*2 + r; 114475d3a19aSMatthew G. Knepley } else { 114575d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 114675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1147297d2bf4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 114875d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 114975d3a19aSMatthew G. Knepley if (cone[c] == f) break; 115075d3a19aSMatthew G. Knepley } 1151297d2bf4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%3 : (c+r)%3); 115275d3a19aSMatthew G. Knepley } 115375d3a19aSMatthew G. Knepley } 115475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 115575d3a19aSMatthew G. Knepley #if 1 115675d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 115775d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 115875d3a19aSMatthew G. Knepley if ((supportRef[p] < cStartNew) || (supportRef[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportRef[p], cStartNew, cEndNew); 115975d3a19aSMatthew G. Knepley } 116075d3a19aSMatthew G. Knepley #endif 116175d3a19aSMatthew G. Knepley } 116275d3a19aSMatthew G. Knepley } 116375d3a19aSMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 116475d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 116575d3a19aSMatthew G. Knepley const PetscInt *cone; 116675d3a19aSMatthew G. Knepley 116775d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 116875d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 116975d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + r; 117075d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 117175d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 117275d3a19aSMatthew G. Knepley 117375d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 117475d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - fStart); 117575d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 117675d3a19aSMatthew G. Knepley #if 1 117775d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 117875d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 117975d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 118075d3a19aSMatthew G. Knepley } 118175d3a19aSMatthew G. Knepley #endif 118275d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + (r+1)%3; 118375d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + 3; 118475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 118575d3a19aSMatthew G. Knepley #if 1 118675d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 118775d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 118875d3a19aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 118975d3a19aSMatthew G. Knepley } 119075d3a19aSMatthew G. Knepley #endif 119175d3a19aSMatthew G. Knepley } 119275d3a19aSMatthew G. Knepley } 119375d3a19aSMatthew G. Knepley /* Interior hybrid faces have 2 vertices and the same cells */ 119475d3a19aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 119575d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (f - fMax); 119675d3a19aSMatthew G. Knepley const PetscInt *cone; 119775d3a19aSMatthew G. Knepley const PetscInt *support; 119875d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 119975d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 120075d3a19aSMatthew G. Knepley PetscInt size, s, r; 120175d3a19aSMatthew G. Knepley 120275d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 120375d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 120475d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 120575d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 120675d3a19aSMatthew G. Knepley #if 1 120775d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 120875d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 120975d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 121075d3a19aSMatthew G. Knepley } 121175d3a19aSMatthew G. Knepley #endif 121275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 121375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 121475d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 121575d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 121675d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 121775d3a19aSMatthew G. Knepley if (cone[r+2] == f) break; 121875d3a19aSMatthew G. Knepley } 121975d3a19aSMatthew G. Knepley supportNew[s] = (cMax - cStart)*4 + (support[s] - cMax)*2 + r; 122075d3a19aSMatthew G. Knepley } 122175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 122275d3a19aSMatthew G. Knepley #if 1 122375d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 122475d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 122575d3a19aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 122675d3a19aSMatthew G. Knepley } 122775d3a19aSMatthew G. Knepley #endif 122875d3a19aSMatthew G. Knepley } 122975d3a19aSMatthew G. Knepley /* Cell hybrid faces have 2 vertices and 2 cells */ 123075d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 123175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 123275d3a19aSMatthew G. Knepley const PetscInt *cone; 123375d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 123475d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 123575d3a19aSMatthew G. Knepley 123675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 123775d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[0] - fStart); 123875d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[1] - fStart); 123975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 124075d3a19aSMatthew G. Knepley #if 1 124175d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 124275d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 124375d3a19aSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 124475d3a19aSMatthew G. Knepley } 124575d3a19aSMatthew G. Knepley #endif 124675d3a19aSMatthew G. Knepley supportNew[0] = (cMax - cStart)*4 + (c - cMax)*2 + 0; 124775d3a19aSMatthew G. Knepley supportNew[1] = (cMax - cStart)*4 + (c - cMax)*2 + 1; 124875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 124975d3a19aSMatthew G. Knepley #if 1 125075d3a19aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 125175d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 125275d3a19aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 125375d3a19aSMatthew G. Knepley } 125475d3a19aSMatthew G. Knepley #endif 125575d3a19aSMatthew G. Knepley } 125675d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 125775d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 125875d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 125975d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 126075d3a19aSMatthew G. Knepley PetscInt size, s; 126175d3a19aSMatthew G. Knepley 126275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 126375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 126475d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 126575d3a19aSMatthew G. Knepley if (support[s] >= fMax) { 126675d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (support[s] - fMax); 126775d3a19aSMatthew G. Knepley } else { 126875d3a19aSMatthew G. Knepley PetscInt r = 0; 126975d3a19aSMatthew G. Knepley 127075d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 127175d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 127275d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 127375d3a19aSMatthew G. Knepley } 127475d3a19aSMatthew G. Knepley } 127575d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 127675d3a19aSMatthew G. Knepley #if 1 127775d3a19aSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 127875d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 127975d3a19aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 128075d3a19aSMatthew G. Knepley } 128175d3a19aSMatthew G. Knepley #endif 128275d3a19aSMatthew G. Knepley } 128375d3a19aSMatthew G. Knepley /* Face vertices have 2 + (2 interior, 1 hybrid) supports */ 128475d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 128575d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 128675d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 128775d3a19aSMatthew G. Knepley PetscInt size, newSize = 2, s; 128875d3a19aSMatthew G. Knepley 128975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 129075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 129175d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 129275d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 129375d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 129475d3a19aSMatthew G. Knepley PetscInt r = 0; 129575d3a19aSMatthew G. Knepley 129675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 129775d3a19aSMatthew G. Knepley if (support[s] >= cMax) { 129875d3a19aSMatthew G. Knepley supportRef[newSize+0] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (support[s] - cMax); 129975d3a19aSMatthew G. Knepley 130075d3a19aSMatthew G. Knepley newSize += 1; 130175d3a19aSMatthew G. Knepley } else { 130275d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 130375d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 130475d3a19aSMatthew G. Knepley supportRef[newSize+0] = fStartNew + (fMax - fStart)*2 + (support[s] - cStart)*3 + (r+2)%3; 130575d3a19aSMatthew G. Knepley supportRef[newSize+1] = fStartNew + (fMax - fStart)*2 + (support[s] - cStart)*3 + r; 130675d3a19aSMatthew G. Knepley 130775d3a19aSMatthew G. Knepley newSize += 2; 130875d3a19aSMatthew G. Knepley } 130975d3a19aSMatthew G. Knepley } 131075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 131175d3a19aSMatthew G. Knepley #if 1 131275d3a19aSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 131375d3a19aSMatthew G. Knepley for (p = 0; p < newSize; ++p) { 131475d3a19aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 131575d3a19aSMatthew G. Knepley } 131675d3a19aSMatthew G. Knepley #endif 131775d3a19aSMatthew G. Knepley } 131875d3a19aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 131975d3a19aSMatthew G. Knepley break; 1320b5da9499SMatthew G. Knepley case 5: 1321b5da9499SMatthew G. Knepley /* Simplicial 3D */ 1322b5da9499SMatthew G. Knepley /* All cells have 4 faces: Tet face order is prescribed in DMPlexGetFaces_Internal() */ 1323b5da9499SMatthew G. Knepley ierr = DMPlexGetRawFaces_Internal(dm, 3, 4, cellInd, NULL, NULL, &faces);CHKERRQ(ierr); 1324b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 1325b5da9499SMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8; 1326b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 1327b5da9499SMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 1328b5da9499SMatthew G. Knepley 1329b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1330b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1331b5da9499SMatthew G. Knepley /* A tetrahedron: {0, a, c, d} */ 1332b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + (ornt[0] < 0 ? (-(ornt[0]+1)+1)%3 : ornt[0]); /* A */ 1333b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1334b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + (ornt[1] < 0 ? (-(ornt[1]+1)+1)%3 : ornt[1]); /* A */ 1335b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1336b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + (ornt[2] < 0 ? (-(ornt[2]+1)+1)%3 : ornt[2]); /* A */ 1337b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1338b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 0; 1339b5da9499SMatthew G. Knepley orntNew[3] = 0; 1340b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 1341b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 1342b5da9499SMatthew G. Knepley #if 1 1343b5da9499SMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cEndNew); 1344b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1345b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1346b5da9499SMatthew G. Knepley } 1347b5da9499SMatthew G. Knepley #endif 1348b5da9499SMatthew G. Knepley /* B tetrahedron: {a, 1, b, e} */ 1349b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + (ornt[0] < 0 ? (-(ornt[0]+1)+0)%3 : (ornt[0]+1)%3); /* B */ 1350b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1351b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + (ornt[1] < 0 ? (-(ornt[1]+1)+2)%3 : (ornt[1]+2)%3); /* C */ 1352b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1353b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 1; 1354b5da9499SMatthew G. Knepley orntNew[2] = 0; 1355b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + (ornt[3] < 0 ? (-(ornt[3]+1)+0)%3 : (ornt[3]+1)%3); /* B */ 1356b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 1357b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 1358b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 1359b5da9499SMatthew G. Knepley #if 1 1360b5da9499SMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cEndNew); 1361b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1362b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1363b5da9499SMatthew G. Knepley } 1364b5da9499SMatthew G. Knepley #endif 1365b5da9499SMatthew G. Knepley /* C tetrahedron: {c, b, 2, f} */ 1366b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + (ornt[0] < 0 ? (-(ornt[0]+1)+2)%3 : (ornt[0]+2)%3); /* C */ 1367b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1368b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 2; 1369b5da9499SMatthew G. Knepley orntNew[1] = 0; 1370b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + (ornt[2] < 0 ? (-(ornt[2]+1)+0)%3 : (ornt[2]+1)%3); /* B */ 1371b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1372b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + (ornt[3] < 0 ? (-(ornt[3]+1)+1)%3 : (ornt[3]+0)%3); /* A */ 1373b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 1374b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 1375b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 1376b5da9499SMatthew G. Knepley #if 1 1377b5da9499SMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+2, cStartNew, cEndNew); 1378b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1379b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1380b5da9499SMatthew G. Knepley } 1381b5da9499SMatthew G. Knepley #endif 1382b5da9499SMatthew G. Knepley /* D tetrahedron: {d, e, f, 3} */ 1383b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 3; 1384b5da9499SMatthew G. Knepley orntNew[0] = 0; 1385b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + (ornt[1] < 0 ? (-(ornt[1]+1)+0)%3 : (ornt[1]+1)%3); /* B */ 1386b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1387b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + (ornt[2] < 0 ? (-(ornt[2]+1)+2)%3 : (ornt[2]+2)%3); /* C */ 1388b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1389b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + (ornt[3] < 0 ? (-(ornt[3]+1)+2)%3 : (ornt[3]+2)%3); /* C */ 1390b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 1391b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 1392b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 1393b5da9499SMatthew G. Knepley #if 1 1394b5da9499SMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+3, cStartNew, cEndNew); 1395b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1396b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1397b5da9499SMatthew G. Knepley } 1398b5da9499SMatthew G. Knepley #endif 1399b5da9499SMatthew G. Knepley /* A' tetrahedron: {d, a, c, f} */ 1400b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 0; 1401b5da9499SMatthew G. Knepley orntNew[0] = -3; 1402b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 1403b5da9499SMatthew G. Knepley orntNew[1] = 0; 1404b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + 3; 1405b5da9499SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -((-(ornt[2]+1)+2)%3+1) : (ornt[2]+2)%3; 1406b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 1407b5da9499SMatthew G. Knepley orntNew[3] = 0; 1408b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 1409b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 1410b5da9499SMatthew G. Knepley #if 1 1411b5da9499SMatthew G. Knepley if ((newp+4 < cStartNew) || (newp+4 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+4, cStartNew, cEndNew); 1412b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1413b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1414b5da9499SMatthew G. Knepley } 1415b5da9499SMatthew G. Knepley #endif 1416b5da9499SMatthew G. Knepley /* B' tetrahedron: {e, b, a, f} */ 1417b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 1; 1418b5da9499SMatthew G. Knepley orntNew[0] = -3; 1419b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (cone[3] - fStart)*4 + 3; 1420b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -((-(ornt[3]+1)+1)%3+1) : (ornt[3]+1)%3; 1421b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 1422b5da9499SMatthew G. Knepley orntNew[2] = 0; 1423b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 1424b5da9499SMatthew G. Knepley orntNew[3] = 0; 1425b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 1426b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 1427b5da9499SMatthew G. Knepley #if 1 1428b5da9499SMatthew G. Knepley if ((newp+5 < cStartNew) || (newp+5 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+5, cStartNew, cEndNew); 1429b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1430b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1431b5da9499SMatthew G. Knepley } 1432b5da9499SMatthew G. Knepley #endif 1433b5da9499SMatthew G. Knepley /* C' tetrahedron: {b, f, c, a} */ 1434b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 2; 1435b5da9499SMatthew G. Knepley orntNew[0] = -3; 1436b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 1437b5da9499SMatthew G. Knepley orntNew[1] = -2; 1438b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (cone[0] - fStart)*4 + 3; 1439b5da9499SMatthew G. Knepley orntNew[2] = ornt[0] < 0 ? (-(ornt[0]+1)+1)%3 : -((ornt[0]+1)%3+1); 1440b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 1441b5da9499SMatthew G. Knepley orntNew[3] = -1; 1442b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 1443b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 1444b5da9499SMatthew G. Knepley #if 1 1445b5da9499SMatthew G. Knepley if ((newp+6 < cStartNew) || (newp+6 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+6, cStartNew, cEndNew); 1446b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1447b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1448b5da9499SMatthew G. Knepley } 1449b5da9499SMatthew G. Knepley #endif 1450b5da9499SMatthew G. Knepley /* D' tetrahedron: {f, e, d, a} */ 1451b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 3; 1452b5da9499SMatthew G. Knepley orntNew[0] = -3; 1453b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 1454b5da9499SMatthew G. Knepley orntNew[1] = -3; 1455b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 1456b5da9499SMatthew G. Knepley orntNew[2] = -2; 1457b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (cone[1] - fStart)*4 + 3; 1458b5da9499SMatthew G. Knepley orntNew[3] = ornt[2]; 1459b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 1460b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 1461b5da9499SMatthew G. Knepley #if 1 1462b5da9499SMatthew G. Knepley if ((newp+7 < cStartNew) || (newp+7 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+7, cStartNew, cEndNew); 1463b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1464b5da9499SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 1465b5da9499SMatthew G. Knepley } 1466b5da9499SMatthew G. Knepley #endif 1467b5da9499SMatthew G. Knepley } 1468b5da9499SMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 1469b5da9499SMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 1470b5da9499SMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 1471b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 1472b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4; 1473b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 1474b5da9499SMatthew G. Knepley PetscInt coneNew[3], orntNew[3], coneSize, supportSize, s; 1475b5da9499SMatthew G. Knepley 1476b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 1477b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 1478b5da9499SMatthew G. Knepley /* A triangle */ 1479b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1 : 0); 1480b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1481b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 2; 1482b5da9499SMatthew G. Knepley orntNew[1] = -2; 1483b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 0 : 1); 1484b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1485b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 1486b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 1487b5da9499SMatthew G. Knepley #if 1 1488b5da9499SMatthew G. Knepley if ((newp+0 < fStartNew) || (newp+0 >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+0, fStartNew, fEndNew); 1489b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1490b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1491b5da9499SMatthew G. Knepley } 1492b5da9499SMatthew G. Knepley #endif 1493b5da9499SMatthew G. Knepley /* B triangle */ 1494b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 0 : 1); 1495b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1496b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1 : 0); 1497b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1498b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 0; 1499b5da9499SMatthew G. Knepley orntNew[2] = -2; 1500b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 1501b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 1502b5da9499SMatthew G. Knepley #if 1 1503b5da9499SMatthew G. Knepley if ((newp+1 < fStartNew) || (newp+1 >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+1, fStartNew, fEndNew); 1504b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1505b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1506b5da9499SMatthew G. Knepley } 1507b5da9499SMatthew G. Knepley #endif 1508b5da9499SMatthew G. Knepley /* C triangle */ 1509b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 1; 1510b5da9499SMatthew G. Knepley orntNew[0] = -2; 1511b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 0 : 1); 1512b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1513b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 1 : 0); 1514b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1515b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 1516b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 1517b5da9499SMatthew G. Knepley #if 1 1518b5da9499SMatthew G. Knepley if ((newp+2 < fStartNew) || (newp+2 >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+2, fStartNew, fEndNew); 1519b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1520b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1521b5da9499SMatthew G. Knepley } 1522b5da9499SMatthew G. Knepley #endif 1523b5da9499SMatthew G. Knepley /* D triangle */ 1524b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 0; 1525b5da9499SMatthew G. Knepley orntNew[0] = 0; 1526b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 1; 1527b5da9499SMatthew G. Knepley orntNew[1] = 0; 1528b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 2; 1529b5da9499SMatthew G. Knepley orntNew[2] = 0; 1530b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 1531b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 1532b5da9499SMatthew G. Knepley #if 1 1533b5da9499SMatthew G. Knepley if ((newp+3 < fStartNew) || (newp+3 >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+3, fStartNew, fEndNew); 1534b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1535b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1536b5da9499SMatthew G. Knepley } 1537b5da9499SMatthew G. Knepley #endif 1538b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 1539b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 1540b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 1541b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 1542b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 1543b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1544b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 1545b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 1546b5da9499SMatthew G. Knepley if (cone[c] == f) break; 1547b5da9499SMatthew G. Knepley } 1548b5da9499SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*8 + (r==3 ? (c+2)%4 + 4 : (ornt[c] < 0 ? faces[c*3+(-(ornt[c]+1)+1+3-r)%3] : faces[c*3+r])); 1549b5da9499SMatthew G. Knepley } 1550b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportRef);CHKERRQ(ierr); 1551b5da9499SMatthew G. Knepley #if 1 1552b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1553b5da9499SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 1554b5da9499SMatthew G. Knepley if ((supportRef[p] < cStartNew) || (supportRef[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportRef[p], cStartNew, cEndNew); 1555b5da9499SMatthew G. Knepley } 1556b5da9499SMatthew G. Knepley #endif 1557b5da9499SMatthew G. Knepley } 1558b5da9499SMatthew G. Knepley } 1559b5da9499SMatthew G. Knepley /* Interior faces have 3 edges and 2 cells */ 1560b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 1561b5da9499SMatthew G. Knepley PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8; 1562b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 1563b5da9499SMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 1564b5da9499SMatthew G. Knepley PetscInt supportNew[2]; 1565b5da9499SMatthew G. Knepley 1566b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1567b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1568b5da9499SMatthew G. Knepley /* Face A: {c, a, d} */ 1569b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+0)%3 : (ornt[0]+2)%3); 1570b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1571b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+0)%3 : (ornt[1]+2)%3); 1572b5da9499SMatthew G. Knepley orntNew[1] = ornt[1] < 0 ? -2 : 0; 1573b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+0)%3 : (ornt[2]+2)%3); 1574b5da9499SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 1575b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1576b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1577b5da9499SMatthew G. Knepley #if 1 1578b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1579b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1580b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1581b5da9499SMatthew G. Knepley } 1582b5da9499SMatthew G. Knepley #endif 1583b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0; 1584b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 0+4; 1585b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1586b5da9499SMatthew G. Knepley #if 1 1587b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1588b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1589b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1590b5da9499SMatthew G. Knepley } 1591b5da9499SMatthew G. Knepley #endif 1592b5da9499SMatthew G. Knepley ++newp; 1593b5da9499SMatthew G. Knepley /* Face B: {a, b, e} */ 1594b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+2)%3 : (ornt[0]+0)%3); 1595b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1596b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+2)%3 : (ornt[3]+0)%3); 1597b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 1598b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+1)%3 : (ornt[1]+1)%3); 1599b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 1600b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1601b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1602b5da9499SMatthew G. Knepley #if 1 1603b5da9499SMatthew G. Knepley if ((newp+1 < fStartNew) || (newp+1 >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+1, fStartNew, fEndNew); 1604b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1605b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1606b5da9499SMatthew G. Knepley } 1607b5da9499SMatthew G. Knepley #endif 1608b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1; 1609b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 1+4; 1610b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1611b5da9499SMatthew G. Knepley #if 1 1612b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1613b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1614b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1615b5da9499SMatthew G. Knepley } 1616b5da9499SMatthew G. Knepley #endif 1617b5da9499SMatthew G. Knepley ++newp; 1618b5da9499SMatthew G. Knepley /* Face C: {c, f, b} */ 1619b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+2)%3 : (ornt[2]+0)%3); 1620b5da9499SMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? -2 : 0; 1621b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+0)%3 : (ornt[3]+2)%3); 1622b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 1623b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+1)%3 : (ornt[0]+1)%3); 1624b5da9499SMatthew G. Knepley orntNew[2] = ornt[0] < 0 ? -2 : 0; 1625b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1626b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1627b5da9499SMatthew G. Knepley #if 1 1628b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1629b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1630b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1631b5da9499SMatthew G. Knepley } 1632b5da9499SMatthew G. Knepley #endif 1633b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 2; 1634b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 1635b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1636b5da9499SMatthew G. Knepley #if 1 1637b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1638b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1639b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1640b5da9499SMatthew G. Knepley } 1641b5da9499SMatthew G. Knepley #endif 1642b5da9499SMatthew G. Knepley ++newp; 1643b5da9499SMatthew G. Knepley /* Face D: {d, e, f} */ 1644b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+2)%3 : (ornt[1]+0)%3); 1645b5da9499SMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 1646b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+1)%3 : (ornt[3]+1)%3); 1647b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 1648b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+1)%3 : (ornt[2]+1)%3); 1649b5da9499SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 1650b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1651b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1652b5da9499SMatthew G. Knepley #if 1 1653b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1654b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1655b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1656b5da9499SMatthew G. Knepley } 1657b5da9499SMatthew G. Knepley #endif 1658b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 3; 1659b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 1660b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1661b5da9499SMatthew G. Knepley #if 1 1662b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1663b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1664b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1665b5da9499SMatthew G. Knepley } 1666b5da9499SMatthew G. Knepley #endif 1667b5da9499SMatthew G. Knepley ++newp; 1668b5da9499SMatthew G. Knepley /* Face E: {d, f, a} */ 1669b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+1)%3 : (ornt[2]+1)%3); 1670b5da9499SMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? 0 : -2; 1671b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1672b5da9499SMatthew G. Knepley orntNew[1] = 0; 1673b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+0)%3 : (ornt[1]+2)%3); 1674b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 1675b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1676b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1677b5da9499SMatthew G. Knepley #if 1 1678b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1679b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1680b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1681b5da9499SMatthew G. Knepley } 1682b5da9499SMatthew G. Knepley #endif 1683b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 1684b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 1685b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1686b5da9499SMatthew G. Knepley #if 1 1687b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1688b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1689b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1690b5da9499SMatthew G. Knepley } 1691b5da9499SMatthew G. Knepley #endif 1692b5da9499SMatthew G. Knepley ++newp; 1693b5da9499SMatthew G. Knepley /* Face F: {c, a, f} */ 1694b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+0)%3 : (ornt[0]+2)%3); 1695b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1696b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1697b5da9499SMatthew G. Knepley orntNew[1] = -2; 1698b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+2)%3 : (ornt[2]+0)%3); 1699b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? 0 : -2; 1700b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1701b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1702b5da9499SMatthew G. Knepley #if 1 1703b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1704b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1705b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1706b5da9499SMatthew G. Knepley } 1707b5da9499SMatthew G. Knepley #endif 1708b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 1709b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 1710b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1711b5da9499SMatthew G. Knepley #if 1 1712b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1713b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1714b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1715b5da9499SMatthew G. Knepley } 1716b5da9499SMatthew G. Knepley #endif 1717b5da9499SMatthew G. Knepley ++newp; 1718b5da9499SMatthew G. Knepley /* Face G: {e, a, f} */ 1719b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+1)%3 : (ornt[1]+1)%3); 1720b5da9499SMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 1721b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1722b5da9499SMatthew G. Knepley orntNew[1] = -2; 1723b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+1)%3 : (ornt[3]+1)%3); 1724b5da9499SMatthew G. Knepley orntNew[2] = ornt[3] < 0 ? 0 : -2; 1725b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1726b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1727b5da9499SMatthew G. Knepley #if 1 1728b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1729b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1730b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1731b5da9499SMatthew G. Knepley } 1732b5da9499SMatthew G. Knepley #endif 1733b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 1734b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 1735b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1736b5da9499SMatthew G. Knepley #if 1 1737b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1738b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1739b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1740b5da9499SMatthew G. Knepley } 1741b5da9499SMatthew G. Knepley #endif 1742b5da9499SMatthew G. Knepley ++newp; 1743b5da9499SMatthew G. Knepley /* Face H: {a, b, f} */ 1744b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+2)%3 : (ornt[0]+0)%3); 1745b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1746b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+0)%3 : (ornt[3]+2)%3); 1747b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? 0 : -2; 1748b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1749b5da9499SMatthew G. Knepley orntNew[2] = 0; 1750b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1751b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1752b5da9499SMatthew G. Knepley #if 1 1753b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1754b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1755b5da9499SMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 1756b5da9499SMatthew G. Knepley } 1757b5da9499SMatthew G. Knepley #endif 1758b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 1759b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 1760b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1761b5da9499SMatthew G. Knepley #if 1 1762b5da9499SMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 1763b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1764b5da9499SMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 1765b5da9499SMatthew G. Knepley } 1766b5da9499SMatthew G. Knepley #endif 1767b5da9499SMatthew G. Knepley ++newp; 1768b5da9499SMatthew G. Knepley } 1769b5da9499SMatthew G. Knepley /* Split Edges have 2 vertices and the same faces as the parent */ 1770b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 1771b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 1772b5da9499SMatthew G. Knepley 1773b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 1774b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 1775b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 1776b5da9499SMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 1777b5da9499SMatthew G. Knepley 1778b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 1779b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 1780b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 1781b5da9499SMatthew G. Knepley coneNew[(r+1)%2] = newv; 1782b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1783b5da9499SMatthew G. Knepley #if 1 1784b5da9499SMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 1785b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1786b5da9499SMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 1787b5da9499SMatthew G. Knepley } 1788b5da9499SMatthew G. Knepley #endif 1789b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 1790b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 1791b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 1792b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 1793b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1794b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 1795b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 1796b5da9499SMatthew G. Knepley if (cone[c] == e) break; 1797b5da9499SMatthew G. Knepley } 1798b5da9499SMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (c + (ornt[c] < 0 ? 1-r : r))%3; 1799b5da9499SMatthew G. Knepley } 1800b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 1801b5da9499SMatthew G. Knepley #if 1 1802b5da9499SMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 1803b5da9499SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 1804b5da9499SMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 1805b5da9499SMatthew G. Knepley } 1806b5da9499SMatthew G. Knepley #endif 1807b5da9499SMatthew G. Knepley } 1808b5da9499SMatthew G. Knepley } 180986f0afeeSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells*(1/2) faces */ 1810b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 1811b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 1812b5da9499SMatthew G. Knepley PetscInt coneSize, supportSize, s; 1813b5da9499SMatthew G. Knepley 1814b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 1815b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 1816b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 1817b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + r; 1818b5da9499SMatthew G. Knepley PetscInt coneNew[2], intFaces = 0, er, eint[4] = {1, 0, 2, 0}; 1819b5da9499SMatthew G. Knepley PetscInt fint[24] = { 1, 7, -1, -1, 0, 5, 1820b5da9499SMatthew G. Knepley -1, -1, 1, 6, 0, 4, 1821b5da9499SMatthew G. Knepley 2, 5, 3, 4, -1, -1, 1822b5da9499SMatthew G. Knepley -1, -1, 3, 6, 2, 7}; 1823b5da9499SMatthew G. Knepley 1824b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 1825b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[(r+0)%3] - eStart); 1826b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - eStart); 1827b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1828b5da9499SMatthew G. Knepley #if 1 1829b5da9499SMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 1830b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1831b5da9499SMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 1832b5da9499SMatthew G. Knepley } 1833b5da9499SMatthew G. Knepley #endif 1834b5da9499SMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + (r+1)%3; 1835b5da9499SMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + 3; 1836b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 1837b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 1838b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1839b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 1840b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 184186f0afeeSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 184286f0afeeSMatthew G. Knepley er = ornt[c] < 0 ? (-(ornt[c]+1) + 2-r)%3 : (ornt[c] + r)%3; 1843b5da9499SMatthew G. Knepley if (er == eint[c]) { 1844b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + (c + 2)%4; 1845b5da9499SMatthew G. Knepley } else { 1846b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 0]; 1847b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 1]; 1848b5da9499SMatthew G. Knepley } 1849b5da9499SMatthew G. Knepley } 1850b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 1851b5da9499SMatthew G. Knepley #if 1 1852b5da9499SMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 1853b5da9499SMatthew G. Knepley for (p = 0; p < intFaces; ++p) { 1854b5da9499SMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 1855b5da9499SMatthew G. Knepley } 1856b5da9499SMatthew G. Knepley #endif 1857b5da9499SMatthew G. Knepley } 1858b5da9499SMatthew G. Knepley } 1859b5da9499SMatthew G. Knepley /* Interior edges have 2 vertices and 4 faces */ 1860b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 1861b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1862b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *fcone; 18634a40f731SMatthew G. Knepley PetscInt coneNew[2], supportNew[4], find; 1864b5da9499SMatthew G. Knepley 1865b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1866b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1867b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &fcone);CHKERRQ(ierr); 1868b5da9499SMatthew G. Knepley find = ornt[0] < 0 ? (-(ornt[0]+1) + 0)%3 : ornt[0]; 1869b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 1870b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &fcone);CHKERRQ(ierr); 1871b5da9499SMatthew G. Knepley find = ornt[2] < 0 ? (-(ornt[2]+1) + 1)%3 : (ornt[2]+1)%3; 1872b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 1873b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1874b5da9499SMatthew G. Knepley #if 1 1875b5da9499SMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 1876b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1877b5da9499SMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 1878b5da9499SMatthew G. Knepley } 1879b5da9499SMatthew G. Knepley #endif 1880b5da9499SMatthew G. Knepley supportNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 1881b5da9499SMatthew G. Knepley supportNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 1882b5da9499SMatthew G. Knepley supportNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 1883b5da9499SMatthew G. Knepley supportNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 1884b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1885b5da9499SMatthew G. Knepley #if 1 1886b5da9499SMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 1887b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1888b5da9499SMatthew G. Knepley if ((supportNew[p] < fStartNew) || (supportNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportNew[p], fStartNew, fEndNew); 1889b5da9499SMatthew G. Knepley } 1890b5da9499SMatthew G. Knepley #endif 1891b5da9499SMatthew G. Knepley } 1892b5da9499SMatthew G. Knepley /* Old vertices have identical supports */ 1893b5da9499SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 1894b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 1895b5da9499SMatthew G. Knepley const PetscInt *support, *cone; 1896b5da9499SMatthew G. Knepley PetscInt size, s; 1897b5da9499SMatthew G. Knepley 1898b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 1899b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 1900b5da9499SMatthew G. Knepley for (s = 0; s < size; ++s) { 1901b5da9499SMatthew G. Knepley PetscInt r = 0; 1902b5da9499SMatthew G. Knepley 1903b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1904b5da9499SMatthew G. Knepley if (cone[1] == v) r = 1; 1905b5da9499SMatthew G. Knepley supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 1906b5da9499SMatthew G. Knepley } 1907b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 1908b5da9499SMatthew G. Knepley #if 1 1909b5da9499SMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 1910b5da9499SMatthew G. Knepley for (p = 0; p < size; ++p) { 1911b5da9499SMatthew G. Knepley if ((supportRef[p] < eStartNew) || (supportRef[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", supportRef[p], eStartNew, eEndNew); 1912b5da9499SMatthew G. Knepley } 1913b5da9499SMatthew G. Knepley #endif 1914b5da9499SMatthew G. Knepley } 1915b5da9499SMatthew G. Knepley /* Edge vertices have 2 + face*2 + 0/1 supports */ 1916b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 1917b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 1918b5da9499SMatthew G. Knepley const PetscInt *cone, *support; 1919b5da9499SMatthew G. Knepley PetscInt *star = NULL, starSize, cellSize = 0, coneSize, size, s; 1920b5da9499SMatthew G. Knepley 1921b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 1922b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 1923b5da9499SMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 1924b5da9499SMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 1925b5da9499SMatthew G. Knepley for (s = 0; s < size; ++s) { 1926b5da9499SMatthew G. Knepley PetscInt r = 0; 1927b5da9499SMatthew G. Knepley 1928b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 1929b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1930b5da9499SMatthew G. Knepley for (r = 0; r < coneSize; ++r) {if (cone[r] == e) break;} 1931b5da9499SMatthew G. Knepley supportRef[2+s*2+0] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*3 + (r+0)%3; 1932b5da9499SMatthew G. Knepley supportRef[2+s*2+1] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*3 + (r+2)%3; 1933b5da9499SMatthew G. Knepley } 1934b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 1935b5da9499SMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 1936b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 1937b5da9499SMatthew G. Knepley PetscInt e01, e23; 1938b5da9499SMatthew G. Knepley 1939b5da9499SMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cEnd)) { 1940b5da9499SMatthew G. Knepley /* Check edge 0-1 */ 1941b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 1942b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 1943b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 1944b5da9499SMatthew G. Knepley e01 = cone[ornt[0] < 0 ? (-(ornt[0]+1) + 0)%3 : ornt[0]]; 1945b5da9499SMatthew G. Knepley /* Check edge 2-3 */ 1946b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 1947b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 1948b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[3], &cone);CHKERRQ(ierr); 1949b5da9499SMatthew G. Knepley e23 = cone[ornt[3] < 0 ? (-(ornt[3]+1) + 2)%3 : (ornt[3] + 2)%3]; 1950b5da9499SMatthew G. Knepley if ((e01 == e) || (e23 == e)) {supportRef[2+size*2+cellSize++] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (star[s] - cStart);} 1951b5da9499SMatthew G. Knepley } 1952b5da9499SMatthew G. Knepley } 1953b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 1954b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 1955b5da9499SMatthew G. Knepley #if 1 1956b5da9499SMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 1957b5da9499SMatthew G. Knepley for (p = 0; p < 2+size*2+cellSize; ++p) { 1958b5da9499SMatthew G. Knepley if ((supportRef[p] < eStartNew) || (supportRef[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", supportRef[p], eStartNew, eEndNew); 1959b5da9499SMatthew G. Knepley } 1960b5da9499SMatthew G. Knepley #endif 1961b5da9499SMatthew G. Knepley } 1962b5da9499SMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 1963b5da9499SMatthew G. Knepley ierr = DMPlexRestoreFaces_Internal(dm, 3, cStart, NULL, NULL, &faces);CHKERRQ(ierr); 1964b5da9499SMatthew G. Knepley break; 1965*2eabf88fSMatthew G. Knepley case 6: 1966*2eabf88fSMatthew G. Knepley /* Hex 3D */ 1967*2eabf88fSMatthew G. Knepley /* 1968*2eabf88fSMatthew G. Knepley Bottom (viewed from top) Top 1969*2eabf88fSMatthew G. Knepley 1---------2---------2 7---------2---------6 1970*2eabf88fSMatthew G. Knepley | | | | | | 1971*2eabf88fSMatthew G. Knepley | B 2 C | | H 2 G | 1972*2eabf88fSMatthew G. Knepley | | | | | | 1973*2eabf88fSMatthew G. Knepley 3----3----0----1----1 3----3----0----1----1 1974*2eabf88fSMatthew G. Knepley | | | | | | 1975*2eabf88fSMatthew G. Knepley | A 0 D | | E 0 F | 1976*2eabf88fSMatthew G. Knepley | | | | | | 1977*2eabf88fSMatthew G. Knepley 0---------0---------3 4---------0---------5 1978*2eabf88fSMatthew G. Knepley */ 1979*2eabf88fSMatthew G. Knepley /* All cells have 6 faces: Bottom, Top, Front, Back, Right, Left */ 1980*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 1981*2eabf88fSMatthew G. Knepley const PetscInt newp = (c - cStart)*8; 1982*2eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt; 1983*2eabf88fSMatthew G. Knepley PetscInt coneNew[6], orntNew[6]; 1984*2eabf88fSMatthew G. Knepley 1985*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1986*2eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1987*2eabf88fSMatthew G. Knepley /* A hex */ 1988*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetRefHexFace_Static(ornt[0], 0); 1989*2eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 1990*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 1991*2eabf88fSMatthew G. Knepley orntNew[1] = 0; 1992*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetRefHexFace_Static(ornt[2], 0); 1993*2eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 1994*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 1995*2eabf88fSMatthew G. Knepley orntNew[3] = 0; 1996*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 1997*2eabf88fSMatthew G. Knepley orntNew[4] = 0; 1998*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetRefHexFace_Static(ornt[5], 0); 1999*2eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 2000*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 2001*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 2002*2eabf88fSMatthew G. Knepley #if 1 2003*2eabf88fSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cEndNew); 2004*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2005*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2006*2eabf88fSMatthew G. Knepley } 2007*2eabf88fSMatthew G. Knepley #endif 2008*2eabf88fSMatthew G. Knepley /* B hex */ 2009*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetRefHexFace_Static(ornt[0], 1); 2010*2eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 2011*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 2012*2eabf88fSMatthew G. Knepley orntNew[1] = 0; 2013*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 2014*2eabf88fSMatthew G. Knepley orntNew[2] = -3; 2015*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetRefHexFace_Static(ornt[3], 1); 2016*2eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 2017*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 2018*2eabf88fSMatthew G. Knepley orntNew[4] = 0; 2019*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetRefHexFace_Static(ornt[5], 3); 2020*2eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 2021*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 2022*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 2023*2eabf88fSMatthew G. Knepley #if 1 2024*2eabf88fSMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cEndNew); 2025*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2026*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2027*2eabf88fSMatthew G. Knepley } 2028*2eabf88fSMatthew G. Knepley #endif 2029*2eabf88fSMatthew G. Knepley /* C hex */ 2030*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetRefHexFace_Static(ornt[0], 2); 2031*2eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 2032*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 2033*2eabf88fSMatthew G. Knepley orntNew[1] = 0; 2034*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 2035*2eabf88fSMatthew G. Knepley orntNew[2] = 0; 2036*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetRefHexFace_Static(ornt[3], 1); 2037*2eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 2038*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetRefHexFace_Static(ornt[4], 1); 2039*2eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 2040*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 2041*2eabf88fSMatthew G. Knepley orntNew[5] = -3; 2042*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 2043*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 2044*2eabf88fSMatthew G. Knepley #if 1 2045*2eabf88fSMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+2, cStartNew, cEndNew); 2046*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2047*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2048*2eabf88fSMatthew G. Knepley } 2049*2eabf88fSMatthew G. Knepley #endif 2050*2eabf88fSMatthew G. Knepley /* D hex */ 2051*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetRefHexFace_Static(ornt[0], 3); 2052*2eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 2053*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 2054*2eabf88fSMatthew G. Knepley orntNew[1] = 0; 2055*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetRefHexFace_Static(ornt[2], 1); 2056*2eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 2057*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 2058*2eabf88fSMatthew G. Knepley orntNew[3] = -3; 2059*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetRefHexFace_Static(ornt[4], 0); 2060*2eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 2061*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 2062*2eabf88fSMatthew G. Knepley orntNew[5] = -3; 2063*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 2064*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 2065*2eabf88fSMatthew G. Knepley #if 1 2066*2eabf88fSMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+3, cStartNew, cEndNew); 2067*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2068*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2069*2eabf88fSMatthew G. Knepley } 2070*2eabf88fSMatthew G. Knepley #endif 2071*2eabf88fSMatthew G. Knepley /* E hex */ 2072*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 2073*2eabf88fSMatthew G. Knepley orntNew[0] = -3; 2074*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetRefHexFace_Static(ornt[1], 0); 2075*2eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 2076*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetRefHexFace_Static(ornt[2], 3); 2077*2eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 2078*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 2079*2eabf88fSMatthew G. Knepley orntNew[3] = 0; 2080*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 2081*2eabf88fSMatthew G. Knepley orntNew[4] = 0; 2082*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetRefHexFace_Static(ornt[5], 1); 2083*2eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 2084*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 2085*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 2086*2eabf88fSMatthew G. Knepley #if 1 2087*2eabf88fSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cEndNew); 2088*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2089*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2090*2eabf88fSMatthew G. Knepley } 2091*2eabf88fSMatthew G. Knepley #endif 2092*2eabf88fSMatthew G. Knepley /* F hex */ 2093*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 2094*2eabf88fSMatthew G. Knepley orntNew[0] = -3; 2095*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetRefHexFace_Static(ornt[1], 1); 2096*2eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 2097*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetRefHexFace_Static(ornt[2], 2); 2098*2eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 2099*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 2100*2eabf88fSMatthew G. Knepley orntNew[3] = 0; 2101*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetRefHexFace_Static(ornt[4], 3); 2102*2eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 2103*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 2104*2eabf88fSMatthew G. Knepley orntNew[5] = -3; 2105*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 2106*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 2107*2eabf88fSMatthew G. Knepley #if 1 2108*2eabf88fSMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cEndNew); 2109*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2110*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2111*2eabf88fSMatthew G. Knepley } 2112*2eabf88fSMatthew G. Knepley #endif 2113*2eabf88fSMatthew G. Knepley /* G hex */ 2114*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 2115*2eabf88fSMatthew G. Knepley orntNew[0] = -3; 2116*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetRefHexFace_Static(ornt[1], 2); 2117*2eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 2118*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 2119*2eabf88fSMatthew G. Knepley orntNew[2] = -3; 2120*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetRefHexFace_Static(ornt[3], 3); 2121*2eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 2122*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetRefHexFace_Static(ornt[4], 2); 2123*2eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 2124*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 2125*2eabf88fSMatthew G. Knepley orntNew[5] = 0; 2126*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 2127*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 2128*2eabf88fSMatthew G. Knepley #if 1 2129*2eabf88fSMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+2, cStartNew, cEndNew); 2130*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2131*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2132*2eabf88fSMatthew G. Knepley } 2133*2eabf88fSMatthew G. Knepley #endif 2134*2eabf88fSMatthew G. Knepley /* H hex */ 2135*2eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 2136*2eabf88fSMatthew G. Knepley orntNew[0] = -3; 2137*2eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetRefHexFace_Static(ornt[1], 3); 2138*2eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 2139*2eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 2140*2eabf88fSMatthew G. Knepley orntNew[2] = -3; 2141*2eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetRefHexFace_Static(ornt[3], 2); 2142*2eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 2143*2eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 2144*2eabf88fSMatthew G. Knepley orntNew[4] = -3; 2145*2eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetRefHexFace_Static(ornt[5], 2); 2146*2eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 2147*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 2148*2eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 2149*2eabf88fSMatthew G. Knepley #if 1 2150*2eabf88fSMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+3, cStartNew, cEndNew); 2151*2eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 2152*2eabf88fSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fEndNew); 2153*2eabf88fSMatthew G. Knepley } 2154*2eabf88fSMatthew G. Knepley #endif 2155*2eabf88fSMatthew G. Knepley } 2156*2eabf88fSMatthew G. Knepley /* Split faces have 4 edges and the same cells as the parent */ 2157*2eabf88fSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 2158*2eabf88fSMatthew G. Knepley ierr = PetscMalloc((4 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 2159*2eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 2160*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 2161*2eabf88fSMatthew G. Knepley /* This can come from GetFaces_Internal() */ 2162*2eabf88fSMatthew G. Knepley const PetscInt newCells[24] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 3, 5, 4, 2, 1, 7, 6, 3, 2, 6, 5, 0, 4, 7, 1}; 2163*2eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 2164*2eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 2165*2eabf88fSMatthew G. Knepley PetscInt coneNew[4], coneSize, c, supportSize, s; 2166*2eabf88fSMatthew G. Knepley 2167*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 2168*2eabf88fSMatthew G. Knepley /* TODO: Redo using orientation information */ 2169*2eabf88fSMatthew G. Knepley coneNew[0] = eStartNew + (cone[(r+3)%4] - eStart)*2 + 1; 2170*2eabf88fSMatthew G. Knepley coneNew[1] = eStartNew + (cone[r] - eStart)*2 + 0; 2171*2eabf88fSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 2172*2eabf88fSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + (r+3)%4; 2173*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2174*2eabf88fSMatthew G. Knepley #if 1 2175*2eabf88fSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 2176*2eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 2177*2eabf88fSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 2178*2eabf88fSMatthew G. Knepley } 2179*2eabf88fSMatthew G. Knepley #endif 2180*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 2181*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2182*2eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2183*2eabf88fSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2184*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2185*2eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 2186*2eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 2187*2eabf88fSMatthew G. Knepley if (cone[c] == f) break; 2188*2eabf88fSMatthew G. Knepley } 2189*2eabf88fSMatthew G. Knepley /* TODO: Redo using orientation information */ 2190*2eabf88fSMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*8 + newCells[c*4+r]; 2191*2eabf88fSMatthew G. Knepley } 2192*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2193*2eabf88fSMatthew G. Knepley #if 1 2194*2eabf88fSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 2195*2eabf88fSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 2196*2eabf88fSMatthew G. Knepley if ((supportRef[p] < cStartNew) || (supportRef[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportRef[p], cStartNew, cEndNew); 2197*2eabf88fSMatthew G. Knepley } 2198*2eabf88fSMatthew G. Knepley #endif 2199*2eabf88fSMatthew G. Knepley } 2200*2eabf88fSMatthew G. Knepley } 2201*2eabf88fSMatthew G. Knepley /* Interior faces have 4 edges and 2 cells */ 2202*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2203*2eabf88fSMatthew G. Knepley const PetscInt newCells[24] = {0, 3, 2, 3, 1, 2, 0, 1, 4, 5, 5, 6, 6, 7, 4, 7, 0, 4, 3, 5, 2, 6, 1, 7}; 2204*2eabf88fSMatthew G. Knepley const PetscInt *cone; 2205*2eabf88fSMatthew G. Knepley PetscInt coneNew[4], supportNew[2]; 2206*2eabf88fSMatthew G. Knepley 2207*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2208*2eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r) { 2209*2eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + r; 2210*2eabf88fSMatthew G. Knepley 2211*2eabf88fSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[r] - fStart); 2212*2eabf88fSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart) + (c - cStart); 2213*2eabf88fSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[r] - fStart); 2214*2eabf88fSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[r] - fStart); 2215*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2216*2eabf88fSMatthew G. Knepley #if 1 2217*2eabf88fSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 2218*2eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 2219*2eabf88fSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eEndNew); 2220*2eabf88fSMatthew G. Knepley } 2221*2eabf88fSMatthew G. Knepley #endif 2222*2eabf88fSMatthew G. Knepley supportNew[0] = cStartNew + (c - cStart)*8 + newCells[r*2+0]; 2223*2eabf88fSMatthew G. Knepley supportNew[1] = cStartNew + (c - cStart)*8 + newCells[r*2+1]; 2224*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2225*2eabf88fSMatthew G. Knepley #if 1 2226*2eabf88fSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fEndNew); 2227*2eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 2228*2eabf88fSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cEndNew); 2229*2eabf88fSMatthew G. Knepley } 2230*2eabf88fSMatthew G. Knepley #endif 2231*2eabf88fSMatthew G. Knepley } 2232*2eabf88fSMatthew G. Knepley } 2233*2eabf88fSMatthew G. Knepley /* Split edges have 2 vertices and the same faces as the parent */ 2234*2eabf88fSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 2235*2eabf88fSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 2236*2eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 2237*2eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 2238*2eabf88fSMatthew G. Knepley 2239*2eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 2240*2eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 2241*2eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 2242*2eabf88fSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 2243*2eabf88fSMatthew G. Knepley 2244*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 2245*2eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 2246*2eabf88fSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 2247*2eabf88fSMatthew G. Knepley coneNew[(r+1)%2] = newv; 2248*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2249*2eabf88fSMatthew G. Knepley #if 1 2250*2eabf88fSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 2251*2eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 2252*2eabf88fSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 2253*2eabf88fSMatthew G. Knepley } 2254*2eabf88fSMatthew G. Knepley #endif 2255*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 2256*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 2257*2eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2258*2eabf88fSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2259*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2260*2eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 2261*2eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 2262*2eabf88fSMatthew G. Knepley if (cone[c] == e) break; 2263*2eabf88fSMatthew G. Knepley } 2264*2eabf88fSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (ornt[c] < 0 ? (c+1-r)%4 : (c+r)%4); 2265*2eabf88fSMatthew G. Knepley } 2266*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2267*2eabf88fSMatthew G. Knepley #if 1 2268*2eabf88fSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 2269*2eabf88fSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 2270*2eabf88fSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 2271*2eabf88fSMatthew G. Knepley } 2272*2eabf88fSMatthew G. Knepley #endif 2273*2eabf88fSMatthew G. Knepley } 2274*2eabf88fSMatthew G. Knepley } 2275*2eabf88fSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells faces */ 2276*2eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 2277*2eabf88fSMatthew G. Knepley const PetscInt newFaces[24] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 9, 4, 8, 2, 11, 6, 10, 1, 10, 5, 9, 3, 8, 7, 11}; 2278*2eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 2279*2eabf88fSMatthew G. Knepley const PetscInt *cone, *coneCell, *support; 2280*2eabf88fSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 2281*2eabf88fSMatthew G. Knepley 2282*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 2283*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 2284*2eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 2285*2eabf88fSMatthew G. Knepley 2286*2eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - eStart); 2287*2eabf88fSMatthew G. Knepley coneNew[1] = newv; 2288*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2289*2eabf88fSMatthew G. Knepley #if 1 2290*2eabf88fSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 2291*2eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 2292*2eabf88fSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 2293*2eabf88fSMatthew G. Knepley } 2294*2eabf88fSMatthew G. Knepley #endif 2295*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 2296*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2297*2eabf88fSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + r; 2298*2eabf88fSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + (r+1)%4; 2299*2eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2300*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &coneCell);CHKERRQ(ierr); 2301*2eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) if (coneCell[c] == f) break; 2302*2eabf88fSMatthew G. Knepley supportRef[2+s] = fStartNew + (f - fStart)*4 + newFaces[c*4+r]; 2303*2eabf88fSMatthew G. Knepley } 2304*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2305*2eabf88fSMatthew G. Knepley #if 1 2306*2eabf88fSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 2307*2eabf88fSMatthew G. Knepley for (p = 0; p < 2+supportSize; ++p) { 2308*2eabf88fSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportRef[p], fStartNew, fEndNew); 2309*2eabf88fSMatthew G. Knepley } 2310*2eabf88fSMatthew G. Knepley #endif 2311*2eabf88fSMatthew G. Knepley } 2312*2eabf88fSMatthew G. Knepley } 2313*2eabf88fSMatthew G. Knepley /* Cell edges have 2 vertices and 4 faces */ 2314*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2315*2eabf88fSMatthew G. Knepley const PetscInt newFaces[24] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 9, 4, 8, 2, 11, 6, 10, 1, 10, 5, 9, 3, 8, 7, 11}; 2316*2eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 2317*2eabf88fSMatthew G. Knepley const PetscInt *cone; 2318*2eabf88fSMatthew G. Knepley PetscInt coneNew[2], supportNew[4]; 2319*2eabf88fSMatthew G. Knepley 2320*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2321*2eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 2322*2eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 2323*2eabf88fSMatthew G. Knepley 2324*2eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (cone[r] - fStart); 2325*2eabf88fSMatthew G. Knepley coneNew[1] = newv; 2326*2eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2327*2eabf88fSMatthew G. Knepley #if 1 2328*2eabf88fSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 2329*2eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 2330*2eabf88fSMatthew G. Knepley if ((coneNew[p] < vStartNew) || (coneNew[p] >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", coneNew[p], vStartNew, vEndNew); 2331*2eabf88fSMatthew G. Knepley } 2332*2eabf88fSMatthew G. Knepley #endif 2333*2eabf88fSMatthew G. Knepley for (f = 0; f < 4; ++f) supportNew[f] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + newFaces[r*4+f]; 2334*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2335*2eabf88fSMatthew G. Knepley #if 1 2336*2eabf88fSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eEndNew); 2337*2eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 2338*2eabf88fSMatthew G. Knepley if ((supportNew[p] < fStartNew) || (supportNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportNew[p], fStartNew, fEndNew); 2339*2eabf88fSMatthew G. Knepley } 2340*2eabf88fSMatthew G. Knepley #endif 2341*2eabf88fSMatthew G. Knepley } 2342*2eabf88fSMatthew G. Knepley } 2343*2eabf88fSMatthew G. Knepley /* Old vertices have identical supports */ 2344*2eabf88fSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 2345*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 2346*2eabf88fSMatthew G. Knepley const PetscInt *support, *cone; 2347*2eabf88fSMatthew G. Knepley PetscInt size, s; 2348*2eabf88fSMatthew G. Knepley 2349*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 2350*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 2351*2eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 2352*2eabf88fSMatthew G. Knepley PetscInt r = 0; 2353*2eabf88fSMatthew G. Knepley 2354*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2355*2eabf88fSMatthew G. Knepley if (cone[1] == v) r = 1; 2356*2eabf88fSMatthew G. Knepley supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 2357*2eabf88fSMatthew G. Knepley } 2358*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2359*2eabf88fSMatthew G. Knepley #if 1 2360*2eabf88fSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 2361*2eabf88fSMatthew G. Knepley for (p = 0; p < size; ++p) { 2362*2eabf88fSMatthew G. Knepley if ((supportRef[p] < eStartNew) || (supportRef[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", supportRef[p], eStartNew, eEndNew); 2363*2eabf88fSMatthew G. Knepley } 2364*2eabf88fSMatthew G. Knepley #endif 2365*2eabf88fSMatthew G. Knepley } 2366*2eabf88fSMatthew G. Knepley /* Edge vertices have 2 + faces supports */ 2367*2eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 2368*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 2369*2eabf88fSMatthew G. Knepley const PetscInt *cone, *support; 2370*2eabf88fSMatthew G. Knepley PetscInt size, s; 2371*2eabf88fSMatthew G. Knepley 2372*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 2373*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 2374*2eabf88fSMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 2375*2eabf88fSMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 2376*2eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 2377*2eabf88fSMatthew G. Knepley PetscInt r; 2378*2eabf88fSMatthew G. Knepley 2379*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2380*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) if (cone[r] == f) break; 2381*2eabf88fSMatthew G. Knepley supportRef[2+s] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*4 + r; 2382*2eabf88fSMatthew G. Knepley } 2383*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2384*2eabf88fSMatthew G. Knepley #if 1 2385*2eabf88fSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 2386*2eabf88fSMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 2387*2eabf88fSMatthew G. Knepley if ((supportRef[p] < eStartNew) || (supportRef[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", supportRef[p], eStartNew, eEndNew); 2388*2eabf88fSMatthew G. Knepley } 2389*2eabf88fSMatthew G. Knepley #endif 2390*2eabf88fSMatthew G. Knepley } 2391*2eabf88fSMatthew G. Knepley /* Face vertices have 4 + cells supports */ 2392*2eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 2393*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 2394*2eabf88fSMatthew G. Knepley const PetscInt *cone, *support; 2395*2eabf88fSMatthew G. Knepley PetscInt size, s; 2396*2eabf88fSMatthew G. Knepley 2397*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 2398*2eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2399*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) supportRef[r] = eStartNew + (e - eStart)*2 + (f - fStart)*4 + r; 2400*2eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 2401*2eabf88fSMatthew G. Knepley PetscInt r; 2402*2eabf88fSMatthew G. Knepley 2403*2eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2404*2eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) if (cone[r] == f) break; 2405*2eabf88fSMatthew G. Knepley supportRef[4+s] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (support[s] - cStart)*6 + r; 2406*2eabf88fSMatthew G. Knepley } 2407*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2408*2eabf88fSMatthew G. Knepley #if 1 2409*2eabf88fSMatthew G. Knepley if ((newp < vStartNew) || (newp >= vEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a vertex [%d, %d)", newp, vStartNew, vEndNew); 2410*2eabf88fSMatthew G. Knepley for (p = 0; p < 4+size; ++p) { 2411*2eabf88fSMatthew G. Knepley if ((supportRef[p] < eStartNew) || (supportRef[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", supportRef[p], eStartNew, eEndNew); 2412*2eabf88fSMatthew G. Knepley } 2413*2eabf88fSMatthew G. Knepley #endif 2414*2eabf88fSMatthew G. Knepley } 2415*2eabf88fSMatthew G. Knepley /* Cell vertices have 6 supports */ 2416*2eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2417*2eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 2418*2eabf88fSMatthew G. Knepley PetscInt supportNew[6]; 2419*2eabf88fSMatthew G. Knepley 2420*2eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 2421*2eabf88fSMatthew G. Knepley supportNew[r] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 2422*2eabf88fSMatthew G. Knepley } 2423*2eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2424*2eabf88fSMatthew G. Knepley } 2425*2eabf88fSMatthew G. Knepley break; 242675d3a19aSMatthew G. Knepley default: 242775d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 242875d3a19aSMatthew G. Knepley } 242975d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 243075d3a19aSMatthew G. Knepley } 243175d3a19aSMatthew G. Knepley 243275d3a19aSMatthew G. Knepley #undef __FUNCT__ 243375d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetCoordinates" 243475d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerSetCoordinates(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 243575d3a19aSMatthew G. Knepley { 243675d3a19aSMatthew G. Knepley PetscSection coordSection, coordSectionNew; 243775d3a19aSMatthew G. Knepley Vec coordinates, coordinatesNew; 243875d3a19aSMatthew G. Knepley PetscScalar *coords, *coordsNew; 2439b5da9499SMatthew G. Knepley PetscInt dim, depth, coordSizeNew, cStart, cEnd, c, vStart, vStartNew, vEnd, v, eStart, eEnd, eMax, e, fStart, fEnd, fMax, f; 244075d3a19aSMatthew G. Knepley PetscErrorCode ierr; 244175d3a19aSMatthew G. Knepley 244275d3a19aSMatthew G. Knepley PetscFunctionBegin; 244375d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 244475d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 244575d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 2446b5da9499SMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 244775d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 244875d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 2449b5da9499SMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, NULL, &fMax, &eMax, NULL);CHKERRQ(ierr); 245075d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, NULL, NULL, NULL, &vStartNew);CHKERRQ(ierr); 245175d3a19aSMatthew G. Knepley ierr = DMPlexGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr); 245275d3a19aSMatthew G. Knepley ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm), &coordSectionNew);CHKERRQ(ierr); 245375d3a19aSMatthew G. Knepley ierr = PetscSectionSetNumFields(coordSectionNew, 1);CHKERRQ(ierr); 245475d3a19aSMatthew G. Knepley ierr = PetscSectionSetFieldComponents(coordSectionNew, 0, dim);CHKERRQ(ierr); 245575d3a19aSMatthew G. Knepley ierr = PetscSectionSetChart(coordSectionNew, vStartNew, vStartNew+depthSize[0]);CHKERRQ(ierr); 245675d3a19aSMatthew G. Knepley if (fMax < 0) fMax = fEnd; 2457b5da9499SMatthew G. Knepley if (eMax < 0) eMax = eEnd; 245875d3a19aSMatthew G. Knepley /* All vertices have the dim coordinates */ 245975d3a19aSMatthew G. Knepley for (v = vStartNew; v < vStartNew+depthSize[0]; ++v) { 246075d3a19aSMatthew G. Knepley ierr = PetscSectionSetDof(coordSectionNew, v, dim);CHKERRQ(ierr); 246175d3a19aSMatthew G. Knepley ierr = PetscSectionSetFieldDof(coordSectionNew, v, 0, dim);CHKERRQ(ierr); 246275d3a19aSMatthew G. Knepley } 246375d3a19aSMatthew G. Knepley ierr = PetscSectionSetUp(coordSectionNew);CHKERRQ(ierr); 246475d3a19aSMatthew G. Knepley ierr = DMPlexSetCoordinateSection(rdm, coordSectionNew);CHKERRQ(ierr); 246575d3a19aSMatthew G. Knepley ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr); 246675d3a19aSMatthew G. Knepley ierr = PetscSectionGetStorageSize(coordSectionNew, &coordSizeNew);CHKERRQ(ierr); 246775d3a19aSMatthew G. Knepley ierr = VecCreate(PetscObjectComm((PetscObject)dm), &coordinatesNew);CHKERRQ(ierr); 246875d3a19aSMatthew G. Knepley ierr = PetscObjectSetName((PetscObject) coordinatesNew, "coordinates");CHKERRQ(ierr); 246975d3a19aSMatthew G. Knepley ierr = VecSetSizes(coordinatesNew, coordSizeNew, PETSC_DETERMINE);CHKERRQ(ierr); 247075d3a19aSMatthew G. Knepley ierr = VecSetFromOptions(coordinatesNew);CHKERRQ(ierr); 247175d3a19aSMatthew G. Knepley ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr); 247275d3a19aSMatthew G. Knepley ierr = VecGetArray(coordinatesNew, &coordsNew);CHKERRQ(ierr); 2473b5da9499SMatthew G. Knepley switch (refiner) { 2474b5da9499SMatthew G. Knepley case 6: /* Hex 3D */ 2475b5da9499SMatthew G. Knepley /* Face vertices have the average of corner coordinates */ 2476b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 2477b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (cEnd - cStart) + (f - fStart); 2478b5da9499SMatthew G. Knepley PetscInt *cone = NULL; 2479b5da9499SMatthew G. Knepley PetscInt closureSize, coneSize = 0, off[8], offnew, p, d; 2480b5da9499SMatthew G. Knepley 2481b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, f, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 2482b5da9499SMatthew G. Knepley for (p = 0; p < closureSize*2; p += 2) { 2483b5da9499SMatthew G. Knepley const PetscInt point = cone[p]; 2484b5da9499SMatthew G. Knepley if ((point >= vStart) && (point < vEnd)) cone[coneSize++] = point; 2485b5da9499SMatthew G. Knepley } 2486b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) { 2487b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[v], &off[v]);CHKERRQ(ierr); 2488b5da9499SMatthew G. Knepley } 2489b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 2490b5da9499SMatthew G. Knepley for (d = 0; d < dim; ++d) { 2491b5da9499SMatthew G. Knepley coordsNew[offnew+d] = 0.0; 2492b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) coordsNew[offnew+d] += coords[off[v]+d]; 2493b5da9499SMatthew G. Knepley coordsNew[offnew+d] /= coneSize; 2494b5da9499SMatthew G. Knepley } 2495b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, f, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 2496b5da9499SMatthew G. Knepley } 2497b5da9499SMatthew G. Knepley case 2: /* Hex 2D */ 2498b5da9499SMatthew G. Knepley /* Cell vertices have the average of corner coordinates */ 2499b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2500b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (c - cStart); 2501b5da9499SMatthew G. Knepley PetscInt *cone = NULL; 2502b5da9499SMatthew G. Knepley PetscInt closureSize, coneSize = 0, off[8], offnew, p, d; 2503b5da9499SMatthew G. Knepley 2504b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 2505b5da9499SMatthew G. Knepley for (p = 0; p < closureSize*2; p += 2) { 2506b5da9499SMatthew G. Knepley const PetscInt point = cone[p]; 2507b5da9499SMatthew G. Knepley if ((point >= vStart) && (point < vEnd)) cone[coneSize++] = point; 2508b5da9499SMatthew G. Knepley } 2509b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) { 2510b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[v], &off[v]);CHKERRQ(ierr); 2511b5da9499SMatthew G. Knepley } 2512b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 2513b5da9499SMatthew G. Knepley for (d = 0; d < dim; ++d) { 2514b5da9499SMatthew G. Knepley coordsNew[offnew+d] = 0.0; 2515b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) coordsNew[offnew+d] += coords[off[v]+d]; 2516b5da9499SMatthew G. Knepley coordsNew[offnew+d] /= coneSize; 2517b5da9499SMatthew G. Knepley } 2518b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 2519b5da9499SMatthew G. Knepley } 2520b5da9499SMatthew G. Knepley case 1: /* Simplicial 2D */ 2521b5da9499SMatthew G. Knepley case 3: /* Hybrid Simplicial 2D */ 2522b5da9499SMatthew G. Knepley case 5: /* Simplicial 3D */ 2523b5da9499SMatthew G. Knepley /* Edge vertices have the average of endpoint coordinates */ 2524b5da9499SMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 2525b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 2526b5da9499SMatthew G. Knepley const PetscInt *cone; 2527b5da9499SMatthew G. Knepley PetscInt coneSize, offA, offB, offnew, d; 2528b5da9499SMatthew G. Knepley 2529b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, e, &coneSize);CHKERRQ(ierr); 2530b5da9499SMatthew G. Knepley if (coneSize != 2) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Edge %d cone should have two vertices, not %d", e, coneSize); 2531b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 2532b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[0], &offA);CHKERRQ(ierr); 2533b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[1], &offB);CHKERRQ(ierr); 2534b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 2535b5da9499SMatthew G. Knepley for (d = 0; d < dim; ++d) { 2536b5da9499SMatthew G. Knepley coordsNew[offnew+d] = 0.5*(coords[offA+d] + coords[offB+d]); 2537b5da9499SMatthew G. Knepley } 2538b5da9499SMatthew G. Knepley } 253975d3a19aSMatthew G. Knepley /* Old vertices have the same coordinates */ 254075d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 254175d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (v - vStart); 254275d3a19aSMatthew G. Knepley PetscInt off, offnew, d; 254375d3a19aSMatthew G. Knepley 254475d3a19aSMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, v, &off);CHKERRQ(ierr); 254575d3a19aSMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 254675d3a19aSMatthew G. Knepley for (d = 0; d < dim; ++d) { 254775d3a19aSMatthew G. Knepley coordsNew[offnew+d] = coords[off+d]; 254875d3a19aSMatthew G. Knepley } 254975d3a19aSMatthew G. Knepley } 2550b5da9499SMatthew G. Knepley break; 2551b5da9499SMatthew G. Knepley default: 2552b5da9499SMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 255375d3a19aSMatthew G. Knepley } 255475d3a19aSMatthew G. Knepley ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr); 255575d3a19aSMatthew G. Knepley ierr = VecRestoreArray(coordinatesNew, &coordsNew);CHKERRQ(ierr); 255675d3a19aSMatthew G. Knepley ierr = DMSetCoordinatesLocal(rdm, coordinatesNew);CHKERRQ(ierr); 255775d3a19aSMatthew G. Knepley ierr = VecDestroy(&coordinatesNew);CHKERRQ(ierr); 255875d3a19aSMatthew G. Knepley ierr = PetscSectionDestroy(&coordSectionNew);CHKERRQ(ierr); 255975d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 256075d3a19aSMatthew G. Knepley } 256175d3a19aSMatthew G. Knepley 256275d3a19aSMatthew G. Knepley #undef __FUNCT__ 256375d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexCreateProcessSF" 256475d3a19aSMatthew G. Knepley PetscErrorCode DMPlexCreateProcessSF(DM dm, PetscSF sfPoint, IS *processRanks, PetscSF *sfProcess) 256575d3a19aSMatthew G. Knepley { 256675d3a19aSMatthew G. Knepley PetscInt numRoots, numLeaves, l; 256775d3a19aSMatthew G. Knepley const PetscInt *localPoints; 256875d3a19aSMatthew G. Knepley const PetscSFNode *remotePoints; 256975d3a19aSMatthew G. Knepley PetscInt *localPointsNew; 257075d3a19aSMatthew G. Knepley PetscSFNode *remotePointsNew; 257175d3a19aSMatthew G. Knepley PetscInt *ranks, *ranksNew; 257275d3a19aSMatthew G. Knepley PetscErrorCode ierr; 257375d3a19aSMatthew G. Knepley 257475d3a19aSMatthew G. Knepley PetscFunctionBegin; 257575d3a19aSMatthew G. Knepley ierr = PetscSFGetGraph(sfPoint, &numRoots, &numLeaves, &localPoints, &remotePoints);CHKERRQ(ierr); 257675d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscInt), &ranks);CHKERRQ(ierr); 257775d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 257875d3a19aSMatthew G. Knepley ranks[l] = remotePoints[l].rank; 257975d3a19aSMatthew G. Knepley } 258075d3a19aSMatthew G. Knepley ierr = PetscSortRemoveDupsInt(&numLeaves, ranks);CHKERRQ(ierr); 258175d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscInt), &ranksNew);CHKERRQ(ierr); 258275d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscInt), &localPointsNew);CHKERRQ(ierr); 258375d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscSFNode), &remotePointsNew);CHKERRQ(ierr); 258475d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 258575d3a19aSMatthew G. Knepley ranksNew[l] = ranks[l]; 258675d3a19aSMatthew G. Knepley localPointsNew[l] = l; 258775d3a19aSMatthew G. Knepley remotePointsNew[l].index = 0; 258875d3a19aSMatthew G. Knepley remotePointsNew[l].rank = ranksNew[l]; 258975d3a19aSMatthew G. Knepley } 259075d3a19aSMatthew G. Knepley ierr = PetscFree(ranks);CHKERRQ(ierr); 259175d3a19aSMatthew G. Knepley ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm), numLeaves, ranksNew, PETSC_OWN_POINTER, processRanks);CHKERRQ(ierr); 259275d3a19aSMatthew G. Knepley ierr = PetscSFCreate(PetscObjectComm((PetscObject)dm), sfProcess);CHKERRQ(ierr); 259375d3a19aSMatthew G. Knepley ierr = PetscSFSetFromOptions(*sfProcess);CHKERRQ(ierr); 259475d3a19aSMatthew G. Knepley ierr = PetscSFSetGraph(*sfProcess, 1, numLeaves, localPointsNew, PETSC_OWN_POINTER, remotePointsNew, PETSC_OWN_POINTER);CHKERRQ(ierr); 259575d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 259675d3a19aSMatthew G. Knepley } 259775d3a19aSMatthew G. Knepley 259875d3a19aSMatthew G. Knepley #undef __FUNCT__ 259975d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerCreateSF" 260075d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerCreateSF(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 260175d3a19aSMatthew G. Knepley { 260275d3a19aSMatthew G. Knepley PetscSF sf, sfNew, sfProcess; 260375d3a19aSMatthew G. Knepley IS processRanks; 260475d3a19aSMatthew G. Knepley MPI_Datatype depthType; 260575d3a19aSMatthew G. Knepley PetscInt numRoots, numLeaves, numLeavesNew = 0, l, m; 260675d3a19aSMatthew G. Knepley const PetscInt *localPoints, *neighbors; 260775d3a19aSMatthew G. Knepley const PetscSFNode *remotePoints; 260875d3a19aSMatthew G. Knepley PetscInt *localPointsNew; 260975d3a19aSMatthew G. Knepley PetscSFNode *remotePointsNew; 261075d3a19aSMatthew G. Knepley PetscInt *depthSizeOld, *rdepthSize, *rdepthSizeOld, *rdepthMaxOld, *rvStart, *rvStartNew, *reStart, *reStartNew, *rfStart, *rfStartNew, *rcStart, *rcStartNew; 261175d3a19aSMatthew G. Knepley PetscInt depth, numNeighbors, pStartNew, pEndNew, cStart, cStartNew, cEnd, cMax, vStart, vStartNew, vEnd, vMax, fStart, fStartNew, fEnd, fMax, eStart, eStartNew, eEnd, eMax, r, n; 261275d3a19aSMatthew G. Knepley PetscErrorCode ierr; 261375d3a19aSMatthew G. Knepley 261475d3a19aSMatthew G. Knepley PetscFunctionBegin; 261575d3a19aSMatthew G. Knepley ierr = DMPlexGetChart(rdm, &pStartNew, &pEndNew);CHKERRQ(ierr); 261675d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 261775d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 261875d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 261975d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 262075d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 262175d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 262275d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr); 262375d3a19aSMatthew G. Knepley switch (refiner) { 262475d3a19aSMatthew G. Knepley case 3: 262575d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 262675d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 262775d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 262875d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 262975d3a19aSMatthew G. Knepley } 263075d3a19aSMatthew G. Knepley ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr); 263175d3a19aSMatthew G. Knepley ierr = DMGetPointSF(rdm, &sfNew);CHKERRQ(ierr); 263275d3a19aSMatthew G. Knepley /* Caculate size of new SF */ 263375d3a19aSMatthew G. Knepley ierr = PetscSFGetGraph(sf, &numRoots, &numLeaves, &localPoints, &remotePoints);CHKERRQ(ierr); 263475d3a19aSMatthew G. Knepley if (numRoots < 0) PetscFunctionReturn(0); 263575d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 263675d3a19aSMatthew G. Knepley const PetscInt p = localPoints[l]; 263775d3a19aSMatthew G. Knepley 263875d3a19aSMatthew G. Knepley switch (refiner) { 263975d3a19aSMatthew G. Knepley case 1: 264075d3a19aSMatthew G. Knepley /* Simplicial 2D */ 264175d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 264275d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 264375d3a19aSMatthew G. Knepley ++numLeavesNew; 264475d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 264575d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 2646d963de37SMatthew G. Knepley numLeavesNew += 2 + 1; 264775d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 264875d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces */ 264975d3a19aSMatthew G. Knepley numLeavesNew += 4 + 3; 265075d3a19aSMatthew G. Knepley } 265175d3a19aSMatthew G. Knepley break; 265275d3a19aSMatthew G. Knepley case 2: 265375d3a19aSMatthew G. Knepley /* Hex 2D */ 265475d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 265575d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 265675d3a19aSMatthew G. Knepley ++numLeavesNew; 265775d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 265875d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 2659d963de37SMatthew G. Knepley numLeavesNew += 2 + 1; 266075d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 2661455d6cd4SMatthew G. Knepley /* Old cells add new cells, interior faces, and vertex */ 2662455d6cd4SMatthew G. Knepley numLeavesNew += 4 + 4 + 1; 266375d3a19aSMatthew G. Knepley } 266475d3a19aSMatthew G. Knepley break; 2665b5da9499SMatthew G. Knepley case 5: 2666b5da9499SMatthew G. Knepley /* Simplicial 3D */ 2667b5da9499SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 2668b5da9499SMatthew G. Knepley /* Old vertices stay the same */ 2669b5da9499SMatthew G. Knepley ++numLeavesNew; 2670b5da9499SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 2671b5da9499SMatthew G. Knepley /* Old edges add new edges and vertex */ 2672b5da9499SMatthew G. Knepley numLeavesNew += 2 + 1; 2673b5da9499SMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 2674b5da9499SMatthew G. Knepley /* Old faces add new faces and face edges */ 2675b5da9499SMatthew G. Knepley numLeavesNew += 4 + 3; 2676b5da9499SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 2677b5da9499SMatthew G. Knepley /* Old cells add new cells and interior faces and edges */ 2678b5da9499SMatthew G. Knepley numLeavesNew += 8 + 8 + 1; 2679b5da9499SMatthew G. Knepley } 2680b5da9499SMatthew G. Knepley break; 2681*2eabf88fSMatthew G. Knepley case 6: 2682*2eabf88fSMatthew G. Knepley /* Hex 3D */ 2683*2eabf88fSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 2684*2eabf88fSMatthew G. Knepley /* Old vertices stay the same */ 2685*2eabf88fSMatthew G. Knepley ++numLeavesNew; 2686*2eabf88fSMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 2687*2eabf88fSMatthew G. Knepley /* Old edges add new edges, and vertex */ 2688*2eabf88fSMatthew G. Knepley numLeavesNew += 2 + 1; 2689*2eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 2690*2eabf88fSMatthew G. Knepley /* Old faces add new faces, edges, and vertex */ 2691*2eabf88fSMatthew G. Knepley numLeavesNew += 4 + 4 + 1; 2692*2eabf88fSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 2693*2eabf88fSMatthew G. Knepley /* Old cells add new cells, faces, edges, and vertex */ 2694*2eabf88fSMatthew G. Knepley numLeavesNew += 8 + 12 + 6 + 1; 2695*2eabf88fSMatthew G. Knepley } 2696*2eabf88fSMatthew G. Knepley break; 269775d3a19aSMatthew G. Knepley default: 269875d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 269975d3a19aSMatthew G. Knepley } 270075d3a19aSMatthew G. Knepley } 270175d3a19aSMatthew G. Knepley /* Communicate depthSizes for each remote rank */ 270275d3a19aSMatthew G. Knepley ierr = DMPlexCreateProcessSF(dm, sf, &processRanks, &sfProcess);CHKERRQ(ierr); 270375d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(processRanks, &numNeighbors);CHKERRQ(ierr); 270475d3a19aSMatthew G. Knepley ierr = PetscMalloc5((depth+1)*numNeighbors,PetscInt,&rdepthSize,numNeighbors,PetscInt,&rvStartNew,numNeighbors,PetscInt,&reStartNew,numNeighbors,PetscInt,&rfStartNew,numNeighbors,PetscInt,&rcStartNew);CHKERRQ(ierr); 270575d3a19aSMatthew G. Knepley ierr = PetscMalloc7(depth+1,PetscInt,&depthSizeOld,(depth+1)*numNeighbors,PetscInt,&rdepthSizeOld,(depth+1)*numNeighbors,PetscInt,&rdepthMaxOld,numNeighbors,PetscInt,&rvStart,numNeighbors,PetscInt,&reStart,numNeighbors,PetscInt,&rfStart,numNeighbors,PetscInt,&rcStart);CHKERRQ(ierr); 270675d3a19aSMatthew G. Knepley ierr = MPI_Type_contiguous(depth+1, MPIU_INT, &depthType);CHKERRQ(ierr); 270775d3a19aSMatthew G. Knepley ierr = MPI_Type_commit(&depthType);CHKERRQ(ierr); 270875d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSize, rdepthSize);CHKERRQ(ierr); 270975d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSize, rdepthSize);CHKERRQ(ierr); 271075d3a19aSMatthew G. Knepley for (n = 0; n < numNeighbors; ++n) { 271175d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, &rdepthSize[n*(depth+1)], &rcStartNew[n], &rfStartNew[n], &reStartNew[n], &rvStartNew[n]);CHKERRQ(ierr); 271275d3a19aSMatthew G. Knepley } 271375d3a19aSMatthew G. Knepley depthSizeOld[depth] = cMax; 271475d3a19aSMatthew G. Knepley depthSizeOld[0] = vMax; 271575d3a19aSMatthew G. Knepley depthSizeOld[depth-1] = fMax; 271675d3a19aSMatthew G. Knepley depthSizeOld[1] = eMax; 271775d3a19aSMatthew G. Knepley 271875d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSizeOld, rdepthMaxOld);CHKERRQ(ierr); 271975d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSizeOld, rdepthMaxOld);CHKERRQ(ierr); 272075d3a19aSMatthew G. Knepley 272175d3a19aSMatthew G. Knepley depthSizeOld[depth] = cEnd - cStart; 272275d3a19aSMatthew G. Knepley depthSizeOld[0] = vEnd - vStart; 272375d3a19aSMatthew G. Knepley depthSizeOld[depth-1] = fEnd - fStart; 272475d3a19aSMatthew G. Knepley depthSizeOld[1] = eEnd - eStart; 272575d3a19aSMatthew G. Knepley 272675d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSizeOld, rdepthSizeOld);CHKERRQ(ierr); 272775d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSizeOld, rdepthSizeOld);CHKERRQ(ierr); 272875d3a19aSMatthew G. Knepley for (n = 0; n < numNeighbors; ++n) { 272975d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, &rdepthSizeOld[n*(depth+1)], &rcStart[n], &rfStart[n], &reStart[n], &rvStart[n]);CHKERRQ(ierr); 273075d3a19aSMatthew G. Knepley } 273175d3a19aSMatthew G. Knepley ierr = MPI_Type_free(&depthType);CHKERRQ(ierr); 273275d3a19aSMatthew G. Knepley ierr = PetscSFDestroy(&sfProcess);CHKERRQ(ierr); 273375d3a19aSMatthew G. Knepley /* Calculate new point SF */ 273475d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeavesNew * sizeof(PetscInt), &localPointsNew);CHKERRQ(ierr); 273575d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeavesNew * sizeof(PetscSFNode), &remotePointsNew);CHKERRQ(ierr); 273675d3a19aSMatthew G. Knepley ierr = ISGetIndices(processRanks, &neighbors);CHKERRQ(ierr); 273775d3a19aSMatthew G. Knepley for (l = 0, m = 0; l < numLeaves; ++l) { 273875d3a19aSMatthew G. Knepley PetscInt p = localPoints[l]; 273975d3a19aSMatthew G. Knepley PetscInt rp = remotePoints[l].index, n; 274075d3a19aSMatthew G. Knepley PetscMPIInt rrank = remotePoints[l].rank; 274175d3a19aSMatthew G. Knepley 274275d3a19aSMatthew G. Knepley ierr = PetscFindInt(rrank, numNeighbors, neighbors, &n);CHKERRQ(ierr); 274375d3a19aSMatthew G. Knepley if (n < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Could not locate remote rank %d", rrank); 274475d3a19aSMatthew G. Knepley switch (refiner) { 274575d3a19aSMatthew G. Knepley case 1: 274675d3a19aSMatthew G. Knepley /* Simplicial 2D */ 274775d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 274875d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 274975d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 275075d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 275175d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 275275d3a19aSMatthew G. Knepley ++m; 275375d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 275475d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 275575d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 275675d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 275775d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 275875d3a19aSMatthew G. Knepley ++m; 275975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 276075d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 276175d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 276275d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 276375d3a19aSMatthew G. Knepley } 276475d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 276575d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces */ 276675d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 276775d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 276875d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 276975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 277075d3a19aSMatthew G. Knepley } 277175d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 277275d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 277375d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*2 + (rp - rcStart[n])*3 + r; 277475d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 277575d3a19aSMatthew G. Knepley } 277675d3a19aSMatthew G. Knepley } 277775d3a19aSMatthew G. Knepley break; 277875d3a19aSMatthew G. Knepley case 2: 277975d3a19aSMatthew G. Knepley /* Hex 2D */ 278075d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 278175d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 278275d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 278375d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 278475d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 278575d3a19aSMatthew G. Knepley ++m; 278675d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 278775d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 278875d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 278975d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 279075d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 279175d3a19aSMatthew G. Knepley ++m; 279275d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 279375d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 279475d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 279575d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 279675d3a19aSMatthew G. Knepley } 279775d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 2798455d6cd4SMatthew G. Knepley /* Old cells add new cells, interior faces, and vertex */ 279975d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 280075d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 280175d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 280275d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 280375d3a19aSMatthew G. Knepley } 280475d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 280575d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*2 + (p - cStart)*4 + r; 280675d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*2 + (rp - rcStart[n])*4 + r; 280775d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 280875d3a19aSMatthew G. Knepley } 2809455d6cd4SMatthew G. Knepley for (r = 0; r < 1; ++r, ++m) { 2810455d6cd4SMatthew G. Knepley localPointsNew[m] = vStartNew + (fEnd - fStart) + (p - cStart) + r; 2811455d6cd4SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1] + (rp - rcStart[n]) + r; 2812455d6cd4SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2813455d6cd4SMatthew G. Knepley } 281475d3a19aSMatthew G. Knepley } 281575d3a19aSMatthew G. Knepley break; 281675d3a19aSMatthew G. Knepley case 3: 281775d3a19aSMatthew G. Knepley /* Hybrid simplicial 2D */ 281875d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 281975d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 282075d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 282175d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 282275d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 282375d3a19aSMatthew G. Knepley ++m; 282475d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 282575d3a19aSMatthew G. Knepley /* Old interior faces add new faces and vertex */ 282675d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 282775d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 282875d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 282975d3a19aSMatthew G. Knepley ++m; 283075d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 283175d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 283275d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 283375d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 283475d3a19aSMatthew G. Knepley } 283575d3a19aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 283675d3a19aSMatthew G. Knepley /* Old hybrid faces stay the same */ 283775d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - fMax); 283875d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rdepthMaxOld[n*(depth+1)+depth-1]); 283975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 284075d3a19aSMatthew G. Knepley ++m; 284175d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 284275d3a19aSMatthew G. Knepley /* Old interior cells add new cells and interior faces */ 284375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 284475d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 284575d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 284675d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 284775d3a19aSMatthew G. Knepley } 284875d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 284975d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - cStart)*3 + r; 285075d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rcStart[n])*3 + r; 285175d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 285275d3a19aSMatthew G. Knepley } 285375d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 285475d3a19aSMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 285575d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 285675d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 285775d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 285875d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 285975d3a19aSMatthew G. Knepley } 286075d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (p - cMax); 286175d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*3 + (rp - rdepthMaxOld[n*(depth+1)+depth]); 286275d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 286375d3a19aSMatthew G. Knepley ++m; 286475d3a19aSMatthew G. Knepley } 286575d3a19aSMatthew G. Knepley break; 2866b5da9499SMatthew G. Knepley case 5: 2867b5da9499SMatthew G. Knepley /* Simplicial 3D */ 2868b5da9499SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 2869b5da9499SMatthew G. Knepley /* Old vertices stay the same */ 2870b5da9499SMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 2871b5da9499SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 2872b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2873b5da9499SMatthew G. Knepley ++m; 287487fe6628SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 2875b5da9499SMatthew G. Knepley /* Old edges add new edges and vertex */ 2876b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 2877b5da9499SMatthew G. Knepley localPointsNew[m] = eStartNew + (p - eStart)*2 + r; 2878b5da9499SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rp - reStart[n])*2 + r; 2879b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2880b5da9499SMatthew G. Knepley } 2881b5da9499SMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - eStart); 2882b5da9499SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - reStart[n]); 2883b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2884b5da9499SMatthew G. Knepley ++m; 2885b5da9499SMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 2886b5da9499SMatthew G. Knepley /* Old faces add new faces and face edges */ 2887b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 2888b5da9499SMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*4 + r; 2889b5da9499SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*4 + r; 2890b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2891b5da9499SMatthew G. Knepley } 2892b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 2893b5da9499SMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (p - fStart)*3 + r; 2894b5da9499SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + rdepthSizeOld[n*(depth+1)+1]*2 + (rp - rfStart[n])*3 + r; 2895b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2896b5da9499SMatthew G. Knepley } 2897b5da9499SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 2898b5da9499SMatthew G. Knepley /* Old cells add new cells and interior faces and edges */ 2899b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 2900b5da9499SMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*8 + r; 2901b5da9499SMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*8 + r; 2902b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2903b5da9499SMatthew G. Knepley } 2904b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 2905b5da9499SMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*4 + (p - cStart)*8 + r; 2906b5da9499SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*4 + (rp - rcStart[n])*8 + r; 2907b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2908b5da9499SMatthew G. Knepley } 2909b5da9499SMatthew G. Knepley for (r = 0; r < 1; ++r, ++m) { 2910b5da9499SMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (p - cStart)*1 + r; 2911b5da9499SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + rdepthSizeOld[n*(depth+1)+1]*2 + rdepthSizeOld[n*(depth+1)+depth-1]*3 + (rp - rcStart[n])*1 + r; 2912b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 2913b5da9499SMatthew G. Knepley } 2914b5da9499SMatthew G. Knepley } 2915b5da9499SMatthew G. Knepley break; 2916*2eabf88fSMatthew G. Knepley case 6: 2917*2eabf88fSMatthew G. Knepley /* Hex 3D */ 2918*2eabf88fSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 2919*2eabf88fSMatthew G. Knepley /* Old vertices stay the same */ 2920*2eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 2921*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 2922*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2923*2eabf88fSMatthew G. Knepley ++m; 2924*2eabf88fSMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 2925*2eabf88fSMatthew G. Knepley /* Old edges add new edges and vertex */ 2926*2eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 2927*2eabf88fSMatthew G. Knepley localPointsNew[m] = eStartNew + (p - eStart)*2 + r; 2928*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rp - reStart[n])*2 + r; 2929*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2930*2eabf88fSMatthew G. Knepley } 2931*2eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - eStart); 2932*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - reStart[n]); 2933*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2934*2eabf88fSMatthew G. Knepley ++m; 2935*2eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 2936*2eabf88fSMatthew G. Knepley /* Old faces add new faces, edges, and vertex */ 2937*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 2938*2eabf88fSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*4 + r; 2939*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*4 + r; 2940*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2941*2eabf88fSMatthew G. Knepley } 2942*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 2943*2eabf88fSMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (p - fStart)*4 + r; 2944*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + rdepthSizeOld[n*(depth+1)+1]*2 + (rp - rfStart[n])*4 + r; 2945*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2946*2eabf88fSMatthew G. Knepley } 2947*2eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (p - fStart); 2948*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + rdepthSizeOld[n*(depth+1)+1] + (rp - rfStart[n]); 2949*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2950*2eabf88fSMatthew G. Knepley ++m; 2951*2eabf88fSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 2952*2eabf88fSMatthew G. Knepley /* Old cells add new cells, faces, edges, and vertex */ 2953*2eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 2954*2eabf88fSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*8 + r; 2955*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*8 + r; 2956*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2957*2eabf88fSMatthew G. Knepley } 2958*2eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r, ++m) { 2959*2eabf88fSMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*4 + (p - cStart)*12 + r; 2960*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*4 + (rp - rcStart[n])*12 + r; 2961*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2962*2eabf88fSMatthew G. Knepley } 2963*2eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r, ++m) { 2964*2eabf88fSMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (p - cStart)*6 + r; 2965*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + rdepthSizeOld[n*(depth+1)+1]*2 + rdepthSizeOld[n*(depth+1)+depth-1]*4 + (rp - rcStart[n])*6 + r; 2966*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2967*2eabf88fSMatthew G. Knepley } 2968*2eabf88fSMatthew G. Knepley for (r = 0; r < 1; ++r, ++m) { 2969*2eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (eEnd - eStart) + (fEnd - fStart) + (p - cStart) + r; 2970*2eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+1] + rdepthSizeOld[n*(depth+1)+depth-1] + (rp - rcStart[n]) + r; 2971*2eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 2972*2eabf88fSMatthew G. Knepley } 2973*2eabf88fSMatthew G. Knepley } 2974*2eabf88fSMatthew G. Knepley break; 297575d3a19aSMatthew G. Knepley default: 297675d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 297775d3a19aSMatthew G. Knepley } 297875d3a19aSMatthew G. Knepley } 297975d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(processRanks, &neighbors);CHKERRQ(ierr); 298075d3a19aSMatthew G. Knepley ierr = ISDestroy(&processRanks);CHKERRQ(ierr); 298175d3a19aSMatthew G. Knepley ierr = PetscSFSetGraph(sfNew, pEndNew-pStartNew, numLeavesNew, localPointsNew, PETSC_OWN_POINTER, remotePointsNew, PETSC_OWN_POINTER);CHKERRQ(ierr); 298275d3a19aSMatthew G. Knepley ierr = PetscFree5(rdepthSize,rvStartNew,reStartNew,rfStartNew,rcStartNew);CHKERRQ(ierr); 298375d3a19aSMatthew G. Knepley ierr = PetscFree6(depthSizeOld,rdepthSizeOld,rvStart,reStart,rfStart,rcStart);CHKERRQ(ierr); 298475d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 298575d3a19aSMatthew G. Knepley } 298675d3a19aSMatthew G. Knepley 298775d3a19aSMatthew G. Knepley #undef __FUNCT__ 298875d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerCreateLabels" 298975d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerCreateLabels(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 299075d3a19aSMatthew G. Knepley { 299175d3a19aSMatthew G. Knepley PetscInt numLabels, l; 2992b5da9499SMatthew G. Knepley PetscInt depth, newp, cStart, cStartNew, cEnd, cMax, vStart, vStartNew, vEnd, vMax, fStart, fStartNew, fEnd, fMax, eStart, eStartNew, eEnd, eMax, r; 299375d3a19aSMatthew G. Knepley PetscErrorCode ierr; 299475d3a19aSMatthew G. Knepley 299575d3a19aSMatthew G. Knepley PetscFunctionBegin; 299675d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 299775d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 299875d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 299975d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 3000d963de37SMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 3001d963de37SMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr); 300275d3a19aSMatthew G. Knepley ierr = DMPlexGetNumLabels(dm, &numLabels);CHKERRQ(ierr); 300375d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 300475d3a19aSMatthew G. Knepley switch (refiner) { 300575d3a19aSMatthew G. Knepley case 3: 300675d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 300775d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 300875d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 300975d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 301075d3a19aSMatthew G. Knepley } 301175d3a19aSMatthew G. Knepley for (l = 0; l < numLabels; ++l) { 301275d3a19aSMatthew G. Knepley DMLabel label, labelNew; 301375d3a19aSMatthew G. Knepley const char *lname; 301475d3a19aSMatthew G. Knepley PetscBool isDepth; 301575d3a19aSMatthew G. Knepley IS valueIS; 301675d3a19aSMatthew G. Knepley const PetscInt *values; 301775d3a19aSMatthew G. Knepley PetscInt numValues, val; 301875d3a19aSMatthew G. Knepley 301975d3a19aSMatthew G. Knepley ierr = DMPlexGetLabelName(dm, l, &lname);CHKERRQ(ierr); 302075d3a19aSMatthew G. Knepley ierr = PetscStrcmp(lname, "depth", &isDepth);CHKERRQ(ierr); 302175d3a19aSMatthew G. Knepley if (isDepth) continue; 302275d3a19aSMatthew G. Knepley ierr = DMPlexCreateLabel(rdm, lname);CHKERRQ(ierr); 302375d3a19aSMatthew G. Knepley ierr = DMPlexGetLabel(dm, lname, &label);CHKERRQ(ierr); 302475d3a19aSMatthew G. Knepley ierr = DMPlexGetLabel(rdm, lname, &labelNew);CHKERRQ(ierr); 302575d3a19aSMatthew G. Knepley ierr = DMLabelGetValueIS(label, &valueIS);CHKERRQ(ierr); 302675d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(valueIS, &numValues);CHKERRQ(ierr); 302775d3a19aSMatthew G. Knepley ierr = ISGetIndices(valueIS, &values);CHKERRQ(ierr); 302875d3a19aSMatthew G. Knepley for (val = 0; val < numValues; ++val) { 302975d3a19aSMatthew G. Knepley IS pointIS; 303075d3a19aSMatthew G. Knepley const PetscInt *points; 303175d3a19aSMatthew G. Knepley PetscInt numPoints, n; 303275d3a19aSMatthew G. Knepley 303375d3a19aSMatthew G. Knepley ierr = DMLabelGetStratumIS(label, values[val], &pointIS);CHKERRQ(ierr); 303475d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(pointIS, &numPoints);CHKERRQ(ierr); 303575d3a19aSMatthew G. Knepley ierr = ISGetIndices(pointIS, &points);CHKERRQ(ierr); 303675d3a19aSMatthew G. Knepley for (n = 0; n < numPoints; ++n) { 303775d3a19aSMatthew G. Knepley const PetscInt p = points[n]; 303875d3a19aSMatthew G. Knepley switch (refiner) { 303975d3a19aSMatthew G. Knepley case 1: 304075d3a19aSMatthew G. Knepley /* Simplicial 2D */ 304175d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 304275d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 304375d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 304475d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 304575d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 304675d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 304775d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 304875d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 304975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 305075d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 305175d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 305275d3a19aSMatthew G. Knepley } 305375d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 305475d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces */ 305575d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 305675d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 305775d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 305875d3a19aSMatthew G. Knepley } 305975d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 306075d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 306175d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 306275d3a19aSMatthew G. Knepley } 306375d3a19aSMatthew G. Knepley } 306475d3a19aSMatthew G. Knepley break; 306575d3a19aSMatthew G. Knepley case 2: 306675d3a19aSMatthew G. Knepley /* Hex 2D */ 306775d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 306875d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 306975d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 307075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 307175d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 307275d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 307375d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 307475d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 307575d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 307675d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 307775d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 307875d3a19aSMatthew G. Knepley } 307975d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 308075d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces and vertex */ 308175d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 308275d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 308375d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 308475d3a19aSMatthew G. Knepley } 308575d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 308675d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*4 + r; 308775d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 308875d3a19aSMatthew G. Knepley } 308975d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (p - cStart); 309075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 309175d3a19aSMatthew G. Knepley } 309275d3a19aSMatthew G. Knepley break; 309375d3a19aSMatthew G. Knepley case 3: 309475d3a19aSMatthew G. Knepley /* Hybrid simplicial 2D */ 309575d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 309675d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 309775d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 309875d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 309975d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 310075d3a19aSMatthew G. Knepley /* Old interior faces add new faces and vertex */ 310175d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 310275d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 310375d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 310475d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 310575d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 310675d3a19aSMatthew G. Knepley } 310775d3a19aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 310875d3a19aSMatthew G. Knepley /* Old hybrid faces stay the same */ 310975d3a19aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (p - fMax); 311075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 311175d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 311275d3a19aSMatthew G. Knepley /* Old interior cells add new cells and interior faces */ 311375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 311475d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 311575d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 311675d3a19aSMatthew G. Knepley } 311775d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 311875d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 311975d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 312075d3a19aSMatthew G. Knepley } 312175d3a19aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 312275d3a19aSMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 312375d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 312475d3a19aSMatthew G. Knepley newp = cStartNew + (cMax - cStart)*4 + (p - cMax)*2 + r; 312575d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 312675d3a19aSMatthew G. Knepley } 312775d3a19aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (p - cMax); 312875d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 312975d3a19aSMatthew G. Knepley } 313075d3a19aSMatthew G. Knepley break; 3131b5da9499SMatthew G. Knepley case 5: 3132b5da9499SMatthew G. Knepley /* Simplicial 3D */ 3133b5da9499SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 3134b5da9499SMatthew G. Knepley /* Old vertices stay the same */ 3135b5da9499SMatthew G. Knepley newp = vStartNew + (p - vStart); 3136b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3137b5da9499SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 3138b5da9499SMatthew G. Knepley /* Old edges add new edges and vertex */ 3139b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 3140b5da9499SMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 3141b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3142b5da9499SMatthew G. Knepley } 3143b5da9499SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 3144b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3145b5da9499SMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 3146b5da9499SMatthew G. Knepley /* Old faces add new faces and edges */ 3147b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 3148b5da9499SMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 3149b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3150b5da9499SMatthew G. Knepley } 3151b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 3152b5da9499SMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (p - fStart)*3 + r; 3153b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3154b5da9499SMatthew G. Knepley } 3155b5da9499SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 3156b5da9499SMatthew G. Knepley /* Old cells add new cells and interior faces and edges */ 3157b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 3158b5da9499SMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 3159b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3160b5da9499SMatthew G. Knepley } 3161b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 3162b5da9499SMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (p - cStart)*8 + r; 3163b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3164b5da9499SMatthew G. Knepley } 3165b5da9499SMatthew G. Knepley for (r = 0; r < 1; ++r) { 3166b5da9499SMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (p - cStart)*1 + r; 3167b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3168b5da9499SMatthew G. Knepley } 3169b5da9499SMatthew G. Knepley } 3170b5da9499SMatthew G. Knepley break; 3171*2eabf88fSMatthew G. Knepley case 6: 3172*2eabf88fSMatthew G. Knepley /* Hex 3D */ 3173*2eabf88fSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 3174*2eabf88fSMatthew G. Knepley /* Old vertices stay the same */ 3175*2eabf88fSMatthew G. Knepley newp = vStartNew + (p - vStart); 3176*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3177*2eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 3178*2eabf88fSMatthew G. Knepley /* Old edges add new edges and vertex */ 3179*2eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 3180*2eabf88fSMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 3181*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3182*2eabf88fSMatthew G. Knepley } 3183*2eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 3184*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3185*2eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 3186*2eabf88fSMatthew G. Knepley /* Old faces add new faces, edges, and vertex */ 3187*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 3188*2eabf88fSMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 3189*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3190*2eabf88fSMatthew G. Knepley } 3191*2eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 3192*2eabf88fSMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (p - fStart)*4 + r; 3193*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3194*2eabf88fSMatthew G. Knepley } 3195*2eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (p - fStart); 3196*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3197*2eabf88fSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 3198*2eabf88fSMatthew G. Knepley /* Old cells add new cells, faces, edges, and vertex */ 3199*2eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r) { 3200*2eabf88fSMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 3201*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3202*2eabf88fSMatthew G. Knepley } 3203*2eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r) { 3204*2eabf88fSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (p - cStart)*12 + r; 3205*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3206*2eabf88fSMatthew G. Knepley } 3207*2eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 3208*2eabf88fSMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (p - cStart)*6 + r; 3209*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3210*2eabf88fSMatthew G. Knepley } 3211*2eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (p - cStart); 3212*2eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 3213*2eabf88fSMatthew G. Knepley } 3214*2eabf88fSMatthew G. Knepley break; 321575d3a19aSMatthew G. Knepley default: 321675d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 321775d3a19aSMatthew G. Knepley } 321875d3a19aSMatthew G. Knepley } 321975d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(pointIS, &points);CHKERRQ(ierr); 322075d3a19aSMatthew G. Knepley ierr = ISDestroy(&pointIS);CHKERRQ(ierr); 322175d3a19aSMatthew G. Knepley } 322275d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(valueIS, &values);CHKERRQ(ierr); 322375d3a19aSMatthew G. Knepley ierr = ISDestroy(&valueIS);CHKERRQ(ierr); 322475d3a19aSMatthew G. Knepley if (0) { 322575d3a19aSMatthew G. Knepley ierr = PetscViewerASCIISynchronizedAllow(PETSC_VIEWER_STDOUT_WORLD, PETSC_TRUE);CHKERRQ(ierr); 322675d3a19aSMatthew G. Knepley ierr = DMLabelView(labelNew, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 322775d3a19aSMatthew G. Knepley ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 322875d3a19aSMatthew G. Knepley } 322975d3a19aSMatthew G. Knepley } 323075d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 323175d3a19aSMatthew G. Knepley } 323275d3a19aSMatthew G. Knepley 323375d3a19aSMatthew G. Knepley #undef __FUNCT__ 3234509c9b89SMatthew G. Knepley #define __FUNCT__ "DMPlexRefineUniform_Internal" 323575d3a19aSMatthew G. Knepley /* This will only work for interpolated meshes */ 3236509c9b89SMatthew G. Knepley PetscErrorCode DMPlexRefineUniform_Internal(DM dm, CellRefiner cellRefiner, DM *dmRefined) 323775d3a19aSMatthew G. Knepley { 323875d3a19aSMatthew G. Knepley DM rdm; 323975d3a19aSMatthew G. Knepley PetscInt *depthSize; 324075d3a19aSMatthew G. Knepley PetscInt dim, depth = 0, d, pStart = 0, pEnd = 0; 324175d3a19aSMatthew G. Knepley PetscErrorCode ierr; 324275d3a19aSMatthew G. Knepley 324375d3a19aSMatthew G. Knepley PetscFunctionBegin; 324475d3a19aSMatthew G. Knepley ierr = DMCreate(PetscObjectComm((PetscObject)dm), &rdm);CHKERRQ(ierr); 324575d3a19aSMatthew G. Knepley ierr = DMSetType(rdm, DMPLEX);CHKERRQ(ierr); 324675d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 324775d3a19aSMatthew G. Knepley ierr = DMPlexSetDimension(rdm, dim);CHKERRQ(ierr); 324875d3a19aSMatthew G. Knepley /* Calculate number of new points of each depth */ 324975d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 325075d3a19aSMatthew G. Knepley ierr = PetscMalloc((depth+1) * sizeof(PetscInt), &depthSize);CHKERRQ(ierr); 325175d3a19aSMatthew G. Knepley ierr = PetscMemzero(depthSize, (depth+1) * sizeof(PetscInt));CHKERRQ(ierr); 325275d3a19aSMatthew G. Knepley ierr = CellRefinerGetSizes(cellRefiner, dm, depthSize);CHKERRQ(ierr); 325375d3a19aSMatthew G. Knepley /* Step 1: Set chart */ 325475d3a19aSMatthew G. Knepley for (d = 0; d <= depth; ++d) pEnd += depthSize[d]; 325575d3a19aSMatthew G. Knepley ierr = DMPlexSetChart(rdm, pStart, pEnd);CHKERRQ(ierr); 325675d3a19aSMatthew G. Knepley /* Step 2: Set cone/support sizes */ 325775d3a19aSMatthew G. Knepley ierr = CellRefinerSetConeSizes(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 325875d3a19aSMatthew G. Knepley /* Step 3: Setup refined DM */ 325975d3a19aSMatthew G. Knepley ierr = DMSetUp(rdm);CHKERRQ(ierr); 326075d3a19aSMatthew G. Knepley /* Step 4: Set cones and supports */ 326175d3a19aSMatthew G. Knepley ierr = CellRefinerSetCones(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 326275d3a19aSMatthew G. Knepley /* Step 5: Stratify */ 326375d3a19aSMatthew G. Knepley ierr = DMPlexStratify(rdm);CHKERRQ(ierr); 326475d3a19aSMatthew G. Knepley /* Step 6: Set coordinates for vertices */ 326575d3a19aSMatthew G. Knepley ierr = CellRefinerSetCoordinates(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 326675d3a19aSMatthew G. Knepley /* Step 7: Create pointSF */ 326775d3a19aSMatthew G. Knepley ierr = CellRefinerCreateSF(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 326875d3a19aSMatthew G. Knepley /* Step 8: Create labels */ 326975d3a19aSMatthew G. Knepley ierr = CellRefinerCreateLabels(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 327075d3a19aSMatthew G. Knepley ierr = PetscFree(depthSize);CHKERRQ(ierr); 327175d3a19aSMatthew G. Knepley 327275d3a19aSMatthew G. Knepley *dmRefined = rdm; 327375d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 327475d3a19aSMatthew G. Knepley } 327575d3a19aSMatthew G. Knepley 327675d3a19aSMatthew G. Knepley #undef __FUNCT__ 327775d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexSetRefinementUniform" 327875d3a19aSMatthew G. Knepley PetscErrorCode DMPlexSetRefinementUniform(DM dm, PetscBool refinementUniform) 327975d3a19aSMatthew G. Knepley { 328075d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 328175d3a19aSMatthew G. Knepley 328275d3a19aSMatthew G. Knepley PetscFunctionBegin; 328375d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 328475d3a19aSMatthew G. Knepley mesh->refinementUniform = refinementUniform; 328575d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 328675d3a19aSMatthew G. Knepley } 328775d3a19aSMatthew G. Knepley 328875d3a19aSMatthew G. Knepley #undef __FUNCT__ 328975d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexGetRefinementUniform" 329075d3a19aSMatthew G. Knepley PetscErrorCode DMPlexGetRefinementUniform(DM dm, PetscBool *refinementUniform) 329175d3a19aSMatthew G. Knepley { 329275d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 329375d3a19aSMatthew G. Knepley 329475d3a19aSMatthew G. Knepley PetscFunctionBegin; 329575d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 329675d3a19aSMatthew G. Knepley PetscValidPointer(refinementUniform, 2); 329775d3a19aSMatthew G. Knepley *refinementUniform = mesh->refinementUniform; 329875d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 329975d3a19aSMatthew G. Knepley } 330075d3a19aSMatthew G. Knepley 330175d3a19aSMatthew G. Knepley #undef __FUNCT__ 330275d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexSetRefinementLimit" 330375d3a19aSMatthew G. Knepley PetscErrorCode DMPlexSetRefinementLimit(DM dm, PetscReal refinementLimit) 330475d3a19aSMatthew G. Knepley { 330575d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 330675d3a19aSMatthew G. Knepley 330775d3a19aSMatthew G. Knepley PetscFunctionBegin; 330875d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 330975d3a19aSMatthew G. Knepley mesh->refinementLimit = refinementLimit; 331075d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 331175d3a19aSMatthew G. Knepley } 331275d3a19aSMatthew G. Knepley 331375d3a19aSMatthew G. Knepley #undef __FUNCT__ 331475d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexGetRefinementLimit" 331575d3a19aSMatthew G. Knepley PetscErrorCode DMPlexGetRefinementLimit(DM dm, PetscReal *refinementLimit) 331675d3a19aSMatthew G. Knepley { 331775d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 331875d3a19aSMatthew G. Knepley 331975d3a19aSMatthew G. Knepley PetscFunctionBegin; 332075d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 332175d3a19aSMatthew G. Knepley PetscValidPointer(refinementLimit, 2); 332275d3a19aSMatthew G. Knepley /* if (mesh->refinementLimit < 0) = getMaxVolume()/2.0; */ 332375d3a19aSMatthew G. Knepley *refinementLimit = mesh->refinementLimit; 332475d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 332575d3a19aSMatthew G. Knepley } 332675d3a19aSMatthew G. Knepley 332775d3a19aSMatthew G. Knepley #undef __FUNCT__ 3328509c9b89SMatthew G. Knepley #define __FUNCT__ "DMPlexGetCellRefiner_Internal" 3329509c9b89SMatthew G. Knepley PetscErrorCode DMPlexGetCellRefiner_Internal(DM dm, CellRefiner *cellRefiner) 333075d3a19aSMatthew G. Knepley { 333175d3a19aSMatthew G. Knepley PetscInt dim, cStart, coneSize, cMax; 333275d3a19aSMatthew G. Knepley PetscErrorCode ierr; 333375d3a19aSMatthew G. Knepley 333475d3a19aSMatthew G. Knepley PetscFunctionBegin; 333575d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 333675d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, NULL);CHKERRQ(ierr); 333775d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, cStart, &coneSize);CHKERRQ(ierr); 333875d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, NULL, NULL, NULL);CHKERRQ(ierr); 333975d3a19aSMatthew G. Knepley switch (dim) { 334075d3a19aSMatthew G. Knepley case 2: 334175d3a19aSMatthew G. Knepley switch (coneSize) { 334275d3a19aSMatthew G. Knepley case 3: 334375d3a19aSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 3; /* Hybrid */ 334475d3a19aSMatthew G. Knepley else *cellRefiner = 1; /* Triangular */ 334575d3a19aSMatthew G. Knepley break; 334675d3a19aSMatthew G. Knepley case 4: 334775d3a19aSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 4; /* Hybrid */ 334875d3a19aSMatthew G. Knepley else *cellRefiner = 2; /* Quadrilateral */ 334975d3a19aSMatthew G. Knepley break; 335075d3a19aSMatthew G. Knepley default: 335175d3a19aSMatthew G. Knepley SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown coneSize %d in dimension %d for cell refiner", coneSize, dim); 335275d3a19aSMatthew G. Knepley } 335375d3a19aSMatthew G. Knepley break; 3354b5da9499SMatthew G. Knepley case 3: 3355b5da9499SMatthew G. Knepley switch (coneSize) { 3356b5da9499SMatthew G. Knepley case 4: 3357b5da9499SMatthew G. Knepley if (cMax >= 0) *cellRefiner = 7; /* Hybrid */ 3358b5da9499SMatthew G. Knepley else *cellRefiner = 5; /* Tetrahedral */ 3359b5da9499SMatthew G. Knepley break; 3360*2eabf88fSMatthew G. Knepley case 6: 3361*2eabf88fSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 8; /* Hybrid */ 3362*2eabf88fSMatthew G. Knepley else *cellRefiner = 6; /* hexahedral */ 3363*2eabf88fSMatthew G. Knepley break; 3364b5da9499SMatthew G. Knepley default: 3365b5da9499SMatthew G. Knepley SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown coneSize %d in dimension %d for cell refiner", coneSize, dim); 3366b5da9499SMatthew G. Knepley } 3367b5da9499SMatthew G. Knepley break; 336875d3a19aSMatthew G. Knepley default: 336975d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown dimension %d for cell refiner", dim); 337075d3a19aSMatthew G. Knepley } 337175d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 337275d3a19aSMatthew G. Knepley } 3373