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__ 2975d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerGetSizes" 3075d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerGetSizes(CellRefiner refiner, DM dm, PetscInt depthSize[]) 3175d3a19aSMatthew G. Knepley { 326ce3c06aSMatthew G. Knepley PetscInt cStart, cEnd, cMax, vStart, vEnd, vMax, fStart, fEnd, fMax, eStart, eEnd, eMax; 3375d3a19aSMatthew G. Knepley PetscErrorCode ierr; 3475d3a19aSMatthew G. Knepley 3575d3a19aSMatthew G. Knepley PetscFunctionBegin; 3675d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 3775d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 3875d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 3975d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 4075d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 4175d3a19aSMatthew G. Knepley switch (refiner) { 423478d7aaSMatthew G. Knepley case 0: 433478d7aaSMatthew G. Knepley break; 4475d3a19aSMatthew G. Knepley case 1: 4575d3a19aSMatthew G. Knepley /* Simplicial 2D */ 4675d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + fEnd - fStart; /* Add a vertex on every face */ 4775d3a19aSMatthew 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 */ 4875d3a19aSMatthew G. Knepley depthSize[2] = 4*(cEnd - cStart); /* Every cell split into 4 cells */ 4975d3a19aSMatthew G. Knepley break; 5075d3a19aSMatthew G. Knepley case 3: 51d963de37SMatthew G. Knepley /* Hybrid Simplicial 2D */ 5275d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 5375d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 5475d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + fMax - fStart; /* Add a vertex on every face, but not hybrid faces */ 5575d3a19aSMatthew 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 */ 5675d3a19aSMatthew G. Knepley depthSize[2] = 4*(cMax - cStart) + 2*(cEnd - cMax); /* Interior cells split into 4 cells, Hybrid cells split into 2 cells */ 5775d3a19aSMatthew G. Knepley break; 5875d3a19aSMatthew G. Knepley case 2: 5975d3a19aSMatthew G. Knepley /* Hex 2D */ 6075d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + cEnd - cStart + fEnd - fStart; /* Add a vertex on every face and cell */ 6175d3a19aSMatthew 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 */ 6275d3a19aSMatthew G. Knepley depthSize[2] = 4*(cEnd - cStart); /* Every cell split into 4 cells */ 6375d3a19aSMatthew G. Knepley break; 64b5da9499SMatthew G. Knepley case 5: 65b5da9499SMatthew G. Knepley /* Simplicial 3D */ 66b5da9499SMatthew G. Knepley depthSize[0] = vEnd - vStart + eEnd - eStart; /* Add a vertex on every edge */ 67b5da9499SMatthew 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 */ 68b5da9499SMatthew G. Knepley depthSize[2] = 4*(fEnd - fStart) + 8*(cEnd - cStart); /* Every face split into 4 faces and 8 faces are added for each cell */ 69b5da9499SMatthew G. Knepley depthSize[3] = 8*(cEnd - cStart); /* Every cell split into 8 cells */ 70b5da9499SMatthew G. Knepley break; 71b5da9499SMatthew G. Knepley case 7: 72b5da9499SMatthew G. Knepley /* Hybrid Simplicial 3D */ 73b5da9499SMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 746ce3c06aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 75b5da9499SMatthew G. Knepley if (eMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No edge maximum specified in hybrid mesh"); 76dae4404aSMatthew G. Knepley /* Tetrahedra */ 77dae4404aSMatthew G. Knepley depthSize[0] = vEnd - vStart + eMax - eStart; /* Add a vertex on every interior edge */ 78dae4404aSMatthew G. Knepley depthSize[1] = 2*(eMax - eStart) + 3*(fMax - fStart) + (cMax - cStart); /* Every interior edge split into 2 edges, 3 edges added for each interior face, 1 edge for each interior cell */ 79dae4404aSMatthew G. Knepley depthSize[2] = 4*(fMax - fStart) + 8*(cMax - cStart); /* Every interior face split into 4 faces, 8 faces added for each interior cell */ 80dae4404aSMatthew G. Knepley depthSize[3] = 8*(cMax - cStart); /* Every interior cell split into 8 cells */ 81dae4404aSMatthew G. Knepley /* Triangular Prisms */ 82dae4404aSMatthew G. Knepley depthSize[0] += 0; /* No hybrid vertices */ 83dae4404aSMatthew G. Knepley depthSize[1] += (eEnd - eMax) + (fEnd - fMax); /* Every hybrid edge remains, 1 edge for every hybrid face */ 846ce3c06aSMatthew G. Knepley depthSize[2] += 2*(fEnd - fMax) + 3*(cEnd - cMax); /* Every hybrid face split into 2 faces and 3 faces are added for each hybrid cell */ 85dae4404aSMatthew G. Knepley depthSize[3] += 4*(cEnd - cMax); /* Every hybrid cell split into 4 cells */ 86b5da9499SMatthew G. Knepley break; 876ce3c06aSMatthew G. Knepley case 6: 886ce3c06aSMatthew G. Knepley /* Hex 3D */ 896ce3c06aSMatthew G. Knepley depthSize[0] = vEnd - vStart + eEnd - eStart + fEnd - fStart + cEnd - cStart; /* Add a vertex on every edge, face and cell */ 906ce3c06aSMatthew 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 */ 916ce3c06aSMatthew 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 */ 926ce3c06aSMatthew G. Knepley depthSize[3] = 8*(cEnd - cStart); /* Every cell split into 8 cells */ 936ce3c06aSMatthew G. Knepley break; 9475d3a19aSMatthew G. Knepley default: 9575d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 9675d3a19aSMatthew G. Knepley } 9775d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 9875d3a19aSMatthew G. Knepley } 9975d3a19aSMatthew G. Knepley 10042525629SMatthew G. Knepley /* Return triangle edge for orientation o, if it is r for o == 0 */ 10142525629SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriEdge_Static(PetscInt o, PetscInt r) { 102518a8359SMatthew G. Knepley return (o < 0 ? 2-(o+r) : o+r)%3; 103518a8359SMatthew G. Knepley } 104de65f515SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriEdgeInverse_Static(PetscInt o, PetscInt s) { 105de65f515SMatthew G. Knepley return (o < 0 ? 2-(o+s) : 3+s-o)%3; 106de65f515SMatthew G. Knepley } 107518a8359SMatthew G. Knepley 108518a8359SMatthew G. Knepley /* Return triangle subface for orientation o, if it is r for o == 0 */ 109518a8359SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriSubface_Static(PetscInt o, PetscInt r) { 1104bae88c7SMatthew G. Knepley return (o < 0 ? 3-(o+r) : o+r)%3; 11142525629SMatthew G. Knepley } 112de65f515SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriSubfaceInverse_Static(PetscInt o, PetscInt s) { 113de65f515SMatthew G. Knepley return (o < 0 ? 3-(o+s) : 3+s-o)%3; 114de65f515SMatthew G. Knepley } 11542525629SMatthew G. Knepley 116e3f8b1d6SMatthew G. Knepley /* Return quad edge for orientation o, if it is r for o == 0 */ 117e3f8b1d6SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadEdge_Static(PetscInt o, PetscInt r) { 118e3f8b1d6SMatthew G. Knepley return (o < 0 ? 3-(o+r) : o+r)%4; 119e3f8b1d6SMatthew G. Knepley } 120d6d937efSMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadEdgeInverse_Static(PetscInt o, PetscInt s) { 121d6d937efSMatthew G. Knepley return (o < 0 ? 3-(o+s) : 4+s-o)%4; 122d6d937efSMatthew G. Knepley } 123e3f8b1d6SMatthew G. Knepley 124e3f8b1d6SMatthew G. Knepley /* Return quad subface for orientation o, if it is r for o == 0 */ 125e3f8b1d6SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadSubface_Static(PetscInt o, PetscInt r) { 1264bae88c7SMatthew G. Knepley return (o < 0 ? 4-(o+r) : o+r)%4; 12742525629SMatthew G. Knepley } 128d6d937efSMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadSubfaceInverse_Static(PetscInt o, PetscInt s) { 129d6d937efSMatthew G. Knepley return (o < 0 ? 4-(o+s) : 4+s-o)%4; 130d6d937efSMatthew G. Knepley } 13142525629SMatthew G. Knepley 13275d3a19aSMatthew G. Knepley #undef __FUNCT__ 13375d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetConeSizes" 13475d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerSetConeSizes(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 13575d3a19aSMatthew G. Knepley { 136b5da9499SMatthew 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; 13775d3a19aSMatthew G. Knepley PetscErrorCode ierr; 13875d3a19aSMatthew G. Knepley 13975d3a19aSMatthew G. Knepley PetscFunctionBegin; 14075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 14175d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 14275d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 14375d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 14475d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 14575d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 1463478d7aaSMatthew G. Knepley if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr);} 14775d3a19aSMatthew G. Knepley switch (refiner) { 1483478d7aaSMatthew G. Knepley case 0: break; 14975d3a19aSMatthew G. Knepley case 1: 15075d3a19aSMatthew G. Knepley /* Simplicial 2D */ 15175d3a19aSMatthew G. Knepley /* All cells have 3 faces */ 15275d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 15375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 15475d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4 + r; 15575d3a19aSMatthew G. Knepley 15675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 15775d3a19aSMatthew G. Knepley } 15875d3a19aSMatthew G. Knepley } 15975d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 16075d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 16175d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 16275d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 16375d3a19aSMatthew G. Knepley PetscInt size; 16475d3a19aSMatthew G. Knepley 16575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 16675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 16775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 16875d3a19aSMatthew G. Knepley } 16975d3a19aSMatthew G. Knepley } 17075d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 17175d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 17275d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 17375d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + r; 17475d3a19aSMatthew G. Knepley 17575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 17675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 17775d3a19aSMatthew G. Knepley } 17875d3a19aSMatthew G. Knepley } 17975d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 18075d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 18175d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 18275d3a19aSMatthew G. Knepley PetscInt size; 18375d3a19aSMatthew G. Knepley 18475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 18575d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 18675d3a19aSMatthew G. Knepley } 18775d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells*2 supports */ 18875d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 18975d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 19075d3a19aSMatthew G. Knepley PetscInt size; 19175d3a19aSMatthew G. Knepley 19275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 19375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size*2);CHKERRQ(ierr); 19475d3a19aSMatthew G. Knepley } 19575d3a19aSMatthew G. Knepley break; 19675d3a19aSMatthew G. Knepley case 2: 19775d3a19aSMatthew G. Knepley /* Hex 2D */ 19875d3a19aSMatthew G. Knepley /* All cells have 4 faces */ 19975d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 20075d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 20175d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4 + r; 20275d3a19aSMatthew G. Knepley 20375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 20475d3a19aSMatthew G. Knepley } 20575d3a19aSMatthew G. Knepley } 20675d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 20775d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 20875d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 20975d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 21075d3a19aSMatthew G. Knepley PetscInt size; 21175d3a19aSMatthew G. Knepley 21275d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 21375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 21475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 21575d3a19aSMatthew G. Knepley } 21675d3a19aSMatthew G. Knepley } 21775d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 21875d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 21975d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 22075d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 22175d3a19aSMatthew G. Knepley 22275d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 22375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 22475d3a19aSMatthew G. Knepley } 22575d3a19aSMatthew G. Knepley } 22675d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 22775d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 22875d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 22975d3a19aSMatthew G. Knepley PetscInt size; 23075d3a19aSMatthew G. Knepley 23175d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 23275d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 23375d3a19aSMatthew G. Knepley } 23475d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells supports */ 23575d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 23675d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 23775d3a19aSMatthew G. Knepley PetscInt size; 23875d3a19aSMatthew G. Knepley 23975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 24075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 24175d3a19aSMatthew G. Knepley } 24275d3a19aSMatthew G. Knepley /* Cell vertices have 4 supports */ 24375d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 24475d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 24575d3a19aSMatthew G. Knepley 24675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 24775d3a19aSMatthew G. Knepley } 24875d3a19aSMatthew G. Knepley break; 24975d3a19aSMatthew G. Knepley case 3: 250d963de37SMatthew G. Knepley /* Hybrid Simplicial 2D */ 25175d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 25275d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 25375d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 25475d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 25575d3a19aSMatthew G. Knepley ierr = DMPlexSetHybridBounds(rdm, cStartNew + (cMax - cStart)*4, fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3, PETSC_DETERMINE, PETSC_DETERMINE);CHKERRQ(ierr); 25675d3a19aSMatthew G. Knepley /* Interior cells have 3 faces */ 25775d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 25875d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 25975d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4 + r; 26075d3a19aSMatthew G. Knepley 26175d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 26275d3a19aSMatthew G. Knepley } 26375d3a19aSMatthew G. Knepley } 26475d3a19aSMatthew G. Knepley /* Hybrid cells have 4 faces */ 26575d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 26675d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 26775d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2 + r; 26875d3a19aSMatthew G. Knepley 26975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 27075d3a19aSMatthew G. Knepley } 27175d3a19aSMatthew G. Knepley } 27275d3a19aSMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 27375d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 27475d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 27575d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 27675d3a19aSMatthew G. Knepley PetscInt size; 27775d3a19aSMatthew G. Knepley 27875d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 27975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 28075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 28175d3a19aSMatthew G. Knepley } 28275d3a19aSMatthew G. Knepley } 28375d3a19aSMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 28475d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 28575d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 28675d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + r; 28775d3a19aSMatthew G. Knepley 28875d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 28975d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 29075d3a19aSMatthew G. Knepley } 29175d3a19aSMatthew G. Knepley } 29275d3a19aSMatthew G. Knepley /* Hybrid faces have 2 vertices and the same cells */ 29375d3a19aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 29475d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (f - fMax); 29575d3a19aSMatthew G. Knepley PetscInt size; 29675d3a19aSMatthew G. Knepley 29775d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 29875d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 29975d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 30075d3a19aSMatthew G. Knepley } 30175d3a19aSMatthew G. Knepley /* Hybrid cell faces have 2 vertices and 2 cells */ 30275d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 30375d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 30475d3a19aSMatthew G. Knepley 30575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 30675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 30775d3a19aSMatthew G. Knepley } 30875d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 30975d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 31075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 31175d3a19aSMatthew G. Knepley PetscInt size; 31275d3a19aSMatthew G. Knepley 31375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 31475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 31575d3a19aSMatthew G. Knepley } 31675d3a19aSMatthew G. Knepley /* Face vertices have 2 + (2 interior, 1 hybrid) supports */ 31775d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 31875d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 31975d3a19aSMatthew G. Knepley const PetscInt *support; 32075d3a19aSMatthew G. Knepley PetscInt size, newSize = 2, s; 32175d3a19aSMatthew G. Knepley 32275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 32375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 32475d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 32575d3a19aSMatthew G. Knepley if (support[s] >= cMax) newSize += 1; 32675d3a19aSMatthew G. Knepley else newSize += 2; 32775d3a19aSMatthew G. Knepley } 32875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, newSize);CHKERRQ(ierr); 32975d3a19aSMatthew G. Knepley } 33075d3a19aSMatthew G. Knepley break; 331b5da9499SMatthew G. Knepley case 5: 332b5da9499SMatthew G. Knepley /* Simplicial 3D */ 333b5da9499SMatthew G. Knepley /* All cells have 4 faces */ 334b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 335b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 336dae4404aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8 + r; 337b5da9499SMatthew G. Knepley 338b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 339b5da9499SMatthew G. Knepley } 340b5da9499SMatthew G. Knepley } 341b5da9499SMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 342b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 343b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 344b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 345b5da9499SMatthew G. Knepley PetscInt size; 346b5da9499SMatthew G. Knepley 347b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 348b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 349b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 350b5da9499SMatthew G. Knepley } 351b5da9499SMatthew G. Knepley } 352b5da9499SMatthew G. Knepley /* Interior faces have 3 edges and 2 cells */ 353b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 354b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 355b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + r; 356b5da9499SMatthew G. Knepley 357b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 358b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 359b5da9499SMatthew G. Knepley } 360b5da9499SMatthew G. Knepley } 361b5da9499SMatthew G. Knepley /* Split edges have 2 vertices and the same faces */ 362b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 363b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 364b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 365b5da9499SMatthew G. Knepley PetscInt size; 366b5da9499SMatthew G. Knepley 367b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 368b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 369b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 370b5da9499SMatthew G. Knepley } 371b5da9499SMatthew G. Knepley } 372b5da9499SMatthew G. Knepley /* Face edges have 2 vertices and 2+cells*(1/2) faces */ 373b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 374b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 375b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + r; 376b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support, eint[4] = {1, 0, 2, 0}; 377b5da9499SMatthew G. Knepley PetscInt coneSize, c, supportSize, s, er, intFaces = 0; 378b5da9499SMatthew G. Knepley 379b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 380b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 381b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 382b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 383b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 384b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 385b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 386b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 38786f0afeeSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 38886f0afeeSMatthew G. Knepley er = ornt[c] < 0 ? (-(ornt[c]+1) + 2-r)%3 : (ornt[c] + r)%3; 389b5da9499SMatthew G. Knepley if (er == eint[c]) { 390b5da9499SMatthew G. Knepley intFaces += 1; 391b5da9499SMatthew G. Knepley } else { 392b5da9499SMatthew G. Knepley intFaces += 2; 393b5da9499SMatthew G. Knepley } 394b5da9499SMatthew G. Knepley } 395b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+intFaces);CHKERRQ(ierr); 396b5da9499SMatthew G. Knepley } 397b5da9499SMatthew G. Knepley } 398b5da9499SMatthew G. Knepley /* Interior edges have 2 vertices and 4 faces */ 399b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 400b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 401b5da9499SMatthew G. Knepley 402b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 403b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 404b5da9499SMatthew G. Knepley } 405b5da9499SMatthew G. Knepley /* Old vertices have identical supports */ 406b5da9499SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 407b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 408b5da9499SMatthew G. Knepley PetscInt size; 409b5da9499SMatthew G. Knepley 410b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 411b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 412b5da9499SMatthew G. Knepley } 413b5da9499SMatthew G. Knepley /* Edge vertices have 2 + faces*2 + cells*0/1 supports */ 414b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 415b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 416b5da9499SMatthew G. Knepley PetscInt size, *star = NULL, starSize, s, cellSize = 0; 417b5da9499SMatthew G. Knepley 418b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 419b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 420b5da9499SMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 421b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 422b5da9499SMatthew G. Knepley PetscInt e01, e23; 423b5da9499SMatthew G. Knepley 424b5da9499SMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cEnd)) { 425b5da9499SMatthew G. Knepley /* Check edge 0-1 */ 426b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 427b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 428b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 42942525629SMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 430b5da9499SMatthew G. Knepley /* Check edge 2-3 */ 431b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 432b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 43342525629SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 43442525629SMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 435b5da9499SMatthew G. Knepley if ((e01 == e) || (e23 == e)) ++cellSize; 436b5da9499SMatthew G. Knepley } 437b5da9499SMatthew G. Knepley } 438b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 439b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size*2 + cellSize);CHKERRQ(ierr); 440b5da9499SMatthew G. Knepley } 441b5da9499SMatthew G. Knepley break; 442dae4404aSMatthew G. Knepley case 7: 4436ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 4446ce3c06aSMatthew G. Knepley ierr = DMPlexSetHybridBounds(rdm, cStartNew + 8*(cMax-cStart), fStartNew + 4*(fMax - fStart) + 8*(cMax - cStart), 4456ce3c06aSMatthew G. Knepley eStartNew + 2*(eMax - eStart) + 3*(fMax - fStart) + (cMax - cStart), PETSC_DETERMINE);CHKERRQ(ierr); 446dae4404aSMatthew G. Knepley /* Interior cells have 4 faces */ 447dae4404aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 448dae4404aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 449dae4404aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8 + r; 450dae4404aSMatthew G. Knepley 451dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 452dae4404aSMatthew G. Knepley } 453dae4404aSMatthew G. Knepley } 454dae4404aSMatthew G. Knepley /* Hybrid cells have 5 faces */ 455dae4404aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 456dae4404aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 457dae4404aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + r; 458dae4404aSMatthew G. Knepley 459dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 5);CHKERRQ(ierr); 460dae4404aSMatthew G. Knepley } 461dae4404aSMatthew G. Knepley } 4626ce3c06aSMatthew G. Knepley /* Interior split faces have 3 edges and the same cells as the parent */ 463dae4404aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 464dae4404aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 465dae4404aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 466dae4404aSMatthew G. Knepley PetscInt size; 467dae4404aSMatthew G. Knepley 468dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 469dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 470dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 471dae4404aSMatthew G. Knepley } 472dae4404aSMatthew G. Knepley } 473dae4404aSMatthew G. Knepley /* Interior cell faces have 3 edges and 2 cells */ 474dae4404aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 475dae4404aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 476dae4404aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + r; 477dae4404aSMatthew G. Knepley 478dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 479dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 480dae4404aSMatthew G. Knepley } 481dae4404aSMatthew G. Knepley } 4826ce3c06aSMatthew G. Knepley /* Hybrid split faces have 4 edges and the same cells as the parent */ 4836ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 4846ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 4856ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + r; 4866ce3c06aSMatthew G. Knepley PetscInt size; 4876ce3c06aSMatthew G. Knepley 4886ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 4896ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 4906ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 4916ce3c06aSMatthew G. Knepley } 4926ce3c06aSMatthew G. Knepley } 4936ce3c06aSMatthew G. Knepley /* Hybrid cells faces have 4 edges and 2 cells */ 4946ce3c06aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 4956ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 4966ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + r; 4976ce3c06aSMatthew G. Knepley 4986ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 4996ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 5006ce3c06aSMatthew G. Knepley } 5016ce3c06aSMatthew G. Knepley } 5026ce3c06aSMatthew G. Knepley /* Interior split edges have 2 vertices and the same faces */ 503dae4404aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 504dae4404aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 505dae4404aSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 506dae4404aSMatthew G. Knepley PetscInt size; 507dae4404aSMatthew G. Knepley 508dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 509dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 510dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 511dae4404aSMatthew G. Knepley } 512dae4404aSMatthew G. Knepley } 5136ce3c06aSMatthew G. Knepley /* Interior face edges have 2 vertices and 2+cells*(1/2) faces */ 514dae4404aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 515dae4404aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 516dae4404aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + r; 517dae4404aSMatthew G. Knepley const PetscInt *cone, *ornt, *support, eint[4] = {1, 0, 2, 0}; 518dae4404aSMatthew G. Knepley PetscInt coneSize, c, supportSize, s, er, intFaces = 0; 519dae4404aSMatthew G. Knepley 520dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 521dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 522dae4404aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 523dae4404aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 524dae4404aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 525dae4404aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 526dae4404aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 527dae4404aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 5286ce3c06aSMatthew G. Knepley if (support[s] < cMax) { 529dae4404aSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 530dae4404aSMatthew G. Knepley er = ornt[c] < 0 ? (-(ornt[c]+1) + 2-r)%3 : (ornt[c] + r)%3; 531dae4404aSMatthew G. Knepley if (er == eint[c]) { 532dae4404aSMatthew G. Knepley intFaces += 1; 533dae4404aSMatthew G. Knepley } else { 534dae4404aSMatthew G. Knepley intFaces += 2; 535dae4404aSMatthew G. Knepley } 5366ce3c06aSMatthew G. Knepley } else { 5376ce3c06aSMatthew G. Knepley intFaces += 1; 5386ce3c06aSMatthew G. Knepley } 539dae4404aSMatthew G. Knepley } 540dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+intFaces);CHKERRQ(ierr); 541dae4404aSMatthew G. Knepley } 542dae4404aSMatthew G. Knepley } 5436ce3c06aSMatthew G. Knepley /* Interior cell edges have 2 vertices and 4 faces */ 544dae4404aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 545dae4404aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 546dae4404aSMatthew G. Knepley 547dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 548dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 549dae4404aSMatthew G. Knepley } 5506ce3c06aSMatthew G. Knepley /* Hybrid edges have 2 vertices and the same faces */ 551dae4404aSMatthew G. Knepley for (e = eMax; e < eEnd; ++e) { 5526ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (e - eMax); 5536ce3c06aSMatthew G. Knepley PetscInt size; 5546ce3c06aSMatthew G. Knepley 5556ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 5566ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 5576ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 5586ce3c06aSMatthew G. Knepley } 5596ce3c06aSMatthew G. Knepley /* Hybrid face edges have 2 vertices and 2+2*cells faces */ 5606ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 5616ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (f - fMax); 562dae4404aSMatthew G. Knepley PetscInt size; 563dae4404aSMatthew G. Knepley 564dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 565dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 5666ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+2*size);CHKERRQ(ierr); 567dae4404aSMatthew G. Knepley } 5686ce3c06aSMatthew G. Knepley /* Interior vertices have identical supports */ 569dae4404aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 570dae4404aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 571dae4404aSMatthew G. Knepley PetscInt size; 572dae4404aSMatthew G. Knepley 573dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 574dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 575dae4404aSMatthew G. Knepley } 5766ce3c06aSMatthew G. Knepley /* Interior edge vertices have 2 + interior face*2 + hybrid face + cells*0/1 supports */ 5776ce3c06aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 5786ce3c06aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 579dae4404aSMatthew G. Knepley const PetscInt *support; 5806ce3c06aSMatthew G. Knepley PetscInt size, *star = NULL, starSize, s, faceSize = 0, cellSize = 0; 581dae4404aSMatthew G. Knepley 5826ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 5836ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 584dae4404aSMatthew G. Knepley for (s = 0; s < size; ++s) { 5856ce3c06aSMatthew G. Knepley if (support[s] < fMax) faceSize += 2; 5866ce3c06aSMatthew G. Knepley else faceSize += 1; 587dae4404aSMatthew G. Knepley } 5886ce3c06aSMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 5896ce3c06aSMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 5906ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 5916ce3c06aSMatthew G. Knepley PetscInt e01, e23; 5926ce3c06aSMatthew G. Knepley 5936ce3c06aSMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cMax)) { 5946ce3c06aSMatthew G. Knepley /* Check edge 0-1 */ 5956ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 5966ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 5976ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 5986ce3c06aSMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 5996ce3c06aSMatthew G. Knepley /* Check edge 2-3 */ 6006ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 6016ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 6026ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 6036ce3c06aSMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 6046ce3c06aSMatthew G. Knepley if ((e01 == e) || (e23 == e)) ++cellSize; 6056ce3c06aSMatthew G. Knepley } 6066ce3c06aSMatthew G. Knepley } 6076ce3c06aSMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 6086ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + faceSize + cellSize);CHKERRQ(ierr); 609dae4404aSMatthew G. Knepley } 610dae4404aSMatthew G. Knepley break; 6112eabf88fSMatthew G. Knepley case 6: 6122eabf88fSMatthew G. Knepley /* Hex 3D */ 6132eabf88fSMatthew G. Knepley /* All cells have 6 faces */ 6142eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 6152eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r) { 6162eabf88fSMatthew G. Knepley const PetscInt newp = (c - cStart)*8 + r; 6172eabf88fSMatthew G. Knepley 6182eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 6);CHKERRQ(ierr); 6192eabf88fSMatthew G. Knepley } 6202eabf88fSMatthew G. Knepley } 6212eabf88fSMatthew G. Knepley /* Split faces have 4 edges and the same cells as the parent */ 6222eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 6232eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 6242eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 6252eabf88fSMatthew G. Knepley PetscInt size; 6262eabf88fSMatthew G. Knepley 6272eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 6282eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 6292eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 6302eabf88fSMatthew G. Knepley } 6312eabf88fSMatthew G. Knepley } 6322eabf88fSMatthew G. Knepley /* Interior faces have 4 edges and 2 cells */ 6332eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 6342eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r) { 6352eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + r; 6362eabf88fSMatthew G. Knepley 6372eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 6382eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 6392eabf88fSMatthew G. Knepley } 6402eabf88fSMatthew G. Knepley } 6412eabf88fSMatthew G. Knepley /* Split edges have 2 vertices and the same faces as the parent */ 6422eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 6432eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 6442eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 6452eabf88fSMatthew G. Knepley PetscInt size; 6462eabf88fSMatthew G. Knepley 6472eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 6482eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 6492eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 6502eabf88fSMatthew G. Knepley } 6512eabf88fSMatthew G. Knepley } 6522eabf88fSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells faces */ 6532eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 6542eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 6552eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 6562eabf88fSMatthew G. Knepley PetscInt size; 6572eabf88fSMatthew G. Knepley 6582eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 6592eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 6602eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+size);CHKERRQ(ierr); 6612eabf88fSMatthew G. Knepley } 6622eabf88fSMatthew G. Knepley } 6632eabf88fSMatthew G. Knepley /* Cell edges have 2 vertices and 4 faces */ 6642eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 6652eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 6662eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 6672eabf88fSMatthew G. Knepley 6682eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 6692eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 6702eabf88fSMatthew G. Knepley } 6712eabf88fSMatthew G. Knepley } 6722eabf88fSMatthew G. Knepley /* Old vertices have identical supports */ 6732eabf88fSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 6742eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 6752eabf88fSMatthew G. Knepley PetscInt size; 6762eabf88fSMatthew G. Knepley 6772eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 6782eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 6792eabf88fSMatthew G. Knepley } 6802eabf88fSMatthew G. Knepley /* Edge vertices have 2 + faces supports */ 6812eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 6822eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 6832eabf88fSMatthew G. Knepley PetscInt size; 6842eabf88fSMatthew G. Knepley 6852eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 6862eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 6872eabf88fSMatthew G. Knepley } 6882eabf88fSMatthew G. Knepley /* Face vertices have 4 + cells supports */ 6892eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 6902eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 6912eabf88fSMatthew G. Knepley PetscInt size; 6922eabf88fSMatthew G. Knepley 6932eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 6942eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4 + size);CHKERRQ(ierr); 6952eabf88fSMatthew G. Knepley } 6962eabf88fSMatthew G. Knepley /* Cell vertices have 6 supports */ 6972eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 6982eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 6992eabf88fSMatthew G. Knepley 7002eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 6);CHKERRQ(ierr); 7012eabf88fSMatthew G. Knepley } 7022eabf88fSMatthew G. Knepley break; 70375d3a19aSMatthew G. Knepley default: 70475d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 70575d3a19aSMatthew G. Knepley } 70675d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 70775d3a19aSMatthew G. Knepley } 70875d3a19aSMatthew G. Knepley 70975d3a19aSMatthew G. Knepley #undef __FUNCT__ 71075d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetCones" 71175d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerSetCones(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 71275d3a19aSMatthew G. Knepley { 713b5da9499SMatthew G. Knepley const PetscInt *faces, cellInd[4] = {0, 1, 2, 3}; 7146ce3c06aSMatthew G. Knepley PetscInt cStart, cEnd, cMax, vStart, vEnd, vMax, fStart, fEnd, fMax, eStart, eEnd, eMax; 7156ce3c06aSMatthew G. Knepley PetscInt cStartNew, cEndNew, cMaxNew, vStartNew, vEndNew, fStartNew, fEndNew, fMaxNew, eStartNew, eEndNew, eMaxNew; 7166ce3c06aSMatthew G. Knepley PetscInt depth, maxSupportSize, *supportRef, c, f, e, v, r, p; 71775d3a19aSMatthew G. Knepley PetscErrorCode ierr; 71875d3a19aSMatthew G. Knepley 71975d3a19aSMatthew G. Knepley PetscFunctionBegin; 72075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 72175d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 72275d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 72375d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 72475d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 72575d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 7263478d7aaSMatthew G. Knepley if (refiner) { 72775d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr); 72875d3a19aSMatthew G. Knepley ierr = GetDepthEnd_Private(depth, depthSize, &cEndNew, &fEndNew, &eEndNew, &vEndNew);CHKERRQ(ierr); 7293478d7aaSMatthew G. Knepley } 73075d3a19aSMatthew G. Knepley switch (refiner) { 7313478d7aaSMatthew G. Knepley case 0: break; 73275d3a19aSMatthew G. Knepley case 1: 73375d3a19aSMatthew G. Knepley /* Simplicial 2D */ 73475d3a19aSMatthew G. Knepley /* 73575d3a19aSMatthew G. Knepley 2 73675d3a19aSMatthew G. Knepley |\ 73775d3a19aSMatthew G. Knepley | \ 73875d3a19aSMatthew G. Knepley | \ 73975d3a19aSMatthew G. Knepley | \ 74075d3a19aSMatthew G. Knepley | C \ 74175d3a19aSMatthew G. Knepley | \ 74275d3a19aSMatthew G. Knepley | \ 74375d3a19aSMatthew G. Knepley 2---1---1 74475d3a19aSMatthew G. Knepley |\ D / \ 74575d3a19aSMatthew G. Knepley | 2 0 \ 74675d3a19aSMatthew G. Knepley |A \ / B \ 74775d3a19aSMatthew G. Knepley 0---0-------1 74875d3a19aSMatthew G. Knepley */ 74975d3a19aSMatthew G. Knepley /* All cells have 3 faces */ 75075d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 75175d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4; 75275d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 75375d3a19aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 75475d3a19aSMatthew G. Knepley 75575d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 75675d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 75775d3a19aSMatthew G. Knepley /* A triangle */ 75875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 75975d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 76075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 2; 76175d3a19aSMatthew G. Knepley orntNew[1] = -2; 76275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 76375d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 76475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 76575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 76675d3a19aSMatthew G. Knepley #if 1 76775d3a19aSMatthew 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); 76875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 76975d3a19aSMatthew 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); 77075d3a19aSMatthew G. Knepley } 77175d3a19aSMatthew G. Knepley #endif 77275d3a19aSMatthew G. Knepley /* B triangle */ 77375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 77475d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 77575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 77675d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 77775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 0; 77875d3a19aSMatthew G. Knepley orntNew[2] = -2; 77975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 78075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 78175d3a19aSMatthew G. Knepley #if 1 78275d3a19aSMatthew 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); 78375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 78475d3a19aSMatthew 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); 78575d3a19aSMatthew G. Knepley } 78675d3a19aSMatthew G. Knepley #endif 78775d3a19aSMatthew G. Knepley /* C triangle */ 78875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 1; 78975d3a19aSMatthew G. Knepley orntNew[0] = -2; 79075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 79175d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 79275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 79375d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 79475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 79575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 79675d3a19aSMatthew G. Knepley #if 1 79775d3a19aSMatthew 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); 79875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 79975d3a19aSMatthew 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); 80075d3a19aSMatthew G. Knepley } 80175d3a19aSMatthew G. Knepley #endif 80275d3a19aSMatthew G. Knepley /* D triangle */ 80375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 0; 80475d3a19aSMatthew G. Knepley orntNew[0] = 0; 80575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 1; 80675d3a19aSMatthew G. Knepley orntNew[1] = 0; 80775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 2; 80875d3a19aSMatthew G. Knepley orntNew[2] = 0; 80975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 81075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 81175d3a19aSMatthew G. Knepley #if 1 81275d3a19aSMatthew 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); 81375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 81475d3a19aSMatthew 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); 81575d3a19aSMatthew G. Knepley } 81675d3a19aSMatthew G. Knepley #endif 81775d3a19aSMatthew G. Knepley } 81875d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 81975d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 82075d3a19aSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 82175d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 82275d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 82375d3a19aSMatthew G. Knepley 82475d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 82575d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 826297d2bf4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 82775d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 82875d3a19aSMatthew G. Knepley 82975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 83075d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 83175d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 83275d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 83375d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 83475d3a19aSMatthew G. Knepley #if 1 83575d3a19aSMatthew 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); 83675d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 83775d3a19aSMatthew 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); 83875d3a19aSMatthew G. Knepley } 83975d3a19aSMatthew G. Knepley #endif 84075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 84175d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 84275d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 84375d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 84475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 845297d2bf4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 84675d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 84775d3a19aSMatthew G. Knepley if (cone[c] == f) break; 84875d3a19aSMatthew G. Knepley } 849297d2bf4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%3 : (c+r)%3); 85075d3a19aSMatthew G. Knepley } 85175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 85275d3a19aSMatthew G. Knepley #if 1 85375d3a19aSMatthew 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); 85475d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 85575d3a19aSMatthew 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); 85675d3a19aSMatthew G. Knepley } 85775d3a19aSMatthew G. Knepley #endif 85875d3a19aSMatthew G. Knepley } 85975d3a19aSMatthew G. Knepley } 86075d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 86175d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 86275d3a19aSMatthew G. Knepley const PetscInt *cone; 86375d3a19aSMatthew G. Knepley 86475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 86575d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 86675d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + r; 86775d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 86875d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 86975d3a19aSMatthew G. Knepley 87075d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 87175d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - fStart); 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 supportNew[0] = (c - cStart)*4 + (r+1)%3; 88075d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + 3; 88175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 88275d3a19aSMatthew G. Knepley #if 1 88375d3a19aSMatthew 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); 88475d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 88575d3a19aSMatthew 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); 88675d3a19aSMatthew G. Knepley } 88775d3a19aSMatthew G. Knepley #endif 88875d3a19aSMatthew G. Knepley } 88975d3a19aSMatthew G. Knepley } 89075d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 89175d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 89275d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 89375d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 89475d3a19aSMatthew G. Knepley PetscInt size, s; 89575d3a19aSMatthew G. Knepley 89675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 89775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 89875d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 89975d3a19aSMatthew G. Knepley PetscInt r = 0; 90075d3a19aSMatthew G. Knepley 90175d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 90275d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 90375d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 90475d3a19aSMatthew G. Knepley } 90575d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 90675d3a19aSMatthew G. Knepley #if 1 90775d3a19aSMatthew 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); 90875d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 90975d3a19aSMatthew 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); 91075d3a19aSMatthew G. Knepley } 91175d3a19aSMatthew G. Knepley #endif 91275d3a19aSMatthew G. Knepley } 91375d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells*2 supports */ 91475d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 91575d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 91675d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 91775d3a19aSMatthew G. Knepley PetscInt size, s; 91875d3a19aSMatthew G. Knepley 91975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 92075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 92175d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 92275d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 92375d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 92475d3a19aSMatthew G. Knepley PetscInt r = 0; 92575d3a19aSMatthew G. Knepley 92675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 92775d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 92875d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 92975d3a19aSMatthew G. Knepley supportRef[2+s*2+0] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*3 + (r+2)%3; 93075d3a19aSMatthew G. Knepley supportRef[2+s*2+1] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*3 + r; 93175d3a19aSMatthew G. Knepley } 93275d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 93375d3a19aSMatthew G. Knepley #if 1 93475d3a19aSMatthew 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); 93575d3a19aSMatthew G. Knepley for (p = 0; p < 2+size*2; ++p) { 93675d3a19aSMatthew 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); 93775d3a19aSMatthew G. Knepley } 93875d3a19aSMatthew G. Knepley #endif 93975d3a19aSMatthew G. Knepley } 94075d3a19aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 94175d3a19aSMatthew G. Knepley break; 94275d3a19aSMatthew G. Knepley case 2: 94375d3a19aSMatthew G. Knepley /* Hex 2D */ 94475d3a19aSMatthew G. Knepley /* 94575d3a19aSMatthew G. Knepley 3---------2---------2 94675d3a19aSMatthew G. Knepley | | | 94775d3a19aSMatthew G. Knepley | D 2 C | 94875d3a19aSMatthew G. Knepley | | | 94975d3a19aSMatthew G. Knepley 3----3----0----1----1 95075d3a19aSMatthew G. Knepley | | | 95175d3a19aSMatthew G. Knepley | A 0 B | 95275d3a19aSMatthew G. Knepley | | | 95375d3a19aSMatthew G. Knepley 0---------0---------1 95475d3a19aSMatthew G. Knepley */ 95575d3a19aSMatthew G. Knepley /* All cells have 4 faces */ 95675d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 95775d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4; 95875d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 95975d3a19aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 96075d3a19aSMatthew G. Knepley 96175d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 96275d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 96375d3a19aSMatthew G. Knepley /* A quad */ 96475d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 96575d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 96675d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 0; 96775d3a19aSMatthew G. Knepley orntNew[1] = 0; 96875d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 3; 96975d3a19aSMatthew G. Knepley orntNew[2] = -2; 97075d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 0 : 1); 97175d3a19aSMatthew G. Knepley orntNew[3] = ornt[3]; 97275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 97375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 97475d3a19aSMatthew G. Knepley #if 1 97575d3a19aSMatthew 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); 97675d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 97775d3a19aSMatthew 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); 97875d3a19aSMatthew G. Knepley } 97975d3a19aSMatthew G. Knepley #endif 98075d3a19aSMatthew G. Knepley /* B quad */ 98175d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 98275d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 98375d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 98475d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 98575d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 1; 98675d3a19aSMatthew G. Knepley orntNew[2] = 0; 98775d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 0; 98875d3a19aSMatthew G. Knepley orntNew[3] = -2; 98975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 99075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 99175d3a19aSMatthew G. Knepley #if 1 99275d3a19aSMatthew 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); 99375d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 99475d3a19aSMatthew 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); 99575d3a19aSMatthew G. Knepley } 99675d3a19aSMatthew G. Knepley #endif 99775d3a19aSMatthew G. Knepley /* C quad */ 99875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 1; 99975d3a19aSMatthew G. Knepley orntNew[0] = -2; 100075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 100175d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 100275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 100375d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 100475d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 2; 100575d3a19aSMatthew G. Knepley orntNew[3] = 0; 100675d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 100775d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 100875d3a19aSMatthew G. Knepley #if 1 100975d3a19aSMatthew 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); 101075d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 101175d3a19aSMatthew 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); 101275d3a19aSMatthew G. Knepley } 101375d3a19aSMatthew G. Knepley #endif 101475d3a19aSMatthew G. Knepley /* D quad */ 101575d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 3; 101675d3a19aSMatthew G. Knepley orntNew[0] = 0; 101775d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 2; 101875d3a19aSMatthew G. Knepley orntNew[1] = -2; 101975d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 102075d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 102175d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 1 : 0); 102275d3a19aSMatthew G. Knepley orntNew[3] = ornt[3]; 102375d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 102475d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 102575d3a19aSMatthew G. Knepley #if 1 102675d3a19aSMatthew 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); 102775d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 102875d3a19aSMatthew 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); 102975d3a19aSMatthew G. Knepley } 103075d3a19aSMatthew G. Knepley #endif 103175d3a19aSMatthew G. Knepley } 103275d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 103375d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 103475d3a19aSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 103575d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 103675d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 103775d3a19aSMatthew G. Knepley 103875d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 103975d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 1040455d6cd4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 104175d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 104275d3a19aSMatthew G. Knepley 104375d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 104475d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 104575d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 104675d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 104775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 104875d3a19aSMatthew G. Knepley #if 1 104975d3a19aSMatthew 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); 105075d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 105175d3a19aSMatthew 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); 105275d3a19aSMatthew G. Knepley } 105375d3a19aSMatthew G. Knepley #endif 105475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 105575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 105675d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 105775d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 105875d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1059455d6cd4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 106075d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 106175d3a19aSMatthew G. Knepley if (cone[c] == f) break; 106275d3a19aSMatthew G. Knepley } 1063455d6cd4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%4 : (c+r)%4); 106475d3a19aSMatthew G. Knepley } 106575d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 106675d3a19aSMatthew G. Knepley #if 1 106775d3a19aSMatthew 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); 106875d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 106975d3a19aSMatthew 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); 107075d3a19aSMatthew G. Knepley } 107175d3a19aSMatthew G. Knepley #endif 107275d3a19aSMatthew G. Knepley } 107375d3a19aSMatthew G. Knepley } 107475d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 107575d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 107675d3a19aSMatthew G. Knepley const PetscInt *cone; 107775d3a19aSMatthew G. Knepley PetscInt coneNew[2], supportNew[2]; 107875d3a19aSMatthew G. Knepley 107975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 108075d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 108175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 108275d3a19aSMatthew G. Knepley 108375d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 108475d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 108575d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 108675d3a19aSMatthew G. Knepley #if 1 108775d3a19aSMatthew 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); 108875d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 108975d3a19aSMatthew 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); 109075d3a19aSMatthew G. Knepley } 109175d3a19aSMatthew G. Knepley #endif 109275d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + r; 109375d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + (r+1)%4; 109475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 109575d3a19aSMatthew G. Knepley #if 1 109675d3a19aSMatthew 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); 109775d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 109875d3a19aSMatthew 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); 109975d3a19aSMatthew G. Knepley } 110075d3a19aSMatthew G. Knepley #endif 110175d3a19aSMatthew G. Knepley } 110275d3a19aSMatthew G. Knepley } 110375d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 110475d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 110575d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 110675d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 110775d3a19aSMatthew G. Knepley PetscInt size, s; 110875d3a19aSMatthew G. Knepley 110975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 111075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 111175d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 111275d3a19aSMatthew G. Knepley PetscInt r = 0; 111375d3a19aSMatthew G. Knepley 111475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 111575d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 111675d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 111775d3a19aSMatthew G. Knepley } 111875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 111975d3a19aSMatthew G. Knepley #if 1 112075d3a19aSMatthew 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); 112175d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 112275d3a19aSMatthew 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); 112375d3a19aSMatthew G. Knepley } 112475d3a19aSMatthew G. Knepley #endif 112575d3a19aSMatthew G. Knepley } 112675d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells supports */ 112775d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 112875d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 112975d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 113075d3a19aSMatthew G. Knepley PetscInt size, s; 113175d3a19aSMatthew G. Knepley 113275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 113375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 113475d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 113575d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 113675d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 113775d3a19aSMatthew G. Knepley PetscInt r = 0; 113875d3a19aSMatthew G. Knepley 113975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 114075d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 114175d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 114275d3a19aSMatthew G. Knepley else if (cone[3] == f) r = 3; 114375d3a19aSMatthew G. Knepley supportRef[2+s] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*4 + r; 114475d3a19aSMatthew G. Knepley } 114575d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 114675d3a19aSMatthew G. Knepley #if 1 114775d3a19aSMatthew 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); 114875d3a19aSMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 114975d3a19aSMatthew 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); 115075d3a19aSMatthew G. Knepley } 115175d3a19aSMatthew G. Knepley #endif 115275d3a19aSMatthew G. Knepley } 115375d3a19aSMatthew G. Knepley /* Cell vertices have 4 supports */ 115475d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 115575d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 115675d3a19aSMatthew G. Knepley PetscInt supportNew[4]; 115775d3a19aSMatthew G. Knepley 115875d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 115975d3a19aSMatthew G. Knepley supportNew[r] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 116075d3a19aSMatthew G. Knepley } 116175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 116275d3a19aSMatthew G. Knepley } 1163da00770fSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 116475d3a19aSMatthew G. Knepley break; 116575d3a19aSMatthew G. Knepley case 3: 116675d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 116775d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 116875d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 116975d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 117075d3a19aSMatthew G. Knepley /* Interior cells have 3 faces */ 117175d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 117275d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4; 117375d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 117475d3a19aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 117575d3a19aSMatthew G. Knepley 117675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 117775d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 117875d3a19aSMatthew G. Knepley /* A triangle */ 117975d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 118075d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 118175d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 2; 118275d3a19aSMatthew G. Knepley orntNew[1] = -2; 118375d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 118475d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 118575d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 118675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 118775d3a19aSMatthew G. Knepley #if 1 118875d3a19aSMatthew 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); 118975d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 119075d3a19aSMatthew 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); 119175d3a19aSMatthew G. Knepley } 119275d3a19aSMatthew G. Knepley #endif 119375d3a19aSMatthew G. Knepley /* B triangle */ 119475d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 119575d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 119675d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 119775d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 119875d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 0; 119975d3a19aSMatthew G. Knepley orntNew[2] = -2; 120075d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 120175d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 120275d3a19aSMatthew G. Knepley #if 1 120375d3a19aSMatthew 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); 120475d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 120575d3a19aSMatthew 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); 120675d3a19aSMatthew G. Knepley } 120775d3a19aSMatthew G. Knepley #endif 120875d3a19aSMatthew G. Knepley /* C triangle */ 120975d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 1; 121075d3a19aSMatthew G. Knepley orntNew[0] = -2; 121175d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 121275d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 121375d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 121475d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 121575d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 121675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 121775d3a19aSMatthew G. Knepley #if 1 121875d3a19aSMatthew 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); 121975d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 122075d3a19aSMatthew 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); 122175d3a19aSMatthew G. Knepley } 122275d3a19aSMatthew G. Knepley #endif 122375d3a19aSMatthew G. Knepley /* D triangle */ 122475d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 0; 122575d3a19aSMatthew G. Knepley orntNew[0] = 0; 122675d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 1; 122775d3a19aSMatthew G. Knepley orntNew[1] = 0; 122875d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 2; 122975d3a19aSMatthew G. Knepley orntNew[2] = 0; 123075d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 123175d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 123275d3a19aSMatthew G. Knepley #if 1 123375d3a19aSMatthew 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); 123475d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 123575d3a19aSMatthew 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); 123675d3a19aSMatthew G. Knepley } 123775d3a19aSMatthew G. Knepley #endif 123875d3a19aSMatthew G. Knepley } 123975d3a19aSMatthew G. Knepley /* 124075d3a19aSMatthew G. Knepley 2----3----3 124175d3a19aSMatthew G. Knepley | | 124275d3a19aSMatthew G. Knepley | B | 124375d3a19aSMatthew G. Knepley | | 124475d3a19aSMatthew G. Knepley 0----4--- 1 124575d3a19aSMatthew G. Knepley | | 124675d3a19aSMatthew G. Knepley | A | 124775d3a19aSMatthew G. Knepley | | 124875d3a19aSMatthew G. Knepley 0----2----1 124975d3a19aSMatthew G. Knepley */ 125075d3a19aSMatthew G. Knepley /* Hybrid cells have 4 faces */ 125175d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 125275d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2; 125375d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 125475d3a19aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 125575d3a19aSMatthew G. Knepley 125675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 125775d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 125875d3a19aSMatthew G. Knepley /* A quad */ 125975d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 126075d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 126175d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 126275d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 126375d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (cone[2] - fMax); 126475d3a19aSMatthew G. Knepley orntNew[2] = 0; 126575d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 126675d3a19aSMatthew G. Knepley orntNew[3] = 0; 126775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 126875d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 126975d3a19aSMatthew G. Knepley #if 1 127075d3a19aSMatthew 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); 127175d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 127275d3a19aSMatthew 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); 127375d3a19aSMatthew G. Knepley } 127475d3a19aSMatthew G. Knepley #endif 127575d3a19aSMatthew G. Knepley /* B quad */ 127675d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 127775d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 127875d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 127975d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 128075d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 128175d3a19aSMatthew G. Knepley orntNew[2] = 0; 128275d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (cone[3] - fMax); 128375d3a19aSMatthew G. Knepley orntNew[3] = 0; 128475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 128575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 128675d3a19aSMatthew G. Knepley #if 1 128775d3a19aSMatthew 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); 128875d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 128975d3a19aSMatthew 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); 129075d3a19aSMatthew G. Knepley } 129175d3a19aSMatthew G. Knepley #endif 129275d3a19aSMatthew G. Knepley } 129375d3a19aSMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 129475d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 129575d3a19aSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 129675d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 129775d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 129875d3a19aSMatthew G. Knepley 129975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 130075d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 1301297d2bf4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 130275d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 130375d3a19aSMatthew G. Knepley 130475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 130575d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 130675d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 130775d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 130875d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 130975d3a19aSMatthew G. Knepley #if 1 131075d3a19aSMatthew 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); 131175d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 131275d3a19aSMatthew 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); 131375d3a19aSMatthew G. Knepley } 131475d3a19aSMatthew G. Knepley #endif 131575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 131675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 131775d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 131875d3a19aSMatthew G. Knepley if (support[s] >= cMax) { 131975d3a19aSMatthew G. Knepley supportRef[s] = cStartNew + (cMax - cStart)*4 + (support[s] - cMax)*2 + r; 132075d3a19aSMatthew G. Knepley } else { 132175d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 132275d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1323297d2bf4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 132475d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 132575d3a19aSMatthew G. Knepley if (cone[c] == f) break; 132675d3a19aSMatthew G. Knepley } 1327297d2bf4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%3 : (c+r)%3); 132875d3a19aSMatthew G. Knepley } 132975d3a19aSMatthew G. Knepley } 133075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 133175d3a19aSMatthew G. Knepley #if 1 133275d3a19aSMatthew 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); 133375d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 133475d3a19aSMatthew 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); 133575d3a19aSMatthew G. Knepley } 133675d3a19aSMatthew G. Knepley #endif 133775d3a19aSMatthew G. Knepley } 133875d3a19aSMatthew G. Knepley } 133975d3a19aSMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 134075d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 134175d3a19aSMatthew G. Knepley const PetscInt *cone; 134275d3a19aSMatthew G. Knepley 134375d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 134475d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 134575d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + r; 134675d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 134775d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 134875d3a19aSMatthew G. Knepley 134975d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 135075d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - fStart); 135175d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 135275d3a19aSMatthew G. Knepley #if 1 135375d3a19aSMatthew 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); 135475d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 135575d3a19aSMatthew 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); 135675d3a19aSMatthew G. Knepley } 135775d3a19aSMatthew G. Knepley #endif 135875d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + (r+1)%3; 135975d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + 3; 136075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 136175d3a19aSMatthew G. Knepley #if 1 136275d3a19aSMatthew 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); 136375d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 136475d3a19aSMatthew 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); 136575d3a19aSMatthew G. Knepley } 136675d3a19aSMatthew G. Knepley #endif 136775d3a19aSMatthew G. Knepley } 136875d3a19aSMatthew G. Knepley } 136975d3a19aSMatthew G. Knepley /* Interior hybrid faces have 2 vertices and the same cells */ 137075d3a19aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 137175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (f - fMax); 137275d3a19aSMatthew G. Knepley const PetscInt *cone; 137375d3a19aSMatthew G. Knepley const PetscInt *support; 137475d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 137575d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 137675d3a19aSMatthew G. Knepley PetscInt size, s, r; 137775d3a19aSMatthew G. Knepley 137875d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 137975d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 138075d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 138175d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 138275d3a19aSMatthew G. Knepley #if 1 138375d3a19aSMatthew 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); 138475d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 138575d3a19aSMatthew 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); 138675d3a19aSMatthew G. Knepley } 138775d3a19aSMatthew G. Knepley #endif 138875d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 138975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 139075d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 139175d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 139275d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 139375d3a19aSMatthew G. Knepley if (cone[r+2] == f) break; 139475d3a19aSMatthew G. Knepley } 139575d3a19aSMatthew G. Knepley supportNew[s] = (cMax - cStart)*4 + (support[s] - cMax)*2 + r; 139675d3a19aSMatthew G. Knepley } 139775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 139875d3a19aSMatthew G. Knepley #if 1 139975d3a19aSMatthew 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); 140075d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 140175d3a19aSMatthew 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); 140275d3a19aSMatthew G. Knepley } 140375d3a19aSMatthew G. Knepley #endif 140475d3a19aSMatthew G. Knepley } 140575d3a19aSMatthew G. Knepley /* Cell hybrid faces have 2 vertices and 2 cells */ 140675d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 140775d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 140875d3a19aSMatthew G. Knepley const PetscInt *cone; 140975d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 141075d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 141175d3a19aSMatthew G. Knepley 141275d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 141375d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[0] - fStart); 141475d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[1] - fStart); 141575d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 141675d3a19aSMatthew G. Knepley #if 1 141775d3a19aSMatthew 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); 141875d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 141975d3a19aSMatthew 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); 142075d3a19aSMatthew G. Knepley } 142175d3a19aSMatthew G. Knepley #endif 142275d3a19aSMatthew G. Knepley supportNew[0] = (cMax - cStart)*4 + (c - cMax)*2 + 0; 142375d3a19aSMatthew G. Knepley supportNew[1] = (cMax - cStart)*4 + (c - cMax)*2 + 1; 142475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 142575d3a19aSMatthew G. Knepley #if 1 142675d3a19aSMatthew 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); 142775d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 142875d3a19aSMatthew 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); 142975d3a19aSMatthew G. Knepley } 143075d3a19aSMatthew G. Knepley #endif 143175d3a19aSMatthew G. Knepley } 143275d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 143375d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 143475d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 143575d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 143675d3a19aSMatthew G. Knepley PetscInt size, s; 143775d3a19aSMatthew G. Knepley 143875d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 143975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 144075d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 144175d3a19aSMatthew G. Knepley if (support[s] >= fMax) { 144275d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (support[s] - fMax); 144375d3a19aSMatthew G. Knepley } else { 144475d3a19aSMatthew G. Knepley PetscInt r = 0; 144575d3a19aSMatthew G. Knepley 144675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 144775d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 144875d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 144975d3a19aSMatthew G. Knepley } 145075d3a19aSMatthew G. Knepley } 145175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 145275d3a19aSMatthew G. Knepley #if 1 145375d3a19aSMatthew 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); 145475d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 145575d3a19aSMatthew 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); 145675d3a19aSMatthew G. Knepley } 145775d3a19aSMatthew G. Knepley #endif 145875d3a19aSMatthew G. Knepley } 145975d3a19aSMatthew G. Knepley /* Face vertices have 2 + (2 interior, 1 hybrid) supports */ 146075d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 146175d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 146275d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 146375d3a19aSMatthew G. Knepley PetscInt size, newSize = 2, s; 146475d3a19aSMatthew G. Knepley 146575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 146675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 146775d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 146875d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 146975d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 147075d3a19aSMatthew G. Knepley PetscInt r = 0; 147175d3a19aSMatthew G. Knepley 147275d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 147375d3a19aSMatthew G. Knepley if (support[s] >= cMax) { 147475d3a19aSMatthew G. Knepley supportRef[newSize+0] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (support[s] - cMax); 147575d3a19aSMatthew G. Knepley 147675d3a19aSMatthew G. Knepley newSize += 1; 147775d3a19aSMatthew G. Knepley } else { 147875d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 147975d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 148075d3a19aSMatthew G. Knepley supportRef[newSize+0] = fStartNew + (fMax - fStart)*2 + (support[s] - cStart)*3 + (r+2)%3; 148175d3a19aSMatthew G. Knepley supportRef[newSize+1] = fStartNew + (fMax - fStart)*2 + (support[s] - cStart)*3 + r; 148275d3a19aSMatthew G. Knepley 148375d3a19aSMatthew G. Knepley newSize += 2; 148475d3a19aSMatthew G. Knepley } 148575d3a19aSMatthew G. Knepley } 148675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 148775d3a19aSMatthew G. Knepley #if 1 148875d3a19aSMatthew 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); 148975d3a19aSMatthew G. Knepley for (p = 0; p < newSize; ++p) { 149075d3a19aSMatthew 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); 149175d3a19aSMatthew G. Knepley } 149275d3a19aSMatthew G. Knepley #endif 149375d3a19aSMatthew G. Knepley } 149475d3a19aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 149575d3a19aSMatthew G. Knepley break; 1496b5da9499SMatthew G. Knepley case 5: 1497b5da9499SMatthew G. Knepley /* Simplicial 3D */ 1498b5da9499SMatthew G. Knepley /* All cells have 4 faces: Tet face order is prescribed in DMPlexGetFaces_Internal() */ 1499b5da9499SMatthew G. Knepley ierr = DMPlexGetRawFaces_Internal(dm, 3, 4, cellInd, NULL, NULL, &faces);CHKERRQ(ierr); 1500b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 1501b5da9499SMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8; 1502b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 1503b5da9499SMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 1504b5da9499SMatthew G. Knepley 1505b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1506b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1507b5da9499SMatthew G. Knepley /* A tetrahedron: {0, a, c, d} */ 1508518a8359SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 0); /* A */ 1509b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1510518a8359SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 0); /* A */ 1511b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1512518a8359SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 0); /* A */ 1513b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1514b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 0; 1515b5da9499SMatthew G. Knepley orntNew[3] = 0; 1516b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 1517b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 1518b5da9499SMatthew G. Knepley #if 1 1519b5da9499SMatthew 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); 1520b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1521b5da9499SMatthew 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); 1522b5da9499SMatthew G. Knepley } 1523b5da9499SMatthew G. Knepley #endif 1524b5da9499SMatthew G. Knepley /* B tetrahedron: {a, 1, b, e} */ 1525518a8359SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 1); /* B */ 1526b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1527518a8359SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 2); /* C */ 1528b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1529b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 1; 1530b5da9499SMatthew G. Knepley orntNew[2] = 0; 1531518a8359SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 1); /* B */ 1532b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 1533b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 1534b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 1535b5da9499SMatthew G. Knepley #if 1 1536b5da9499SMatthew 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); 1537b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1538b5da9499SMatthew 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); 1539b5da9499SMatthew G. Knepley } 1540b5da9499SMatthew G. Knepley #endif 1541b5da9499SMatthew G. Knepley /* C tetrahedron: {c, b, 2, f} */ 1542518a8359SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 2); /* C */ 1543b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1544b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 2; 1545b5da9499SMatthew G. Knepley orntNew[1] = 0; 1546518a8359SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 1); /* B */ 1547b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1548518a8359SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 0); /* A */ 1549b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 1550b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 1551b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 1552b5da9499SMatthew G. Knepley #if 1 1553b5da9499SMatthew 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); 1554b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1555b5da9499SMatthew 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); 1556b5da9499SMatthew G. Knepley } 1557b5da9499SMatthew G. Knepley #endif 1558b5da9499SMatthew G. Knepley /* D tetrahedron: {d, e, f, 3} */ 1559b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 3; 1560b5da9499SMatthew G. Knepley orntNew[0] = 0; 1561518a8359SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 1); /* B */ 1562b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1563518a8359SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 2); /* C */ 1564b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1565518a8359SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 2); /* C */ 1566b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 1567b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 1568b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 1569b5da9499SMatthew G. Knepley #if 1 1570b5da9499SMatthew 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); 1571b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1572b5da9499SMatthew 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); 1573b5da9499SMatthew G. Knepley } 1574b5da9499SMatthew G. Knepley #endif 1575b5da9499SMatthew G. Knepley /* A' tetrahedron: {d, a, c, f} */ 1576b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 0; 1577b5da9499SMatthew G. Knepley orntNew[0] = -3; 1578fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (cone[2] - fStart)*4 + 3; 1579fac4ab25SMatthew G. Knepley orntNew[1] = ornt[2] < 0 ? -((-(ornt[2]+1)+0)%3+1) : (ornt[2]+0)%3; /* TODO: I do not believe this one */ 1580fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 1581fac4ab25SMatthew G. Knepley orntNew[2] = 0; 1582fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 1583fac4ab25SMatthew G. Knepley orntNew[3] = 2; 1584b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 1585b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 1586b5da9499SMatthew G. Knepley #if 1 1587b5da9499SMatthew 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); 1588b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1589b5da9499SMatthew 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); 1590b5da9499SMatthew G. Knepley } 1591b5da9499SMatthew G. Knepley #endif 1592b5da9499SMatthew G. Knepley /* B' tetrahedron: {e, b, a, f} */ 1593b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 1; 1594b5da9499SMatthew G. Knepley orntNew[0] = -3; 1595fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 1596fac4ab25SMatthew G. Knepley orntNew[1] = 1; 1597fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 1598b5da9499SMatthew G. Knepley orntNew[2] = 0; 1599fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + 3; 1600fac4ab25SMatthew G. Knepley orntNew[3] = ornt[3] < 0 ? -((-(ornt[3]+1)+0)%3+1) : (ornt[3]+0)%3; /* TODO I do not believe this one */ 1601b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 1602b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 1603b5da9499SMatthew G. Knepley #if 1 1604b5da9499SMatthew 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); 1605b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1606b5da9499SMatthew 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); 1607b5da9499SMatthew G. Knepley } 1608b5da9499SMatthew G. Knepley #endif 1609b5da9499SMatthew G. Knepley /* C' tetrahedron: {b, f, c, a} */ 1610b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 2; 1611b5da9499SMatthew G. Knepley orntNew[0] = -3; 1612fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (cone[0] - fStart)*4 + 3; 1613fac4ab25SMatthew G. Knepley orntNew[1] = ornt[0] < 0 ? -((-(ornt[0]+1)+0)%3+1) : ((ornt[0]+1)%3+1); /* TODO: This is wrong I think */ 1614fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 1615fac4ab25SMatthew G. Knepley orntNew[2] = -3; 1616fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 1617fac4ab25SMatthew G. Knepley orntNew[3] = -2; 1618b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 1619b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 1620b5da9499SMatthew G. Knepley #if 1 1621b5da9499SMatthew 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); 1622b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1623b5da9499SMatthew 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); 1624b5da9499SMatthew G. Knepley } 1625b5da9499SMatthew G. Knepley #endif 1626b5da9499SMatthew G. Knepley /* D' tetrahedron: {f, e, d, a} */ 1627b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 3; 1628b5da9499SMatthew G. Knepley orntNew[0] = -3; 1629fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 1630b5da9499SMatthew G. Knepley orntNew[1] = -3; 1631fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (cone[1] - fStart)*4 + 3; 1632fac4ab25SMatthew G. Knepley orntNew[2] = ornt[2]; 1633fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 1634fac4ab25SMatthew G. Knepley orntNew[3] = -3; 1635b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 1636b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 1637b5da9499SMatthew G. Knepley #if 1 1638b5da9499SMatthew 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); 1639b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1640b5da9499SMatthew 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); 1641b5da9499SMatthew G. Knepley } 1642b5da9499SMatthew G. Knepley #endif 1643b5da9499SMatthew G. Knepley } 1644b5da9499SMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 1645b5da9499SMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 1646b5da9499SMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 1647b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 1648b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4; 1649b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 1650b5da9499SMatthew G. Knepley PetscInt coneNew[3], orntNew[3], coneSize, supportSize, s; 1651b5da9499SMatthew G. Knepley 1652b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 1653b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 1654b5da9499SMatthew G. Knepley /* A triangle */ 1655b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1 : 0); 1656b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1657b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 2; 1658b5da9499SMatthew G. Knepley orntNew[1] = -2; 1659b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 0 : 1); 1660b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1661b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 1662b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 1663b5da9499SMatthew G. Knepley #if 1 1664b5da9499SMatthew 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); 1665b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1666b5da9499SMatthew 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); 1667b5da9499SMatthew G. Knepley } 1668b5da9499SMatthew G. Knepley #endif 1669b5da9499SMatthew G. Knepley /* B triangle */ 1670b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 0 : 1); 1671b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 1672b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1 : 0); 1673b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1674b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 0; 1675b5da9499SMatthew G. Knepley orntNew[2] = -2; 1676b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 1677b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 1678b5da9499SMatthew G. Knepley #if 1 1679b5da9499SMatthew 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); 1680b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1681b5da9499SMatthew 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); 1682b5da9499SMatthew G. Knepley } 1683b5da9499SMatthew G. Knepley #endif 1684b5da9499SMatthew G. Knepley /* C triangle */ 1685b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 1; 1686b5da9499SMatthew G. Knepley orntNew[0] = -2; 1687b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 0 : 1); 1688b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 1689b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 1 : 0); 1690b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 1691b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 1692b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 1693b5da9499SMatthew G. Knepley #if 1 1694b5da9499SMatthew 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); 1695b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1696b5da9499SMatthew 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); 1697b5da9499SMatthew G. Knepley } 1698b5da9499SMatthew G. Knepley #endif 1699b5da9499SMatthew G. Knepley /* D triangle */ 1700b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 0; 1701b5da9499SMatthew G. Knepley orntNew[0] = 0; 1702b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 1; 1703b5da9499SMatthew G. Knepley orntNew[1] = 0; 1704b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 2; 1705b5da9499SMatthew G. Knepley orntNew[2] = 0; 1706b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 1707b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 1708b5da9499SMatthew G. Knepley #if 1 1709b5da9499SMatthew 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); 1710b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1711b5da9499SMatthew 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); 1712b5da9499SMatthew G. Knepley } 1713b5da9499SMatthew G. Knepley #endif 1714b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 1715b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 1716b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 1717b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 1718b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 1719b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1720b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 1721b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 1722b5da9499SMatthew G. Knepley if (cone[c] == f) break; 1723b5da9499SMatthew G. Knepley } 1724b5da9499SMatthew 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])); 1725b5da9499SMatthew G. Knepley } 1726b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportRef);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 < supportSize; ++p) { 1730b5da9499SMatthew 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); 1731b5da9499SMatthew G. Knepley } 1732b5da9499SMatthew G. Knepley #endif 1733b5da9499SMatthew G. Knepley } 1734b5da9499SMatthew G. Knepley } 1735b5da9499SMatthew G. Knepley /* Interior faces have 3 edges and 2 cells */ 1736b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 1737b5da9499SMatthew G. Knepley PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8; 1738b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 1739b5da9499SMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 1740b5da9499SMatthew G. Knepley PetscInt supportNew[2]; 1741b5da9499SMatthew G. Knepley 1742b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1743b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1744b5da9499SMatthew G. Knepley /* Face A: {c, a, d} */ 1745b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+0)%3 : (ornt[0]+2)%3); 1746b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1747b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+0)%3 : (ornt[1]+2)%3); 1748b5da9499SMatthew G. Knepley orntNew[1] = ornt[1] < 0 ? -2 : 0; 1749b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+0)%3 : (ornt[2]+2)%3); 1750b5da9499SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 1751b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1752b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1753b5da9499SMatthew G. Knepley #if 1 1754b5da9499SMatthew 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); 1755b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1756b5da9499SMatthew 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); 1757b5da9499SMatthew G. Knepley } 1758b5da9499SMatthew G. Knepley #endif 1759b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0; 1760b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 0+4; 1761b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1762b5da9499SMatthew G. Knepley #if 1 1763b5da9499SMatthew 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); 1764b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1765b5da9499SMatthew 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); 1766b5da9499SMatthew G. Knepley } 1767b5da9499SMatthew G. Knepley #endif 1768b5da9499SMatthew G. Knepley ++newp; 1769b5da9499SMatthew G. Knepley /* Face B: {a, b, e} */ 1770b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+2)%3 : (ornt[0]+0)%3); 1771b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1772b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+2)%3 : (ornt[3]+0)%3); 1773b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 1774b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+1)%3 : (ornt[1]+1)%3); 1775b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 1776b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1777b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1778b5da9499SMatthew G. Knepley #if 1 1779b5da9499SMatthew 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); 1780b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1781b5da9499SMatthew 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); 1782b5da9499SMatthew G. Knepley } 1783b5da9499SMatthew G. Knepley #endif 1784b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1; 1785b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 1+4; 1786b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1787b5da9499SMatthew G. Knepley #if 1 1788b5da9499SMatthew 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); 1789b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1790b5da9499SMatthew 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); 1791b5da9499SMatthew G. Knepley } 1792b5da9499SMatthew G. Knepley #endif 1793b5da9499SMatthew G. Knepley ++newp; 1794b5da9499SMatthew G. Knepley /* Face C: {c, f, b} */ 1795b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+2)%3 : (ornt[2]+0)%3); 1796b5da9499SMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? -2 : 0; 1797b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+0)%3 : (ornt[3]+2)%3); 1798b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 1799b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+1)%3 : (ornt[0]+1)%3); 1800b5da9499SMatthew G. Knepley orntNew[2] = ornt[0] < 0 ? -2 : 0; 1801b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1802b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1803b5da9499SMatthew G. Knepley #if 1 1804b5da9499SMatthew 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); 1805b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1806b5da9499SMatthew 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); 1807b5da9499SMatthew G. Knepley } 1808b5da9499SMatthew G. Knepley #endif 1809b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 2; 1810b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 1811b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1812b5da9499SMatthew G. Knepley #if 1 1813b5da9499SMatthew 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); 1814b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1815b5da9499SMatthew 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); 1816b5da9499SMatthew G. Knepley } 1817b5da9499SMatthew G. Knepley #endif 1818b5da9499SMatthew G. Knepley ++newp; 1819b5da9499SMatthew G. Knepley /* Face D: {d, e, f} */ 1820b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+2)%3 : (ornt[1]+0)%3); 1821b5da9499SMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 1822b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+1)%3 : (ornt[3]+1)%3); 1823b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 1824b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+1)%3 : (ornt[2]+1)%3); 1825b5da9499SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 1826b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1827b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1828b5da9499SMatthew G. Knepley #if 1 1829b5da9499SMatthew 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); 1830b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1831b5da9499SMatthew 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); 1832b5da9499SMatthew G. Knepley } 1833b5da9499SMatthew G. Knepley #endif 1834b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 3; 1835b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 1836b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1837b5da9499SMatthew G. Knepley #if 1 1838b5da9499SMatthew 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); 1839b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1840b5da9499SMatthew 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); 1841b5da9499SMatthew G. Knepley } 1842b5da9499SMatthew G. Knepley #endif 1843b5da9499SMatthew G. Knepley ++newp; 1844b5da9499SMatthew G. Knepley /* Face E: {d, f, a} */ 1845b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+1)%3 : (ornt[2]+1)%3); 1846b5da9499SMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? 0 : -2; 1847b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1848b5da9499SMatthew G. Knepley orntNew[1] = 0; 1849b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+0)%3 : (ornt[1]+2)%3); 1850b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 1851b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1852b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1853b5da9499SMatthew G. Knepley #if 1 1854b5da9499SMatthew 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); 1855b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1856b5da9499SMatthew 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); 1857b5da9499SMatthew G. Knepley } 1858b5da9499SMatthew G. Knepley #endif 1859b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 1860b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 1861b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1862b5da9499SMatthew G. Knepley #if 1 1863b5da9499SMatthew 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); 1864b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1865b5da9499SMatthew 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); 1866b5da9499SMatthew G. Knepley } 1867b5da9499SMatthew G. Knepley #endif 1868b5da9499SMatthew G. Knepley ++newp; 1869b5da9499SMatthew G. Knepley /* Face F: {c, a, f} */ 1870b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+0)%3 : (ornt[0]+2)%3); 1871b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1872b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1873b5da9499SMatthew G. Knepley orntNew[1] = -2; 1874b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+2)%3 : (ornt[2]+0)%3); 1875b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? 0 : -2; 1876b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1877b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1878b5da9499SMatthew G. Knepley #if 1 1879b5da9499SMatthew 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); 1880b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1881b5da9499SMatthew 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); 1882b5da9499SMatthew G. Knepley } 1883b5da9499SMatthew G. Knepley #endif 1884b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 1885b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 1886b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1887b5da9499SMatthew G. Knepley #if 1 1888b5da9499SMatthew 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); 1889b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1890b5da9499SMatthew 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); 1891b5da9499SMatthew G. Knepley } 1892b5da9499SMatthew G. Knepley #endif 1893b5da9499SMatthew G. Knepley ++newp; 1894b5da9499SMatthew G. Knepley /* Face G: {e, a, f} */ 1895b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+1)%3 : (ornt[1]+1)%3); 1896b5da9499SMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 1897b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1898fac4ab25SMatthew G. Knepley orntNew[1] = 0; 1899b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+1)%3 : (ornt[3]+1)%3); 1900b5da9499SMatthew G. Knepley orntNew[2] = ornt[3] < 0 ? 0 : -2; 1901b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1902b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1903b5da9499SMatthew G. Knepley #if 1 1904b5da9499SMatthew 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); 1905b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1906b5da9499SMatthew 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); 1907b5da9499SMatthew G. Knepley } 1908b5da9499SMatthew G. Knepley #endif 1909b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 1910b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 1911b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1912b5da9499SMatthew G. Knepley #if 1 1913b5da9499SMatthew 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); 1914b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1915b5da9499SMatthew 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); 1916b5da9499SMatthew G. Knepley } 1917b5da9499SMatthew G. Knepley #endif 1918b5da9499SMatthew G. Knepley ++newp; 1919b5da9499SMatthew G. Knepley /* Face H: {a, b, f} */ 1920b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+2)%3 : (ornt[0]+0)%3); 1921b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 1922b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+0)%3 : (ornt[3]+2)%3); 1923b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? 0 : -2; 1924b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 1925b5da9499SMatthew G. Knepley orntNew[2] = 0; 1926b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1927b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 1928b5da9499SMatthew G. Knepley #if 1 1929b5da9499SMatthew 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); 1930b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 1931b5da9499SMatthew 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); 1932b5da9499SMatthew G. Knepley } 1933b5da9499SMatthew G. Knepley #endif 1934b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 1935b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 1936b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 1937b5da9499SMatthew G. Knepley #if 1 1938b5da9499SMatthew 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); 1939b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1940b5da9499SMatthew 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); 1941b5da9499SMatthew G. Knepley } 1942b5da9499SMatthew G. Knepley #endif 1943b5da9499SMatthew G. Knepley ++newp; 1944b5da9499SMatthew G. Knepley } 1945b5da9499SMatthew G. Knepley /* Split Edges have 2 vertices and the same faces as the parent */ 1946b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 1947b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 1948b5da9499SMatthew G. Knepley 1949b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 1950b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 1951b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 1952b5da9499SMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 1953b5da9499SMatthew G. Knepley 1954b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 1955b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 1956b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 1957b5da9499SMatthew G. Knepley coneNew[(r+1)%2] = newv; 1958b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 1959b5da9499SMatthew G. Knepley #if 1 1960b5da9499SMatthew 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); 1961b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 1962b5da9499SMatthew 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); 1963b5da9499SMatthew G. Knepley } 1964b5da9499SMatthew G. Knepley #endif 1965b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 1966b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 1967b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 1968b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 1969b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1970b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 1971b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 1972b5da9499SMatthew G. Knepley if (cone[c] == e) break; 1973b5da9499SMatthew G. Knepley } 1974b5da9499SMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (c + (ornt[c] < 0 ? 1-r : r))%3; 1975b5da9499SMatthew G. Knepley } 1976b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 1977b5da9499SMatthew G. Knepley #if 1 1978b5da9499SMatthew 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); 1979b5da9499SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 1980b5da9499SMatthew 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); 1981b5da9499SMatthew G. Knepley } 1982b5da9499SMatthew G. Knepley #endif 1983b5da9499SMatthew G. Knepley } 1984b5da9499SMatthew G. Knepley } 198586f0afeeSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells*(1/2) faces */ 1986b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 1987b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 1988b5da9499SMatthew G. Knepley PetscInt coneSize, supportSize, s; 1989b5da9499SMatthew G. Knepley 1990b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 1991b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 1992b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 1993b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + r; 1994b5da9499SMatthew G. Knepley PetscInt coneNew[2], intFaces = 0, er, eint[4] = {1, 0, 2, 0}; 1995b5da9499SMatthew G. Knepley PetscInt fint[24] = { 1, 7, -1, -1, 0, 5, 1996b5da9499SMatthew G. Knepley -1, -1, 1, 6, 0, 4, 1997b5da9499SMatthew G. Knepley 2, 5, 3, 4, -1, -1, 1998b5da9499SMatthew G. Knepley -1, -1, 3, 6, 2, 7}; 1999b5da9499SMatthew G. Knepley 2000b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 2001b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[(r+0)%3] - eStart); 2002b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - eStart); 2003b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2004b5da9499SMatthew G. Knepley #if 1 2005b5da9499SMatthew 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); 2006b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2007b5da9499SMatthew 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); 2008b5da9499SMatthew G. Knepley } 2009b5da9499SMatthew G. Knepley #endif 2010b5da9499SMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + (r+1)%3; 2011b5da9499SMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + 3; 2012b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2013b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2014b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2015b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 2016b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 201786f0afeeSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 201886f0afeeSMatthew G. Knepley er = ornt[c] < 0 ? (-(ornt[c]+1) + 2-r)%3 : (ornt[c] + r)%3; 2019b5da9499SMatthew G. Knepley if (er == eint[c]) { 2020b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + (c + 2)%4; 2021b5da9499SMatthew G. Knepley } else { 2022b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 0]; 2023b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 1]; 2024b5da9499SMatthew G. Knepley } 2025b5da9499SMatthew G. Knepley } 2026b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2027b5da9499SMatthew G. Knepley #if 1 2028b5da9499SMatthew 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); 2029b5da9499SMatthew G. Knepley for (p = 0; p < intFaces; ++p) { 2030b5da9499SMatthew 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); 2031b5da9499SMatthew G. Knepley } 2032b5da9499SMatthew G. Knepley #endif 2033b5da9499SMatthew G. Knepley } 2034b5da9499SMatthew G. Knepley } 2035b5da9499SMatthew G. Knepley /* Interior edges have 2 vertices and 4 faces */ 2036b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2037b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 2038b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *fcone; 20394a40f731SMatthew G. Knepley PetscInt coneNew[2], supportNew[4], find; 2040b5da9499SMatthew G. Knepley 2041b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2042b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 2043b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &fcone);CHKERRQ(ierr); 204442525629SMatthew G. Knepley find = GetTriEdge_Static(ornt[0], 0); 2045b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 2046b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &fcone);CHKERRQ(ierr); 204742525629SMatthew G. Knepley find = GetTriEdge_Static(ornt[2], 1); 2048b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 2049b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2050b5da9499SMatthew G. Knepley #if 1 2051b5da9499SMatthew 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); 2052b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2053b5da9499SMatthew 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); 2054b5da9499SMatthew G. Knepley } 2055b5da9499SMatthew G. Knepley #endif 2056b5da9499SMatthew G. Knepley supportNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 2057b5da9499SMatthew G. Knepley supportNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 2058b5da9499SMatthew G. Knepley supportNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 2059b5da9499SMatthew G. Knepley supportNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 2060b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2061b5da9499SMatthew G. Knepley #if 1 2062b5da9499SMatthew 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); 2063b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2064b5da9499SMatthew 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); 2065b5da9499SMatthew G. Knepley } 2066b5da9499SMatthew G. Knepley #endif 2067b5da9499SMatthew G. Knepley } 2068b5da9499SMatthew G. Knepley /* Old vertices have identical supports */ 2069b5da9499SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 2070b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 2071b5da9499SMatthew G. Knepley const PetscInt *support, *cone; 2072b5da9499SMatthew G. Knepley PetscInt size, s; 2073b5da9499SMatthew G. Knepley 2074b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 2075b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 2076b5da9499SMatthew G. Knepley for (s = 0; s < size; ++s) { 2077b5da9499SMatthew G. Knepley PetscInt r = 0; 2078b5da9499SMatthew G. Knepley 2079b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2080b5da9499SMatthew G. Knepley if (cone[1] == v) r = 1; 2081b5da9499SMatthew G. Knepley supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 2082b5da9499SMatthew G. Knepley } 2083b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2084b5da9499SMatthew G. Knepley #if 1 2085b5da9499SMatthew 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); 2086b5da9499SMatthew G. Knepley for (p = 0; p < size; ++p) { 2087b5da9499SMatthew 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); 2088b5da9499SMatthew G. Knepley } 2089b5da9499SMatthew G. Knepley #endif 2090b5da9499SMatthew G. Knepley } 2091b5da9499SMatthew G. Knepley /* Edge vertices have 2 + face*2 + 0/1 supports */ 2092b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 2093b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 2094b5da9499SMatthew G. Knepley const PetscInt *cone, *support; 2095b5da9499SMatthew G. Knepley PetscInt *star = NULL, starSize, cellSize = 0, coneSize, size, s; 2096b5da9499SMatthew G. Knepley 2097b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 2098b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 2099b5da9499SMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 2100b5da9499SMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 2101b5da9499SMatthew G. Knepley for (s = 0; s < size; ++s) { 2102b5da9499SMatthew G. Knepley PetscInt r = 0; 2103b5da9499SMatthew G. Knepley 2104b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2105b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2106b5da9499SMatthew G. Knepley for (r = 0; r < coneSize; ++r) {if (cone[r] == e) break;} 2107b5da9499SMatthew G. Knepley supportRef[2+s*2+0] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*3 + (r+0)%3; 2108b5da9499SMatthew G. Knepley supportRef[2+s*2+1] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*3 + (r+2)%3; 2109b5da9499SMatthew G. Knepley } 2110b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 2111b5da9499SMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 2112b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 2113b5da9499SMatthew G. Knepley PetscInt e01, e23; 2114b5da9499SMatthew G. Knepley 2115b5da9499SMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cEnd)) { 2116b5da9499SMatthew G. Knepley /* Check edge 0-1 */ 2117b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 2118b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 2119b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 212042525629SMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 2121b5da9499SMatthew G. Knepley /* Check edge 2-3 */ 2122b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 2123b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 212442525629SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 212542525629SMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 2126b5da9499SMatthew G. Knepley if ((e01 == e) || (e23 == e)) {supportRef[2+size*2+cellSize++] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (star[s] - cStart);} 2127b5da9499SMatthew G. Knepley } 2128b5da9499SMatthew G. Knepley } 2129b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 2130b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2131b5da9499SMatthew G. Knepley #if 1 2132b5da9499SMatthew 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); 2133b5da9499SMatthew G. Knepley for (p = 0; p < 2+size*2+cellSize; ++p) { 2134b5da9499SMatthew 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); 2135b5da9499SMatthew G. Knepley } 2136b5da9499SMatthew G. Knepley #endif 2137b5da9499SMatthew G. Knepley } 2138b5da9499SMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 2139b5da9499SMatthew G. Knepley ierr = DMPlexRestoreFaces_Internal(dm, 3, cStart, NULL, NULL, &faces);CHKERRQ(ierr); 2140b5da9499SMatthew G. Knepley break; 21416ce3c06aSMatthew G. Knepley case 7: 21426ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 21436ce3c06aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(rdm, &cMaxNew, &fMaxNew, &eMaxNew, NULL);CHKERRQ(ierr); 21446ce3c06aSMatthew G. Knepley /* Interior cells have 4 faces: Tet face order is prescribed in DMPlexGetFaces_Internal() */ 21456ce3c06aSMatthew G. Knepley ierr = DMPlexGetRawFaces_Internal(dm, 3, 4, cellInd, NULL, NULL, &faces);CHKERRQ(ierr); 21466ce3c06aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 21476ce3c06aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8; 21486ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 21496ce3c06aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 21506ce3c06aSMatthew G. Knepley 21516ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 21526ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 21536ce3c06aSMatthew G. Knepley /* A tetrahedron: {0, a, c, d} */ 21546ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 0); /* A */ 21556ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 21566ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 0); /* A */ 21576ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 21586ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 0); /* A */ 21596ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 21606ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 0; 21616ce3c06aSMatthew G. Knepley orntNew[3] = 0; 21626ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 21636ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 21646ce3c06aSMatthew G. Knepley #if 1 21656ce3c06aSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+0, cStartNew, cMaxNew); 21666ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 21676ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 21686ce3c06aSMatthew G. Knepley } 21696ce3c06aSMatthew G. Knepley #endif 21706ce3c06aSMatthew G. Knepley /* B tetrahedron: {a, 1, b, e} */ 21716ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 1); /* B */ 21726ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 21736ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 2); /* C */ 21746ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 21756ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 1; 21766ce3c06aSMatthew G. Knepley orntNew[2] = 0; 21776ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 1); /* B */ 21786ce3c06aSMatthew G. Knepley orntNew[3] = ornt[3]; 21796ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 21806ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 21816ce3c06aSMatthew G. Knepley #if 1 21826ce3c06aSMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+1, cStartNew, cMaxNew); 21836ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 21846ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 21856ce3c06aSMatthew G. Knepley } 21866ce3c06aSMatthew G. Knepley #endif 21876ce3c06aSMatthew G. Knepley /* C tetrahedron: {c, b, 2, f} */ 21886ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 2); /* C */ 21896ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 21906ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 2; 21916ce3c06aSMatthew G. Knepley orntNew[1] = 0; 21926ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 1); /* B */ 21936ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 21946ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 0); /* A */ 21956ce3c06aSMatthew G. Knepley orntNew[3] = ornt[3]; 21966ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 21976ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 21986ce3c06aSMatthew G. Knepley #if 1 21996ce3c06aSMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+2, cStartNew, cMaxNew); 22006ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 22016ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 22026ce3c06aSMatthew G. Knepley } 22036ce3c06aSMatthew G. Knepley #endif 22046ce3c06aSMatthew G. Knepley /* D tetrahedron: {d, e, f, 3} */ 22056ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 3; 22066ce3c06aSMatthew G. Knepley orntNew[0] = 0; 22076ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 1); /* B */ 22086ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 22096ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 2); /* C */ 22106ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 22116ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 2); /* C */ 22126ce3c06aSMatthew G. Knepley orntNew[3] = ornt[3]; 22136ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 22146ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 22156ce3c06aSMatthew G. Knepley #if 1 22166ce3c06aSMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+3, cStartNew, cMaxNew); 22176ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 22186ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 22196ce3c06aSMatthew G. Knepley } 22206ce3c06aSMatthew G. Knepley #endif 22216ce3c06aSMatthew G. Knepley /* A' tetrahedron: {d, a, c, f} */ 22226ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 0; 22236ce3c06aSMatthew G. Knepley orntNew[0] = -3; 22246ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 4; 22256ce3c06aSMatthew G. Knepley orntNew[1] = 0; 22266ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + 3; 22276ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -((-(ornt[2]+1)+2)%3+1) : (ornt[2]+2)%3; 22286ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 5; 22296ce3c06aSMatthew G. Knepley orntNew[3] = 0; 22306ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 22316ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 22326ce3c06aSMatthew G. Knepley #if 1 22336ce3c06aSMatthew G. Knepley if ((newp+4 < cStartNew) || (newp+4 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+4, cStartNew, cMaxNew); 22346ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 22356ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 22366ce3c06aSMatthew G. Knepley } 22376ce3c06aSMatthew G. Knepley #endif 22386ce3c06aSMatthew G. Knepley /* B' tetrahedron: {e, b, a, f} */ 22396ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 1; 22406ce3c06aSMatthew G. Knepley orntNew[0] = -3; 22416ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[3] - fStart)*4 + 3; 22426ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -((-(ornt[3]+1)+1)%3+1) : (ornt[3]+1)%3; 22436ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 6; 22446ce3c06aSMatthew G. Knepley orntNew[2] = 0; 22456ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 7; 22466ce3c06aSMatthew G. Knepley orntNew[3] = 0; 22476ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 22486ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 22496ce3c06aSMatthew G. Knepley #if 1 22506ce3c06aSMatthew G. Knepley if ((newp+5 < cStartNew) || (newp+5 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+5, cStartNew, cMaxNew); 22516ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 22526ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 22536ce3c06aSMatthew G. Knepley } 22546ce3c06aSMatthew G. Knepley #endif 22556ce3c06aSMatthew G. Knepley /* C' tetrahedron: {b, f, c, a} */ 22566ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 2; 22576ce3c06aSMatthew G. Knepley orntNew[0] = -3; 22586ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 7; 22596ce3c06aSMatthew G. Knepley orntNew[1] = -2; 22606ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[0] - fStart)*4 + 3; 22616ce3c06aSMatthew G. Knepley orntNew[2] = ornt[0] < 0 ? (-(ornt[0]+1)+1)%3 : -((ornt[0]+1)%3+1); 22626ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 5; 22636ce3c06aSMatthew G. Knepley orntNew[3] = -1; 22646ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 22656ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 22666ce3c06aSMatthew G. Knepley #if 1 22676ce3c06aSMatthew G. Knepley if ((newp+6 < cStartNew) || (newp+6 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+6, cStartNew, cMaxNew); 22686ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 22696ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 22706ce3c06aSMatthew G. Knepley } 22716ce3c06aSMatthew G. Knepley #endif 22726ce3c06aSMatthew G. Knepley /* D' tetrahedron: {f, e, d, a} */ 22736ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 3; 22746ce3c06aSMatthew G. Knepley orntNew[0] = -3; 22756ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 6; 22766ce3c06aSMatthew G. Knepley orntNew[1] = -3; 22776ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 4; 22786ce3c06aSMatthew G. Knepley orntNew[2] = -2; 22796ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[1] - fStart)*4 + 3; 22806ce3c06aSMatthew G. Knepley orntNew[3] = ornt[2]; 22816ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 22826ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 22836ce3c06aSMatthew G. Knepley #if 1 22846ce3c06aSMatthew G. Knepley if ((newp+7 < cStartNew) || (newp+7 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", newp+7, cStartNew, cMaxNew); 22856ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 22866ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 22876ce3c06aSMatthew G. Knepley } 22886ce3c06aSMatthew G. Knepley #endif 22896ce3c06aSMatthew G. Knepley } 22906ce3c06aSMatthew G. Knepley /* Hybrid cells have 5 faces */ 22916ce3c06aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 22926ce3c06aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*8 + (c - cMax)*4; 2293d3a1cc75SMatthew G. Knepley const PetscInt *cone, *ornt, *fornt; 22946ce3c06aSMatthew G. Knepley PetscInt coneNew[5], orntNew[5]; 22956ce3c06aSMatthew G. Knepley 22966ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 22976ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 2298d3a1cc75SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, cone[0], &fornt);CHKERRQ(ierr); 22996ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 23006ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], r); 23016ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 23026ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], r); 23036ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 2304d3a1cc75SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (cone[2+GetTriEdge_Static(ornt[0], (r+2)%3)] - fMax)*2 + (fornt[GetTriEdge_Static(ornt[0], (r+2)%3)] < 0 ? 0 : 1); 23056ce3c06aSMatthew G. Knepley orntNew[2] = 0; 2306d3a1cc75SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (cone[2+GetTriEdge_Static(ornt[0], r)] - fMax)*2 + (fornt[GetTriEdge_Static(ornt[0], r)] < 0 ? 1 : 0); 23076ce3c06aSMatthew G. Knepley orntNew[3] = 0; 23086ce3c06aSMatthew G. Knepley coneNew[4] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + GetTriSubface_Static(ornt[0], r); 23096ce3c06aSMatthew G. Knepley orntNew[4] = 0; 23106ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+r, coneNew);CHKERRQ(ierr); 23116ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+r, orntNew);CHKERRQ(ierr); 23126ce3c06aSMatthew G. Knepley #if 1 23136ce3c06aSMatthew G. Knepley if ((newp+r < cMaxNew) || (newp+r >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid cell [%d, %d)", newp+r, cMaxNew, cEndNew); 23146ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 23156ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 23166ce3c06aSMatthew G. Knepley } 23176ce3c06aSMatthew G. Knepley for (p = 2; p < 5; ++p) { 23186ce3c06aSMatthew G. Knepley if ((coneNew[p] < fMaxNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", coneNew[p], fMaxNew, fEndNew); 23196ce3c06aSMatthew G. Knepley } 23206ce3c06aSMatthew G. Knepley #endif 23216ce3c06aSMatthew G. Knepley } 23226ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + 3; 23236ce3c06aSMatthew G. Knepley orntNew[0] = 0; 23246ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + 3; 23256ce3c06aSMatthew G. Knepley orntNew[1] = 0; 23266ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + 0; 23276ce3c06aSMatthew G. Knepley orntNew[2] = 0; 23286ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + 1; 23296ce3c06aSMatthew G. Knepley orntNew[3] = 0; 23306ce3c06aSMatthew G. Knepley coneNew[4] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + 2; 23316ce3c06aSMatthew G. Knepley orntNew[4] = 0; 23326ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 23336ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 23346ce3c06aSMatthew G. Knepley #if 1 23356ce3c06aSMatthew G. Knepley if ((newp+3 < cMaxNew) || (newp+3 >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid cell [%d, %d)", newp+3, cMaxNew, cEndNew); 23366ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 23376ce3c06aSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 23386ce3c06aSMatthew G. Knepley } 23396ce3c06aSMatthew G. Knepley for (p = 2; p < 5; ++p) { 23406ce3c06aSMatthew G. Knepley if ((coneNew[p] < fMaxNew) || (coneNew[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", coneNew[p], fMaxNew, fEndNew); 23416ce3c06aSMatthew G. Knepley } 23426ce3c06aSMatthew G. Knepley #endif 23436ce3c06aSMatthew G. Knepley } 23446ce3c06aSMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 23456ce3c06aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 23466ce3c06aSMatthew G. Knepley ierr = PetscMalloc((2 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 23476ce3c06aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 23486ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4; 23496ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 23506ce3c06aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3], coneSize, supportSize, s; 23516ce3c06aSMatthew G. Knepley 23526ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 23536ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 23546ce3c06aSMatthew G. Knepley /* A triangle */ 23556ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1 : 0); 23566ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 23576ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 2; 23586ce3c06aSMatthew G. Knepley orntNew[1] = -2; 23596ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 0 : 1); 23606ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 23616ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 23626ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 23636ce3c06aSMatthew G. Knepley #if 1 23646ce3c06aSMatthew G. Knepley if ((newp+0 < fStartNew) || (newp+0 >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+0, fStartNew, fMaxNew); 23656ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 23666ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 23676ce3c06aSMatthew G. Knepley } 23686ce3c06aSMatthew G. Knepley #endif 23696ce3c06aSMatthew G. Knepley /* B triangle */ 23706ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 0 : 1); 23716ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 23726ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1 : 0); 23736ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 23746ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 0; 23756ce3c06aSMatthew G. Knepley orntNew[2] = -2; 23766ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 23776ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 23786ce3c06aSMatthew G. Knepley #if 1 23796ce3c06aSMatthew G. Knepley if ((newp+1 < fStartNew) || (newp+1 >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+1, fStartNew, fMaxNew); 23806ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 23816ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 23826ce3c06aSMatthew G. Knepley } 23836ce3c06aSMatthew G. Knepley #endif 23846ce3c06aSMatthew G. Knepley /* C triangle */ 23856ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 1; 23866ce3c06aSMatthew G. Knepley orntNew[0] = -2; 23876ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 0 : 1); 23886ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 23896ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 1 : 0); 23906ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 23916ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 23926ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 23936ce3c06aSMatthew G. Knepley #if 1 23946ce3c06aSMatthew G. Knepley if ((newp+2 < fStartNew) || (newp+2 >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+2, fStartNew, fMaxNew); 23956ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 23966ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 23976ce3c06aSMatthew G. Knepley } 23986ce3c06aSMatthew G. Knepley #endif 23996ce3c06aSMatthew G. Knepley /* D triangle */ 24006ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 0; 24016ce3c06aSMatthew G. Knepley orntNew[0] = 0; 24026ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 1; 24036ce3c06aSMatthew G. Knepley orntNew[1] = 0; 24046ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 2; 24056ce3c06aSMatthew G. Knepley orntNew[2] = 0; 24066ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 24076ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 24086ce3c06aSMatthew G. Knepley #if 1 24096ce3c06aSMatthew G. Knepley if ((newp+3 < fStartNew) || (newp+3 >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+3, fStartNew, fMaxNew); 24106ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 24116ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 24126ce3c06aSMatthew G. Knepley } 24136ce3c06aSMatthew G. Knepley #endif 24146ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 24156ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 24166ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 24176ce3c06aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 24186ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 24196ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 24206ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 24216ce3c06aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 24226ce3c06aSMatthew G. Knepley if (cone[c] == f) break; 24236ce3c06aSMatthew G. Knepley } 24246ce3c06aSMatthew G. Knepley if (support[s] < cMax) { 24256ce3c06aSMatthew 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])); 24266ce3c06aSMatthew G. Knepley } else { 2427d3a1cc75SMatthew G. Knepley supportRef[s] = cStartNew + (cMax - cStart)*8 + (support[s] - cMax)*4 + (r==3 ? r : GetTriSubfaceInverse_Static(ornt[c], r)); 24286ce3c06aSMatthew G. Knepley } 24296ce3c06aSMatthew G. Knepley } 24306ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportRef);CHKERRQ(ierr); 24316ce3c06aSMatthew G. Knepley #if 1 24326ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 24336ce3c06aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 24346ce3c06aSMatthew G. Knepley if ((supportRef[p] < cStartNew) || (supportRef[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior or hybrid cell [%d, %d)", supportRef[p], cStartNew, cEndNew); 24356ce3c06aSMatthew G. Knepley } 24366ce3c06aSMatthew G. Knepley #endif 24376ce3c06aSMatthew G. Knepley } 24386ce3c06aSMatthew G. Knepley } 24396ce3c06aSMatthew G. Knepley /* Interior cell faces have 3 edges and 2 cells */ 24406ce3c06aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 24416ce3c06aSMatthew G. Knepley PetscInt newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*8; 24426ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 24436ce3c06aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 24446ce3c06aSMatthew G. Knepley PetscInt supportNew[2]; 24456ce3c06aSMatthew G. Knepley 24466ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 24476ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 24486ce3c06aSMatthew G. Knepley /* Face A: {c, a, d} */ 24496ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+0)%3 : (ornt[0]+2)%3); 24506ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 24516ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+0)%3 : (ornt[1]+2)%3); 24526ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1] < 0 ? -2 : 0; 24536ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+0)%3 : (ornt[2]+2)%3); 24546ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 24556ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 24566ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 24576ce3c06aSMatthew G. Knepley #if 1 24586ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 24596ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 24606ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 24616ce3c06aSMatthew G. Knepley } 24626ce3c06aSMatthew G. Knepley #endif 24636ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0; 24646ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 0+4; 24656ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 24666ce3c06aSMatthew G. Knepley #if 1 24676ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 24686ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 24696ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 24706ce3c06aSMatthew G. Knepley } 24716ce3c06aSMatthew G. Knepley #endif 24726ce3c06aSMatthew G. Knepley ++newp; 24736ce3c06aSMatthew G. Knepley /* Face B: {a, b, e} */ 24746ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+2)%3 : (ornt[0]+0)%3); 24756ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 24766ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+2)%3 : (ornt[3]+0)%3); 24776ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 24786ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+1)%3 : (ornt[1]+1)%3); 24796ce3c06aSMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 24806ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 24816ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 24826ce3c06aSMatthew G. Knepley #if 1 24836ce3c06aSMatthew G. Knepley if ((newp+1 < fStartNew) || (newp+1 >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+1, fStartNew, fMaxNew); 24846ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 24856ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 24866ce3c06aSMatthew G. Knepley } 24876ce3c06aSMatthew G. Knepley #endif 24886ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1; 24896ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 1+4; 24906ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 24916ce3c06aSMatthew G. Knepley #if 1 24926ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 24936ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 24946ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 24956ce3c06aSMatthew G. Knepley } 24966ce3c06aSMatthew G. Knepley #endif 24976ce3c06aSMatthew G. Knepley ++newp; 24986ce3c06aSMatthew G. Knepley /* Face C: {c, f, b} */ 24996ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+2)%3 : (ornt[2]+0)%3); 25006ce3c06aSMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? -2 : 0; 25016ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+0)%3 : (ornt[3]+2)%3); 25026ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 25036ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+1)%3 : (ornt[0]+1)%3); 25046ce3c06aSMatthew G. Knepley orntNew[2] = ornt[0] < 0 ? -2 : 0; 25056ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 25066ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 25076ce3c06aSMatthew G. Knepley #if 1 25086ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25096ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 25106ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 25116ce3c06aSMatthew G. Knepley } 25126ce3c06aSMatthew G. Knepley #endif 25136ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 2; 25146ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 25156ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 25166ce3c06aSMatthew G. Knepley #if 1 25176ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25186ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 25196ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 25206ce3c06aSMatthew G. Knepley } 25216ce3c06aSMatthew G. Knepley #endif 25226ce3c06aSMatthew G. Knepley ++newp; 25236ce3c06aSMatthew G. Knepley /* Face D: {d, e, f} */ 25246ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+2)%3 : (ornt[1]+0)%3); 25256ce3c06aSMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 25266ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+1)%3 : (ornt[3]+1)%3); 25276ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 25286ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+1)%3 : (ornt[2]+1)%3); 25296ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 25306ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 25316ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 25326ce3c06aSMatthew G. Knepley #if 1 25336ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25346ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 25356ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 25366ce3c06aSMatthew G. Knepley } 25376ce3c06aSMatthew G. Knepley #endif 25386ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 3; 25396ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 25406ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 25416ce3c06aSMatthew G. Knepley #if 1 25426ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25436ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 25446ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 25456ce3c06aSMatthew G. Knepley } 25466ce3c06aSMatthew G. Knepley #endif 25476ce3c06aSMatthew G. Knepley ++newp; 25486ce3c06aSMatthew G. Knepley /* Face E: {d, f, a} */ 25496ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+1)%3 : (ornt[2]+1)%3); 25506ce3c06aSMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? 0 : -2; 25516ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 25526ce3c06aSMatthew G. Knepley orntNew[1] = 0; 25536ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+0)%3 : (ornt[1]+2)%3); 25546ce3c06aSMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 25556ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 25566ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 25576ce3c06aSMatthew G. Knepley #if 1 25586ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25596ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 25606ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 25616ce3c06aSMatthew G. Knepley } 25626ce3c06aSMatthew G. Knepley #endif 25636ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 25646ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 25656ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 25666ce3c06aSMatthew G. Knepley #if 1 25676ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25686ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 25696ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 25706ce3c06aSMatthew G. Knepley } 25716ce3c06aSMatthew G. Knepley #endif 25726ce3c06aSMatthew G. Knepley ++newp; 25736ce3c06aSMatthew G. Knepley /* Face F: {c, a, f} */ 25746ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+0)%3 : (ornt[0]+2)%3); 25756ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 25766ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 25776ce3c06aSMatthew G. Knepley orntNew[1] = -2; 25786ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + (ornt[2] < 0 ? (-(ornt[2]+1)+2)%3 : (ornt[2]+0)%3); 25796ce3c06aSMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? 0 : -2; 25806ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 25816ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 25826ce3c06aSMatthew G. Knepley #if 1 25836ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25846ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 25856ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 25866ce3c06aSMatthew G. Knepley } 25876ce3c06aSMatthew G. Knepley #endif 25886ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 25896ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 25906ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 25916ce3c06aSMatthew G. Knepley #if 1 25926ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 25936ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 25946ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 25956ce3c06aSMatthew G. Knepley } 25966ce3c06aSMatthew G. Knepley #endif 25976ce3c06aSMatthew G. Knepley ++newp; 25986ce3c06aSMatthew G. Knepley /* Face G: {e, a, f} */ 25996ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + (ornt[1] < 0 ? (-(ornt[1]+1)+1)%3 : (ornt[1]+1)%3); 26006ce3c06aSMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 26016ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 26026ce3c06aSMatthew G. Knepley orntNew[1] = -2; 26036ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+1)%3 : (ornt[3]+1)%3); 26046ce3c06aSMatthew G. Knepley orntNew[2] = ornt[3] < 0 ? 0 : -2; 26056ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 26066ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 26076ce3c06aSMatthew G. Knepley #if 1 26086ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 26096ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 26106ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 26116ce3c06aSMatthew G. Knepley } 26126ce3c06aSMatthew G. Knepley #endif 26136ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 26146ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 26156ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 26166ce3c06aSMatthew G. Knepley #if 1 26176ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 26186ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 26196ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 26206ce3c06aSMatthew G. Knepley } 26216ce3c06aSMatthew G. Knepley #endif 26226ce3c06aSMatthew G. Knepley ++newp; 26236ce3c06aSMatthew G. Knepley /* Face H: {a, b, f} */ 26246ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + (ornt[0] < 0 ? (-(ornt[0]+1)+2)%3 : (ornt[0]+0)%3); 26256ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 26266ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + (ornt[3] < 0 ? (-(ornt[3]+1)+0)%3 : (ornt[3]+2)%3); 26276ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? 0 : -2; 26286ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 26296ce3c06aSMatthew G. Knepley orntNew[2] = 0; 26306ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 26316ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 26326ce3c06aSMatthew G. Knepley #if 1 26336ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 26346ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 26356ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 26366ce3c06aSMatthew G. Knepley } 26376ce3c06aSMatthew G. Knepley #endif 26386ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 26396ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 26406ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 26416ce3c06aSMatthew G. Knepley #if 1 26426ce3c06aSMatthew G. Knepley if ((newp < fStartNew) || (newp >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp, fStartNew, fMaxNew); 26436ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 26446ce3c06aSMatthew G. Knepley if ((supportNew[p] < cStartNew) || (supportNew[p] >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a cell [%d, %d)", supportNew[p], cStartNew, cMaxNew); 26456ce3c06aSMatthew G. Knepley } 26466ce3c06aSMatthew G. Knepley #endif 26476ce3c06aSMatthew G. Knepley ++newp; 26486ce3c06aSMatthew G. Knepley } 26496ce3c06aSMatthew G. Knepley /* Hybrid split faces have 4 edges and same cells */ 26506ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 26516ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 26526ce3c06aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 26536ce3c06aSMatthew G. Knepley PetscInt supportNew[2], size, s, c; 26546ce3c06aSMatthew G. Knepley 26556ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 26566ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 26576ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 26586ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 26596ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 26606ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + r; 26616ce3c06aSMatthew G. Knepley 26626ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1-r : r); 26636ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 26646ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1-r : r); 26656ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 26666ce3c06aSMatthew G. Knepley coneNew[2+r] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (cone[2+r] - eMax); 26676ce3c06aSMatthew G. Knepley orntNew[2+r] = 0; 26686ce3c06aSMatthew G. Knepley coneNew[3-r] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (f - fMax); 26696ce3c06aSMatthew G. Knepley orntNew[3-r] = 0; 26706ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 26716ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 26726ce3c06aSMatthew G. Knepley #if 1 26736ce3c06aSMatthew G. Knepley if ((newp < fMaxNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", newp, fMaxNew, fEndNew); 26746ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 26756ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 26766ce3c06aSMatthew G. Knepley } 26776ce3c06aSMatthew G. Knepley for (p = 2; p < 4; ++p) { 26786ce3c06aSMatthew G. Knepley if ((coneNew[p] < eMaxNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid edge [%d, %d)", coneNew[p], eMaxNew, eEndNew); 26796ce3c06aSMatthew G. Knepley } 26806ce3c06aSMatthew G. Knepley #endif 26816ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 2682d3a1cc75SMatthew G. Knepley const PetscInt *coneCell, *orntCell, *fornt; 26836ce3c06aSMatthew G. Knepley 26846ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &coneCell);CHKERRQ(ierr); 26856ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &orntCell);CHKERRQ(ierr); 26866ce3c06aSMatthew G. Knepley for (c = 2; c < 5; ++c) if (coneCell[c] == f) break; 26876ce3c06aSMatthew G. Knepley if (c >= 5) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Could not find face %d in cone of cell %d", f, support[s]); 2688d3a1cc75SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, coneCell[0], &fornt);CHKERRQ(ierr); 2689d3a1cc75SMatthew G. Knepley supportNew[s] = cStartNew + (cMax - cStart)*8 + (support[s] - cMax)*4 + (GetTriEdgeInverse_Static(orntCell[0], c-2) + (fornt[c-2] < 0 ? 1-r : r))%3; 26906ce3c06aSMatthew G. Knepley } 26916ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 26926ce3c06aSMatthew G. Knepley #if 1 26936ce3c06aSMatthew G. Knepley if ((newp < fMaxNew) || (newp >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", newp, fMaxNew, fEndNew); 26946ce3c06aSMatthew G. Knepley for (p = 0; p < size; ++p) { 26956ce3c06aSMatthew G. Knepley if ((supportNew[p] < cMaxNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid cell [%d, %d)", supportNew[p], cMaxNew, cEndNew); 26966ce3c06aSMatthew G. Knepley } 26976ce3c06aSMatthew G. Knepley #endif 26986ce3c06aSMatthew G. Knepley } 26996ce3c06aSMatthew G. Knepley } 27006ce3c06aSMatthew G. Knepley /* Hybrid cell faces have 4 edges and 2 cells */ 27016ce3c06aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 27026ce3c06aSMatthew G. Knepley PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3; 27036ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 27046ce3c06aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 27056ce3c06aSMatthew G. Knepley PetscInt supportNew[2]; 27066ce3c06aSMatthew G. Knepley 27076ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 27086ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 27096ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 27106ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + GetTriSubface_Static(ornt[0], (r+2)%3); 27116ce3c06aSMatthew G. Knepley orntNew[0] = 0; 27126ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + GetTriSubface_Static(ornt[1], (r+2)%3); 27136ce3c06aSMatthew G. Knepley orntNew[1] = 0; 27146ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (cone[2+GetTriSubface_Static(ornt[0], (r+2)%3)] - fMax); 27156ce3c06aSMatthew G. Knepley orntNew[2] = 0; 27166ce3c06aSMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (cone[2+GetTriSubface_Static(ornt[0], r)] - fMax); 27176ce3c06aSMatthew G. Knepley orntNew[3] = 0; 27186ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+r, coneNew);CHKERRQ(ierr); 27196ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+r, orntNew);CHKERRQ(ierr); 27206ce3c06aSMatthew G. Knepley #if 1 27216ce3c06aSMatthew G. Knepley if ((newp+r < fMaxNew) || (newp+r >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", newp+r, fMaxNew, fEndNew); 27226ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 27236ce3c06aSMatthew G. Knepley if ((coneNew[p] < eStartNew) || (coneNew[p] >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", coneNew[p], eStartNew, eMaxNew); 27246ce3c06aSMatthew G. Knepley } 27256ce3c06aSMatthew G. Knepley for (p = 2; p < 4; ++p) { 27266ce3c06aSMatthew G. Knepley if ((coneNew[p] < eMaxNew) || (coneNew[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid edge [%d, %d)", coneNew[p], eMaxNew, eEndNew); 27276ce3c06aSMatthew G. Knepley } 27286ce3c06aSMatthew G. Knepley #endif 27296ce3c06aSMatthew G. Knepley supportNew[0] = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + GetTriSubface_Static(ornt[0], r); 27306ce3c06aSMatthew G. Knepley supportNew[1] = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + 3; 27316ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportNew);CHKERRQ(ierr); 27326ce3c06aSMatthew G. Knepley #if 1 27336ce3c06aSMatthew G. Knepley if ((newp+r < fMaxNew) || (newp+r >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", newp+r, fMaxNew, fEndNew); 27346ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 27356ce3c06aSMatthew G. Knepley if ((supportNew[p] < cMaxNew) || (supportNew[p] >= cEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid cell [%d, %d)", supportNew[p], cMaxNew, cEndNew); 27366ce3c06aSMatthew G. Knepley } 27376ce3c06aSMatthew G. Knepley #endif 27386ce3c06aSMatthew G. Knepley } 27396ce3c06aSMatthew G. Knepley } 27406ce3c06aSMatthew G. Knepley /* Interior split edges have 2 vertices and the same faces as the parent */ 27416ce3c06aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 27426ce3c06aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 27436ce3c06aSMatthew G. Knepley 27446ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 27456ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 27466ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 27476ce3c06aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 27486ce3c06aSMatthew G. Knepley 27496ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 27506ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 27516ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 27526ce3c06aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 27536ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 27546ce3c06aSMatthew G. Knepley #if 1 27556ce3c06aSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eMaxNew); 27566ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 27576ce3c06aSMatthew 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); 27586ce3c06aSMatthew G. Knepley } 27596ce3c06aSMatthew G. Knepley #endif 27606ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 27616ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 27626ce3c06aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 27636ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 27646ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 27656ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 27666ce3c06aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) if (cone[c] == e) break; 27676ce3c06aSMatthew G. Knepley if (support[s] < fMax) { 27686ce3c06aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (c + (ornt[c] < 0 ? 1-r : r))%3; 27696ce3c06aSMatthew G. Knepley } else { 27706ce3c06aSMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (support[s] - fMax)*2 + (ornt[c] < 0 ? 1-r : r); 27716ce3c06aSMatthew G. Knepley } 27726ce3c06aSMatthew G. Knepley } 27736ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 27746ce3c06aSMatthew G. Knepley #if 1 27756ce3c06aSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eMaxNew); 27766ce3c06aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 27776ce3c06aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior or hybrid face [%d, %d)", supportRef[p], fStartNew, fEndNew); 27786ce3c06aSMatthew G. Knepley } 27796ce3c06aSMatthew G. Knepley #endif 27806ce3c06aSMatthew G. Knepley } 27816ce3c06aSMatthew G. Knepley } 27826ce3c06aSMatthew G. Knepley /* Interior face edges have 2 vertices and 2+cells*(1/2) faces */ 27836ce3c06aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 27846ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 27856ce3c06aSMatthew G. Knepley PetscInt coneSize, supportSize, s; 27866ce3c06aSMatthew G. Knepley 27876ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 27886ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 27896ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 27906ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + r; 27916ce3c06aSMatthew G. Knepley PetscInt coneNew[2], intFaces = 0, er, eint[4] = {1, 0, 2, 0}; 27926ce3c06aSMatthew G. Knepley PetscInt fint[24] = { 1, 7, -1, -1, 0, 5, 27936ce3c06aSMatthew G. Knepley -1, -1, 1, 6, 0, 4, 27946ce3c06aSMatthew G. Knepley 2, 5, 3, 4, -1, -1, 27956ce3c06aSMatthew G. Knepley -1, -1, 3, 6, 2, 7}; 27966ce3c06aSMatthew G. Knepley 27976ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 27986ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[(r+0)%3] - eStart); 27996ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - eStart); 28006ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 28016ce3c06aSMatthew G. Knepley #if 1 28026ce3c06aSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eMaxNew); 28036ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 28046ce3c06aSMatthew 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); 28056ce3c06aSMatthew G. Knepley } 28066ce3c06aSMatthew G. Knepley #endif 28076ce3c06aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + (r+1)%3; 28086ce3c06aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + 3; 28096ce3c06aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 28106ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 28116ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 28126ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 28136ce3c06aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 28146ce3c06aSMatthew G. Knepley if (support[s] < cMax) { 28156ce3c06aSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 28166ce3c06aSMatthew G. Knepley er = ornt[c] < 0 ? (-(ornt[c]+1) + 2-r)%3 : (ornt[c] + r)%3; 28176ce3c06aSMatthew G. Knepley if (er == eint[c]) { 28186ce3c06aSMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (support[s] - cStart)*8 + (c + 2)%4; 28196ce3c06aSMatthew G. Knepley } else { 28206ce3c06aSMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 0]; 28216ce3c06aSMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 1]; 28226ce3c06aSMatthew G. Knepley } 28236ce3c06aSMatthew G. Knepley } else { 2824e515e2ddSMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (support[s] - cMax)*3 + (GetTriSubfaceInverse_Static(ornt[c], r) + 1)%3; 28256ce3c06aSMatthew G. Knepley } 28266ce3c06aSMatthew G. Knepley } 28276ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 28286ce3c06aSMatthew G. Knepley #if 1 28296ce3c06aSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eMaxNew); 28306ce3c06aSMatthew G. Knepley for (p = 0; p < intFaces; ++p) { 28316ce3c06aSMatthew G. Knepley if ((supportRef[p] < fStartNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior or hybrid face [%d, %d)", supportRef[p], fStartNew, fEndNew); 28326ce3c06aSMatthew G. Knepley } 28336ce3c06aSMatthew G. Knepley #endif 28346ce3c06aSMatthew G. Knepley } 28356ce3c06aSMatthew G. Knepley } 28366ce3c06aSMatthew G. Knepley /* Interior cell edges have 2 vertices and 4 faces */ 28376ce3c06aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 28386ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 28396ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *fcone; 28406ce3c06aSMatthew G. Knepley PetscInt coneNew[2], supportNew[4], find; 28416ce3c06aSMatthew G. Knepley 28426ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 28436ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 28446ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &fcone);CHKERRQ(ierr); 28456ce3c06aSMatthew G. Knepley find = GetTriEdge_Static(ornt[0], 0); 28466ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 28476ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &fcone);CHKERRQ(ierr); 28486ce3c06aSMatthew G. Knepley find = GetTriEdge_Static(ornt[2], 1); 28496ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 28506ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 28516ce3c06aSMatthew G. Knepley #if 1 28526ce3c06aSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eMaxNew); 28536ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 28546ce3c06aSMatthew 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); 28556ce3c06aSMatthew G. Knepley } 28566ce3c06aSMatthew G. Knepley #endif 28576ce3c06aSMatthew G. Knepley supportNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 4; 28586ce3c06aSMatthew G. Knepley supportNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 5; 28596ce3c06aSMatthew G. Knepley supportNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 6; 28606ce3c06aSMatthew G. Knepley supportNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 7; 28616ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 28626ce3c06aSMatthew G. Knepley #if 1 28636ce3c06aSMatthew G. Knepley if ((newp < eStartNew) || (newp >= eMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an edge [%d, %d)", newp, eStartNew, eMaxNew); 28646ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 28656ce3c06aSMatthew G. Knepley if ((supportNew[p] < fStartNew) || (supportNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", supportNew[p], fStartNew, fMaxNew); 28666ce3c06aSMatthew G. Knepley } 28676ce3c06aSMatthew G. Knepley #endif 28686ce3c06aSMatthew G. Knepley } 28696ce3c06aSMatthew G. Knepley /* Hybrid edges have two vertices and the same faces */ 28706ce3c06aSMatthew G. Knepley for (e = eMax; e < eEnd; ++e) { 28716ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (e - eMax); 28726ce3c06aSMatthew G. Knepley const PetscInt *cone, *support, *fcone; 28736ce3c06aSMatthew G. Knepley PetscInt coneNew[2], size, fsize, s; 28746ce3c06aSMatthew G. Knepley 28756ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 28766ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 28776ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 28786ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 28796ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 28806ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 28816ce3c06aSMatthew G. Knepley #if 1 28826ce3c06aSMatthew G. Knepley if ((newp < eMaxNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid edge [%d, %d)", newp, eMaxNew, eEndNew); 28836ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 28846ce3c06aSMatthew 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); 28856ce3c06aSMatthew G. Knepley } 28866ce3c06aSMatthew G. Knepley #endif 28876ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 28886ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &fsize);CHKERRQ(ierr); 28896ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &fcone);CHKERRQ(ierr); 28906ce3c06aSMatthew G. Knepley for (c = 0; c < fsize; ++c) if (fcone[c] == e) break; 28916ce3c06aSMatthew G. Knepley if ((c < 2) || (c > 3)) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Edge %d not found in cone of face %d", e, support[s]); 28926ce3c06aSMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (support[s] - fMax)*2 + c-2; 28936ce3c06aSMatthew G. Knepley } 28946ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 28956ce3c06aSMatthew G. Knepley #if 1 28966ce3c06aSMatthew G. Knepley if ((newp < eMaxNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid edge [%d, %d)", newp, eMaxNew, eEndNew); 28976ce3c06aSMatthew G. Knepley for (p = 0; p < size; ++p) { 28986ce3c06aSMatthew G. Knepley if ((supportRef[p] < fMaxNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", supportRef[p], fMaxNew, fEndNew); 28996ce3c06aSMatthew G. Knepley } 29006ce3c06aSMatthew G. Knepley #endif 29016ce3c06aSMatthew G. Knepley } 29026ce3c06aSMatthew G. Knepley /* Hybrid face edges have 2 vertices and 2+2*cells faces */ 29036ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 29046ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (f - fMax); 2905623f4348SMatthew G. Knepley const PetscInt *cone, *support, *ccone, *cornt; 29066ce3c06aSMatthew G. Knepley PetscInt coneNew[2], size, csize, s; 29076ce3c06aSMatthew G. Knepley 29086ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 29096ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 29106ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 29116ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[0] - eStart); 29126ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[1] - eStart); 29136ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 29146ce3c06aSMatthew G. Knepley #if 1 29156ce3c06aSMatthew G. Knepley if ((newp < eMaxNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid edge [%d, %d)", newp, eMaxNew, eEndNew); 29166ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 29176ce3c06aSMatthew 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); 29186ce3c06aSMatthew G. Knepley } 29196ce3c06aSMatthew G. Knepley #endif 29206ce3c06aSMatthew G. Knepley supportRef[0] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + 0; 29216ce3c06aSMatthew G. Knepley supportRef[1] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + 1; 29226ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 29236ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &csize);CHKERRQ(ierr); 29246ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &ccone);CHKERRQ(ierr); 2925623f4348SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &cornt);CHKERRQ(ierr); 29266ce3c06aSMatthew G. Knepley for (c = 0; c < csize; ++c) if (ccone[c] == f) break; 29276ce3c06aSMatthew G. Knepley if ((c < 2) || (c >= csize)) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Hybrid face %d is not in cone of hybrid cell %d", f, support[s]); 2928623f4348SMatthew G. Knepley supportRef[2+s*2+0] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (support[s] - cMax)*3 + GetTriSubfaceInverse_Static(cornt[0], c-2); 2929623f4348SMatthew G. Knepley supportRef[2+s*2+1] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (support[s] - cMax)*3 + (GetTriSubfaceInverse_Static(cornt[0], c-2) + 1)%3; 29306ce3c06aSMatthew G. Knepley } 29316ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 29326ce3c06aSMatthew G. Knepley #if 1 29336ce3c06aSMatthew G. Knepley if ((newp < eMaxNew) || (newp >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid edge [%d, %d)", newp, eMaxNew, eEndNew); 29346ce3c06aSMatthew G. Knepley for (p = 0; p < 2+size*2; ++p) { 29356ce3c06aSMatthew G. Knepley if ((supportRef[p] < fMaxNew) || (supportRef[p] >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a hybrid face [%d, %d)", supportRef[p], fMaxNew, fEndNew); 29366ce3c06aSMatthew G. Knepley } 29376ce3c06aSMatthew G. Knepley #endif 29386ce3c06aSMatthew G. Knepley } 29396ce3c06aSMatthew G. Knepley /* Interior vertices have identical supports */ 29406ce3c06aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 29416ce3c06aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 29426ce3c06aSMatthew G. Knepley const PetscInt *support, *cone; 29436ce3c06aSMatthew G. Knepley PetscInt size, s; 29446ce3c06aSMatthew G. Knepley 29456ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 29466ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 29476ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 29486ce3c06aSMatthew G. Knepley PetscInt r = 0; 29496ce3c06aSMatthew G. Knepley 29506ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 29516ce3c06aSMatthew G. Knepley if (cone[1] == v) r = 1; 29526ce3c06aSMatthew G. Knepley if (support[s] < eMax) supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 29536ce3c06aSMatthew G. Knepley else supportRef[s] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (support[s] - eMax); 29546ce3c06aSMatthew G. Knepley } 29556ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 29566ce3c06aSMatthew G. Knepley #if 1 29576ce3c06aSMatthew 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); 29586ce3c06aSMatthew G. Knepley for (p = 0; p < size; ++p) { 29596ce3c06aSMatthew G. Knepley if ((supportRef[p] < eStartNew) || (supportRef[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior or hybrid edge [%d, %d)", supportRef[p], eStartNew, eEndNew); 29606ce3c06aSMatthew G. Knepley } 29616ce3c06aSMatthew G. Knepley #endif 29626ce3c06aSMatthew G. Knepley } 29636ce3c06aSMatthew G. Knepley /* Interior edge vertices have 2 + interior face*2 + hybrid face + cells*0/1 supports */ 29646ce3c06aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 29656ce3c06aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 29666ce3c06aSMatthew G. Knepley const PetscInt *cone, *support; 29676ce3c06aSMatthew G. Knepley PetscInt *star = NULL, starSize, faceSize = 0, cellSize = 0, coneSize, size, s; 29686ce3c06aSMatthew G. Knepley 29696ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 29706ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 29716ce3c06aSMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 29726ce3c06aSMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 29736ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 29746ce3c06aSMatthew G. Knepley PetscInt r = 0; 29756ce3c06aSMatthew G. Knepley 29766ce3c06aSMatthew G. Knepley if (support[s] < fMax) { 29776ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 29786ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 29796ce3c06aSMatthew G. Knepley for (r = 0; r < coneSize; ++r) {if (cone[r] == e) break;} 29806ce3c06aSMatthew G. Knepley supportRef[2+faceSize+0] = eStartNew + (eMax - eStart)*2 + (support[s] - fStart)*3 + (r+0)%3; 29816ce3c06aSMatthew G. Knepley supportRef[2+faceSize+1] = eStartNew + (eMax - eStart)*2 + (support[s] - fStart)*3 + (r+2)%3; 29826ce3c06aSMatthew G. Knepley faceSize += 2; 29836ce3c06aSMatthew G. Knepley } else { 29846ce3c06aSMatthew G. Knepley supportRef[2+faceSize+0] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (support[s] - fMax); 29856ce3c06aSMatthew G. Knepley ++faceSize; 29866ce3c06aSMatthew G. Knepley } 29876ce3c06aSMatthew G. Knepley } 29886ce3c06aSMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 29896ce3c06aSMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 29906ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 29916ce3c06aSMatthew G. Knepley PetscInt e01, e23; 29926ce3c06aSMatthew G. Knepley 29936ce3c06aSMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cMax)) { 29946ce3c06aSMatthew G. Knepley /* Check edge 0-1 */ 29956ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 29966ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 29976ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 29986ce3c06aSMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 29996ce3c06aSMatthew G. Knepley /* Check edge 2-3 */ 30006ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 30016ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 30026ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 30036ce3c06aSMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 30046ce3c06aSMatthew G. Knepley if ((e01 == e) || (e23 == e)) {supportRef[2+faceSize+cellSize++] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (star[s] - cStart);} 30056ce3c06aSMatthew G. Knepley } 30066ce3c06aSMatthew G. Knepley } 30076ce3c06aSMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 30086ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 30096ce3c06aSMatthew G. Knepley #if 1 30106ce3c06aSMatthew 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); 30116ce3c06aSMatthew G. Knepley for (p = 0; p < 2+faceSize+cellSize; ++p) { 30126ce3c06aSMatthew G. Knepley if ((supportRef[p] < eStartNew) || (supportRef[p] >= eEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior or hybrid edge [%d, %d)", supportRef[p], eStartNew, eEndNew); 30136ce3c06aSMatthew G. Knepley } 30146ce3c06aSMatthew G. Knepley #endif 30156ce3c06aSMatthew G. Knepley } 30166ce3c06aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 30176ce3c06aSMatthew G. Knepley ierr = DMPlexRestoreFaces_Internal(dm, 3, cStart, NULL, NULL, &faces);CHKERRQ(ierr); 30186ce3c06aSMatthew G. Knepley break; 30192eabf88fSMatthew G. Knepley case 6: 30202eabf88fSMatthew G. Knepley /* Hex 3D */ 30212eabf88fSMatthew G. Knepley /* 30222eabf88fSMatthew G. Knepley Bottom (viewed from top) Top 30232eabf88fSMatthew G. Knepley 1---------2---------2 7---------2---------6 30242eabf88fSMatthew G. Knepley | | | | | | 30252eabf88fSMatthew G. Knepley | B 2 C | | H 2 G | 30262eabf88fSMatthew G. Knepley | | | | | | 30272eabf88fSMatthew G. Knepley 3----3----0----1----1 3----3----0----1----1 30282eabf88fSMatthew G. Knepley | | | | | | 30292eabf88fSMatthew G. Knepley | A 0 D | | E 0 F | 30302eabf88fSMatthew G. Knepley | | | | | | 30312eabf88fSMatthew G. Knepley 0---------0---------3 4---------0---------5 30322eabf88fSMatthew G. Knepley */ 30332eabf88fSMatthew G. Knepley /* All cells have 6 faces: Bottom, Top, Front, Back, Right, Left */ 30342eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 30352eabf88fSMatthew G. Knepley const PetscInt newp = (c - cStart)*8; 30362eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt; 30372eabf88fSMatthew G. Knepley PetscInt coneNew[6], orntNew[6]; 30382eabf88fSMatthew G. Knepley 30392eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 30402eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 30412eabf88fSMatthew G. Knepley /* A hex */ 3042e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 0); 30432eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 30442eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 30452eabf88fSMatthew G. Knepley orntNew[1] = 0; 3046e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 0); 30472eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 30482eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 30492eabf88fSMatthew G. Knepley orntNew[3] = 0; 30502eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 30512eabf88fSMatthew G. Knepley orntNew[4] = 0; 3052e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 0); 30532eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 30542eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 30552eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 30562eabf88fSMatthew G. Knepley #if 1 30572eabf88fSMatthew 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); 30582eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 30592eabf88fSMatthew 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); 30602eabf88fSMatthew G. Knepley } 30612eabf88fSMatthew G. Knepley #endif 30622eabf88fSMatthew G. Knepley /* B hex */ 3063e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 1); 30642eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 30652eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 30662eabf88fSMatthew G. Knepley orntNew[1] = 0; 30672eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 3068*a3cddbf8SMatthew G. Knepley orntNew[2] = -1; 3069e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 1); 30702eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 30712eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 30722eabf88fSMatthew G. Knepley orntNew[4] = 0; 3073e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 3); 30742eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 30752eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 30762eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 30772eabf88fSMatthew G. Knepley #if 1 30782eabf88fSMatthew 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); 30792eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 30802eabf88fSMatthew 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); 30812eabf88fSMatthew G. Knepley } 30822eabf88fSMatthew G. Knepley #endif 30832eabf88fSMatthew G. Knepley /* C hex */ 3084e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 2); 30852eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 30862eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 30872eabf88fSMatthew G. Knepley orntNew[1] = 0; 30882eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 3089*a3cddbf8SMatthew G. Knepley orntNew[2] = -1; 3090e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 0); 30912eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 3092e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 1); 30932eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 30942eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 3095*a3cddbf8SMatthew G. Knepley orntNew[5] = -4; 30962eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 30972eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 30982eabf88fSMatthew G. Knepley #if 1 30992eabf88fSMatthew 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); 31002eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 31012eabf88fSMatthew 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); 31022eabf88fSMatthew G. Knepley } 31032eabf88fSMatthew G. Knepley #endif 31042eabf88fSMatthew G. Knepley /* D hex */ 3105e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 3); 31062eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 31072eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 31082eabf88fSMatthew G. Knepley orntNew[1] = 0; 3109e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 1); 31102eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 31112eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 3112*a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 3113e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 0); 31142eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 31152eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 3116*a3cddbf8SMatthew G. Knepley orntNew[5] = -4; 31172eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 31182eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 31192eabf88fSMatthew G. Knepley #if 1 31202eabf88fSMatthew 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); 31212eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 31222eabf88fSMatthew 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); 31232eabf88fSMatthew G. Knepley } 31242eabf88fSMatthew G. Knepley #endif 31252eabf88fSMatthew G. Knepley /* E hex */ 31262eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 3127*a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3128e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 0); 31292eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 3130e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 3); 31312eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 31322eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 31332eabf88fSMatthew G. Knepley orntNew[3] = 0; 31342eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 3135*a3cddbf8SMatthew G. Knepley orntNew[4] = -1; 3136e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 1); 31372eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 3138b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 3139b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 31402eabf88fSMatthew G. Knepley #if 1 3141b164cbf2SMatthew 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); 31422eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 31432eabf88fSMatthew 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); 31442eabf88fSMatthew G. Knepley } 31452eabf88fSMatthew G. Knepley #endif 31462eabf88fSMatthew G. Knepley /* F hex */ 31472eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 3148*a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3149e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 1); 31502eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 3151e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 2); 31522eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 31532eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 3154*a3cddbf8SMatthew G. Knepley orntNew[3] = -1; 3155e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 3); 31562eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 31572eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 3158*a3cddbf8SMatthew G. Knepley orntNew[5] = 1; 3159b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 3160b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 31612eabf88fSMatthew G. Knepley #if 1 3162b164cbf2SMatthew 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); 31632eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 31642eabf88fSMatthew 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); 31652eabf88fSMatthew G. Knepley } 31662eabf88fSMatthew G. Knepley #endif 31672eabf88fSMatthew G. Knepley /* G hex */ 31682eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 3169*a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3170e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 2); 31712eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 31722eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 3173*a3cddbf8SMatthew G. Knepley orntNew[2] = 0; 3174e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 3); 31752eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 3176e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 2); 31772eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 31782eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 3179*a3cddbf8SMatthew G. Knepley orntNew[5] = -3; 3180b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 3181b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 31822eabf88fSMatthew G. Knepley #if 1 3183b164cbf2SMatthew 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); 31842eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 31852eabf88fSMatthew 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); 31862eabf88fSMatthew G. Knepley } 31872eabf88fSMatthew G. Knepley #endif 31882eabf88fSMatthew G. Knepley /* H hex */ 31892eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 3190*a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3191e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 3); 31922eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 31932eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 3194*a3cddbf8SMatthew G. Knepley orntNew[2] = -1; 3195e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 2); 31962eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 31972eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 3198*a3cddbf8SMatthew G. Knepley orntNew[4] = 3; 3199e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 2); 32002eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 3201b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 3202b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 32032eabf88fSMatthew G. Knepley #if 1 3204b164cbf2SMatthew 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); 32052eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 32062eabf88fSMatthew 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); 32072eabf88fSMatthew G. Knepley } 32082eabf88fSMatthew G. Knepley #endif 32092eabf88fSMatthew G. Knepley } 32102eabf88fSMatthew G. Knepley /* Split faces have 4 edges and the same cells as the parent */ 32112eabf88fSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 32122eabf88fSMatthew G. Knepley ierr = PetscMalloc((4 + maxSupportSize*2) * sizeof(PetscInt), &supportRef);CHKERRQ(ierr); 32132eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 32142eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 3215aaebbb9dSMatthew G. Knepley /* TODO: This can come from GetFaces_Internal() */ 32162eabf88fSMatthew 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}; 32172eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 32182eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 3219aaebbb9dSMatthew G. Knepley PetscInt coneNew[4], orntNew[4], coneSize, c, supportSize, s; 32202eabf88fSMatthew G. Knepley 32212eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 3222aaebbb9dSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 3223*a3cddbf8SMatthew G. Knepley coneNew[(r+3)%4] = eStartNew + (cone[(r+3)%4] - eStart)*2 + (ornt[(r+3)%4] < 0 ? 0 : 1); 3224*a3cddbf8SMatthew G. Knepley orntNew[(r+3)%4] = ornt[(r+3)%4]; 3225*a3cddbf8SMatthew G. Knepley coneNew[(r+0)%4] = eStartNew + (cone[r] - eStart)*2 + (ornt[r] < 0 ? 1 : 0); 3226*a3cddbf8SMatthew G. Knepley orntNew[(r+0)%4] = ornt[r]; 3227*a3cddbf8SMatthew G. Knepley coneNew[(r+1)%4] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 3228*a3cddbf8SMatthew G. Knepley orntNew[(r+1)%4] = 0; 3229*a3cddbf8SMatthew G. Knepley coneNew[(r+2)%4] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + (r+3)%4; 3230*a3cddbf8SMatthew G. Knepley orntNew[(r+2)%4] = -2; 32312eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3232aaebbb9dSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 32332eabf88fSMatthew G. Knepley #if 1 32342eabf88fSMatthew 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); 32352eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 32362eabf88fSMatthew 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); 32372eabf88fSMatthew G. Knepley } 32382eabf88fSMatthew G. Knepley #endif 32392eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 32402eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 32412eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 32422eabf88fSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 32432eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 32442eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 32452eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 32462eabf88fSMatthew G. Knepley if (cone[c] == f) break; 32472eabf88fSMatthew G. Knepley } 3248*a3cddbf8SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*8 + newCells[c*4+GetQuadSubfaceInverse_Static(ornt[c], r)]; 32492eabf88fSMatthew G. Knepley } 32502eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 32512eabf88fSMatthew G. Knepley #if 1 32522eabf88fSMatthew 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); 32532eabf88fSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 32542eabf88fSMatthew 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); 32552eabf88fSMatthew G. Knepley } 32562eabf88fSMatthew G. Knepley #endif 32572eabf88fSMatthew G. Knepley } 32582eabf88fSMatthew G. Knepley } 32592eabf88fSMatthew G. Knepley /* Interior faces have 4 edges and 2 cells */ 32602eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 32612eabf88fSMatthew 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}; 3262afb2665bSMatthew G. Knepley const PetscInt *cone, *ornt; 3263afb2665bSMatthew G. Knepley PetscInt newp, coneNew[4], orntNew[4], supportNew[2]; 32642eabf88fSMatthew G. Knepley 32652eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 3266afb2665bSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 3267afb2665bSMatthew G. Knepley /* A-D face */ 3268afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; 3269*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 3); 3270*a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 3271*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 3272afb2665bSMatthew G. Knepley orntNew[1] = 0; 3273*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 3274*a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 3275*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 0); 3276afb2665bSMatthew G. Knepley orntNew[3] = -2; 32772eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3278afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 32792eabf88fSMatthew G. Knepley #if 1 32802eabf88fSMatthew 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); 32812eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 32822eabf88fSMatthew 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); 32832eabf88fSMatthew G. Knepley } 32842eabf88fSMatthew G. Knepley #endif 3285afb2665bSMatthew G. Knepley /* C-D face */ 3286afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; 3287*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 2); 3288*a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 3289*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 3290afb2665bSMatthew G. Knepley orntNew[1] = 0; 3291*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 3292*a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 3293*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 0); 3294afb2665bSMatthew G. Knepley orntNew[3] = -2; 3295afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3296afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3297afb2665bSMatthew G. Knepley #if 1 3298afb2665bSMatthew 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); 3299afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3300afb2665bSMatthew 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); 3301afb2665bSMatthew G. Knepley } 3302afb2665bSMatthew G. Knepley #endif 3303afb2665bSMatthew G. Knepley /* B-C face */ 3304afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; 3305afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 1); 3306afb2665bSMatthew G. Knepley orntNew[0] = -2; 3307afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 0); 3308afb2665bSMatthew G. Knepley orntNew[1] = 0; 3309afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 3310afb2665bSMatthew G. Knepley orntNew[2] = 0; 3311afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 3312afb2665bSMatthew G. Knepley orntNew[3] = -2; 3313afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3314afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3315afb2665bSMatthew G. Knepley #if 1 3316afb2665bSMatthew 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); 3317afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3318afb2665bSMatthew 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); 3319afb2665bSMatthew G. Knepley } 3320afb2665bSMatthew G. Knepley #endif 3321afb2665bSMatthew G. Knepley /* A-B face */ 3322afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; 3323afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 0); 3324afb2665bSMatthew G. Knepley orntNew[0] = -2; 3325afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 3); 3326afb2665bSMatthew G. Knepley orntNew[1] = 0; 3327afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 3328afb2665bSMatthew G. Knepley orntNew[2] = 0; 3329afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 3330afb2665bSMatthew G. Knepley orntNew[3] = -2; 3331afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3332afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3333afb2665bSMatthew G. Knepley #if 1 3334afb2665bSMatthew 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); 3335afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3336afb2665bSMatthew 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); 3337afb2665bSMatthew G. Knepley } 3338afb2665bSMatthew G. Knepley #endif 3339afb2665bSMatthew G. Knepley /* E-F face */ 3340afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; 3341*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 3342afb2665bSMatthew G. Knepley orntNew[0] = -2; 3343*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 2); 3344*a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 3345*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 0); 3346afb2665bSMatthew G. Knepley orntNew[2] = 0; 3347*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 3348*a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 3349afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3350afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3351afb2665bSMatthew G. Knepley #if 1 3352afb2665bSMatthew 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); 3353afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3354afb2665bSMatthew 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); 3355afb2665bSMatthew G. Knepley } 3356afb2665bSMatthew G. Knepley #endif 3357afb2665bSMatthew G. Knepley /* F-G face */ 3358afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; 3359*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 3360afb2665bSMatthew G. Knepley orntNew[0] = -2; 3361*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 2); 3362*a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 3363*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 1); 3364afb2665bSMatthew G. Knepley orntNew[2] = 0; 3365*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 3366*a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 3367afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3368afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3369afb2665bSMatthew G. Knepley #if 1 3370afb2665bSMatthew 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); 3371afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3372afb2665bSMatthew 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); 3373afb2665bSMatthew G. Knepley } 3374afb2665bSMatthew G. Knepley #endif 3375afb2665bSMatthew G. Knepley /* G-H face */ 3376afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; 3377afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 2); 3378afb2665bSMatthew G. Knepley orntNew[0] = -2; 3379afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 2); 3380afb2665bSMatthew G. Knepley orntNew[1] = 0; 3381afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 3382afb2665bSMatthew G. Knepley orntNew[2] = 0; 3383afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 3384afb2665bSMatthew G. Knepley orntNew[3] = -2; 3385afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3386afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3387afb2665bSMatthew G. Knepley #if 1 3388afb2665bSMatthew 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); 3389afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3390afb2665bSMatthew 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); 3391afb2665bSMatthew G. Knepley } 3392afb2665bSMatthew G. Knepley #endif 3393afb2665bSMatthew G. Knepley /* E-H face */ 3394afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; 3395*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 3396afb2665bSMatthew G. Knepley orntNew[0] = -2; 3397*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 1); 3398*a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 3399*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 3); 3400afb2665bSMatthew G. Knepley orntNew[2] = 0; 3401*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 3402*a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 3403afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3404afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3405afb2665bSMatthew G. Knepley #if 1 3406afb2665bSMatthew 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); 3407afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3408afb2665bSMatthew 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); 3409afb2665bSMatthew G. Knepley } 3410afb2665bSMatthew G. Knepley #endif 3411afb2665bSMatthew G. Knepley /* A-E face */ 3412afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; 3413*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 3); 3414*a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 3415*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 3416afb2665bSMatthew G. Knepley orntNew[1] = 0; 3417*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 3418*a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 3419*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 0); 3420afb2665bSMatthew G. Knepley orntNew[3] = -2; 3421afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3422afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3423afb2665bSMatthew G. Knepley #if 1 3424afb2665bSMatthew 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); 3425afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3426afb2665bSMatthew 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); 3427afb2665bSMatthew G. Knepley } 3428afb2665bSMatthew G. Knepley #endif 3429afb2665bSMatthew G. Knepley /* D-F face */ 3430afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; 3431afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 1); 3432afb2665bSMatthew G. Knepley orntNew[0] = -2; 3433afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 3); 3434afb2665bSMatthew G. Knepley orntNew[1] = 0; 3435afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 3436afb2665bSMatthew G. Knepley orntNew[2] = 0; 3437afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 3438afb2665bSMatthew G. Knepley orntNew[3] = -2; 3439afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3440afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3441afb2665bSMatthew G. Knepley #if 1 3442afb2665bSMatthew 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); 3443afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3444afb2665bSMatthew 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); 3445afb2665bSMatthew G. Knepley } 3446afb2665bSMatthew G. Knepley #endif 3447afb2665bSMatthew G. Knepley /* C-G face */ 3448afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; 3449*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 3450afb2665bSMatthew G. Knepley orntNew[0] = -2; 3451*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 1); 3452*a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 3453*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 3); 3454afb2665bSMatthew G. Knepley orntNew[2] = 0; 3455*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 3456*a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 3457afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3458afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3459afb2665bSMatthew G. Knepley #if 1 3460afb2665bSMatthew 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); 3461afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3462afb2665bSMatthew 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); 3463afb2665bSMatthew G. Knepley } 3464afb2665bSMatthew G. Knepley #endif 3465afb2665bSMatthew G. Knepley /* B-H face */ 3466afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; 3467*a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 3468*a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 3469*a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 3470*a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 3471*a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 1); 3472*a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 3473*a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 2); 3474*a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 3475afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3476afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 3477afb2665bSMatthew G. Knepley #if 1 3478afb2665bSMatthew 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); 3479afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 3480afb2665bSMatthew 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); 3481afb2665bSMatthew G. Knepley } 3482afb2665bSMatthew G. Knepley #endif 3483afb2665bSMatthew G. Knepley for (r = 0; r < 12; ++r) { 3484afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + r; 34852eabf88fSMatthew G. Knepley supportNew[0] = cStartNew + (c - cStart)*8 + newCells[r*2+0]; 34862eabf88fSMatthew G. Knepley supportNew[1] = cStartNew + (c - cStart)*8 + newCells[r*2+1]; 34872eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 34882eabf88fSMatthew G. Knepley #if 1 34892eabf88fSMatthew 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); 34902eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 34912eabf88fSMatthew 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); 34922eabf88fSMatthew G. Knepley } 34932eabf88fSMatthew G. Knepley #endif 34942eabf88fSMatthew G. Knepley } 34952eabf88fSMatthew G. Knepley } 34962eabf88fSMatthew G. Knepley /* Split edges have 2 vertices and the same faces as the parent */ 34972eabf88fSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 34982eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 34992eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 35002eabf88fSMatthew G. Knepley 35012eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 35022eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 35032eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 35042eabf88fSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 35052eabf88fSMatthew G. Knepley 35062eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 35072eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 35082eabf88fSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 35092eabf88fSMatthew G. Knepley coneNew[(r+1)%2] = newv; 35102eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 35112eabf88fSMatthew G. Knepley #if 1 35122eabf88fSMatthew 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); 35132eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 35142eabf88fSMatthew 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); 35152eabf88fSMatthew G. Knepley } 35162eabf88fSMatthew G. Knepley #endif 35172eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 35182eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 35192eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 35202eabf88fSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 35212eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 35222eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 35232eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 35242eabf88fSMatthew G. Knepley if (cone[c] == e) break; 35252eabf88fSMatthew G. Knepley } 35262eabf88fSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (ornt[c] < 0 ? (c+1-r)%4 : (c+r)%4); 35272eabf88fSMatthew G. Knepley } 35282eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 35292eabf88fSMatthew G. Knepley #if 1 35302eabf88fSMatthew 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); 35312eabf88fSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 35322eabf88fSMatthew 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); 35332eabf88fSMatthew G. Knepley } 35342eabf88fSMatthew G. Knepley #endif 35352eabf88fSMatthew G. Knepley } 35362eabf88fSMatthew G. Knepley } 35372eabf88fSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells faces */ 35382eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 35396b852384SMatthew G. Knepley const PetscInt newFaces[24] = {3, 2, 1, 0, 4, 5, 6, 7, 0, 9, 4, 8, 2, 11, 6, 10, 1, 10, 5, 9, 8, 7, 11, 3}; 35402eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 35416b852384SMatthew G. Knepley const PetscInt *cone, *coneCell, *orntCell, *support; 35422eabf88fSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 35432eabf88fSMatthew G. Knepley 35442eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 35452eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 35462eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 35472eabf88fSMatthew G. Knepley 35482eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - eStart); 35492eabf88fSMatthew G. Knepley coneNew[1] = newv; 35502eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 35512eabf88fSMatthew G. Knepley #if 1 35522eabf88fSMatthew 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); 35532eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 35542eabf88fSMatthew 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); 35552eabf88fSMatthew G. Knepley } 35562eabf88fSMatthew G. Knepley #endif 35572eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 35582eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 35592eabf88fSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + r; 35602eabf88fSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + (r+1)%4; 35612eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 35626b852384SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 35636b852384SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &coneCell);CHKERRQ(ierr); 35646b852384SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &orntCell);CHKERRQ(ierr); 35652eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) if (coneCell[c] == f) break; 3566*a3cddbf8SMatthew G. Knepley supportRef[2+s] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*12 + newFaces[c*4 + GetQuadEdgeInverse_Static(orntCell[c], r)]; 35672eabf88fSMatthew G. Knepley } 35682eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 35692eabf88fSMatthew G. Knepley #if 1 35702eabf88fSMatthew 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); 35712eabf88fSMatthew G. Knepley for (p = 0; p < 2+supportSize; ++p) { 35722eabf88fSMatthew 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); 35732eabf88fSMatthew G. Knepley } 35742eabf88fSMatthew G. Knepley #endif 35752eabf88fSMatthew G. Knepley } 35762eabf88fSMatthew G. Knepley } 35772eabf88fSMatthew G. Knepley /* Cell edges have 2 vertices and 4 faces */ 35782eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 35792eabf88fSMatthew 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}; 35802eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 35812eabf88fSMatthew G. Knepley const PetscInt *cone; 35822eabf88fSMatthew G. Knepley PetscInt coneNew[2], supportNew[4]; 35832eabf88fSMatthew G. Knepley 35842eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 35852eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 35862eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 35872eabf88fSMatthew G. Knepley 35882eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (cone[r] - fStart); 35892eabf88fSMatthew G. Knepley coneNew[1] = newv; 35902eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 35912eabf88fSMatthew G. Knepley #if 1 35922eabf88fSMatthew 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); 35932eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 35942eabf88fSMatthew 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); 35952eabf88fSMatthew G. Knepley } 35962eabf88fSMatthew G. Knepley #endif 35972eabf88fSMatthew G. Knepley for (f = 0; f < 4; ++f) supportNew[f] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + newFaces[r*4+f]; 35982eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 35992eabf88fSMatthew G. Knepley #if 1 36002eabf88fSMatthew 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); 36012eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 36022eabf88fSMatthew 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); 36032eabf88fSMatthew G. Knepley } 36042eabf88fSMatthew G. Knepley #endif 36052eabf88fSMatthew G. Knepley } 36062eabf88fSMatthew G. Knepley } 36072eabf88fSMatthew G. Knepley /* Old vertices have identical supports */ 36082eabf88fSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 36092eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 36102eabf88fSMatthew G. Knepley const PetscInt *support, *cone; 36112eabf88fSMatthew G. Knepley PetscInt size, s; 36122eabf88fSMatthew G. Knepley 36132eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 36142eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 36152eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 36162eabf88fSMatthew G. Knepley PetscInt r = 0; 36172eabf88fSMatthew G. Knepley 36182eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 36192eabf88fSMatthew G. Knepley if (cone[1] == v) r = 1; 36202eabf88fSMatthew G. Knepley supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 36212eabf88fSMatthew G. Knepley } 36222eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 36232eabf88fSMatthew G. Knepley #if 1 36242eabf88fSMatthew 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); 36252eabf88fSMatthew G. Knepley for (p = 0; p < size; ++p) { 36262eabf88fSMatthew 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); 36272eabf88fSMatthew G. Knepley } 36282eabf88fSMatthew G. Knepley #endif 36292eabf88fSMatthew G. Knepley } 36302eabf88fSMatthew G. Knepley /* Edge vertices have 2 + faces supports */ 36312eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 36322eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 36332eabf88fSMatthew G. Knepley const PetscInt *cone, *support; 36342eabf88fSMatthew G. Knepley PetscInt size, s; 36352eabf88fSMatthew G. Knepley 36362eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 36372eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 36382eabf88fSMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 36392eabf88fSMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 36402eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 36412eabf88fSMatthew G. Knepley PetscInt r; 36422eabf88fSMatthew G. Knepley 36432eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 3644a660e16cSMatthew G. Knepley for (r = 0; r < 4; ++r) if (cone[r] == e) break; 36452eabf88fSMatthew G. Knepley supportRef[2+s] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*4 + r; 36462eabf88fSMatthew G. Knepley } 36472eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 36482eabf88fSMatthew G. Knepley #if 1 36492eabf88fSMatthew 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); 36502eabf88fSMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 36512eabf88fSMatthew 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); 36522eabf88fSMatthew G. Knepley } 36532eabf88fSMatthew G. Knepley #endif 36542eabf88fSMatthew G. Knepley } 36552eabf88fSMatthew G. Knepley /* Face vertices have 4 + cells supports */ 36562eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 36572eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 36582eabf88fSMatthew G. Knepley const PetscInt *cone, *support; 36592eabf88fSMatthew G. Knepley PetscInt size, s; 36602eabf88fSMatthew G. Knepley 36612eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 36622eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 36632eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) supportRef[r] = eStartNew + (e - eStart)*2 + (f - fStart)*4 + r; 36642eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 36652eabf88fSMatthew G. Knepley PetscInt r; 36662eabf88fSMatthew G. Knepley 36672eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 36682eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) if (cone[r] == f) break; 36692eabf88fSMatthew G. Knepley supportRef[4+s] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (support[s] - cStart)*6 + r; 36702eabf88fSMatthew G. Knepley } 36712eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 36722eabf88fSMatthew G. Knepley #if 1 36732eabf88fSMatthew 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); 36742eabf88fSMatthew G. Knepley for (p = 0; p < 4+size; ++p) { 36752eabf88fSMatthew 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); 36762eabf88fSMatthew G. Knepley } 36772eabf88fSMatthew G. Knepley #endif 36782eabf88fSMatthew G. Knepley } 36792eabf88fSMatthew G. Knepley /* Cell vertices have 6 supports */ 36802eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 36812eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 36822eabf88fSMatthew G. Knepley PetscInt supportNew[6]; 36832eabf88fSMatthew G. Knepley 36842eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 36852eabf88fSMatthew G. Knepley supportNew[r] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 36862eabf88fSMatthew G. Knepley } 36872eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 36882eabf88fSMatthew G. Knepley } 3689da00770fSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 36902eabf88fSMatthew G. Knepley break; 369175d3a19aSMatthew G. Knepley default: 369275d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 369375d3a19aSMatthew G. Knepley } 369475d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 369575d3a19aSMatthew G. Knepley } 369675d3a19aSMatthew G. Knepley 369775d3a19aSMatthew G. Knepley #undef __FUNCT__ 369875d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetCoordinates" 369975d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerSetCoordinates(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 370075d3a19aSMatthew G. Knepley { 370175d3a19aSMatthew G. Knepley PetscSection coordSection, coordSectionNew; 370275d3a19aSMatthew G. Knepley Vec coordinates, coordinatesNew; 370375d3a19aSMatthew G. Knepley PetscScalar *coords, *coordsNew; 37043478d7aaSMatthew G. Knepley const PetscInt numVertices = depthSize ? depthSize[0] : 0; 3705b5da9499SMatthew G. Knepley PetscInt dim, depth, coordSizeNew, cStart, cEnd, c, vStart, vStartNew, vEnd, v, eStart, eEnd, eMax, e, fStart, fEnd, fMax, f; 370675d3a19aSMatthew G. Knepley PetscErrorCode ierr; 370775d3a19aSMatthew G. Knepley 370875d3a19aSMatthew G. Knepley PetscFunctionBegin; 370975d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 371075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 371175d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 3712b5da9499SMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 371375d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 371475d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 3715b5da9499SMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, NULL, &fMax, &eMax, NULL);CHKERRQ(ierr); 37163478d7aaSMatthew G. Knepley if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, NULL, NULL, NULL, &vStartNew);CHKERRQ(ierr);} 371775d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, NULL, NULL, NULL, &vStartNew);CHKERRQ(ierr); 371875d3a19aSMatthew G. Knepley ierr = DMPlexGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr); 371975d3a19aSMatthew G. Knepley ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm), &coordSectionNew);CHKERRQ(ierr); 372075d3a19aSMatthew G. Knepley ierr = PetscSectionSetNumFields(coordSectionNew, 1);CHKERRQ(ierr); 372175d3a19aSMatthew G. Knepley ierr = PetscSectionSetFieldComponents(coordSectionNew, 0, dim);CHKERRQ(ierr); 37223478d7aaSMatthew G. Knepley ierr = PetscSectionSetChart(coordSectionNew, vStartNew, vStartNew+numVertices);CHKERRQ(ierr); 372375d3a19aSMatthew G. Knepley if (fMax < 0) fMax = fEnd; 3724b5da9499SMatthew G. Knepley if (eMax < 0) eMax = eEnd; 372575d3a19aSMatthew G. Knepley /* All vertices have the dim coordinates */ 37263478d7aaSMatthew G. Knepley for (v = vStartNew; v < vStartNew+numVertices; ++v) { 372775d3a19aSMatthew G. Knepley ierr = PetscSectionSetDof(coordSectionNew, v, dim);CHKERRQ(ierr); 372875d3a19aSMatthew G. Knepley ierr = PetscSectionSetFieldDof(coordSectionNew, v, 0, dim);CHKERRQ(ierr); 372975d3a19aSMatthew G. Knepley } 373075d3a19aSMatthew G. Knepley ierr = PetscSectionSetUp(coordSectionNew);CHKERRQ(ierr); 373175d3a19aSMatthew G. Knepley ierr = DMPlexSetCoordinateSection(rdm, coordSectionNew);CHKERRQ(ierr); 373275d3a19aSMatthew G. Knepley ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr); 373375d3a19aSMatthew G. Knepley ierr = PetscSectionGetStorageSize(coordSectionNew, &coordSizeNew);CHKERRQ(ierr); 373475d3a19aSMatthew G. Knepley ierr = VecCreate(PetscObjectComm((PetscObject)dm), &coordinatesNew);CHKERRQ(ierr); 373575d3a19aSMatthew G. Knepley ierr = PetscObjectSetName((PetscObject) coordinatesNew, "coordinates");CHKERRQ(ierr); 373675d3a19aSMatthew G. Knepley ierr = VecSetSizes(coordinatesNew, coordSizeNew, PETSC_DETERMINE);CHKERRQ(ierr); 373775d3a19aSMatthew G. Knepley ierr = VecSetFromOptions(coordinatesNew);CHKERRQ(ierr); 373875d3a19aSMatthew G. Knepley ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr); 373975d3a19aSMatthew G. Knepley ierr = VecGetArray(coordinatesNew, &coordsNew);CHKERRQ(ierr); 3740b5da9499SMatthew G. Knepley switch (refiner) { 37413478d7aaSMatthew G. Knepley case 0: break; 3742b5da9499SMatthew G. Knepley case 6: /* Hex 3D */ 3743b5da9499SMatthew G. Knepley /* Face vertices have the average of corner coordinates */ 3744b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 3745c91acedaSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 3746b5da9499SMatthew G. Knepley PetscInt *cone = NULL; 3747b5da9499SMatthew G. Knepley PetscInt closureSize, coneSize = 0, off[8], offnew, p, d; 3748b5da9499SMatthew G. Knepley 3749b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, f, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 3750b5da9499SMatthew G. Knepley for (p = 0; p < closureSize*2; p += 2) { 3751b5da9499SMatthew G. Knepley const PetscInt point = cone[p]; 3752b5da9499SMatthew G. Knepley if ((point >= vStart) && (point < vEnd)) cone[coneSize++] = point; 3753b5da9499SMatthew G. Knepley } 3754b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) { 3755b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[v], &off[v]);CHKERRQ(ierr); 3756b5da9499SMatthew G. Knepley } 3757b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 3758b5da9499SMatthew G. Knepley for (d = 0; d < dim; ++d) { 3759b5da9499SMatthew G. Knepley coordsNew[offnew+d] = 0.0; 3760b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) coordsNew[offnew+d] += coords[off[v]+d]; 3761b5da9499SMatthew G. Knepley coordsNew[offnew+d] /= coneSize; 3762b5da9499SMatthew G. Knepley } 3763b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, f, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 3764b5da9499SMatthew G. Knepley } 3765b5da9499SMatthew G. Knepley case 2: /* Hex 2D */ 3766b5da9499SMatthew G. Knepley /* Cell vertices have the average of corner coordinates */ 3767b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 3768c91acedaSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (c - cStart) + (dim > 2 ? (fEnd - fStart) : 0); 3769b5da9499SMatthew G. Knepley PetscInt *cone = NULL; 3770b5da9499SMatthew G. Knepley PetscInt closureSize, coneSize = 0, off[8], offnew, p, d; 3771b5da9499SMatthew G. Knepley 3772b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 3773b5da9499SMatthew G. Knepley for (p = 0; p < closureSize*2; p += 2) { 3774b5da9499SMatthew G. Knepley const PetscInt point = cone[p]; 3775b5da9499SMatthew G. Knepley if ((point >= vStart) && (point < vEnd)) cone[coneSize++] = point; 3776b5da9499SMatthew G. Knepley } 3777b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) { 3778b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[v], &off[v]);CHKERRQ(ierr); 3779b5da9499SMatthew G. Knepley } 3780b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 3781b5da9499SMatthew G. Knepley for (d = 0; d < dim; ++d) { 3782b5da9499SMatthew G. Knepley coordsNew[offnew+d] = 0.0; 3783b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) coordsNew[offnew+d] += coords[off[v]+d]; 3784b5da9499SMatthew G. Knepley coordsNew[offnew+d] /= coneSize; 3785b5da9499SMatthew G. Knepley } 3786b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 3787b5da9499SMatthew G. Knepley } 3788b5da9499SMatthew G. Knepley case 1: /* Simplicial 2D */ 3789b5da9499SMatthew G. Knepley case 3: /* Hybrid Simplicial 2D */ 3790b5da9499SMatthew G. Knepley case 5: /* Simplicial 3D */ 37916ce3c06aSMatthew G. Knepley case 7: /* Hybrid Simplicial 3D */ 3792b5da9499SMatthew G. Knepley /* Edge vertices have the average of endpoint coordinates */ 3793b5da9499SMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 3794b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 3795b5da9499SMatthew G. Knepley const PetscInt *cone; 3796b5da9499SMatthew G. Knepley PetscInt coneSize, offA, offB, offnew, d; 3797b5da9499SMatthew G. Knepley 3798b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, e, &coneSize);CHKERRQ(ierr); 3799b5da9499SMatthew G. Knepley if (coneSize != 2) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Edge %d cone should have two vertices, not %d", e, coneSize); 3800b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 3801b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[0], &offA);CHKERRQ(ierr); 3802b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[1], &offB);CHKERRQ(ierr); 3803b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 3804b5da9499SMatthew G. Knepley for (d = 0; d < dim; ++d) { 3805b5da9499SMatthew G. Knepley coordsNew[offnew+d] = 0.5*(coords[offA+d] + coords[offB+d]); 3806b5da9499SMatthew G. Knepley } 3807b5da9499SMatthew G. Knepley } 380875d3a19aSMatthew G. Knepley /* Old vertices have the same coordinates */ 380975d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 381075d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (v - vStart); 381175d3a19aSMatthew G. Knepley PetscInt off, offnew, d; 381275d3a19aSMatthew G. Knepley 381375d3a19aSMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, v, &off);CHKERRQ(ierr); 381475d3a19aSMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 381575d3a19aSMatthew G. Knepley for (d = 0; d < dim; ++d) { 381675d3a19aSMatthew G. Knepley coordsNew[offnew+d] = coords[off+d]; 381775d3a19aSMatthew G. Knepley } 381875d3a19aSMatthew G. Knepley } 3819b5da9499SMatthew G. Knepley break; 3820b5da9499SMatthew G. Knepley default: 3821b5da9499SMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 382275d3a19aSMatthew G. Knepley } 382375d3a19aSMatthew G. Knepley ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr); 382475d3a19aSMatthew G. Knepley ierr = VecRestoreArray(coordinatesNew, &coordsNew);CHKERRQ(ierr); 382575d3a19aSMatthew G. Knepley ierr = DMSetCoordinatesLocal(rdm, coordinatesNew);CHKERRQ(ierr); 382675d3a19aSMatthew G. Knepley ierr = VecDestroy(&coordinatesNew);CHKERRQ(ierr); 382775d3a19aSMatthew G. Knepley ierr = PetscSectionDestroy(&coordSectionNew);CHKERRQ(ierr); 382875d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 382975d3a19aSMatthew G. Knepley } 383075d3a19aSMatthew G. Knepley 383175d3a19aSMatthew G. Knepley #undef __FUNCT__ 383275d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexCreateProcessSF" 383375d3a19aSMatthew G. Knepley PetscErrorCode DMPlexCreateProcessSF(DM dm, PetscSF sfPoint, IS *processRanks, PetscSF *sfProcess) 383475d3a19aSMatthew G. Knepley { 383575d3a19aSMatthew G. Knepley PetscInt numRoots, numLeaves, l; 383675d3a19aSMatthew G. Knepley const PetscInt *localPoints; 383775d3a19aSMatthew G. Knepley const PetscSFNode *remotePoints; 383875d3a19aSMatthew G. Knepley PetscInt *localPointsNew; 383975d3a19aSMatthew G. Knepley PetscSFNode *remotePointsNew; 384075d3a19aSMatthew G. Knepley PetscInt *ranks, *ranksNew; 384175d3a19aSMatthew G. Knepley PetscErrorCode ierr; 384275d3a19aSMatthew G. Knepley 384375d3a19aSMatthew G. Knepley PetscFunctionBegin; 384475d3a19aSMatthew G. Knepley ierr = PetscSFGetGraph(sfPoint, &numRoots, &numLeaves, &localPoints, &remotePoints);CHKERRQ(ierr); 384575d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscInt), &ranks);CHKERRQ(ierr); 384675d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 384775d3a19aSMatthew G. Knepley ranks[l] = remotePoints[l].rank; 384875d3a19aSMatthew G. Knepley } 384975d3a19aSMatthew G. Knepley ierr = PetscSortRemoveDupsInt(&numLeaves, ranks);CHKERRQ(ierr); 385075d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscInt), &ranksNew);CHKERRQ(ierr); 385175d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscInt), &localPointsNew);CHKERRQ(ierr); 385275d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeaves * sizeof(PetscSFNode), &remotePointsNew);CHKERRQ(ierr); 385375d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 385475d3a19aSMatthew G. Knepley ranksNew[l] = ranks[l]; 385575d3a19aSMatthew G. Knepley localPointsNew[l] = l; 385675d3a19aSMatthew G. Knepley remotePointsNew[l].index = 0; 385775d3a19aSMatthew G. Knepley remotePointsNew[l].rank = ranksNew[l]; 385875d3a19aSMatthew G. Knepley } 385975d3a19aSMatthew G. Knepley ierr = PetscFree(ranks);CHKERRQ(ierr); 386075d3a19aSMatthew G. Knepley ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm), numLeaves, ranksNew, PETSC_OWN_POINTER, processRanks);CHKERRQ(ierr); 386175d3a19aSMatthew G. Knepley ierr = PetscSFCreate(PetscObjectComm((PetscObject)dm), sfProcess);CHKERRQ(ierr); 386275d3a19aSMatthew G. Knepley ierr = PetscSFSetFromOptions(*sfProcess);CHKERRQ(ierr); 386375d3a19aSMatthew G. Knepley ierr = PetscSFSetGraph(*sfProcess, 1, numLeaves, localPointsNew, PETSC_OWN_POINTER, remotePointsNew, PETSC_OWN_POINTER);CHKERRQ(ierr); 386475d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 386575d3a19aSMatthew G. Knepley } 386675d3a19aSMatthew G. Knepley 386775d3a19aSMatthew G. Knepley #undef __FUNCT__ 386875d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerCreateSF" 386975d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerCreateSF(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 387075d3a19aSMatthew G. Knepley { 387175d3a19aSMatthew G. Knepley PetscSF sf, sfNew, sfProcess; 387275d3a19aSMatthew G. Knepley IS processRanks; 387375d3a19aSMatthew G. Knepley MPI_Datatype depthType; 387475d3a19aSMatthew G. Knepley PetscInt numRoots, numLeaves, numLeavesNew = 0, l, m; 387575d3a19aSMatthew G. Knepley const PetscInt *localPoints, *neighbors; 387675d3a19aSMatthew G. Knepley const PetscSFNode *remotePoints; 387775d3a19aSMatthew G. Knepley PetscInt *localPointsNew; 387875d3a19aSMatthew G. Knepley PetscSFNode *remotePointsNew; 387975d3a19aSMatthew G. Knepley PetscInt *depthSizeOld, *rdepthSize, *rdepthSizeOld, *rdepthMaxOld, *rvStart, *rvStartNew, *reStart, *reStartNew, *rfStart, *rfStartNew, *rcStart, *rcStartNew; 3880c3a233c8SMatthew G. Knepley PetscInt depth, numNeighbors, pStartNew, pEndNew, cStart, cStartNew = 0, cEnd, cMax, vStart, vStartNew = 0, vEnd, vMax, fStart, fStartNew = 0, fEnd, fMax, eStart, eStartNew = 0, eEnd, eMax, r, n; 388175d3a19aSMatthew G. Knepley PetscErrorCode ierr; 388275d3a19aSMatthew G. Knepley 388375d3a19aSMatthew G. Knepley PetscFunctionBegin; 388475d3a19aSMatthew G. Knepley ierr = DMPlexGetChart(rdm, &pStartNew, &pEndNew);CHKERRQ(ierr); 388575d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 388675d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 388775d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 388875d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 388975d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 389075d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 38913478d7aaSMatthew G. Knepley if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr);} 389275d3a19aSMatthew G. Knepley ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr); 389375d3a19aSMatthew G. Knepley ierr = DMGetPointSF(rdm, &sfNew);CHKERRQ(ierr); 389475d3a19aSMatthew G. Knepley /* Caculate size of new SF */ 389575d3a19aSMatthew G. Knepley ierr = PetscSFGetGraph(sf, &numRoots, &numLeaves, &localPoints, &remotePoints);CHKERRQ(ierr); 389675d3a19aSMatthew G. Knepley if (numRoots < 0) PetscFunctionReturn(0); 389775d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 389875d3a19aSMatthew G. Knepley const PetscInt p = localPoints[l]; 389975d3a19aSMatthew G. Knepley 390075d3a19aSMatthew G. Knepley switch (refiner) { 390175d3a19aSMatthew G. Knepley case 1: 390275d3a19aSMatthew G. Knepley /* Simplicial 2D */ 390375d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 390475d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 390575d3a19aSMatthew G. Knepley ++numLeavesNew; 390675d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 390775d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 3908d963de37SMatthew G. Knepley numLeavesNew += 2 + 1; 390975d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 391075d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces */ 391175d3a19aSMatthew G. Knepley numLeavesNew += 4 + 3; 391275d3a19aSMatthew G. Knepley } 391375d3a19aSMatthew G. Knepley break; 391475d3a19aSMatthew G. Knepley case 2: 391575d3a19aSMatthew G. Knepley /* Hex 2D */ 391675d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 391775d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 391875d3a19aSMatthew G. Knepley ++numLeavesNew; 391975d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 392075d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 3921d963de37SMatthew G. Knepley numLeavesNew += 2 + 1; 392275d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 3923455d6cd4SMatthew G. Knepley /* Old cells add new cells, interior faces, and vertex */ 3924455d6cd4SMatthew G. Knepley numLeavesNew += 4 + 4 + 1; 392575d3a19aSMatthew G. Knepley } 392675d3a19aSMatthew G. Knepley break; 3927b5da9499SMatthew G. Knepley case 5: 3928b5da9499SMatthew G. Knepley /* Simplicial 3D */ 3929b5da9499SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 3930b5da9499SMatthew G. Knepley /* Old vertices stay the same */ 3931b5da9499SMatthew G. Knepley ++numLeavesNew; 3932b5da9499SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 3933b5da9499SMatthew G. Knepley /* Old edges add new edges and vertex */ 3934b5da9499SMatthew G. Knepley numLeavesNew += 2 + 1; 3935b5da9499SMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 3936b5da9499SMatthew G. Knepley /* Old faces add new faces and face edges */ 3937b5da9499SMatthew G. Knepley numLeavesNew += 4 + 3; 3938b5da9499SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 3939b5da9499SMatthew G. Knepley /* Old cells add new cells and interior faces and edges */ 3940b5da9499SMatthew G. Knepley numLeavesNew += 8 + 8 + 1; 3941b5da9499SMatthew G. Knepley } 3942b5da9499SMatthew G. Knepley break; 39436ce3c06aSMatthew G. Knepley case 7: 39446ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 39456ce3c06aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 39466ce3c06aSMatthew G. Knepley /* Interior vertices stay the same */ 39476ce3c06aSMatthew G. Knepley ++numLeavesNew; 39486ce3c06aSMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 39496ce3c06aSMatthew G. Knepley /* Interior edges add new edges and vertex */ 39506ce3c06aSMatthew G. Knepley numLeavesNew += 2 + 1; 39516ce3c06aSMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 39526ce3c06aSMatthew G. Knepley /* Hybrid edges stay the same */ 39536ce3c06aSMatthew G. Knepley ++numLeavesNew; 39546ce3c06aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 39556ce3c06aSMatthew G. Knepley /* Interior faces add new faces and edges */ 39566ce3c06aSMatthew G. Knepley numLeavesNew += 4 + 3; 39576ce3c06aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 39586ce3c06aSMatthew G. Knepley /* Hybrid faces add new faces and edges */ 39596ce3c06aSMatthew G. Knepley numLeavesNew += 2 + 1; 39606ce3c06aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 39616ce3c06aSMatthew G. Knepley /* Interior cells add new cells, faces, and edges */ 39626ce3c06aSMatthew G. Knepley numLeavesNew += 8 + 8 + 1; 39636ce3c06aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 39646ce3c06aSMatthew G. Knepley /* Hybrid cells add new cells and faces */ 39656ce3c06aSMatthew G. Knepley numLeavesNew += 4 + 3; 39666ce3c06aSMatthew G. Knepley } 39676ce3c06aSMatthew G. Knepley break; 39682eabf88fSMatthew G. Knepley case 6: 39692eabf88fSMatthew G. Knepley /* Hex 3D */ 39702eabf88fSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 39712eabf88fSMatthew G. Knepley /* Old vertices stay the same */ 39722eabf88fSMatthew G. Knepley ++numLeavesNew; 39732eabf88fSMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 39742eabf88fSMatthew G. Knepley /* Old edges add new edges, and vertex */ 39752eabf88fSMatthew G. Knepley numLeavesNew += 2 + 1; 39762eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 39772eabf88fSMatthew G. Knepley /* Old faces add new faces, edges, and vertex */ 39782eabf88fSMatthew G. Knepley numLeavesNew += 4 + 4 + 1; 39792eabf88fSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 39802eabf88fSMatthew G. Knepley /* Old cells add new cells, faces, edges, and vertex */ 39812eabf88fSMatthew G. Knepley numLeavesNew += 8 + 12 + 6 + 1; 39822eabf88fSMatthew G. Knepley } 39832eabf88fSMatthew G. Knepley break; 398475d3a19aSMatthew G. Knepley default: 398575d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 398675d3a19aSMatthew G. Knepley } 398775d3a19aSMatthew G. Knepley } 398875d3a19aSMatthew G. Knepley /* Communicate depthSizes for each remote rank */ 398975d3a19aSMatthew G. Knepley ierr = DMPlexCreateProcessSF(dm, sf, &processRanks, &sfProcess);CHKERRQ(ierr); 399075d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(processRanks, &numNeighbors);CHKERRQ(ierr); 399175d3a19aSMatthew G. Knepley ierr = PetscMalloc5((depth+1)*numNeighbors,PetscInt,&rdepthSize,numNeighbors,PetscInt,&rvStartNew,numNeighbors,PetscInt,&reStartNew,numNeighbors,PetscInt,&rfStartNew,numNeighbors,PetscInt,&rcStartNew);CHKERRQ(ierr); 399275d3a19aSMatthew 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); 399375d3a19aSMatthew G. Knepley ierr = MPI_Type_contiguous(depth+1, MPIU_INT, &depthType);CHKERRQ(ierr); 399475d3a19aSMatthew G. Knepley ierr = MPI_Type_commit(&depthType);CHKERRQ(ierr); 399575d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSize, rdepthSize);CHKERRQ(ierr); 399675d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSize, rdepthSize);CHKERRQ(ierr); 399775d3a19aSMatthew G. Knepley for (n = 0; n < numNeighbors; ++n) { 399875d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, &rdepthSize[n*(depth+1)], &rcStartNew[n], &rfStartNew[n], &reStartNew[n], &rvStartNew[n]);CHKERRQ(ierr); 399975d3a19aSMatthew G. Knepley } 400075d3a19aSMatthew G. Knepley depthSizeOld[depth] = cMax; 400175d3a19aSMatthew G. Knepley depthSizeOld[0] = vMax; 400275d3a19aSMatthew G. Knepley depthSizeOld[depth-1] = fMax; 400375d3a19aSMatthew G. Knepley depthSizeOld[1] = eMax; 400475d3a19aSMatthew G. Knepley 400575d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSizeOld, rdepthMaxOld);CHKERRQ(ierr); 400675d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSizeOld, rdepthMaxOld);CHKERRQ(ierr); 400775d3a19aSMatthew G. Knepley 400875d3a19aSMatthew G. Knepley depthSizeOld[depth] = cEnd - cStart; 400975d3a19aSMatthew G. Knepley depthSizeOld[0] = vEnd - vStart; 401075d3a19aSMatthew G. Knepley depthSizeOld[depth-1] = fEnd - fStart; 401175d3a19aSMatthew G. Knepley depthSizeOld[1] = eEnd - eStart; 401275d3a19aSMatthew G. Knepley 401375d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSizeOld, rdepthSizeOld);CHKERRQ(ierr); 401475d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSizeOld, rdepthSizeOld);CHKERRQ(ierr); 401575d3a19aSMatthew G. Knepley for (n = 0; n < numNeighbors; ++n) { 401675d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, &rdepthSizeOld[n*(depth+1)], &rcStart[n], &rfStart[n], &reStart[n], &rvStart[n]);CHKERRQ(ierr); 401775d3a19aSMatthew G. Knepley } 401875d3a19aSMatthew G. Knepley ierr = MPI_Type_free(&depthType);CHKERRQ(ierr); 401975d3a19aSMatthew G. Knepley ierr = PetscSFDestroy(&sfProcess);CHKERRQ(ierr); 402075d3a19aSMatthew G. Knepley /* Calculate new point SF */ 402175d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeavesNew * sizeof(PetscInt), &localPointsNew);CHKERRQ(ierr); 402275d3a19aSMatthew G. Knepley ierr = PetscMalloc(numLeavesNew * sizeof(PetscSFNode), &remotePointsNew);CHKERRQ(ierr); 402375d3a19aSMatthew G. Knepley ierr = ISGetIndices(processRanks, &neighbors);CHKERRQ(ierr); 402475d3a19aSMatthew G. Knepley for (l = 0, m = 0; l < numLeaves; ++l) { 402575d3a19aSMatthew G. Knepley PetscInt p = localPoints[l]; 402675d3a19aSMatthew G. Knepley PetscInt rp = remotePoints[l].index, n; 402775d3a19aSMatthew G. Knepley PetscMPIInt rrank = remotePoints[l].rank; 402875d3a19aSMatthew G. Knepley 402975d3a19aSMatthew G. Knepley ierr = PetscFindInt(rrank, numNeighbors, neighbors, &n);CHKERRQ(ierr); 403075d3a19aSMatthew G. Knepley if (n < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Could not locate remote rank %d", rrank); 403175d3a19aSMatthew G. Knepley switch (refiner) { 403275d3a19aSMatthew G. Knepley case 1: 403375d3a19aSMatthew G. Knepley /* Simplicial 2D */ 403475d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 403575d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 403675d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 403775d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 403875d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 403975d3a19aSMatthew G. Knepley ++m; 404075d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 404175d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 404275d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 404375d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 404475d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 404575d3a19aSMatthew G. Knepley ++m; 404675d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 404775d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 404875d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 404975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 405075d3a19aSMatthew G. Knepley } 405175d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 405275d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces */ 405375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 405475d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 405575d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 405675d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 405775d3a19aSMatthew G. Knepley } 405875d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 405975d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 406075d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*2 + (rp - rcStart[n])*3 + r; 406175d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 406275d3a19aSMatthew G. Knepley } 406375d3a19aSMatthew G. Knepley } 406475d3a19aSMatthew G. Knepley break; 406575d3a19aSMatthew G. Knepley case 2: 406675d3a19aSMatthew G. Knepley /* Hex 2D */ 406775d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 406875d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 406975d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 407075d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 407175d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 407275d3a19aSMatthew G. Knepley ++m; 407375d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 407475d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 407575d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 407675d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 407775d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 407875d3a19aSMatthew G. Knepley ++m; 407975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 408075d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 408175d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 408275d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 408375d3a19aSMatthew G. Knepley } 408475d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 4085455d6cd4SMatthew G. Knepley /* Old cells add new cells, interior faces, and vertex */ 408675d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 408775d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 408875d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 408975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 409075d3a19aSMatthew G. Knepley } 409175d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 409275d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*2 + (p - cStart)*4 + r; 409375d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*2 + (rp - rcStart[n])*4 + r; 409475d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 409575d3a19aSMatthew G. Knepley } 4096455d6cd4SMatthew G. Knepley for (r = 0; r < 1; ++r, ++m) { 4097455d6cd4SMatthew G. Knepley localPointsNew[m] = vStartNew + (fEnd - fStart) + (p - cStart) + r; 4098455d6cd4SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1] + (rp - rcStart[n]) + r; 4099455d6cd4SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4100455d6cd4SMatthew G. Knepley } 410175d3a19aSMatthew G. Knepley } 410275d3a19aSMatthew G. Knepley break; 410375d3a19aSMatthew G. Knepley case 3: 410475d3a19aSMatthew G. Knepley /* Hybrid simplicial 2D */ 410575d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 410675d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 410775d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 410875d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 410975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 411075d3a19aSMatthew G. Knepley ++m; 411175d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 411275d3a19aSMatthew G. Knepley /* Old interior faces add new faces and vertex */ 411375d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 411475d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 411575d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 411675d3a19aSMatthew G. Knepley ++m; 411775d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 411875d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 411975d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 412075d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 412175d3a19aSMatthew G. Knepley } 412275d3a19aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 412375d3a19aSMatthew G. Knepley /* Old hybrid faces stay the same */ 412475d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - fMax); 412575d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rdepthMaxOld[n*(depth+1)+depth-1]); 412675d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 412775d3a19aSMatthew G. Knepley ++m; 412875d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 412975d3a19aSMatthew G. Knepley /* Old interior cells add new cells and interior faces */ 413075d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 413175d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 413275d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 413375d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 413475d3a19aSMatthew G. Knepley } 413575d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 413675d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - cStart)*3 + r; 413775d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rcStart[n])*3 + r; 413875d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 413975d3a19aSMatthew G. Knepley } 414075d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 414175d3a19aSMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 414275d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 414375d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 414475d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 414575d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 414675d3a19aSMatthew G. Knepley } 414775d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (p - cMax); 414875d3a19aSMatthew 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]); 414975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 415075d3a19aSMatthew G. Knepley ++m; 415175d3a19aSMatthew G. Knepley } 415275d3a19aSMatthew G. Knepley break; 4153b5da9499SMatthew G. Knepley case 5: 4154b5da9499SMatthew G. Knepley /* Simplicial 3D */ 4155b5da9499SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 4156b5da9499SMatthew G. Knepley /* Old vertices stay the same */ 4157b5da9499SMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 4158b5da9499SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 4159b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4160b5da9499SMatthew G. Knepley ++m; 416187fe6628SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 4162b5da9499SMatthew G. Knepley /* Old edges add new edges and vertex */ 4163b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 4164b5da9499SMatthew G. Knepley localPointsNew[m] = eStartNew + (p - eStart)*2 + r; 4165b5da9499SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rp - reStart[n])*2 + r; 4166b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4167b5da9499SMatthew G. Knepley } 4168b5da9499SMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - eStart); 4169b5da9499SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - reStart[n]); 4170b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4171b5da9499SMatthew G. Knepley ++m; 4172b5da9499SMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 4173b5da9499SMatthew G. Knepley /* Old faces add new faces and face edges */ 4174b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 4175b5da9499SMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*4 + r; 4176b5da9499SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*4 + r; 4177b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4178b5da9499SMatthew G. Knepley } 4179b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 4180b5da9499SMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (p - fStart)*3 + r; 4181b5da9499SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + rdepthSizeOld[n*(depth+1)+1]*2 + (rp - rfStart[n])*3 + r; 4182b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4183b5da9499SMatthew G. Knepley } 4184b5da9499SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 4185b5da9499SMatthew G. Knepley /* Old cells add new cells and interior faces and edges */ 4186b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 4187b5da9499SMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*8 + r; 4188b5da9499SMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*8 + r; 4189b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4190b5da9499SMatthew G. Knepley } 4191b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 4192b5da9499SMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*4 + (p - cStart)*8 + r; 4193b5da9499SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*4 + (rp - rcStart[n])*8 + r; 4194b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4195b5da9499SMatthew G. Knepley } 4196b5da9499SMatthew G. Knepley for (r = 0; r < 1; ++r, ++m) { 4197b5da9499SMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (p - cStart)*1 + r; 4198b5da9499SMatthew 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; 4199b5da9499SMatthew G. Knepley remotePointsNew[m].rank = rrank; 4200b5da9499SMatthew G. Knepley } 4201b5da9499SMatthew G. Knepley } 4202b5da9499SMatthew G. Knepley break; 42036ce3c06aSMatthew G. Knepley case 7: 42046ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 42056ce3c06aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 42066ce3c06aSMatthew G. Knepley /* Interior vertices stay the same */ 42076ce3c06aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 42086ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 42096ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42106ce3c06aSMatthew G. Knepley ++m; 42116ce3c06aSMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 42126ce3c06aSMatthew G. Knepley /* Interior edges add new edges and vertex */ 42136ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 42146ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (p - eStart)*2 + r; 42156ce3c06aSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rp - reStart[n])*2 + r; 42166ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42176ce3c06aSMatthew G. Knepley } 42186ce3c06aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - eStart); 42196ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - reStart[n]); 42206ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42216ce3c06aSMatthew G. Knepley ++m; 42226ce3c06aSMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 42236ce3c06aSMatthew G. Knepley /* Hybrid edges stay the same */ 42246ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (p - eMax); 42256ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*3 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n]) + (rp - rdepthMaxOld[n*(depth+1)+1]); 42266ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42276ce3c06aSMatthew G. Knepley ++m; 42286ce3c06aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 42296ce3c06aSMatthew G. Knepley /* Interior faces add new faces and edges */ 42306ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 42316ce3c06aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*4 + r; 42326ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*4 + r; 42336ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42346ce3c06aSMatthew G. Knepley } 42356ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 42366ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (p - fStart)*3 + r; 42376ce3c06aSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rp - rfStart[n])*3 + r; 42386ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42396ce3c06aSMatthew G. Knepley } 42406ce3c06aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 42416ce3c06aSMatthew G. Knepley /* Hybrid faces add new faces and edges */ 42426ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 42436ce3c06aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (p - fStart)*2 + r; 42446ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*8 + (rp - rfStart[n])*2 + r; 42456ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42466ce3c06aSMatthew G. Knepley } 42476ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart) + (cMax - cStart) + (fEnd - fMax); 42486ce3c06aSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n]) + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n]) + (rdepthSizeOld[n*(depth+1)+depth-1]+rfStart[n] - rdepthMaxOld[n*(depth+1)+depth-1]); 42496ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42506ce3c06aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 42516ce3c06aSMatthew G. Knepley /* Interior cells add new cells, faces, and edges */ 42526ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 42536ce3c06aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*8 + r; 42546ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*8 + r; 42556ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42566ce3c06aSMatthew G. Knepley } 42576ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 42586ce3c06aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (p - cStart)*8 + r; 42596ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rp - rcStart[n])*8 + r; 42606ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42616ce3c06aSMatthew G. Knepley } 42626ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (p - cStart)*1 + r; 42636ce3c06aSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*3 + (rp - rcStart[n])*1 + r; 42646ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42656ce3c06aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 42666ce3c06aSMatthew G. Knepley /* Hybrid cells add new cells and faces */ 42676ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 42686ce3c06aSMatthew G. Knepley localPointsNew[m] = cStartNew + (cMax - cStart)*8 + (p - cMax)*4 + r; 42696ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*8 + (rp - rdepthMaxOld[n*(depth+1)+depth])*4 + r; 42706ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42716ce3c06aSMatthew G. Knepley } 42726ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 42736ce3c06aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*4 + (p - cMax)*3 + r; 42746ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*8 + (rdepthSizeOld[n*(depth+1)+depth-1]+rfStart[n] - rdepthMaxOld[n*(depth+1)+depth-1])*4 + (rp - rdepthMaxOld[n*(depth+1)+depth])*3 + r; 42756ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42766ce3c06aSMatthew G. Knepley } 42776ce3c06aSMatthew G. Knepley } 42786ce3c06aSMatthew G. Knepley break; 42792eabf88fSMatthew G. Knepley case 6: 42802eabf88fSMatthew G. Knepley /* Hex 3D */ 42812eabf88fSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 42822eabf88fSMatthew G. Knepley /* Old vertices stay the same */ 42832eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 42842eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 42852eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42862eabf88fSMatthew G. Knepley ++m; 42872eabf88fSMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 42882eabf88fSMatthew G. Knepley /* Old edges add new edges and vertex */ 42892eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 42902eabf88fSMatthew G. Knepley localPointsNew[m] = eStartNew + (p - eStart)*2 + r; 42912eabf88fSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rp - reStart[n])*2 + r; 42922eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42932eabf88fSMatthew G. Knepley } 42942eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - eStart); 42952eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - reStart[n]); 42962eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 42972eabf88fSMatthew G. Knepley ++m; 42982eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 42992eabf88fSMatthew G. Knepley /* Old faces add new faces, edges, and vertex */ 43002eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 43012eabf88fSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*4 + r; 43022eabf88fSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*4 + r; 43032eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 43042eabf88fSMatthew G. Knepley } 43052eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 43062eabf88fSMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (p - fStart)*4 + r; 43072eabf88fSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + rdepthSizeOld[n*(depth+1)+1]*2 + (rp - rfStart[n])*4 + r; 43082eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 43092eabf88fSMatthew G. Knepley } 43102eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (p - fStart); 43112eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + rdepthSizeOld[n*(depth+1)+1] + (rp - rfStart[n]); 43122eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 43132eabf88fSMatthew G. Knepley ++m; 43142eabf88fSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 43152eabf88fSMatthew G. Knepley /* Old cells add new cells, faces, edges, and vertex */ 43162eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 43172eabf88fSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*8 + r; 43182eabf88fSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*8 + r; 43192eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 43202eabf88fSMatthew G. Knepley } 43212eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r, ++m) { 43222eabf88fSMatthew G. Knepley localPointsNew[m] = fStartNew + (fEnd - fStart)*4 + (p - cStart)*12 + r; 43232eabf88fSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + rdepthSizeOld[n*(depth+1)+depth-1]*4 + (rp - rcStart[n])*12 + r; 43242eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 43252eabf88fSMatthew G. Knepley } 43262eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r, ++m) { 43272eabf88fSMatthew G. Knepley localPointsNew[m] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (p - cStart)*6 + r; 43282eabf88fSMatthew 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; 43292eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 43302eabf88fSMatthew G. Knepley } 43312eabf88fSMatthew G. Knepley for (r = 0; r < 1; ++r, ++m) { 43322eabf88fSMatthew G. Knepley localPointsNew[m] = vStartNew + (eEnd - eStart) + (fEnd - fStart) + (p - cStart) + r; 43332eabf88fSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+1] + rdepthSizeOld[n*(depth+1)+depth-1] + (rp - rcStart[n]) + r; 43342eabf88fSMatthew G. Knepley remotePointsNew[m].rank = rrank; 43352eabf88fSMatthew G. Knepley } 43362eabf88fSMatthew G. Knepley } 43372eabf88fSMatthew G. Knepley break; 433875d3a19aSMatthew G. Knepley default: 433975d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 434075d3a19aSMatthew G. Knepley } 434175d3a19aSMatthew G. Knepley } 434275d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(processRanks, &neighbors);CHKERRQ(ierr); 434375d3a19aSMatthew G. Knepley ierr = ISDestroy(&processRanks);CHKERRQ(ierr); 434475d3a19aSMatthew G. Knepley ierr = PetscSFSetGraph(sfNew, pEndNew-pStartNew, numLeavesNew, localPointsNew, PETSC_OWN_POINTER, remotePointsNew, PETSC_OWN_POINTER);CHKERRQ(ierr); 434575d3a19aSMatthew G. Knepley ierr = PetscFree5(rdepthSize,rvStartNew,reStartNew,rfStartNew,rcStartNew);CHKERRQ(ierr); 434606a0ba2dSMatthew G. Knepley ierr = PetscFree7(depthSizeOld,rdepthSizeOld,rdepthMaxOld,rvStart,reStart,rfStart,rcStart);CHKERRQ(ierr); 434775d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 434875d3a19aSMatthew G. Knepley } 434975d3a19aSMatthew G. Knepley 435075d3a19aSMatthew G. Knepley #undef __FUNCT__ 435175d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerCreateLabels" 435275d3a19aSMatthew G. Knepley PetscErrorCode CellRefinerCreateLabels(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 435375d3a19aSMatthew G. Knepley { 435475d3a19aSMatthew G. Knepley PetscInt numLabels, l; 4355c3a233c8SMatthew G. Knepley PetscInt depth, newp, cStart, cStartNew = 0, cEnd, cMax, vStart, vStartNew = 0, vEnd, vMax, fStart, fStartNew = 0, fEnd, fMax, eStart, eStartNew = 0, eEnd, eMax, r; 435675d3a19aSMatthew G. Knepley PetscErrorCode ierr; 435775d3a19aSMatthew G. Knepley 435875d3a19aSMatthew G. Knepley PetscFunctionBegin; 435975d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 436075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 436175d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 436275d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 4363d963de37SMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 43643478d7aaSMatthew G. Knepley if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr);} 436575d3a19aSMatthew G. Knepley ierr = DMPlexGetNumLabels(dm, &numLabels);CHKERRQ(ierr); 436675d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 436775d3a19aSMatthew G. Knepley switch (refiner) { 43683478d7aaSMatthew G. Knepley case 0: break; 436958b8852aSMatthew G. Knepley case 7: 437058b8852aSMatthew G. Knepley case 8: 437158b8852aSMatthew G. Knepley if (eMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No edge maximum specified in hybrid mesh"); 437275d3a19aSMatthew G. Knepley case 3: 437358b8852aSMatthew G. Knepley case 4: 437475d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 437575d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 437675d3a19aSMatthew G. Knepley } 437775d3a19aSMatthew G. Knepley for (l = 0; l < numLabels; ++l) { 437875d3a19aSMatthew G. Knepley DMLabel label, labelNew; 437975d3a19aSMatthew G. Knepley const char *lname; 438075d3a19aSMatthew G. Knepley PetscBool isDepth; 438175d3a19aSMatthew G. Knepley IS valueIS; 438275d3a19aSMatthew G. Knepley const PetscInt *values; 438375d3a19aSMatthew G. Knepley PetscInt numValues, val; 438475d3a19aSMatthew G. Knepley 438575d3a19aSMatthew G. Knepley ierr = DMPlexGetLabelName(dm, l, &lname);CHKERRQ(ierr); 438675d3a19aSMatthew G. Knepley ierr = PetscStrcmp(lname, "depth", &isDepth);CHKERRQ(ierr); 438775d3a19aSMatthew G. Knepley if (isDepth) continue; 438875d3a19aSMatthew G. Knepley ierr = DMPlexCreateLabel(rdm, lname);CHKERRQ(ierr); 438975d3a19aSMatthew G. Knepley ierr = DMPlexGetLabel(dm, lname, &label);CHKERRQ(ierr); 439075d3a19aSMatthew G. Knepley ierr = DMPlexGetLabel(rdm, lname, &labelNew);CHKERRQ(ierr); 439175d3a19aSMatthew G. Knepley ierr = DMLabelGetValueIS(label, &valueIS);CHKERRQ(ierr); 439275d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(valueIS, &numValues);CHKERRQ(ierr); 439375d3a19aSMatthew G. Knepley ierr = ISGetIndices(valueIS, &values);CHKERRQ(ierr); 439475d3a19aSMatthew G. Knepley for (val = 0; val < numValues; ++val) { 439575d3a19aSMatthew G. Knepley IS pointIS; 439675d3a19aSMatthew G. Knepley const PetscInt *points; 439775d3a19aSMatthew G. Knepley PetscInt numPoints, n; 439875d3a19aSMatthew G. Knepley 439975d3a19aSMatthew G. Knepley ierr = DMLabelGetStratumIS(label, values[val], &pointIS);CHKERRQ(ierr); 440075d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(pointIS, &numPoints);CHKERRQ(ierr); 440175d3a19aSMatthew G. Knepley ierr = ISGetIndices(pointIS, &points);CHKERRQ(ierr); 440275d3a19aSMatthew G. Knepley for (n = 0; n < numPoints; ++n) { 440375d3a19aSMatthew G. Knepley const PetscInt p = points[n]; 440475d3a19aSMatthew G. Knepley switch (refiner) { 440575d3a19aSMatthew G. Knepley case 1: 440675d3a19aSMatthew G. Knepley /* Simplicial 2D */ 440775d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 440875d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 440975d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 441075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 441175d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 441275d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 441375d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 441475d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 441575d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 441675d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 441775d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 441875d3a19aSMatthew G. Knepley } 441975d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 442075d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces */ 442175d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 442275d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 442375d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 442475d3a19aSMatthew G. Knepley } 442575d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 442675d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 442775d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 442875d3a19aSMatthew G. Knepley } 442975d3a19aSMatthew G. Knepley } 443075d3a19aSMatthew G. Knepley break; 443175d3a19aSMatthew G. Knepley case 2: 443275d3a19aSMatthew G. Knepley /* Hex 2D */ 443375d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 443475d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 443575d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 443675d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 443775d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 443875d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 443975d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 444075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 444175d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 444275d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 444375d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 444475d3a19aSMatthew G. Knepley } 444575d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 444675d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces and vertex */ 444775d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 444875d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 444975d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 445075d3a19aSMatthew G. Knepley } 445175d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 445275d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*4 + r; 445375d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 445475d3a19aSMatthew G. Knepley } 445575d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (p - cStart); 445675d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 445775d3a19aSMatthew G. Knepley } 445875d3a19aSMatthew G. Knepley break; 445975d3a19aSMatthew G. Knepley case 3: 446075d3a19aSMatthew G. Knepley /* Hybrid simplicial 2D */ 446175d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 446275d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 446375d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 446475d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 446575d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 446675d3a19aSMatthew G. Knepley /* Old interior faces add new faces and vertex */ 446775d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 446875d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 446975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 447075d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 447175d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 447275d3a19aSMatthew G. Knepley } 447375d3a19aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 447475d3a19aSMatthew G. Knepley /* Old hybrid faces stay the same */ 447575d3a19aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (p - fMax); 447675d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 447775d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 447875d3a19aSMatthew G. Knepley /* Old interior cells add new cells and interior faces */ 447975d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 448075d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 448175d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 448275d3a19aSMatthew G. Knepley } 448375d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 448475d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 448575d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 448675d3a19aSMatthew G. Knepley } 448775d3a19aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 448875d3a19aSMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 448975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 449075d3a19aSMatthew G. Knepley newp = cStartNew + (cMax - cStart)*4 + (p - cMax)*2 + r; 449175d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 449275d3a19aSMatthew G. Knepley } 449375d3a19aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (p - cMax); 449475d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 449575d3a19aSMatthew G. Knepley } 449675d3a19aSMatthew G. Knepley break; 4497b5da9499SMatthew G. Knepley case 5: 4498b5da9499SMatthew G. Knepley /* Simplicial 3D */ 4499b5da9499SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 4500b5da9499SMatthew G. Knepley /* Old vertices stay the same */ 4501b5da9499SMatthew G. Knepley newp = vStartNew + (p - vStart); 4502b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4503b5da9499SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 4504b5da9499SMatthew G. Knepley /* Old edges add new edges and vertex */ 4505b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 4506b5da9499SMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 4507b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4508b5da9499SMatthew G. Knepley } 4509b5da9499SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 4510b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4511b5da9499SMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 4512b5da9499SMatthew G. Knepley /* Old faces add new faces and edges */ 4513b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 4514b5da9499SMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 4515b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4516b5da9499SMatthew G. Knepley } 4517b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 4518b5da9499SMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (p - fStart)*3 + r; 4519b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4520b5da9499SMatthew G. Knepley } 4521b5da9499SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 4522b5da9499SMatthew G. Knepley /* Old cells add new cells and interior faces and edges */ 4523b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 4524b5da9499SMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 4525b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4526b5da9499SMatthew G. Knepley } 4527b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 4528b5da9499SMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (p - cStart)*8 + r; 4529b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4530b5da9499SMatthew G. Knepley } 4531b5da9499SMatthew G. Knepley for (r = 0; r < 1; ++r) { 4532b5da9499SMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (p - cStart)*1 + r; 4533b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 4534b5da9499SMatthew G. Knepley } 4535b5da9499SMatthew G. Knepley } 4536b5da9499SMatthew G. Knepley break; 45376ce3c06aSMatthew G. Knepley case 7: 45386ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 45396ce3c06aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 45406ce3c06aSMatthew G. Knepley /* Interior vertices stay the same */ 45416ce3c06aSMatthew G. Knepley newp = vStartNew + (p - vStart); 45426ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45436ce3c06aSMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 45446ce3c06aSMatthew G. Knepley /* Interior edges add new edges and vertex */ 45456ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 45466ce3c06aSMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 45476ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45486ce3c06aSMatthew G. Knepley } 45496ce3c06aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 45506ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45516ce3c06aSMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 45526ce3c06aSMatthew G. Knepley /* Hybrid edges stay the same */ 45536ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (p - eMax); 45546ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45556ce3c06aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 45566ce3c06aSMatthew G. Knepley /* Interior faces add new faces and edges */ 45576ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 45586ce3c06aSMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 45596ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45606ce3c06aSMatthew G. Knepley } 45616ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 45626ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (p - fStart)*3 + r; 45636ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45646ce3c06aSMatthew G. Knepley } 45656ce3c06aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 45666ce3c06aSMatthew G. Knepley /* Hybrid faces add new faces and edges */ 45676ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 45686ce3c06aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (p - fMax)*2 + r; 45696ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45706ce3c06aSMatthew G. Knepley } 45716ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (p - fMax); 45726ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45736ce3c06aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 45746ce3c06aSMatthew G. Knepley /* Interior cells add new cells, faces, and edges */ 45756ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 45766ce3c06aSMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 45776ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45786ce3c06aSMatthew G. Knepley } 45796ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 45806ce3c06aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (p - cStart)*8 + r; 45816ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45826ce3c06aSMatthew G. Knepley } 45836ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (p - cStart); 45846ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 458558b8852aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 45866ce3c06aSMatthew G. Knepley /* Hybrid cells add new cells and faces */ 45876ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 45886ce3c06aSMatthew G. Knepley newp = cStartNew + (cMax - cStart)*8 + (p - cMax)*4 + r; 45896ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45906ce3c06aSMatthew G. Knepley } 45916ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 45926ce3c06aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (p - cMax)*3 + r; 45936ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 45946ce3c06aSMatthew G. Knepley } 45956ce3c06aSMatthew G. Knepley } 45966ce3c06aSMatthew G. Knepley break; 45972eabf88fSMatthew G. Knepley case 6: 45982eabf88fSMatthew G. Knepley /* Hex 3D */ 45992eabf88fSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 46002eabf88fSMatthew G. Knepley /* Old vertices stay the same */ 46012eabf88fSMatthew G. Knepley newp = vStartNew + (p - vStart); 46022eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 460319d7d790SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 46042eabf88fSMatthew G. Knepley /* Old edges add new edges and vertex */ 46052eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 46062eabf88fSMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 46072eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46082eabf88fSMatthew G. Knepley } 46092eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 46102eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46112eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 46122eabf88fSMatthew G. Knepley /* Old faces add new faces, edges, and vertex */ 46132eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 46142eabf88fSMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 46152eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46162eabf88fSMatthew G. Knepley } 46172eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 46182eabf88fSMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (p - fStart)*4 + r; 46192eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46202eabf88fSMatthew G. Knepley } 46212eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (p - fStart); 46222eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46232eabf88fSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 46242eabf88fSMatthew G. Knepley /* Old cells add new cells, faces, edges, and vertex */ 46252eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r) { 46262eabf88fSMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 46272eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46282eabf88fSMatthew G. Knepley } 46292eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r) { 46302eabf88fSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (p - cStart)*12 + r; 46312eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46322eabf88fSMatthew G. Knepley } 46332eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 46342eabf88fSMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (p - cStart)*6 + r; 46352eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46362eabf88fSMatthew G. Knepley } 46372eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (p - cStart); 46382eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 46392eabf88fSMatthew G. Knepley } 46402eabf88fSMatthew G. Knepley break; 464175d3a19aSMatthew G. Knepley default: 464275d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 464375d3a19aSMatthew G. Knepley } 464475d3a19aSMatthew G. Knepley } 464575d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(pointIS, &points);CHKERRQ(ierr); 464675d3a19aSMatthew G. Knepley ierr = ISDestroy(&pointIS);CHKERRQ(ierr); 464775d3a19aSMatthew G. Knepley } 464875d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(valueIS, &values);CHKERRQ(ierr); 464975d3a19aSMatthew G. Knepley ierr = ISDestroy(&valueIS);CHKERRQ(ierr); 465075d3a19aSMatthew G. Knepley if (0) { 465175d3a19aSMatthew G. Knepley ierr = PetscViewerASCIISynchronizedAllow(PETSC_VIEWER_STDOUT_WORLD, PETSC_TRUE);CHKERRQ(ierr); 465275d3a19aSMatthew G. Knepley ierr = DMLabelView(labelNew, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 465375d3a19aSMatthew G. Knepley ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 465475d3a19aSMatthew G. Knepley } 465575d3a19aSMatthew G. Knepley } 465675d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 465775d3a19aSMatthew G. Knepley } 465875d3a19aSMatthew G. Knepley 465975d3a19aSMatthew G. Knepley #undef __FUNCT__ 4660509c9b89SMatthew G. Knepley #define __FUNCT__ "DMPlexRefineUniform_Internal" 466175d3a19aSMatthew G. Knepley /* This will only work for interpolated meshes */ 4662509c9b89SMatthew G. Knepley PetscErrorCode DMPlexRefineUniform_Internal(DM dm, CellRefiner cellRefiner, DM *dmRefined) 466375d3a19aSMatthew G. Knepley { 466475d3a19aSMatthew G. Knepley DM rdm; 466575d3a19aSMatthew G. Knepley PetscInt *depthSize; 466675d3a19aSMatthew G. Knepley PetscInt dim, depth = 0, d, pStart = 0, pEnd = 0; 466775d3a19aSMatthew G. Knepley PetscErrorCode ierr; 466875d3a19aSMatthew G. Knepley 466975d3a19aSMatthew G. Knepley PetscFunctionBegin; 467075d3a19aSMatthew G. Knepley ierr = DMCreate(PetscObjectComm((PetscObject)dm), &rdm);CHKERRQ(ierr); 467175d3a19aSMatthew G. Knepley ierr = DMSetType(rdm, DMPLEX);CHKERRQ(ierr); 467275d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 467375d3a19aSMatthew G. Knepley ierr = DMPlexSetDimension(rdm, dim);CHKERRQ(ierr); 467475d3a19aSMatthew G. Knepley /* Calculate number of new points of each depth */ 467575d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 467675d3a19aSMatthew G. Knepley ierr = PetscMalloc((depth+1) * sizeof(PetscInt), &depthSize);CHKERRQ(ierr); 467775d3a19aSMatthew G. Knepley ierr = PetscMemzero(depthSize, (depth+1) * sizeof(PetscInt));CHKERRQ(ierr); 467875d3a19aSMatthew G. Knepley ierr = CellRefinerGetSizes(cellRefiner, dm, depthSize);CHKERRQ(ierr); 467975d3a19aSMatthew G. Knepley /* Step 1: Set chart */ 468075d3a19aSMatthew G. Knepley for (d = 0; d <= depth; ++d) pEnd += depthSize[d]; 468175d3a19aSMatthew G. Knepley ierr = DMPlexSetChart(rdm, pStart, pEnd);CHKERRQ(ierr); 468275d3a19aSMatthew G. Knepley /* Step 2: Set cone/support sizes */ 468375d3a19aSMatthew G. Knepley ierr = CellRefinerSetConeSizes(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 468475d3a19aSMatthew G. Knepley /* Step 3: Setup refined DM */ 468575d3a19aSMatthew G. Knepley ierr = DMSetUp(rdm);CHKERRQ(ierr); 468675d3a19aSMatthew G. Knepley /* Step 4: Set cones and supports */ 468775d3a19aSMatthew G. Knepley ierr = CellRefinerSetCones(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 468875d3a19aSMatthew G. Knepley /* Step 5: Stratify */ 468975d3a19aSMatthew G. Knepley ierr = DMPlexStratify(rdm);CHKERRQ(ierr); 469075d3a19aSMatthew G. Knepley /* Step 6: Set coordinates for vertices */ 469175d3a19aSMatthew G. Knepley ierr = CellRefinerSetCoordinates(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 469275d3a19aSMatthew G. Knepley /* Step 7: Create pointSF */ 469375d3a19aSMatthew G. Knepley ierr = CellRefinerCreateSF(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 469475d3a19aSMatthew G. Knepley /* Step 8: Create labels */ 469575d3a19aSMatthew G. Knepley ierr = CellRefinerCreateLabels(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 469675d3a19aSMatthew G. Knepley ierr = PetscFree(depthSize);CHKERRQ(ierr); 469775d3a19aSMatthew G. Knepley 469875d3a19aSMatthew G. Knepley *dmRefined = rdm; 469975d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 470075d3a19aSMatthew G. Knepley } 470175d3a19aSMatthew G. Knepley 470275d3a19aSMatthew G. Knepley #undef __FUNCT__ 470375d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexSetRefinementUniform" 470475d3a19aSMatthew G. Knepley PetscErrorCode DMPlexSetRefinementUniform(DM dm, PetscBool refinementUniform) 470575d3a19aSMatthew G. Knepley { 470675d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 470775d3a19aSMatthew G. Knepley 470875d3a19aSMatthew G. Knepley PetscFunctionBegin; 470975d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 471075d3a19aSMatthew G. Knepley mesh->refinementUniform = refinementUniform; 471175d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 471275d3a19aSMatthew G. Knepley } 471375d3a19aSMatthew G. Knepley 471475d3a19aSMatthew G. Knepley #undef __FUNCT__ 471575d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexGetRefinementUniform" 471675d3a19aSMatthew G. Knepley PetscErrorCode DMPlexGetRefinementUniform(DM dm, PetscBool *refinementUniform) 471775d3a19aSMatthew G. Knepley { 471875d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 471975d3a19aSMatthew G. Knepley 472075d3a19aSMatthew G. Knepley PetscFunctionBegin; 472175d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 472275d3a19aSMatthew G. Knepley PetscValidPointer(refinementUniform, 2); 472375d3a19aSMatthew G. Knepley *refinementUniform = mesh->refinementUniform; 472475d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 472575d3a19aSMatthew G. Knepley } 472675d3a19aSMatthew G. Knepley 472775d3a19aSMatthew G. Knepley #undef __FUNCT__ 472875d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexSetRefinementLimit" 472975d3a19aSMatthew G. Knepley PetscErrorCode DMPlexSetRefinementLimit(DM dm, PetscReal refinementLimit) 473075d3a19aSMatthew G. Knepley { 473175d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 473275d3a19aSMatthew G. Knepley 473375d3a19aSMatthew G. Knepley PetscFunctionBegin; 473475d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 473575d3a19aSMatthew G. Knepley mesh->refinementLimit = refinementLimit; 473675d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 473775d3a19aSMatthew G. Knepley } 473875d3a19aSMatthew G. Knepley 473975d3a19aSMatthew G. Knepley #undef __FUNCT__ 474075d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexGetRefinementLimit" 474175d3a19aSMatthew G. Knepley PetscErrorCode DMPlexGetRefinementLimit(DM dm, PetscReal *refinementLimit) 474275d3a19aSMatthew G. Knepley { 474375d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 474475d3a19aSMatthew G. Knepley 474575d3a19aSMatthew G. Knepley PetscFunctionBegin; 474675d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 474775d3a19aSMatthew G. Knepley PetscValidPointer(refinementLimit, 2); 474875d3a19aSMatthew G. Knepley /* if (mesh->refinementLimit < 0) = getMaxVolume()/2.0; */ 474975d3a19aSMatthew G. Knepley *refinementLimit = mesh->refinementLimit; 475075d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 475175d3a19aSMatthew G. Knepley } 475275d3a19aSMatthew G. Knepley 475375d3a19aSMatthew G. Knepley #undef __FUNCT__ 4754509c9b89SMatthew G. Knepley #define __FUNCT__ "DMPlexGetCellRefiner_Internal" 4755509c9b89SMatthew G. Knepley PetscErrorCode DMPlexGetCellRefiner_Internal(DM dm, CellRefiner *cellRefiner) 475675d3a19aSMatthew G. Knepley { 47573478d7aaSMatthew G. Knepley PetscInt dim, cStart, cEnd, coneSize, cMax; 475875d3a19aSMatthew G. Knepley PetscErrorCode ierr; 475975d3a19aSMatthew G. Knepley 476075d3a19aSMatthew G. Knepley PetscFunctionBegin; 476175d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 47623478d7aaSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 47633478d7aaSMatthew G. Knepley if (cEnd <= cStart) {*cellRefiner = 0; PetscFunctionReturn(0);} 476475d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, cStart, &coneSize);CHKERRQ(ierr); 476575d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, NULL, NULL, NULL);CHKERRQ(ierr); 476675d3a19aSMatthew G. Knepley switch (dim) { 476775d3a19aSMatthew G. Knepley case 2: 476875d3a19aSMatthew G. Knepley switch (coneSize) { 476975d3a19aSMatthew G. Knepley case 3: 477075d3a19aSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 3; /* Hybrid */ 477175d3a19aSMatthew G. Knepley else *cellRefiner = 1; /* Triangular */ 477275d3a19aSMatthew G. Knepley break; 477375d3a19aSMatthew G. Knepley case 4: 477475d3a19aSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 4; /* Hybrid */ 477575d3a19aSMatthew G. Knepley else *cellRefiner = 2; /* Quadrilateral */ 477675d3a19aSMatthew G. Knepley break; 477775d3a19aSMatthew G. Knepley default: 477875d3a19aSMatthew G. Knepley SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown coneSize %d in dimension %d for cell refiner", coneSize, dim); 477975d3a19aSMatthew G. Knepley } 478075d3a19aSMatthew G. Knepley break; 4781b5da9499SMatthew G. Knepley case 3: 4782b5da9499SMatthew G. Knepley switch (coneSize) { 4783b5da9499SMatthew G. Knepley case 4: 4784b5da9499SMatthew G. Knepley if (cMax >= 0) *cellRefiner = 7; /* Hybrid */ 4785b5da9499SMatthew G. Knepley else *cellRefiner = 5; /* Tetrahedral */ 4786b5da9499SMatthew G. Knepley break; 47872eabf88fSMatthew G. Knepley case 6: 47882eabf88fSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 8; /* Hybrid */ 47892eabf88fSMatthew G. Knepley else *cellRefiner = 6; /* hexahedral */ 47902eabf88fSMatthew G. Knepley break; 4791b5da9499SMatthew G. Knepley default: 4792b5da9499SMatthew G. Knepley SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown coneSize %d in dimension %d for cell refiner", coneSize, dim); 4793b5da9499SMatthew G. Knepley } 4794b5da9499SMatthew G. Knepley break; 479575d3a19aSMatthew G. Knepley default: 479675d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown dimension %d for cell refiner", dim); 479775d3a19aSMatthew G. Knepley } 479875d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 479975d3a19aSMatthew G. Knepley } 4800