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__ 29bed052eaSMatthew G. Knepley #define __FUNCT__ "CellRefinerGetAffineTransforms_Internal" 30bed052eaSMatthew G. Knepley /* Gets the affine map from the original cell to each subcell */ 31bed052eaSMatthew G. Knepley PetscErrorCode CellRefinerGetAffineTransforms_Internal(CellRefiner refiner, PetscInt *numSubcells, PetscReal *v0[], PetscReal *jac[], PetscReal *invjac[]) 32bed052eaSMatthew G. Knepley { 33bed052eaSMatthew G. Knepley PetscReal *v = NULL, *j = NULL, *invj = NULL, detJ; 34bed052eaSMatthew G. Knepley PetscInt dim, s; 35bed052eaSMatthew G. Knepley PetscErrorCode ierr; 36bed052eaSMatthew G. Knepley 37bed052eaSMatthew G. Knepley PetscFunctionBegin; 38bed052eaSMatthew G. Knepley switch (refiner) { 39bed052eaSMatthew G. Knepley case 0: break; 40bed052eaSMatthew G. Knepley case 1: 41*260b6d3fSMatthew G. Knepley /* 42*260b6d3fSMatthew G. Knepley 2 43*260b6d3fSMatthew G. Knepley |\ 44*260b6d3fSMatthew G. Knepley | \ 45*260b6d3fSMatthew G. Knepley | \ 46*260b6d3fSMatthew G. Knepley | \ 47*260b6d3fSMatthew G. Knepley | C \ 48*260b6d3fSMatthew G. Knepley | \ 49*260b6d3fSMatthew G. Knepley | \ 50*260b6d3fSMatthew G. Knepley 2---1---1 51*260b6d3fSMatthew G. Knepley |\ D / \ 52*260b6d3fSMatthew G. Knepley | 2 0 \ 53*260b6d3fSMatthew G. Knepley |A \ / B \ 54*260b6d3fSMatthew G. Knepley 0---0-------1 55*260b6d3fSMatthew G. Knepley */ 56bed052eaSMatthew G. Knepley dim = 2; 57bed052eaSMatthew G. Knepley if (numSubcells) *numSubcells = 4; 58bed052eaSMatthew G. Knepley if (v0) { 59bed052eaSMatthew G. Knepley ierr = PetscMalloc3(4*dim,&v,4*dim*dim,&j,4*dim*dim,&invj);CHKERRQ(ierr); 60bed052eaSMatthew G. Knepley /* A */ 61bed052eaSMatthew G. Knepley v[0+0] = -1.0; v[0+1] = -1.0; 62bed052eaSMatthew G. Knepley j[0+0] = 0.5; j[0+1] = 0.0; 63bed052eaSMatthew G. Knepley j[0+2] = 0.0; j[0+3] = 0.5; 64bed052eaSMatthew G. Knepley /* B */ 65bed052eaSMatthew G. Knepley v[2+0] = 0.0; v[2+1] = -1.0; 66bed052eaSMatthew G. Knepley j[4+0] = 0.5; j[4+1] = 0.0; 67bed052eaSMatthew G. Knepley j[4+2] = 0.0; j[4+3] = 0.5; 68bed052eaSMatthew G. Knepley /* C */ 69bed052eaSMatthew G. Knepley v[4+0] = -1.0; v[4+1] = 0.0; 70bed052eaSMatthew G. Knepley j[8+0] = 0.5; j[8+1] = 0.0; 71bed052eaSMatthew G. Knepley j[8+2] = 0.0; j[8+3] = 0.5; 72bed052eaSMatthew G. Knepley /* D */ 73bed052eaSMatthew G. Knepley v[6+0] = 0.0; v[6+1] = -1.0; 74bed052eaSMatthew G. Knepley j[12+0] = 0.0; j[12+1] = -0.5; 75bed052eaSMatthew G. Knepley j[12+2] = 0.5; j[12+3] = 0.5; 76bed052eaSMatthew G. Knepley for (s = 0; s < 4; ++s) { 77bed052eaSMatthew G. Knepley DMPlex_Det2D_Internal(&detJ, &j[s*dim*dim]); 78bed052eaSMatthew G. Knepley DMPlex_Invert2D_Internal(&invj[s*dim*dim], &j[s*dim*dim], detJ); 79bed052eaSMatthew G. Knepley } 80bed052eaSMatthew G. Knepley } 81bed052eaSMatthew G. Knepley break; 82*260b6d3fSMatthew G. Knepley case 2: 83*260b6d3fSMatthew G. Knepley /* 84*260b6d3fSMatthew G. Knepley 3---------2---------2 85*260b6d3fSMatthew G. Knepley | | | 86*260b6d3fSMatthew G. Knepley | D 2 C | 87*260b6d3fSMatthew G. Knepley | | | 88*260b6d3fSMatthew G. Knepley 3----3----0----1----1 89*260b6d3fSMatthew G. Knepley | | | 90*260b6d3fSMatthew G. Knepley | A 0 B | 91*260b6d3fSMatthew G. Knepley | | | 92*260b6d3fSMatthew G. Knepley 0---------0---------1 93*260b6d3fSMatthew G. Knepley */ 94*260b6d3fSMatthew G. Knepley dim = 2; 95*260b6d3fSMatthew G. Knepley if (numSubcells) *numSubcells = 4; 96*260b6d3fSMatthew G. Knepley if (v0) { 97*260b6d3fSMatthew G. Knepley ierr = PetscMalloc3(4*dim,&v,4*dim*dim,&j,4*dim*dim,&invj);CHKERRQ(ierr); 98*260b6d3fSMatthew G. Knepley /* A */ 99*260b6d3fSMatthew G. Knepley v[0+0] = -1.0; v[0+1] = -1.0; 100*260b6d3fSMatthew G. Knepley j[0+0] = 0.5; j[0+1] = 0.0; 101*260b6d3fSMatthew G. Knepley j[0+2] = 0.0; j[0+3] = 0.5; 102*260b6d3fSMatthew G. Knepley /* B */ 103*260b6d3fSMatthew G. Knepley v[2+0] = 0.0; v[2+1] = -1.0; 104*260b6d3fSMatthew G. Knepley j[4+0] = 0.5; j[4+1] = 0.0; 105*260b6d3fSMatthew G. Knepley j[4+2] = 0.0; j[4+3] = 0.5; 106*260b6d3fSMatthew G. Knepley /* C */ 107*260b6d3fSMatthew G. Knepley v[4+0] = 0.0; v[4+1] = 0.0; 108*260b6d3fSMatthew G. Knepley j[8+0] = 0.5; j[8+1] = 0.0; 109*260b6d3fSMatthew G. Knepley j[8+2] = 0.0; j[8+3] = 0.5; 110*260b6d3fSMatthew G. Knepley /* D */ 111*260b6d3fSMatthew G. Knepley v[6+0] = -1.0; v[6+1] = 0.0; 112*260b6d3fSMatthew G. Knepley j[12+0] = 0.5; j[12+1] = 0.0; 113*260b6d3fSMatthew G. Knepley j[12+2] = 0.0; j[12+3] = 0.5; 114*260b6d3fSMatthew G. Knepley for (s = 0; s < 4; ++s) { 115*260b6d3fSMatthew G. Knepley DMPlex_Det2D_Internal(&detJ, &j[s*dim*dim]); 116*260b6d3fSMatthew G. Knepley DMPlex_Invert2D_Internal(&invj[s*dim*dim], &j[s*dim*dim], detJ); 117*260b6d3fSMatthew G. Knepley } 118*260b6d3fSMatthew G. Knepley } 119*260b6d3fSMatthew G. Knepley break; 120bed052eaSMatthew G. Knepley default: 121bed052eaSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 122bed052eaSMatthew G. Knepley } 123bed052eaSMatthew G. Knepley if (v0) {*v0 = v; *jac = j; *invjac = invj;} 124bed052eaSMatthew G. Knepley PetscFunctionReturn(0); 125bed052eaSMatthew G. Knepley } 126bed052eaSMatthew G. Knepley 127bed052eaSMatthew G. Knepley #undef __FUNCT__ 128bed052eaSMatthew G. Knepley #define __FUNCT__ "CellRefinerRestoreAffineTransforms_Internal" 129bed052eaSMatthew G. Knepley PetscErrorCode CellRefinerRestoreAffineTransforms_Internal(CellRefiner refiner, PetscInt *numSubcells, PetscReal *v0[], PetscReal *jac[], PetscReal *invjac[]) 130bed052eaSMatthew G. Knepley { 131bed052eaSMatthew G. Knepley PetscErrorCode ierr; 132bed052eaSMatthew G. Knepley 133bed052eaSMatthew G. Knepley PetscFunctionBegin; 134bed052eaSMatthew G. Knepley ierr = PetscFree3(*v0,*jac,*invjac);CHKERRQ(ierr); 135bed052eaSMatthew G. Knepley PetscFunctionReturn(0); 136bed052eaSMatthew G. Knepley } 137bed052eaSMatthew G. Knepley 138bed052eaSMatthew G. Knepley #undef __FUNCT__ 13975d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerGetSizes" 14086150812SJed Brown static PetscErrorCode CellRefinerGetSizes(CellRefiner refiner, DM dm, PetscInt depthSize[]) 14175d3a19aSMatthew G. Knepley { 1426ce3c06aSMatthew G. Knepley PetscInt cStart, cEnd, cMax, vStart, vEnd, vMax, fStart, fEnd, fMax, eStart, eEnd, eMax; 14375d3a19aSMatthew G. Knepley PetscErrorCode ierr; 14475d3a19aSMatthew G. Knepley 14575d3a19aSMatthew G. Knepley PetscFunctionBegin; 14675d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 14775d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 14875d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 14975d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 15075d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 15175d3a19aSMatthew G. Knepley switch (refiner) { 1523478d7aaSMatthew G. Knepley case 0: 1533478d7aaSMatthew G. Knepley break; 15475d3a19aSMatthew G. Knepley case 1: 15575d3a19aSMatthew G. Knepley /* Simplicial 2D */ 15675d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + fEnd - fStart; /* Add a vertex on every face */ 15775d3a19aSMatthew 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 */ 15875d3a19aSMatthew G. Knepley depthSize[2] = 4*(cEnd - cStart); /* Every cell split into 4 cells */ 15975d3a19aSMatthew G. Knepley break; 16075d3a19aSMatthew G. Knepley case 3: 161d963de37SMatthew G. Knepley /* Hybrid Simplicial 2D */ 16275d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 16375d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 16475d3a19aSMatthew G. Knepley depthSize[0] = vEnd - vStart + fMax - fStart; /* Add a vertex on every face, but not hybrid faces */ 16575d3a19aSMatthew 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 */ 16675d3a19aSMatthew G. Knepley depthSize[2] = 4*(cMax - cStart) + 2*(cEnd - cMax); /* Interior cells split into 4 cells, Hybrid cells split into 2 cells */ 16775d3a19aSMatthew G. Knepley break; 16875d3a19aSMatthew G. Knepley case 2: 16975d3a19aSMatthew G. Knepley /* Hex 2D */ 170149f48fdSMatthew G. Knepley depthSize[0] = vEnd - vStart + fEnd - fStart + cEnd - cStart; /* Add a vertex on every face and cell */ 17175d3a19aSMatthew 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 */ 17275d3a19aSMatthew G. Knepley depthSize[2] = 4*(cEnd - cStart); /* Every cell split into 4 cells */ 17375d3a19aSMatthew G. Knepley break; 174a97b51b8SMatthew G. Knepley case 4: 175a97b51b8SMatthew G. Knepley /* Hybrid Hex 2D */ 176a97b51b8SMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 177a97b51b8SMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 178a97b51b8SMatthew G. Knepley /* Quadrilateral */ 179a97b51b8SMatthew G. Knepley depthSize[0] = vEnd - vStart + fMax - fStart + cMax - cStart; /* Add a vertex on every face and cell */ 180a97b51b8SMatthew G. Knepley depthSize[1] = 2*(fMax - fStart) + 4*(cMax - cStart); /* Every face is split into 2 faces, and 4 faces are added for each cell */ 181a97b51b8SMatthew G. Knepley depthSize[2] = 4*(cMax - cStart); /* Every cell split into 4 cells */ 182a97b51b8SMatthew G. Knepley /* Segment Prisms */ 183a97b51b8SMatthew G. Knepley depthSize[0] += 0; /* No hybrid vertices */ 184a97b51b8SMatthew G. Knepley depthSize[1] += (fEnd - fMax) + (cEnd - cMax); /* Every hybrid face remains and 1 faces is added for each hybrid cell */ 185a97b51b8SMatthew G. Knepley depthSize[2] += 2*(cEnd - cMax); /* Every hybrid cell split into 2 cells */ 186a97b51b8SMatthew G. Knepley break; 187b5da9499SMatthew G. Knepley case 5: 188b5da9499SMatthew G. Knepley /* Simplicial 3D */ 189b5da9499SMatthew G. Knepley depthSize[0] = vEnd - vStart + eEnd - eStart; /* Add a vertex on every edge */ 190b5da9499SMatthew 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 */ 191b5da9499SMatthew G. Knepley depthSize[2] = 4*(fEnd - fStart) + 8*(cEnd - cStart); /* Every face split into 4 faces and 8 faces are added for each cell */ 192b5da9499SMatthew G. Knepley depthSize[3] = 8*(cEnd - cStart); /* Every cell split into 8 cells */ 193b5da9499SMatthew G. Knepley break; 194b5da9499SMatthew G. Knepley case 7: 195b5da9499SMatthew G. Knepley /* Hybrid Simplicial 3D */ 196b5da9499SMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 1976ce3c06aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 198b5da9499SMatthew G. Knepley if (eMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No edge maximum specified in hybrid mesh"); 199dae4404aSMatthew G. Knepley /* Tetrahedra */ 200dae4404aSMatthew G. Knepley depthSize[0] = vEnd - vStart + eMax - eStart; /* Add a vertex on every interior edge */ 201dae4404aSMatthew 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 */ 202dae4404aSMatthew G. Knepley depthSize[2] = 4*(fMax - fStart) + 8*(cMax - cStart); /* Every interior face split into 4 faces, 8 faces added for each interior cell */ 203dae4404aSMatthew G. Knepley depthSize[3] = 8*(cMax - cStart); /* Every interior cell split into 8 cells */ 204dae4404aSMatthew G. Knepley /* Triangular Prisms */ 205dae4404aSMatthew G. Knepley depthSize[0] += 0; /* No hybrid vertices */ 206dae4404aSMatthew G. Knepley depthSize[1] += (eEnd - eMax) + (fEnd - fMax); /* Every hybrid edge remains, 1 edge for every hybrid face */ 2076ce3c06aSMatthew 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 */ 208dae4404aSMatthew G. Knepley depthSize[3] += 4*(cEnd - cMax); /* Every hybrid cell split into 4 cells */ 209b5da9499SMatthew G. Knepley break; 2106ce3c06aSMatthew G. Knepley case 6: 2116ce3c06aSMatthew G. Knepley /* Hex 3D */ 2126ce3c06aSMatthew G. Knepley depthSize[0] = vEnd - vStart + eEnd - eStart + fEnd - fStart + cEnd - cStart; /* Add a vertex on every edge, face and cell */ 2136ce3c06aSMatthew 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 */ 2146ce3c06aSMatthew 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 */ 2156ce3c06aSMatthew G. Knepley depthSize[3] = 8*(cEnd - cStart); /* Every cell split into 8 cells */ 2166ce3c06aSMatthew G. Knepley break; 21727fcede3SMatthew G. Knepley case 8: 21827fcede3SMatthew G. Knepley /* Hybrid Hex 3D */ 21927fcede3SMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 22027fcede3SMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 22127fcede3SMatthew G. Knepley if (eMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No edge maximum specified in hybrid mesh"); 22227fcede3SMatthew G. Knepley /* Hexahedra */ 22327fcede3SMatthew G. Knepley depthSize[0] = vEnd - vStart + eMax - eStart + fMax - fStart + cMax - cStart; /* Add a vertex on every edge, face and cell */ 22427fcede3SMatthew G. Knepley depthSize[1] = 2*(eMax - eStart) + 4*(fMax - fStart) + 6*(cMax - cStart); /* Every edge is split into 2 edge, 4 edges are added for each face, and 6 edges for each cell */ 22527fcede3SMatthew G. Knepley depthSize[2] = 4*(fMax - fStart) + 12*(cMax - cStart); /* Every face is split into 4 faces, and 12 faces are added for each cell */ 22627fcede3SMatthew G. Knepley depthSize[3] = 8*(cMax - cStart); /* Every cell split into 8 cells */ 22727fcede3SMatthew G. Knepley /* Quadrilateral Prisms */ 22827fcede3SMatthew G. Knepley depthSize[0] += 0; /* No hybrid vertices */ 22927fcede3SMatthew G. Knepley depthSize[1] += (eEnd - eMax) + (fEnd - fMax) + (cEnd - cMax); /* Every hybrid edge remains, 1 edge for every hybrid face and hybrid cell */ 23027fcede3SMatthew G. Knepley depthSize[2] += 2*(fEnd - fMax) + 4*(cEnd - cMax); /* Every hybrid face split into 2 faces and 4 faces are added for each hybrid cell */ 23127fcede3SMatthew G. Knepley depthSize[3] += 4*(cEnd - cMax); /* Every hybrid cell split into 4 cells */ 23227fcede3SMatthew G. Knepley break; 23375d3a19aSMatthew G. Knepley default: 23475d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 23575d3a19aSMatthew G. Knepley } 23675d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 23775d3a19aSMatthew G. Knepley } 23875d3a19aSMatthew G. Knepley 23942525629SMatthew G. Knepley /* Return triangle edge for orientation o, if it is r for o == 0 */ 24042525629SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriEdge_Static(PetscInt o, PetscInt r) { 241518a8359SMatthew G. Knepley return (o < 0 ? 2-(o+r) : o+r)%3; 242518a8359SMatthew G. Knepley } 243de65f515SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriEdgeInverse_Static(PetscInt o, PetscInt s) { 244de65f515SMatthew G. Knepley return (o < 0 ? 2-(o+s) : 3+s-o)%3; 245de65f515SMatthew G. Knepley } 246518a8359SMatthew G. Knepley 247518a8359SMatthew G. Knepley /* Return triangle subface for orientation o, if it is r for o == 0 */ 248518a8359SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriSubface_Static(PetscInt o, PetscInt r) { 2494bae88c7SMatthew G. Knepley return (o < 0 ? 3-(o+r) : o+r)%3; 25042525629SMatthew G. Knepley } 251de65f515SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTriSubfaceInverse_Static(PetscInt o, PetscInt s) { 252de65f515SMatthew G. Knepley return (o < 0 ? 3-(o+s) : 3+s-o)%3; 253de65f515SMatthew G. Knepley } 25442525629SMatthew G. Knepley 255431647a4SMatthew G. Knepley /* I HAVE NO IDEA: Return ??? for orientation o, if it is r for o == 0 */ 256431647a4SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTetSomething_Static(PetscInt o, PetscInt r) { 257431647a4SMatthew G. Knepley return (o < 0 ? 1-(o+r) : o+r)%3; 258431647a4SMatthew G. Knepley } 259431647a4SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetTetSomethingInverse_Static(PetscInt o, PetscInt s) { 260431647a4SMatthew G. Knepley return (o < 0 ? 1-(o+s) : 3+s-o)%3; 261431647a4SMatthew G. Knepley } 262431647a4SMatthew G. Knepley 26342525629SMatthew G. Knepley 264e3f8b1d6SMatthew G. Knepley /* Return quad edge for orientation o, if it is r for o == 0 */ 265e3f8b1d6SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadEdge_Static(PetscInt o, PetscInt r) { 266e3f8b1d6SMatthew G. Knepley return (o < 0 ? 3-(o+r) : o+r)%4; 267e3f8b1d6SMatthew G. Knepley } 268d6d937efSMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadEdgeInverse_Static(PetscInt o, PetscInt s) { 269d6d937efSMatthew G. Knepley return (o < 0 ? 3-(o+s) : 4+s-o)%4; 270d6d937efSMatthew G. Knepley } 271e3f8b1d6SMatthew G. Knepley 272e3f8b1d6SMatthew G. Knepley /* Return quad subface for orientation o, if it is r for o == 0 */ 273e3f8b1d6SMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadSubface_Static(PetscInt o, PetscInt r) { 2744bae88c7SMatthew G. Knepley return (o < 0 ? 4-(o+r) : o+r)%4; 27542525629SMatthew G. Knepley } 276d6d937efSMatthew G. Knepley PETSC_STATIC_INLINE PetscInt GetQuadSubfaceInverse_Static(PetscInt o, PetscInt s) { 277d6d937efSMatthew G. Knepley return (o < 0 ? 4-(o+s) : 4+s-o)%4; 278d6d937efSMatthew G. Knepley } 27942525629SMatthew G. Knepley 28075d3a19aSMatthew G. Knepley #undef __FUNCT__ 28175d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetConeSizes" 28286150812SJed Brown static PetscErrorCode CellRefinerSetConeSizes(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 28375d3a19aSMatthew G. Knepley { 284b5da9499SMatthew 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; 28575d3a19aSMatthew G. Knepley PetscErrorCode ierr; 28675d3a19aSMatthew G. Knepley 28775d3a19aSMatthew G. Knepley PetscFunctionBegin; 2882a5d0125SJed Brown if (!refiner) PetscFunctionReturn(0); 28975d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 29075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 29175d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 29275d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 29375d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 29475d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 2952a5d0125SJed Brown ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr); 29675d3a19aSMatthew G. Knepley switch (refiner) { 29775d3a19aSMatthew G. Knepley case 1: 29875d3a19aSMatthew G. Knepley /* Simplicial 2D */ 29975d3a19aSMatthew G. Knepley /* All cells have 3 faces */ 30075d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 30175d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 30275d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4 + r; 30375d3a19aSMatthew G. Knepley 30475d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 30575d3a19aSMatthew G. Knepley } 30675d3a19aSMatthew G. Knepley } 30775d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 30875d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 30975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 31075d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 31175d3a19aSMatthew G. Knepley PetscInt size; 31275d3a19aSMatthew G. Knepley 31375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 31475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 31575d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 31675d3a19aSMatthew G. Knepley } 31775d3a19aSMatthew G. Knepley } 31875d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 31975d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 32075d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 32175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + r; 32275d3a19aSMatthew G. Knepley 32375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 32475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 32575d3a19aSMatthew G. Knepley } 32675d3a19aSMatthew G. Knepley } 32775d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 32875d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 32975d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 33075d3a19aSMatthew G. Knepley PetscInt size; 33175d3a19aSMatthew G. Knepley 33275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 33375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 33475d3a19aSMatthew G. Knepley } 33575d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells*2 supports */ 33675d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 33775d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 33875d3a19aSMatthew G. Knepley PetscInt size; 33975d3a19aSMatthew G. Knepley 34075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 34175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size*2);CHKERRQ(ierr); 34275d3a19aSMatthew G. Knepley } 34375d3a19aSMatthew G. Knepley break; 34475d3a19aSMatthew G. Knepley case 2: 34575d3a19aSMatthew G. Knepley /* Hex 2D */ 34675d3a19aSMatthew G. Knepley /* All cells have 4 faces */ 34775d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 34875d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 349149f48fdSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4 + r; 35075d3a19aSMatthew G. Knepley 35175d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 35275d3a19aSMatthew G. Knepley } 35375d3a19aSMatthew G. Knepley } 35475d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 35575d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 35675d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 35775d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 35875d3a19aSMatthew G. Knepley PetscInt size; 35975d3a19aSMatthew G. Knepley 36075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 36175d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 36275d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 36375d3a19aSMatthew G. Knepley } 36475d3a19aSMatthew G. Knepley } 36575d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 36675d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 36775d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 36875d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 36975d3a19aSMatthew G. Knepley 37075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 37175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 37275d3a19aSMatthew G. Knepley } 37375d3a19aSMatthew G. Knepley } 37475d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 37575d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 37675d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 37775d3a19aSMatthew G. Knepley PetscInt size; 37875d3a19aSMatthew G. Knepley 37975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 38075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 38175d3a19aSMatthew G. Knepley } 38275d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells supports */ 38375d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 38475d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 38575d3a19aSMatthew G. Knepley PetscInt size; 38675d3a19aSMatthew G. Knepley 38775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 38875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 38975d3a19aSMatthew G. Knepley } 39075d3a19aSMatthew G. Knepley /* Cell vertices have 4 supports */ 39175d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 39275d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 39375d3a19aSMatthew G. Knepley 39475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 39575d3a19aSMatthew G. Knepley } 39675d3a19aSMatthew G. Knepley break; 39775d3a19aSMatthew G. Knepley case 3: 398d963de37SMatthew G. Knepley /* Hybrid Simplicial 2D */ 39975d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 40075d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 40175d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 40275d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 40375d3a19aSMatthew G. Knepley ierr = DMPlexSetHybridBounds(rdm, cStartNew + (cMax - cStart)*4, fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3, PETSC_DETERMINE, PETSC_DETERMINE);CHKERRQ(ierr); 40475d3a19aSMatthew G. Knepley /* Interior cells have 3 faces */ 40575d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 40675d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 40775d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4 + r; 40875d3a19aSMatthew G. Knepley 40975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 41075d3a19aSMatthew G. Knepley } 41175d3a19aSMatthew G. Knepley } 41275d3a19aSMatthew G. Knepley /* Hybrid cells have 4 faces */ 41375d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 41475d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 41575d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2 + r; 41675d3a19aSMatthew G. Knepley 41775d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 41875d3a19aSMatthew G. Knepley } 41975d3a19aSMatthew G. Knepley } 42075d3a19aSMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 42175d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 42275d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 42375d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 42475d3a19aSMatthew G. Knepley PetscInt size; 42575d3a19aSMatthew G. Knepley 42675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 42775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 42875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 42975d3a19aSMatthew G. Knepley } 43075d3a19aSMatthew G. Knepley } 43175d3a19aSMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 43275d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 43375d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 43475d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + r; 43575d3a19aSMatthew G. Knepley 43675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 43775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 43875d3a19aSMatthew G. Knepley } 43975d3a19aSMatthew G. Knepley } 44075d3a19aSMatthew G. Knepley /* Hybrid faces have 2 vertices and the same cells */ 44175d3a19aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 44275d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (f - fMax); 44375d3a19aSMatthew G. Knepley PetscInt size; 44475d3a19aSMatthew G. Knepley 44575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 44675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 44775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 44875d3a19aSMatthew G. Knepley } 44975d3a19aSMatthew G. Knepley /* Hybrid cell faces have 2 vertices and 2 cells */ 45075d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 45175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 45275d3a19aSMatthew G. Knepley 45375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 45475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 45575d3a19aSMatthew G. Knepley } 45675d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 45775d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 45875d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 45975d3a19aSMatthew G. Knepley PetscInt size; 46075d3a19aSMatthew G. Knepley 46175d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 46275d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 46375d3a19aSMatthew G. Knepley } 46475d3a19aSMatthew G. Knepley /* Face vertices have 2 + (2 interior, 1 hybrid) supports */ 46575d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 46675d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 46775d3a19aSMatthew G. Knepley const PetscInt *support; 46875d3a19aSMatthew G. Knepley PetscInt size, newSize = 2, s; 46975d3a19aSMatthew G. Knepley 47075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 47175d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 47275d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 47375d3a19aSMatthew G. Knepley if (support[s] >= cMax) newSize += 1; 47475d3a19aSMatthew G. Knepley else newSize += 2; 47575d3a19aSMatthew G. Knepley } 47675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, newSize);CHKERRQ(ierr); 47775d3a19aSMatthew G. Knepley } 47875d3a19aSMatthew G. Knepley break; 479a97b51b8SMatthew G. Knepley case 4: 480a97b51b8SMatthew G. Knepley /* Hybrid Hex 2D */ 481a97b51b8SMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 482a97b51b8SMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 483a97b51b8SMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 484a97b51b8SMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 485a97b51b8SMatthew G. Knepley ierr = DMPlexSetHybridBounds(rdm, cStartNew + (cMax - cStart)*4, fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4, PETSC_DETERMINE, PETSC_DETERMINE);CHKERRQ(ierr); 486a97b51b8SMatthew G. Knepley /* Interior cells have 4 faces */ 487a97b51b8SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 488a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r) { 489a97b51b8SMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4 + r; 490a97b51b8SMatthew G. Knepley 491a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 492a97b51b8SMatthew G. Knepley } 493a97b51b8SMatthew G. Knepley } 494a97b51b8SMatthew G. Knepley /* Hybrid cells have 4 faces */ 495a97b51b8SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 496a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r) { 497a97b51b8SMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2 + r; 498a97b51b8SMatthew G. Knepley 499a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 500a97b51b8SMatthew G. Knepley } 501a97b51b8SMatthew G. Knepley } 502a97b51b8SMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 503a97b51b8SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 504a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r) { 505a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 506a97b51b8SMatthew G. Knepley PetscInt size; 507a97b51b8SMatthew G. Knepley 508a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 509a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 510a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 511a97b51b8SMatthew G. Knepley } 512a97b51b8SMatthew G. Knepley } 513a97b51b8SMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 514a97b51b8SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 515a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r) { 516a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + r; 517a97b51b8SMatthew G. Knepley 518a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 519a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 520a97b51b8SMatthew G. Knepley } 521a97b51b8SMatthew G. Knepley } 522a97b51b8SMatthew G. Knepley /* Hybrid faces have 2 vertices and the same cells */ 523a97b51b8SMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 524a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (f - fMax); 525a97b51b8SMatthew G. Knepley PetscInt size; 526a97b51b8SMatthew G. Knepley 527a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 528a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 529a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 530a97b51b8SMatthew G. Knepley } 531a97b51b8SMatthew G. Knepley /* Hybrid cell faces have 2 vertices and 2 cells */ 532a97b51b8SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 533a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (fEnd - fMax) + (c - cMax); 534a97b51b8SMatthew G. Knepley 535a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 536a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 537a97b51b8SMatthew G. Knepley } 538a97b51b8SMatthew G. Knepley /* Old vertices have identical supports */ 539a97b51b8SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 540a97b51b8SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 541a97b51b8SMatthew G. Knepley PetscInt size; 542a97b51b8SMatthew G. Knepley 543a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 544a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 545a97b51b8SMatthew G. Knepley } 546a97b51b8SMatthew G. Knepley /* Face vertices have 2 + cells supports */ 547a97b51b8SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 548a97b51b8SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 549a97b51b8SMatthew G. Knepley PetscInt size; 550a97b51b8SMatthew G. Knepley 551a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 552a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 553a97b51b8SMatthew G. Knepley } 554a97b51b8SMatthew G. Knepley /* Cell vertices have 4 supports */ 555a97b51b8SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 556a97b51b8SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fMax - fStart) + (c - cStart); 557a97b51b8SMatthew G. Knepley 558a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 559a97b51b8SMatthew G. Knepley } 560a97b51b8SMatthew G. Knepley break; 561b5da9499SMatthew G. Knepley case 5: 562b5da9499SMatthew G. Knepley /* Simplicial 3D */ 563b5da9499SMatthew G. Knepley /* All cells have 4 faces */ 564b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 565b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 566dae4404aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8 + r; 567b5da9499SMatthew G. Knepley 568b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 569b5da9499SMatthew G. Knepley } 570b5da9499SMatthew G. Knepley } 571b5da9499SMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 572b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 573b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 574b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 575b5da9499SMatthew G. Knepley PetscInt size; 576b5da9499SMatthew G. Knepley 577b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 578b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 579b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 580b5da9499SMatthew G. Knepley } 581b5da9499SMatthew G. Knepley } 5829ddff745SMatthew G. Knepley /* Interior cell faces have 3 edges and 2 cells */ 583b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 584b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 585b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + r; 586b5da9499SMatthew G. Knepley 587b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 588b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 589b5da9499SMatthew G. Knepley } 590b5da9499SMatthew G. Knepley } 591b5da9499SMatthew G. Knepley /* Split edges have 2 vertices and the same faces */ 592b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 593b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 594b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 595b5da9499SMatthew G. Knepley PetscInt size; 596b5da9499SMatthew G. Knepley 597b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 598b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 599b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 600b5da9499SMatthew G. Knepley } 601b5da9499SMatthew G. Knepley } 602b5da9499SMatthew G. Knepley /* Face edges have 2 vertices and 2+cells*(1/2) faces */ 603b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 604b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 605b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + r; 606b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support, eint[4] = {1, 0, 2, 0}; 607b5da9499SMatthew G. Knepley PetscInt coneSize, c, supportSize, s, er, intFaces = 0; 608b5da9499SMatthew G. Knepley 609b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 610b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 611b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 612b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 613b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 614b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 615b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 616b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 61786f0afeeSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 6189ddff745SMatthew G. Knepley er = GetTetSomethingInverse_Static(ornt[c], r); 619b5da9499SMatthew G. Knepley if (er == eint[c]) { 620b5da9499SMatthew G. Knepley intFaces += 1; 621b5da9499SMatthew G. Knepley } else { 622b5da9499SMatthew G. Knepley intFaces += 2; 623b5da9499SMatthew G. Knepley } 624b5da9499SMatthew G. Knepley } 625b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+intFaces);CHKERRQ(ierr); 626b5da9499SMatthew G. Knepley } 627b5da9499SMatthew G. Knepley } 6289ddff745SMatthew G. Knepley /* Interior cell edges have 2 vertices and 4 faces */ 629b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 630b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 631b5da9499SMatthew G. Knepley 632b5da9499SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 633b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 634b5da9499SMatthew G. Knepley } 635b5da9499SMatthew G. Knepley /* Old vertices have identical supports */ 636b5da9499SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 637b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 638b5da9499SMatthew G. Knepley PetscInt size; 639b5da9499SMatthew G. Knepley 640b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 641b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 642b5da9499SMatthew G. Knepley } 643b5da9499SMatthew G. Knepley /* Edge vertices have 2 + faces*2 + cells*0/1 supports */ 644b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 645b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 646b5da9499SMatthew G. Knepley PetscInt size, *star = NULL, starSize, s, cellSize = 0; 647b5da9499SMatthew G. Knepley 648b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 649b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 650b5da9499SMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 651b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 652b5da9499SMatthew G. Knepley PetscInt e01, e23; 653b5da9499SMatthew G. Knepley 654b5da9499SMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cEnd)) { 655b5da9499SMatthew G. Knepley /* Check edge 0-1 */ 656b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 657b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 658b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 65942525629SMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 660b5da9499SMatthew G. Knepley /* Check edge 2-3 */ 661b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 662b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 66342525629SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 66442525629SMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 665b5da9499SMatthew G. Knepley if ((e01 == e) || (e23 == e)) ++cellSize; 666b5da9499SMatthew G. Knepley } 667b5da9499SMatthew G. Knepley } 668b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 669b5da9499SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size*2 + cellSize);CHKERRQ(ierr); 670b5da9499SMatthew G. Knepley } 671b5da9499SMatthew G. Knepley break; 672dae4404aSMatthew G. Knepley case 7: 6736ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 6746ce3c06aSMatthew G. Knepley ierr = DMPlexSetHybridBounds(rdm, cStartNew + 8*(cMax-cStart), fStartNew + 4*(fMax - fStart) + 8*(cMax - cStart), 6756ce3c06aSMatthew G. Knepley eStartNew + 2*(eMax - eStart) + 3*(fMax - fStart) + (cMax - cStart), PETSC_DETERMINE);CHKERRQ(ierr); 676dae4404aSMatthew G. Knepley /* Interior cells have 4 faces */ 677dae4404aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 678dae4404aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 679dae4404aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8 + r; 680dae4404aSMatthew G. Knepley 681dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 682dae4404aSMatthew G. Knepley } 683dae4404aSMatthew G. Knepley } 684dae4404aSMatthew G. Knepley /* Hybrid cells have 5 faces */ 685dae4404aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 686dae4404aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 687dae4404aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + r; 688dae4404aSMatthew G. Knepley 689dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 5);CHKERRQ(ierr); 690dae4404aSMatthew G. Knepley } 691dae4404aSMatthew G. Knepley } 6926ce3c06aSMatthew G. Knepley /* Interior split faces have 3 edges and the same cells as the parent */ 693dae4404aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 694dae4404aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 695dae4404aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 696dae4404aSMatthew G. Knepley PetscInt size; 697dae4404aSMatthew G. Knepley 698dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 699dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 700dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 701dae4404aSMatthew G. Knepley } 702dae4404aSMatthew G. Knepley } 703dae4404aSMatthew G. Knepley /* Interior cell faces have 3 edges and 2 cells */ 704dae4404aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 705dae4404aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 706dae4404aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + r; 707dae4404aSMatthew G. Knepley 708dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 3);CHKERRQ(ierr); 709dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 710dae4404aSMatthew G. Knepley } 711dae4404aSMatthew G. Knepley } 7126ce3c06aSMatthew G. Knepley /* Hybrid split faces have 4 edges and the same cells as the parent */ 7136ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 7146ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 7156ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + r; 7166ce3c06aSMatthew G. Knepley PetscInt size; 7176ce3c06aSMatthew G. Knepley 7186ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 7196ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 7206ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 7216ce3c06aSMatthew G. Knepley } 7226ce3c06aSMatthew G. Knepley } 7236ce3c06aSMatthew G. Knepley /* Hybrid cells faces have 4 edges and 2 cells */ 7246ce3c06aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 7256ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 7266ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + r; 7276ce3c06aSMatthew G. Knepley 7286ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 7296ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 7306ce3c06aSMatthew G. Knepley } 7316ce3c06aSMatthew G. Knepley } 7326ce3c06aSMatthew G. Knepley /* Interior split edges have 2 vertices and the same faces */ 733dae4404aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 734dae4404aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 735dae4404aSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 736dae4404aSMatthew G. Knepley PetscInt size; 737dae4404aSMatthew G. Knepley 738dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 739dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 740dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 741dae4404aSMatthew G. Knepley } 742dae4404aSMatthew G. Knepley } 7436ce3c06aSMatthew G. Knepley /* Interior face edges have 2 vertices and 2+cells*(1/2) faces */ 744dae4404aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 745dae4404aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 746dae4404aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + r; 747dae4404aSMatthew G. Knepley const PetscInt *cone, *ornt, *support, eint[4] = {1, 0, 2, 0}; 748dae4404aSMatthew G. Knepley PetscInt coneSize, c, supportSize, s, er, intFaces = 0; 749dae4404aSMatthew G. Knepley 750dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 751dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 752dae4404aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 753dae4404aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 754dae4404aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 755dae4404aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 756dae4404aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 757dae4404aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 7586ce3c06aSMatthew G. Knepley if (support[s] < cMax) { 759dae4404aSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 7609ddff745SMatthew G. Knepley er = GetTetSomethingInverse_Static(ornt[c], r); 761dae4404aSMatthew G. Knepley if (er == eint[c]) { 762dae4404aSMatthew G. Knepley intFaces += 1; 763dae4404aSMatthew G. Knepley } else { 764dae4404aSMatthew G. Knepley intFaces += 2; 765dae4404aSMatthew G. Knepley } 7666ce3c06aSMatthew G. Knepley } else { 7676ce3c06aSMatthew G. Knepley intFaces += 1; 7686ce3c06aSMatthew G. Knepley } 769dae4404aSMatthew G. Knepley } 770dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+intFaces);CHKERRQ(ierr); 771dae4404aSMatthew G. Knepley } 772dae4404aSMatthew G. Knepley } 7736ce3c06aSMatthew G. Knepley /* Interior cell edges have 2 vertices and 4 faces */ 774dae4404aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 775dae4404aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 776dae4404aSMatthew G. Knepley 777dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 778dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 779dae4404aSMatthew G. Knepley } 7806ce3c06aSMatthew G. Knepley /* Hybrid edges have 2 vertices and the same faces */ 781dae4404aSMatthew G. Knepley for (e = eMax; e < eEnd; ++e) { 7826ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (e - eMax); 7836ce3c06aSMatthew G. Knepley PetscInt size; 7846ce3c06aSMatthew G. Knepley 7856ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 7866ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 7876ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 7886ce3c06aSMatthew G. Knepley } 7896ce3c06aSMatthew G. Knepley /* Hybrid face edges have 2 vertices and 2+2*cells faces */ 7906ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 7916ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (f - fMax); 792dae4404aSMatthew G. Knepley PetscInt size; 793dae4404aSMatthew G. Knepley 794dae4404aSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 795dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 7966ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+2*size);CHKERRQ(ierr); 797dae4404aSMatthew G. Knepley } 7986ce3c06aSMatthew G. Knepley /* Interior vertices have identical supports */ 799dae4404aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 800dae4404aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 801dae4404aSMatthew G. Knepley PetscInt size; 802dae4404aSMatthew G. Knepley 803dae4404aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 804dae4404aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 805dae4404aSMatthew G. Knepley } 8066ce3c06aSMatthew G. Knepley /* Interior edge vertices have 2 + interior face*2 + hybrid face + cells*0/1 supports */ 8076ce3c06aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 8086ce3c06aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 809dae4404aSMatthew G. Knepley const PetscInt *support; 8106ce3c06aSMatthew G. Knepley PetscInt size, *star = NULL, starSize, s, faceSize = 0, cellSize = 0; 811dae4404aSMatthew G. Knepley 8126ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 8136ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 814dae4404aSMatthew G. Knepley for (s = 0; s < size; ++s) { 8156ce3c06aSMatthew G. Knepley if (support[s] < fMax) faceSize += 2; 8166ce3c06aSMatthew G. Knepley else faceSize += 1; 817dae4404aSMatthew G. Knepley } 8186ce3c06aSMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 8196ce3c06aSMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 8206ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 8216ce3c06aSMatthew G. Knepley PetscInt e01, e23; 8226ce3c06aSMatthew G. Knepley 8236ce3c06aSMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cMax)) { 8246ce3c06aSMatthew G. Knepley /* Check edge 0-1 */ 8256ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 8266ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 8276ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 8286ce3c06aSMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 8296ce3c06aSMatthew G. Knepley /* Check edge 2-3 */ 8306ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 8316ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 8326ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 8336ce3c06aSMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 8346ce3c06aSMatthew G. Knepley if ((e01 == e) || (e23 == e)) ++cellSize; 8356ce3c06aSMatthew G. Knepley } 8366ce3c06aSMatthew G. Knepley } 8376ce3c06aSMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 8386ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + faceSize + cellSize);CHKERRQ(ierr); 839dae4404aSMatthew G. Knepley } 840dae4404aSMatthew G. Knepley break; 8412eabf88fSMatthew G. Knepley case 6: 8422eabf88fSMatthew G. Knepley /* Hex 3D */ 8432eabf88fSMatthew G. Knepley /* All cells have 6 faces */ 8442eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 8452eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r) { 8462eabf88fSMatthew G. Knepley const PetscInt newp = (c - cStart)*8 + r; 8472eabf88fSMatthew G. Knepley 8482eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 6);CHKERRQ(ierr); 8492eabf88fSMatthew G. Knepley } 8502eabf88fSMatthew G. Knepley } 8512eabf88fSMatthew G. Knepley /* Split faces have 4 edges and the same cells as the parent */ 8522eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 8532eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 8542eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 8552eabf88fSMatthew G. Knepley PetscInt size; 8562eabf88fSMatthew G. Knepley 8572eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 8582eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 8592eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 8602eabf88fSMatthew G. Knepley } 8612eabf88fSMatthew G. Knepley } 8622eabf88fSMatthew G. Knepley /* Interior faces have 4 edges and 2 cells */ 8632eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 8642eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r) { 8652eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + r; 8662eabf88fSMatthew G. Knepley 8672eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 8682eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 8692eabf88fSMatthew G. Knepley } 8702eabf88fSMatthew G. Knepley } 8712eabf88fSMatthew G. Knepley /* Split edges have 2 vertices and the same faces as the parent */ 8722eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 8732eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 8742eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 8752eabf88fSMatthew G. Knepley PetscInt size; 8762eabf88fSMatthew G. Knepley 8772eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 8782eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 8792eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 8802eabf88fSMatthew G. Knepley } 8812eabf88fSMatthew G. Knepley } 8822eabf88fSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells faces */ 8832eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 8842eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 8852eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 8862eabf88fSMatthew G. Knepley PetscInt size; 8872eabf88fSMatthew G. Knepley 8882eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 8892eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 8902eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+size);CHKERRQ(ierr); 8912eabf88fSMatthew G. Knepley } 8922eabf88fSMatthew G. Knepley } 8932eabf88fSMatthew G. Knepley /* Cell edges have 2 vertices and 4 faces */ 8942eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 8952eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 8962eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 8972eabf88fSMatthew G. Knepley 8982eabf88fSMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 8992eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 9002eabf88fSMatthew G. Knepley } 9012eabf88fSMatthew G. Knepley } 9022eabf88fSMatthew G. Knepley /* Old vertices have identical supports */ 9032eabf88fSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 9042eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 9052eabf88fSMatthew G. Knepley PetscInt size; 9062eabf88fSMatthew G. Knepley 9072eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 9082eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 9092eabf88fSMatthew G. Knepley } 9102eabf88fSMatthew G. Knepley /* Edge vertices have 2 + faces supports */ 9112eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 9122eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 9132eabf88fSMatthew G. Knepley PetscInt size; 9142eabf88fSMatthew G. Knepley 9152eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 9162eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 9172eabf88fSMatthew G. Knepley } 9182eabf88fSMatthew G. Knepley /* Face vertices have 4 + cells supports */ 9192eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 9202eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 9212eabf88fSMatthew G. Knepley PetscInt size; 9222eabf88fSMatthew G. Knepley 9232eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 9242eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4 + size);CHKERRQ(ierr); 9252eabf88fSMatthew G. Knepley } 9262eabf88fSMatthew G. Knepley /* Cell vertices have 6 supports */ 9272eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 9282eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 9292eabf88fSMatthew G. Knepley 9302eabf88fSMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 6);CHKERRQ(ierr); 9312eabf88fSMatthew G. Knepley } 9322eabf88fSMatthew G. Knepley break; 93327fcede3SMatthew G. Knepley case 8: 93427fcede3SMatthew G. Knepley /* Hybrid Hex 3D */ 93527fcede3SMatthew G. Knepley ierr = DMPlexSetHybridBounds(rdm, cStartNew + 8*(cMax-cStart), fStartNew + 4*(fMax - fStart) + 12*(cMax - cStart), 93627fcede3SMatthew G. Knepley eStartNew + 2*(eMax - eStart) + 4*(fMax - fStart) + 6*(cMax - cStart), PETSC_DETERMINE);CHKERRQ(ierr); 93727fcede3SMatthew G. Knepley /* Interior cells have 6 faces */ 93827fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 93927fcede3SMatthew G. Knepley for (r = 0; r < 8; ++r) { 94027fcede3SMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8 + r; 94127fcede3SMatthew G. Knepley 94227fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 6);CHKERRQ(ierr); 94327fcede3SMatthew G. Knepley } 94427fcede3SMatthew G. Knepley } 94527fcede3SMatthew G. Knepley /* Hybrid cells have 6 faces */ 94627fcede3SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 94727fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 94827fcede3SMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + r; 94927fcede3SMatthew G. Knepley 95027fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 6);CHKERRQ(ierr); 95127fcede3SMatthew G. Knepley } 95227fcede3SMatthew G. Knepley } 95327fcede3SMatthew G. Knepley /* Interior split faces have 4 edges and the same cells as the parent */ 95427fcede3SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 95527fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 95627fcede3SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 95727fcede3SMatthew G. Knepley PetscInt size; 95827fcede3SMatthew G. Knepley 95927fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 96027fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 96127fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 96227fcede3SMatthew G. Knepley } 96327fcede3SMatthew G. Knepley } 96427fcede3SMatthew G. Knepley /* Interior cell faces have 4 edges and 2 cells */ 96527fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 96627fcede3SMatthew G. Knepley for (r = 0; r < 12; ++r) { 96727fcede3SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + r; 96827fcede3SMatthew G. Knepley 96927fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 97027fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 97127fcede3SMatthew G. Knepley } 97227fcede3SMatthew G. Knepley } 97327fcede3SMatthew G. Knepley /* Hybrid split faces have 4 edges and the same cells as the parent */ 97427fcede3SMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 97527fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r) { 97627fcede3SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (f - fMax)*2 + r; 97727fcede3SMatthew G. Knepley PetscInt size; 97827fcede3SMatthew G. Knepley 97927fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 98027fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 98127fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 98227fcede3SMatthew G. Knepley } 98327fcede3SMatthew G. Knepley } 98427fcede3SMatthew G. Knepley /* Hybrid cells faces have 4 edges and 2 cells */ 98527fcede3SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 98627fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 98727fcede3SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4 + r; 98827fcede3SMatthew G. Knepley 98927fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 4);CHKERRQ(ierr); 99027fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2);CHKERRQ(ierr); 99127fcede3SMatthew G. Knepley } 99227fcede3SMatthew G. Knepley } 99327fcede3SMatthew G. Knepley /* Interior split edges have 2 vertices and the same faces as the parent */ 99427fcede3SMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 99527fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r) { 99627fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 99727fcede3SMatthew G. Knepley PetscInt size; 99827fcede3SMatthew G. Knepley 99927fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 100027fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 100127fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 100227fcede3SMatthew G. Knepley } 100327fcede3SMatthew G. Knepley } 100427fcede3SMatthew G. Knepley /* Interior face edges have 2 vertices and 2+cells faces */ 100527fcede3SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 100627fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 100727fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (f - fStart)*4 + r; 100827fcede3SMatthew G. Knepley PetscInt size; 100927fcede3SMatthew G. Knepley 101027fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 101127fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 101227fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+size);CHKERRQ(ierr); 101327fcede3SMatthew G. Knepley } 101427fcede3SMatthew G. Knepley } 101527fcede3SMatthew G. Knepley /* Interior cell edges have 2 vertices and 4 faces */ 101627fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 101727fcede3SMatthew G. Knepley for (r = 0; r < 6; ++r) { 101827fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + r; 101927fcede3SMatthew G. Knepley 102027fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 102127fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 102227fcede3SMatthew G. Knepley } 102327fcede3SMatthew G. Knepley } 102427fcede3SMatthew G. Knepley /* Hybrid edges have 2 vertices and the same faces */ 102527fcede3SMatthew G. Knepley for (e = eMax; e < eEnd; ++e) { 102627fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (e - eMax); 102727fcede3SMatthew G. Knepley PetscInt size; 102827fcede3SMatthew G. Knepley 102927fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 103027fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 103127fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 103227fcede3SMatthew G. Knepley } 103327fcede3SMatthew G. Knepley /* Hybrid face edges have 2 vertices and 2+cells faces */ 103427fcede3SMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 103527fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (f - fMax); 103627fcede3SMatthew G. Knepley PetscInt size; 103727fcede3SMatthew G. Knepley 103827fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 103927fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 104027fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2+size);CHKERRQ(ierr); 104127fcede3SMatthew G. Knepley } 104227fcede3SMatthew G. Knepley /* Hybrid cell edges have 2 vertices and 4 faces */ 104327fcede3SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 104427fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (fEnd - fMax) + (c - cMax); 104527fcede3SMatthew G. Knepley 104627fcede3SMatthew G. Knepley ierr = DMPlexSetConeSize(rdm, newp, 2);CHKERRQ(ierr); 104727fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4);CHKERRQ(ierr); 104827fcede3SMatthew G. Knepley } 104927fcede3SMatthew G. Knepley /* Interior vertices have identical supports */ 105027fcede3SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 105127fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 105227fcede3SMatthew G. Knepley PetscInt size; 105327fcede3SMatthew G. Knepley 105427fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 105527fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, size);CHKERRQ(ierr); 105627fcede3SMatthew G. Knepley } 105727fcede3SMatthew G. Knepley /* Interior edge vertices have 2 + faces supports */ 105827fcede3SMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 105927fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 106027fcede3SMatthew G. Knepley PetscInt size; 106127fcede3SMatthew G. Knepley 106227fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 106327fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 2 + size);CHKERRQ(ierr); 106427fcede3SMatthew G. Knepley } 106527fcede3SMatthew G. Knepley /* Interior face vertices have 4 + cells supports */ 106627fcede3SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 106727fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eMax - eStart) + (f - fStart); 106827fcede3SMatthew G. Knepley PetscInt size; 106927fcede3SMatthew G. Knepley 107027fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 107127fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 4 + size);CHKERRQ(ierr); 107227fcede3SMatthew G. Knepley } 107327fcede3SMatthew G. Knepley /* Interior cell vertices have 6 supports */ 107427fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 107527fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eMax - eStart) + (fMax - fStart) + (c - cStart); 107627fcede3SMatthew G. Knepley 107727fcede3SMatthew G. Knepley ierr = DMPlexSetSupportSize(rdm, newp, 6);CHKERRQ(ierr); 107827fcede3SMatthew G. Knepley } 107927fcede3SMatthew G. Knepley break; 108075d3a19aSMatthew G. Knepley default: 108175d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 108275d3a19aSMatthew G. Knepley } 108375d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 108475d3a19aSMatthew G. Knepley } 108575d3a19aSMatthew G. Knepley 108675d3a19aSMatthew G. Knepley #undef __FUNCT__ 108775d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetCones" 108886150812SJed Brown static PetscErrorCode CellRefinerSetCones(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 108975d3a19aSMatthew G. Knepley { 1090b5da9499SMatthew G. Knepley const PetscInt *faces, cellInd[4] = {0, 1, 2, 3}; 10916ce3c06aSMatthew G. Knepley PetscInt cStart, cEnd, cMax, vStart, vEnd, vMax, fStart, fEnd, fMax, eStart, eEnd, eMax; 10926ce3c06aSMatthew G. Knepley PetscInt cStartNew, cEndNew, cMaxNew, vStartNew, vEndNew, fStartNew, fEndNew, fMaxNew, eStartNew, eEndNew, eMaxNew; 10936ce3c06aSMatthew G. Knepley PetscInt depth, maxSupportSize, *supportRef, c, f, e, v, r, p; 109475d3a19aSMatthew G. Knepley PetscErrorCode ierr; 109575d3a19aSMatthew G. Knepley 109675d3a19aSMatthew G. Knepley PetscFunctionBegin; 10972a5d0125SJed Brown if (!refiner) PetscFunctionReturn(0); 109875d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 109975d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 110075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 110175d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 110275d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 110375d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 110475d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr); 110575d3a19aSMatthew G. Knepley ierr = GetDepthEnd_Private(depth, depthSize, &cEndNew, &fEndNew, &eEndNew, &vEndNew);CHKERRQ(ierr); 110675d3a19aSMatthew G. Knepley switch (refiner) { 110775d3a19aSMatthew G. Knepley case 1: 110875d3a19aSMatthew G. Knepley /* Simplicial 2D */ 110975d3a19aSMatthew G. Knepley /* 111075d3a19aSMatthew G. Knepley 2 111175d3a19aSMatthew G. Knepley |\ 111275d3a19aSMatthew G. Knepley | \ 111375d3a19aSMatthew G. Knepley | \ 111475d3a19aSMatthew G. Knepley | \ 111575d3a19aSMatthew G. Knepley | C \ 111675d3a19aSMatthew G. Knepley | \ 111775d3a19aSMatthew G. Knepley | \ 111875d3a19aSMatthew G. Knepley 2---1---1 111975d3a19aSMatthew G. Knepley |\ D / \ 112075d3a19aSMatthew G. Knepley | 2 0 \ 112175d3a19aSMatthew G. Knepley |A \ / B \ 112275d3a19aSMatthew G. Knepley 0---0-------1 112375d3a19aSMatthew G. Knepley */ 112475d3a19aSMatthew G. Knepley /* All cells have 3 faces */ 112575d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 112675d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4; 112775d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 112875d3a19aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 112975d3a19aSMatthew G. Knepley 113075d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 113175d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 113275d3a19aSMatthew G. Knepley /* A triangle */ 113375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 113475d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 113575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 2; 113675d3a19aSMatthew G. Knepley orntNew[1] = -2; 113775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 113875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 113975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 114075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 114175d3a19aSMatthew G. Knepley #if 1 114275d3a19aSMatthew 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); 114375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 114475d3a19aSMatthew 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); 114575d3a19aSMatthew G. Knepley } 114675d3a19aSMatthew G. Knepley #endif 114775d3a19aSMatthew G. Knepley /* B triangle */ 114875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 114975d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 115075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 115175d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 115275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 0; 115375d3a19aSMatthew G. Knepley orntNew[2] = -2; 115475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 115575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 115675d3a19aSMatthew G. Knepley #if 1 115775d3a19aSMatthew 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); 115875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 115975d3a19aSMatthew 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); 116075d3a19aSMatthew G. Knepley } 116175d3a19aSMatthew G. Knepley #endif 116275d3a19aSMatthew G. Knepley /* C triangle */ 116375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 1; 116475d3a19aSMatthew G. Knepley orntNew[0] = -2; 116575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 116675d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 116775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 116875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 116975d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 117075d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 117175d3a19aSMatthew G. Knepley #if 1 117275d3a19aSMatthew 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); 117375d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 117475d3a19aSMatthew 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); 117575d3a19aSMatthew G. Knepley } 117675d3a19aSMatthew G. Knepley #endif 117775d3a19aSMatthew G. Knepley /* D triangle */ 117875d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 0; 117975d3a19aSMatthew G. Knepley orntNew[0] = 0; 118075d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 1; 118175d3a19aSMatthew G. Knepley orntNew[1] = 0; 118275d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + 2; 118375d3a19aSMatthew G. Knepley orntNew[2] = 0; 118475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 118575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 118675d3a19aSMatthew G. Knepley #if 1 118775d3a19aSMatthew 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); 118875d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 118975d3a19aSMatthew 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); 119075d3a19aSMatthew G. Knepley } 119175d3a19aSMatthew G. Knepley #endif 119275d3a19aSMatthew G. Knepley } 119375d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 119475d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 1195785e854fSJed Brown ierr = PetscMalloc1((2 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 119675d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 119775d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 119875d3a19aSMatthew G. Knepley 119975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 120075d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 1201297d2bf4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 120275d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 120375d3a19aSMatthew G. Knepley 120475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 120575d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 120675d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 120775d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 120875d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 120975d3a19aSMatthew G. Knepley #if 1 121075d3a19aSMatthew 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); 121175d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 121275d3a19aSMatthew 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); 121375d3a19aSMatthew G. Knepley } 121475d3a19aSMatthew G. Knepley #endif 121575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 121675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 121775d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 121875d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 121975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1220297d2bf4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 122175d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 122275d3a19aSMatthew G. Knepley if (cone[c] == f) break; 122375d3a19aSMatthew G. Knepley } 1224297d2bf4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%3 : (c+r)%3); 122575d3a19aSMatthew G. Knepley } 122675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 122775d3a19aSMatthew G. Knepley #if 1 122875d3a19aSMatthew 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); 122975d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 123075d3a19aSMatthew 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); 123175d3a19aSMatthew G. Knepley } 123275d3a19aSMatthew G. Knepley #endif 123375d3a19aSMatthew G. Knepley } 123475d3a19aSMatthew G. Knepley } 123575d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 123675d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 123775d3a19aSMatthew G. Knepley const PetscInt *cone; 123875d3a19aSMatthew G. Knepley 123975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 124075d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 124175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*3 + r; 124275d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 124375d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 124475d3a19aSMatthew G. Knepley 124575d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 124675d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - fStart); 124775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 124875d3a19aSMatthew G. Knepley #if 1 124975d3a19aSMatthew 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); 125075d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 125175d3a19aSMatthew 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); 125275d3a19aSMatthew G. Knepley } 125375d3a19aSMatthew G. Knepley #endif 125475d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + (r+1)%3; 125575d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + 3; 125675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 125775d3a19aSMatthew G. Knepley #if 1 125875d3a19aSMatthew 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); 125975d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 126075d3a19aSMatthew 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); 126175d3a19aSMatthew G. Knepley } 126275d3a19aSMatthew G. Knepley #endif 126375d3a19aSMatthew G. Knepley } 126475d3a19aSMatthew G. Knepley } 126575d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 126675d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 126775d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 126875d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 126975d3a19aSMatthew G. Knepley PetscInt size, s; 127075d3a19aSMatthew G. Knepley 127175d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 127275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 127375d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 127475d3a19aSMatthew G. Knepley PetscInt r = 0; 127575d3a19aSMatthew G. Knepley 127675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 127775d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 127875d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 127975d3a19aSMatthew G. Knepley } 128075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 128175d3a19aSMatthew G. Knepley #if 1 128275d3a19aSMatthew 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); 128375d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 128475d3a19aSMatthew 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); 128575d3a19aSMatthew G. Knepley } 128675d3a19aSMatthew G. Knepley #endif 128775d3a19aSMatthew G. Knepley } 128875d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells*2 supports */ 128975d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 129075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 129175d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 129275d3a19aSMatthew G. Knepley PetscInt size, s; 129375d3a19aSMatthew G. Knepley 129475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 129575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 129675d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 129775d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 129875d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 129975d3a19aSMatthew G. Knepley PetscInt r = 0; 130075d3a19aSMatthew G. Knepley 130175d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 130275d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 130375d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 130475d3a19aSMatthew G. Knepley supportRef[2+s*2+0] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*3 + (r+2)%3; 130575d3a19aSMatthew G. Knepley supportRef[2+s*2+1] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*3 + r; 130675d3a19aSMatthew G. Knepley } 130775d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 130875d3a19aSMatthew G. Knepley #if 1 130975d3a19aSMatthew 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); 131075d3a19aSMatthew G. Knepley for (p = 0; p < 2+size*2; ++p) { 131175d3a19aSMatthew 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); 131275d3a19aSMatthew G. Knepley } 131375d3a19aSMatthew G. Knepley #endif 131475d3a19aSMatthew G. Knepley } 131575d3a19aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 131675d3a19aSMatthew G. Knepley break; 131775d3a19aSMatthew G. Knepley case 2: 131875d3a19aSMatthew G. Knepley /* Hex 2D */ 131975d3a19aSMatthew G. Knepley /* 132075d3a19aSMatthew G. Knepley 3---------2---------2 132175d3a19aSMatthew G. Knepley | | | 132275d3a19aSMatthew G. Knepley | D 2 C | 132375d3a19aSMatthew G. Knepley | | | 132475d3a19aSMatthew G. Knepley 3----3----0----1----1 132575d3a19aSMatthew G. Knepley | | | 132675d3a19aSMatthew G. Knepley | A 0 B | 132775d3a19aSMatthew G. Knepley | | | 132875d3a19aSMatthew G. Knepley 0---------0---------1 132975d3a19aSMatthew G. Knepley */ 133075d3a19aSMatthew G. Knepley /* All cells have 4 faces */ 133175d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 133275d3a19aSMatthew G. Knepley const PetscInt newp = (c - cStart)*4; 133375d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 133475d3a19aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 133575d3a19aSMatthew G. Knepley 133675d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 133775d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 133875d3a19aSMatthew G. Knepley /* A quad */ 133975d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 134075d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 134175d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 0; 134275d3a19aSMatthew G. Knepley orntNew[1] = 0; 134375d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 3; 134475d3a19aSMatthew G. Knepley orntNew[2] = -2; 134575d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 0 : 1); 134675d3a19aSMatthew G. Knepley orntNew[3] = ornt[3]; 134775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 134875d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 134975d3a19aSMatthew G. Knepley #if 1 135075d3a19aSMatthew 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); 135175d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 135275d3a19aSMatthew 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); 135375d3a19aSMatthew G. Knepley } 135475d3a19aSMatthew G. Knepley #endif 135575d3a19aSMatthew G. Knepley /* B quad */ 135675d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 135775d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 135875d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 135975d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 136075d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 1; 136175d3a19aSMatthew G. Knepley orntNew[2] = 0; 136275d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 0; 136375d3a19aSMatthew G. Knepley orntNew[3] = -2; 136475d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 136575d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 136675d3a19aSMatthew G. Knepley #if 1 136775d3a19aSMatthew 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); 136875d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 136975d3a19aSMatthew 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); 137075d3a19aSMatthew G. Knepley } 137175d3a19aSMatthew G. Knepley #endif 137275d3a19aSMatthew G. Knepley /* C quad */ 137375d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 1; 137475d3a19aSMatthew G. Knepley orntNew[0] = -2; 137575d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 137675d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 137775d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 137875d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 137975d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 2; 138075d3a19aSMatthew G. Knepley orntNew[3] = 0; 138175d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 138275d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 138375d3a19aSMatthew G. Knepley #if 1 138475d3a19aSMatthew 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); 138575d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 138675d3a19aSMatthew 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); 138775d3a19aSMatthew G. Knepley } 138875d3a19aSMatthew G. Knepley #endif 138975d3a19aSMatthew G. Knepley /* D quad */ 139075d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 3; 139175d3a19aSMatthew G. Knepley orntNew[0] = 0; 139275d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + 2; 139375d3a19aSMatthew G. Knepley orntNew[1] = -2; 139475d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 139575d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 139675d3a19aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 1 : 0); 139775d3a19aSMatthew G. Knepley orntNew[3] = ornt[3]; 139875d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 139975d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 140075d3a19aSMatthew G. Knepley #if 1 140175d3a19aSMatthew 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); 140275d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 140375d3a19aSMatthew 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); 140475d3a19aSMatthew G. Knepley } 140575d3a19aSMatthew G. Knepley #endif 140675d3a19aSMatthew G. Knepley } 140775d3a19aSMatthew G. Knepley /* Split faces have 2 vertices and the same cells as the parent */ 140875d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 1409785e854fSJed Brown ierr = PetscMalloc1((2 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 141075d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 141175d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 141275d3a19aSMatthew G. Knepley 141375d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 141475d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 1415455d6cd4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 141675d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 141775d3a19aSMatthew G. Knepley 141875d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 141975d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 142075d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 142175d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 142275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 142375d3a19aSMatthew G. Knepley #if 1 142475d3a19aSMatthew 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); 142575d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 142675d3a19aSMatthew 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); 142775d3a19aSMatthew G. Knepley } 142875d3a19aSMatthew G. Knepley #endif 142975d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 143075d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 143175d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 143275d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 143375d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1434455d6cd4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 143575d3a19aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 143675d3a19aSMatthew G. Knepley if (cone[c] == f) break; 143775d3a19aSMatthew G. Knepley } 1438455d6cd4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%4 : (c+r)%4); 143975d3a19aSMatthew G. Knepley } 144075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 144175d3a19aSMatthew G. Knepley #if 1 144275d3a19aSMatthew 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); 144375d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 144475d3a19aSMatthew 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); 144575d3a19aSMatthew G. Knepley } 144675d3a19aSMatthew G. Knepley #endif 144775d3a19aSMatthew G. Knepley } 144875d3a19aSMatthew G. Knepley } 144975d3a19aSMatthew G. Knepley /* Interior faces have 2 vertices and 2 cells */ 145075d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 145175d3a19aSMatthew G. Knepley const PetscInt *cone; 145275d3a19aSMatthew G. Knepley PetscInt coneNew[2], supportNew[2]; 145375d3a19aSMatthew G. Knepley 145475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 145575d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 145675d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 145775d3a19aSMatthew G. Knepley 145875d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 145975d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 146075d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 146175d3a19aSMatthew G. Knepley #if 1 146275d3a19aSMatthew 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); 146375d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 146475d3a19aSMatthew 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); 146575d3a19aSMatthew G. Knepley } 146675d3a19aSMatthew G. Knepley #endif 146775d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + r; 146875d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + (r+1)%4; 146975d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 147075d3a19aSMatthew G. Knepley #if 1 147175d3a19aSMatthew 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); 147275d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 147375d3a19aSMatthew 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); 147475d3a19aSMatthew G. Knepley } 147575d3a19aSMatthew G. Knepley #endif 147675d3a19aSMatthew G. Knepley } 147775d3a19aSMatthew G. Knepley } 147875d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 147975d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 148075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 148175d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 148275d3a19aSMatthew G. Knepley PetscInt size, s; 148375d3a19aSMatthew G. Knepley 148475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 148575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 148675d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 148775d3a19aSMatthew G. Knepley PetscInt r = 0; 148875d3a19aSMatthew G. Knepley 148975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 149075d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 149175d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 149275d3a19aSMatthew G. Knepley } 149375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 149475d3a19aSMatthew G. Knepley #if 1 149575d3a19aSMatthew 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); 149675d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 149775d3a19aSMatthew 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); 149875d3a19aSMatthew G. Knepley } 149975d3a19aSMatthew G. Knepley #endif 150075d3a19aSMatthew G. Knepley } 150175d3a19aSMatthew G. Knepley /* Face vertices have 2 + cells supports */ 150275d3a19aSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 150375d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 150475d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 150575d3a19aSMatthew G. Knepley PetscInt size, s; 150675d3a19aSMatthew G. Knepley 150775d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 150875d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 150975d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 151075d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 151175d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 151275d3a19aSMatthew G. Knepley PetscInt r = 0; 151375d3a19aSMatthew G. Knepley 151475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 151575d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 151675d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 151775d3a19aSMatthew G. Knepley else if (cone[3] == f) r = 3; 151875d3a19aSMatthew G. Knepley supportRef[2+s] = fStartNew + (fEnd - fStart)*2 + (support[s] - cStart)*4 + r; 151975d3a19aSMatthew G. Knepley } 152075d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 152175d3a19aSMatthew G. Knepley #if 1 152275d3a19aSMatthew 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); 152375d3a19aSMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 152475d3a19aSMatthew 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); 152575d3a19aSMatthew G. Knepley } 152675d3a19aSMatthew G. Knepley #endif 152775d3a19aSMatthew G. Knepley } 152875d3a19aSMatthew G. Knepley /* Cell vertices have 4 supports */ 152975d3a19aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 153075d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (c - cStart); 153175d3a19aSMatthew G. Knepley PetscInt supportNew[4]; 153275d3a19aSMatthew G. Knepley 153375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 153475d3a19aSMatthew G. Knepley supportNew[r] = fStartNew + (fEnd - fStart)*2 + (c - cStart)*4 + r; 153575d3a19aSMatthew G. Knepley } 153675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 153775d3a19aSMatthew G. Knepley } 1538da00770fSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 153975d3a19aSMatthew G. Knepley break; 154075d3a19aSMatthew G. Knepley case 3: 1541149f48fdSMatthew G. Knepley /* Hybrid Simplicial 2D */ 154275d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 154375d3a19aSMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 154475d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 154575d3a19aSMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 1546149f48fdSMatthew G. Knepley ierr = DMPlexGetHybridBounds(rdm, &cMaxNew, &fMaxNew, NULL, NULL);CHKERRQ(ierr); 154775d3a19aSMatthew G. Knepley /* Interior cells have 3 faces */ 154875d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 154975d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4; 155075d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 155175d3a19aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 155275d3a19aSMatthew G. Knepley 155375d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 155475d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 155575d3a19aSMatthew G. Knepley /* A triangle */ 155675d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 155775d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 155875d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 2; 155975d3a19aSMatthew G. Knepley orntNew[1] = -2; 156075d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 156175d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 156275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 156375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 156475d3a19aSMatthew G. Knepley #if 1 1565149f48fdSMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+0, cStartNew, cMaxNew); 156675d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 1567149f48fdSMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 156875d3a19aSMatthew G. Knepley } 156975d3a19aSMatthew G. Knepley #endif 157075d3a19aSMatthew G. Knepley /* B triangle */ 157175d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 157275d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 157375d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 157475d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 157575d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 0; 157675d3a19aSMatthew G. Knepley orntNew[2] = -2; 157775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 157875d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 157975d3a19aSMatthew G. Knepley #if 1 1580a97b51b8SMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+1, cStartNew, cMaxNew); 158175d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 1582a97b51b8SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 158375d3a19aSMatthew G. Knepley } 158475d3a19aSMatthew G. Knepley #endif 158575d3a19aSMatthew G. Knepley /* C triangle */ 158675d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 1; 158775d3a19aSMatthew G. Knepley orntNew[0] = -2; 158875d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 158975d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 159075d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 159175d3a19aSMatthew G. Knepley orntNew[2] = ornt[2]; 159275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 159375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 159475d3a19aSMatthew G. Knepley #if 1 1595a97b51b8SMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+2, cStartNew, cMaxNew); 159675d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 1597a97b51b8SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 159875d3a19aSMatthew G. Knepley } 159975d3a19aSMatthew G. Knepley #endif 160075d3a19aSMatthew G. Knepley /* D triangle */ 160175d3a19aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 0; 160275d3a19aSMatthew G. Knepley orntNew[0] = 0; 160375d3a19aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 1; 160475d3a19aSMatthew G. Knepley orntNew[1] = 0; 160575d3a19aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + 2; 160675d3a19aSMatthew G. Knepley orntNew[2] = 0; 160775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 160875d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 160975d3a19aSMatthew G. Knepley #if 1 1610a97b51b8SMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+3, cStartNew, cMaxNew); 161175d3a19aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 1612a97b51b8SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 161375d3a19aSMatthew G. Knepley } 161475d3a19aSMatthew G. Knepley #endif 161575d3a19aSMatthew G. Knepley } 161675d3a19aSMatthew G. Knepley /* 161775d3a19aSMatthew G. Knepley 2----3----3 161875d3a19aSMatthew G. Knepley | | 161975d3a19aSMatthew G. Knepley | B | 162075d3a19aSMatthew G. Knepley | | 162175d3a19aSMatthew G. Knepley 0----4--- 1 162275d3a19aSMatthew G. Knepley | | 162375d3a19aSMatthew G. Knepley | A | 162475d3a19aSMatthew G. Knepley | | 162575d3a19aSMatthew G. Knepley 0----2----1 162675d3a19aSMatthew G. Knepley */ 162775d3a19aSMatthew G. Knepley /* Hybrid cells have 4 faces */ 162875d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 162975d3a19aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2; 163075d3a19aSMatthew G. Knepley const PetscInt *cone, *ornt; 1631ea00e70eSMatthew G. Knepley PetscInt coneNew[4], orntNew[4], r; 163275d3a19aSMatthew G. Knepley 163375d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 163475d3a19aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1635ea00e70eSMatthew G. Knepley r = (ornt[0] < 0 ? 1 : 0); 163675d3a19aSMatthew G. Knepley /* A quad */ 1637ea00e70eSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + r; 163875d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 1639ea00e70eSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + r; 164075d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 1641ea00e70eSMatthew G. Knepley coneNew[2+r] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (cone[2+r] - fMax); 1642ea00e70eSMatthew G. Knepley orntNew[2+r] = 0; 1643ea00e70eSMatthew G. Knepley coneNew[3-r] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 1644ea00e70eSMatthew G. Knepley orntNew[3-r] = 0; 164575d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 164675d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 164775d3a19aSMatthew G. Knepley #if 1 164875d3a19aSMatthew 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); 164975d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 165075d3a19aSMatthew 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); 165175d3a19aSMatthew G. Knepley } 165275d3a19aSMatthew G. Knepley #endif 165375d3a19aSMatthew G. Knepley /* B quad */ 1654ea00e70eSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + 1-r; 165575d3a19aSMatthew G. Knepley orntNew[0] = ornt[0]; 1656ea00e70eSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + 1-r; 165775d3a19aSMatthew G. Knepley orntNew[1] = ornt[1]; 1658ea00e70eSMatthew G. Knepley coneNew[2+r] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 1659ea00e70eSMatthew G. Knepley orntNew[2+r] = 0; 1660ea00e70eSMatthew G. Knepley coneNew[3-r] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (cone[3-r] - fMax); 1661ea00e70eSMatthew G. Knepley orntNew[3-r] = 0; 166275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 166375d3a19aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 166475d3a19aSMatthew G. Knepley #if 1 166575d3a19aSMatthew 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); 166675d3a19aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 166775d3a19aSMatthew 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); 166875d3a19aSMatthew G. Knepley } 166975d3a19aSMatthew G. Knepley #endif 167075d3a19aSMatthew G. Knepley } 167175d3a19aSMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 167275d3a19aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 1673785e854fSJed Brown ierr = PetscMalloc1((2 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 167475d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 167575d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 167675d3a19aSMatthew G. Knepley 167775d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 167875d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 1679297d2bf4SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 168075d3a19aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 168175d3a19aSMatthew G. Knepley 168275d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 168375d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 168475d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 168575d3a19aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 168675d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 168775d3a19aSMatthew G. Knepley #if 1 168875d3a19aSMatthew 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); 168975d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 169075d3a19aSMatthew 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); 169175d3a19aSMatthew G. Knepley } 169275d3a19aSMatthew G. Knepley #endif 169375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 169475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 169575d3a19aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 169675d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 169775d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1698297d2bf4SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 1699ea00e70eSMatthew G. Knepley for (c = 0; c < coneSize; ++c) if (cone[c] == f) break; 1700ea00e70eSMatthew G. Knepley if (support[s] >= cMax) { 1701ea00e70eSMatthew G. Knepley supportRef[s] = cStartNew + (cMax - cStart)*4 + (support[s] - cMax)*2 + (ornt[c] < 0 ? 1-r : r); 1702ea00e70eSMatthew G. Knepley } else { 1703297d2bf4SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%3 : (c+r)%3); 170475d3a19aSMatthew G. Knepley } 170575d3a19aSMatthew G. Knepley } 170675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 170775d3a19aSMatthew G. Knepley #if 1 170875d3a19aSMatthew 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); 170975d3a19aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 171075d3a19aSMatthew 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); 171175d3a19aSMatthew G. Knepley } 171275d3a19aSMatthew G. Knepley #endif 171375d3a19aSMatthew G. Knepley } 171475d3a19aSMatthew G. Knepley } 171575d3a19aSMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 171675d3a19aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 171775d3a19aSMatthew G. Knepley const PetscInt *cone; 171875d3a19aSMatthew G. Knepley 171975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 172075d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 172175d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*3 + r; 172275d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 172375d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 172475d3a19aSMatthew G. Knepley 172575d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 172675d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - fStart); 172775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 172875d3a19aSMatthew G. Knepley #if 1 172975d3a19aSMatthew 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); 173075d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 173175d3a19aSMatthew 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); 173275d3a19aSMatthew G. Knepley } 173375d3a19aSMatthew G. Knepley #endif 173475d3a19aSMatthew G. Knepley supportNew[0] = (c - cStart)*4 + (r+1)%3; 173575d3a19aSMatthew G. Knepley supportNew[1] = (c - cStart)*4 + 3; 173675d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 173775d3a19aSMatthew G. Knepley #if 1 173875d3a19aSMatthew 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); 173975d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 174075d3a19aSMatthew 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); 174175d3a19aSMatthew G. Knepley } 174275d3a19aSMatthew G. Knepley #endif 174375d3a19aSMatthew G. Knepley } 174475d3a19aSMatthew G. Knepley } 174575d3a19aSMatthew G. Knepley /* Interior hybrid faces have 2 vertices and the same cells */ 174675d3a19aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 174775d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (f - fMax); 1748ea00e70eSMatthew G. Knepley const PetscInt *cone, *ornt; 174975d3a19aSMatthew G. Knepley const PetscInt *support; 175075d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 175175d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 175275d3a19aSMatthew G. Knepley PetscInt size, s, r; 175375d3a19aSMatthew G. Knepley 175475d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 175575d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 175675d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 175775d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 175875d3a19aSMatthew G. Knepley #if 1 175975d3a19aSMatthew 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); 176075d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 176175d3a19aSMatthew 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); 176275d3a19aSMatthew G. Knepley } 176375d3a19aSMatthew G. Knepley #endif 176475d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 176575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 176675d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 176775d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 1768ea00e70eSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 176975d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 177075d3a19aSMatthew G. Knepley if (cone[r+2] == f) break; 177175d3a19aSMatthew G. Knepley } 1772ea00e70eSMatthew G. Knepley supportNew[s] = (cMax - cStart)*4 + (support[s] - cMax)*2 + (ornt[0] < 0 ? 1-r : r); 177375d3a19aSMatthew G. Knepley } 177475d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 177575d3a19aSMatthew G. Knepley #if 1 177675d3a19aSMatthew 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); 177775d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 177875d3a19aSMatthew 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); 177975d3a19aSMatthew G. Knepley } 178075d3a19aSMatthew G. Knepley #endif 178175d3a19aSMatthew G. Knepley } 178275d3a19aSMatthew G. Knepley /* Cell hybrid faces have 2 vertices and 2 cells */ 178375d3a19aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 178475d3a19aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (c - cMax); 178575d3a19aSMatthew G. Knepley const PetscInt *cone; 178675d3a19aSMatthew G. Knepley PetscInt coneNew[2]; 178775d3a19aSMatthew G. Knepley PetscInt supportNew[2]; 178875d3a19aSMatthew G. Knepley 178975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 179075d3a19aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[0] - fStart); 179175d3a19aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[1] - fStart); 179275d3a19aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 179375d3a19aSMatthew G. Knepley #if 1 179475d3a19aSMatthew 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); 179575d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 179675d3a19aSMatthew 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); 179775d3a19aSMatthew G. Knepley } 179875d3a19aSMatthew G. Knepley #endif 179975d3a19aSMatthew G. Knepley supportNew[0] = (cMax - cStart)*4 + (c - cMax)*2 + 0; 180075d3a19aSMatthew G. Knepley supportNew[1] = (cMax - cStart)*4 + (c - cMax)*2 + 1; 180175d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 180275d3a19aSMatthew G. Knepley #if 1 180375d3a19aSMatthew 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); 180475d3a19aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 180575d3a19aSMatthew 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); 180675d3a19aSMatthew G. Knepley } 180775d3a19aSMatthew G. Knepley #endif 180875d3a19aSMatthew G. Knepley } 180975d3a19aSMatthew G. Knepley /* Old vertices have identical supports */ 181075d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 181175d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 181275d3a19aSMatthew G. Knepley const PetscInt *support, *cone; 181375d3a19aSMatthew G. Knepley PetscInt size, s; 181475d3a19aSMatthew G. Knepley 181575d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 181675d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 181775d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 181875d3a19aSMatthew G. Knepley if (support[s] >= fMax) { 181975d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (support[s] - fMax); 182075d3a19aSMatthew G. Knepley } else { 182175d3a19aSMatthew G. Knepley PetscInt r = 0; 182275d3a19aSMatthew G. Knepley 182375d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 182475d3a19aSMatthew G. Knepley if (cone[1] == v) r = 1; 182575d3a19aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 182675d3a19aSMatthew G. Knepley } 182775d3a19aSMatthew G. Knepley } 182875d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 182975d3a19aSMatthew G. Knepley #if 1 183075d3a19aSMatthew 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); 183175d3a19aSMatthew G. Knepley for (p = 0; p < size; ++p) { 183275d3a19aSMatthew 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); 183375d3a19aSMatthew G. Knepley } 183475d3a19aSMatthew G. Knepley #endif 183575d3a19aSMatthew G. Knepley } 183675d3a19aSMatthew G. Knepley /* Face vertices have 2 + (2 interior, 1 hybrid) supports */ 183775d3a19aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 183875d3a19aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 183975d3a19aSMatthew G. Knepley const PetscInt *cone, *support; 184075d3a19aSMatthew G. Knepley PetscInt size, newSize = 2, s; 184175d3a19aSMatthew G. Knepley 184275d3a19aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 184375d3a19aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 184475d3a19aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 184575d3a19aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 184675d3a19aSMatthew G. Knepley for (s = 0; s < size; ++s) { 184775d3a19aSMatthew G. Knepley PetscInt r = 0; 184875d3a19aSMatthew G. Knepley 184975d3a19aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 185075d3a19aSMatthew G. Knepley if (support[s] >= cMax) { 185175d3a19aSMatthew G. Knepley supportRef[newSize+0] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (fEnd - fMax) + (support[s] - cMax); 185275d3a19aSMatthew G. Knepley 185375d3a19aSMatthew G. Knepley newSize += 1; 185475d3a19aSMatthew G. Knepley } else { 185575d3a19aSMatthew G. Knepley if (cone[1] == f) r = 1; 185675d3a19aSMatthew G. Knepley else if (cone[2] == f) r = 2; 185775d3a19aSMatthew G. Knepley supportRef[newSize+0] = fStartNew + (fMax - fStart)*2 + (support[s] - cStart)*3 + (r+2)%3; 185875d3a19aSMatthew G. Knepley supportRef[newSize+1] = fStartNew + (fMax - fStart)*2 + (support[s] - cStart)*3 + r; 185975d3a19aSMatthew G. Knepley 186075d3a19aSMatthew G. Knepley newSize += 2; 186175d3a19aSMatthew G. Knepley } 186275d3a19aSMatthew G. Knepley } 186375d3a19aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 186475d3a19aSMatthew G. Knepley #if 1 186575d3a19aSMatthew 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); 186675d3a19aSMatthew G. Knepley for (p = 0; p < newSize; ++p) { 186775d3a19aSMatthew 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); 186875d3a19aSMatthew G. Knepley } 186975d3a19aSMatthew G. Knepley #endif 187075d3a19aSMatthew G. Knepley } 187175d3a19aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 187275d3a19aSMatthew G. Knepley break; 1873a97b51b8SMatthew G. Knepley case 4: 1874a97b51b8SMatthew G. Knepley /* Hybrid Hex 2D */ 1875a97b51b8SMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 1876a97b51b8SMatthew G. Knepley cMax = PetscMin(cEnd, cMax); 1877a97b51b8SMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 1878a97b51b8SMatthew G. Knepley fMax = PetscMin(fEnd, fMax); 1879a97b51b8SMatthew G. Knepley ierr = DMPlexGetHybridBounds(rdm, &cMaxNew, &fMaxNew, NULL, NULL);CHKERRQ(ierr); 1880a97b51b8SMatthew G. Knepley /* Interior cells have 4 faces */ 1881a97b51b8SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 1882a97b51b8SMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*4; 1883a97b51b8SMatthew G. Knepley const PetscInt *cone, *ornt; 1884a97b51b8SMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 1885a97b51b8SMatthew G. Knepley 1886a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1887a97b51b8SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1888a97b51b8SMatthew G. Knepley /* A quad */ 1889a97b51b8SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 1890a97b51b8SMatthew G. Knepley orntNew[0] = ornt[0]; 1891a97b51b8SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 0; 1892a97b51b8SMatthew G. Knepley orntNew[1] = 0; 1893a97b51b8SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 3; 1894a97b51b8SMatthew G. Knepley orntNew[2] = -2; 1895a97b51b8SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 0 : 1); 1896a97b51b8SMatthew G. Knepley orntNew[3] = ornt[3]; 1897a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 1898a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 1899a97b51b8SMatthew G. Knepley #if 1 1900a97b51b8SMatthew G. Knepley if ((newp+0 < cStartNew) || (newp+0 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+0, cStartNew, cMaxNew); 1901a97b51b8SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1902a97b51b8SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 1903a97b51b8SMatthew G. Knepley } 1904a97b51b8SMatthew G. Knepley #endif 1905a97b51b8SMatthew G. Knepley /* B quad */ 1906a97b51b8SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 1907a97b51b8SMatthew G. Knepley orntNew[0] = ornt[0]; 1908a97b51b8SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 1909a97b51b8SMatthew G. Knepley orntNew[1] = ornt[1]; 1910a97b51b8SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 1; 1911a97b51b8SMatthew G. Knepley orntNew[2] = 0; 1912a97b51b8SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 0; 1913a97b51b8SMatthew G. Knepley orntNew[3] = -2; 1914a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 1915a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 1916a97b51b8SMatthew G. Knepley #if 1 1917a97b51b8SMatthew G. Knepley if ((newp+1 < cStartNew) || (newp+1 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+1, cStartNew, cMaxNew); 1918a97b51b8SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1919a97b51b8SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 1920a97b51b8SMatthew G. Knepley } 1921a97b51b8SMatthew G. Knepley #endif 1922a97b51b8SMatthew G. Knepley /* C quad */ 1923a97b51b8SMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 1; 1924a97b51b8SMatthew G. Knepley orntNew[0] = -2; 1925a97b51b8SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 1926a97b51b8SMatthew G. Knepley orntNew[1] = ornt[1]; 1927a97b51b8SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 1 : 0); 1928a97b51b8SMatthew G. Knepley orntNew[2] = ornt[2]; 1929a97b51b8SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 2; 1930a97b51b8SMatthew G. Knepley orntNew[3] = 0; 1931a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 1932a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 1933a97b51b8SMatthew G. Knepley #if 1 1934a97b51b8SMatthew G. Knepley if ((newp+2 < cStartNew) || (newp+2 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+2, cStartNew, cMaxNew); 1935a97b51b8SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1936a97b51b8SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 1937a97b51b8SMatthew G. Knepley } 1938a97b51b8SMatthew G. Knepley #endif 1939a97b51b8SMatthew G. Knepley /* D quad */ 1940a97b51b8SMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 3; 1941a97b51b8SMatthew G. Knepley orntNew[0] = 0; 1942a97b51b8SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + 2; 1943a97b51b8SMatthew G. Knepley orntNew[1] = -2; 1944a97b51b8SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*2 + (ornt[2] < 0 ? 0 : 1); 1945a97b51b8SMatthew G. Knepley orntNew[2] = ornt[2]; 1946a97b51b8SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*2 + (ornt[3] < 0 ? 1 : 0); 1947a97b51b8SMatthew G. Knepley orntNew[3] = ornt[3]; 1948a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 1949a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 1950a97b51b8SMatthew G. Knepley #if 1 1951a97b51b8SMatthew G. Knepley if ((newp+3 < cStartNew) || (newp+3 >= cMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior cell [%d, %d)", newp+3, cStartNew, cMaxNew); 1952a97b51b8SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1953a97b51b8SMatthew G. Knepley if ((coneNew[p] < fStartNew) || (coneNew[p] >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not an interior face [%d, %d)", coneNew[p], fStartNew, fMaxNew); 1954a97b51b8SMatthew G. Knepley } 1955a97b51b8SMatthew G. Knepley #endif 1956a97b51b8SMatthew G. Knepley } 1957a97b51b8SMatthew G. Knepley /* 1958a97b51b8SMatthew G. Knepley 2----3----3 1959a97b51b8SMatthew G. Knepley | | 1960a97b51b8SMatthew G. Knepley | B | 1961a97b51b8SMatthew G. Knepley | | 1962a97b51b8SMatthew G. Knepley 0----4--- 1 1963a97b51b8SMatthew G. Knepley | | 1964a97b51b8SMatthew G. Knepley | A | 1965a97b51b8SMatthew G. Knepley | | 1966a97b51b8SMatthew G. Knepley 0----2----1 1967a97b51b8SMatthew G. Knepley */ 1968a97b51b8SMatthew G. Knepley /* Hybrid cells have 4 faces */ 1969a97b51b8SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 1970a97b51b8SMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*4 + (c - cMax)*2; 1971a97b51b8SMatthew G. Knepley const PetscInt *cone, *ornt; 1972a97b51b8SMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 1973a97b51b8SMatthew G. Knepley 1974a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 1975a97b51b8SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 1976a97b51b8SMatthew G. Knepley /* A quad */ 1977a97b51b8SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 1 : 0); 1978a97b51b8SMatthew G. Knepley orntNew[0] = ornt[0]; 1979a97b51b8SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 1 : 0); 1980a97b51b8SMatthew G. Knepley orntNew[1] = ornt[1]; 1981a97b51b8SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (cone[2] - fMax); 1982a97b51b8SMatthew G. Knepley orntNew[2] = 0; 1983a97b51b8SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (fEnd - fMax) + (c - cMax); 1984a97b51b8SMatthew G. Knepley orntNew[3] = 0; 1985a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 1986a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 1987a97b51b8SMatthew G. Knepley #if 1 1988a97b51b8SMatthew 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); 1989a97b51b8SMatthew G. Knepley for (p = 0; p < 4; ++p) { 1990a97b51b8SMatthew 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); 1991a97b51b8SMatthew G. Knepley } 1992a97b51b8SMatthew G. Knepley #endif 1993a97b51b8SMatthew G. Knepley /* B quad */ 1994a97b51b8SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*2 + (ornt[0] < 0 ? 0 : 1); 1995a97b51b8SMatthew G. Knepley orntNew[0] = ornt[0]; 1996a97b51b8SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*2 + (ornt[1] < 0 ? 0 : 1); 1997a97b51b8SMatthew G. Knepley orntNew[1] = ornt[1]; 1998a97b51b8SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (fEnd - fMax) + (c - cMax); 1999a97b51b8SMatthew G. Knepley orntNew[2] = 0; 2000a97b51b8SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (cone[3] - fMax); 2001a97b51b8SMatthew G. Knepley orntNew[3] = 0; 2002a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 2003a97b51b8SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 2004a97b51b8SMatthew G. Knepley #if 1 2005a97b51b8SMatthew 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); 2006a97b51b8SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2007a97b51b8SMatthew 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); 2008a97b51b8SMatthew G. Knepley } 2009a97b51b8SMatthew G. Knepley #endif 2010a97b51b8SMatthew G. Knepley } 2011a97b51b8SMatthew G. Knepley /* Interior split faces have 2 vertices and the same cells as the parent */ 2012a97b51b8SMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 2013a97b51b8SMatthew G. Knepley ierr = PetscMalloc1((2 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 2014a97b51b8SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 2015a97b51b8SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (f - fStart); 2016a97b51b8SMatthew G. Knepley 2017a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r) { 2018a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*2 + r; 2019a97b51b8SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 2020a97b51b8SMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 2021a97b51b8SMatthew G. Knepley 2022a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 2023a97b51b8SMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 2024a97b51b8SMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 2025a97b51b8SMatthew G. Knepley coneNew[(r+1)%2] = newv; 2026a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2027a97b51b8SMatthew G. Knepley #if 1 2028a97b51b8SMatthew 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); 2029a97b51b8SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2030a97b51b8SMatthew 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); 2031a97b51b8SMatthew G. Knepley } 2032a97b51b8SMatthew G. Knepley #endif 2033a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 2034a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2035a97b51b8SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2036a97b51b8SMatthew G. Knepley if (support[s] >= cMax) { 2037a97b51b8SMatthew G. Knepley supportRef[s] = cStartNew + (cMax - cStart)*4 + (support[s] - cMax)*2 + r; 2038a97b51b8SMatthew G. Knepley } else { 2039a97b51b8SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2040a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2041a97b51b8SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 2042a97b51b8SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 2043a97b51b8SMatthew G. Knepley if (cone[c] == f) break; 2044a97b51b8SMatthew G. Knepley } 2045a97b51b8SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*4 + (ornt[c] < 0 ? (c+1-r)%4 : (c+r)%4); 2046a97b51b8SMatthew G. Knepley } 2047a97b51b8SMatthew G. Knepley } 2048a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2049a97b51b8SMatthew G. Knepley #if 1 2050a97b51b8SMatthew 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); 2051a97b51b8SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 2052a97b51b8SMatthew 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); 2053a97b51b8SMatthew G. Knepley } 2054a97b51b8SMatthew G. Knepley #endif 2055a97b51b8SMatthew G. Knepley } 2056a97b51b8SMatthew G. Knepley } 2057a97b51b8SMatthew G. Knepley /* Interior cell faces have 2 vertices and 2 cells */ 2058a97b51b8SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 2059a97b51b8SMatthew G. Knepley const PetscInt *cone; 2060a97b51b8SMatthew G. Knepley 2061a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2062a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r) { 2063a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + r; 2064a97b51b8SMatthew G. Knepley PetscInt coneNew[2], supportNew[2]; 2065a97b51b8SMatthew G. Knepley 2066a97b51b8SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - fStart); 2067a97b51b8SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fMax - fStart) + (c - cStart); 2068a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2069a97b51b8SMatthew G. Knepley #if 1 2070a97b51b8SMatthew 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); 2071a97b51b8SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2072a97b51b8SMatthew 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); 2073a97b51b8SMatthew G. Knepley } 2074a97b51b8SMatthew G. Knepley #endif 2075a97b51b8SMatthew G. Knepley supportNew[0] = (c - cStart)*4 + r; 2076a97b51b8SMatthew G. Knepley supportNew[1] = (c - cStart)*4 + (r+1)%4; 2077a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2078a97b51b8SMatthew G. Knepley #if 1 2079a97b51b8SMatthew 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); 2080a97b51b8SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2081a97b51b8SMatthew 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); 2082a97b51b8SMatthew G. Knepley } 2083a97b51b8SMatthew G. Knepley #endif 2084a97b51b8SMatthew G. Knepley } 2085a97b51b8SMatthew G. Knepley } 2086a97b51b8SMatthew G. Knepley /* Hybrid faces have 2 vertices and the same cells */ 2087a97b51b8SMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 2088a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (f - fMax); 2089a97b51b8SMatthew G. Knepley const PetscInt *cone, *support; 2090a97b51b8SMatthew G. Knepley PetscInt coneNew[2], supportNew[2]; 2091a97b51b8SMatthew G. Knepley PetscInt size, s, r; 2092a97b51b8SMatthew G. Knepley 2093a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 2094a97b51b8SMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 2095a97b51b8SMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 2096a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2097a97b51b8SMatthew G. Knepley #if 1 2098a97b51b8SMatthew 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); 2099a97b51b8SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2100a97b51b8SMatthew 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); 2101a97b51b8SMatthew G. Knepley } 2102a97b51b8SMatthew G. Knepley #endif 2103a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 2104a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2105a97b51b8SMatthew G. Knepley for (s = 0; s < size; ++s) { 2106a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2107a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r) { 2108a97b51b8SMatthew G. Knepley if (cone[r+2] == f) break; 2109a97b51b8SMatthew G. Knepley } 2110a97b51b8SMatthew G. Knepley supportNew[s] = (cMax - cStart)*4 + (support[s] - cMax)*2 + r; 2111a97b51b8SMatthew G. Knepley } 2112a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2113a97b51b8SMatthew G. Knepley #if 1 2114a97b51b8SMatthew 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); 2115a97b51b8SMatthew G. Knepley for (p = 0; p < size; ++p) { 2116a97b51b8SMatthew 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); 2117a97b51b8SMatthew G. Knepley } 2118a97b51b8SMatthew G. Knepley #endif 2119a97b51b8SMatthew G. Knepley } 2120a97b51b8SMatthew G. Knepley /* Cell hybrid faces have 2 vertices and 2 cells */ 2121a97b51b8SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 2122a97b51b8SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (fEnd - fMax) + (c - cMax); 2123a97b51b8SMatthew G. Knepley const PetscInt *cone; 2124a97b51b8SMatthew G. Knepley PetscInt coneNew[2], supportNew[2]; 2125a97b51b8SMatthew G. Knepley 2126a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2127a97b51b8SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[0] - fStart); 2128a97b51b8SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[1] - fStart); 2129a97b51b8SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2130a97b51b8SMatthew G. Knepley #if 1 2131a97b51b8SMatthew 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); 2132a97b51b8SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2133a97b51b8SMatthew 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); 2134a97b51b8SMatthew G. Knepley } 2135a97b51b8SMatthew G. Knepley #endif 2136a97b51b8SMatthew G. Knepley supportNew[0] = (cMax - cStart)*4 + (c - cMax)*2 + 0; 2137a97b51b8SMatthew G. Knepley supportNew[1] = (cMax - cStart)*4 + (c - cMax)*2 + 1; 2138a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2139a97b51b8SMatthew G. Knepley #if 1 2140a97b51b8SMatthew 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); 2141a97b51b8SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2142a97b51b8SMatthew 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); 2143a97b51b8SMatthew G. Knepley } 2144a97b51b8SMatthew G. Knepley #endif 2145a97b51b8SMatthew G. Knepley } 2146a97b51b8SMatthew G. Knepley /* Old vertices have identical supports */ 2147a97b51b8SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 2148a97b51b8SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 2149a97b51b8SMatthew G. Knepley const PetscInt *support, *cone; 2150a97b51b8SMatthew G. Knepley PetscInt size, s; 2151a97b51b8SMatthew G. Knepley 2152a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 2153a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 2154a97b51b8SMatthew G. Knepley for (s = 0; s < size; ++s) { 2155a97b51b8SMatthew G. Knepley if (support[s] >= fMax) { 2156a97b51b8SMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (support[s] - fMax); 2157a97b51b8SMatthew G. Knepley } else { 2158a97b51b8SMatthew G. Knepley PetscInt r = 0; 2159a97b51b8SMatthew G. Knepley 2160a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2161a97b51b8SMatthew G. Knepley if (cone[1] == v) r = 1; 2162a97b51b8SMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*2 + r; 2163a97b51b8SMatthew G. Knepley } 2164a97b51b8SMatthew G. Knepley } 2165a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2166a97b51b8SMatthew G. Knepley #if 1 2167a97b51b8SMatthew 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); 2168a97b51b8SMatthew G. Knepley for (p = 0; p < size; ++p) { 2169a97b51b8SMatthew 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); 2170a97b51b8SMatthew G. Knepley } 2171a97b51b8SMatthew G. Knepley #endif 2172a97b51b8SMatthew G. Knepley } 2173a97b51b8SMatthew G. Knepley /* Face vertices have 2 + cells supports */ 2174a97b51b8SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 2175a97b51b8SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (f - fStart); 2176a97b51b8SMatthew G. Knepley const PetscInt *cone, *support; 2177a97b51b8SMatthew G. Knepley PetscInt size, s; 2178a97b51b8SMatthew G. Knepley 2179a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 2180a97b51b8SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2181a97b51b8SMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*2 + 0; 2182a97b51b8SMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*2 + 1; 2183a97b51b8SMatthew G. Knepley for (s = 0; s < size; ++s) { 2184a97b51b8SMatthew G. Knepley PetscInt r = 0; 2185a97b51b8SMatthew G. Knepley 2186a97b51b8SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2187a97b51b8SMatthew G. Knepley if (support[s] >= cMax) { 2188a97b51b8SMatthew G. Knepley supportRef[2+s] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (fEnd - fMax) + (support[s] - cMax); 2189a97b51b8SMatthew G. Knepley } else { 2190a97b51b8SMatthew G. Knepley if (cone[1] == f) r = 1; 2191a97b51b8SMatthew G. Knepley else if (cone[2] == f) r = 2; 2192a97b51b8SMatthew G. Knepley else if (cone[3] == f) r = 3; 2193a97b51b8SMatthew G. Knepley supportRef[2+s] = fStartNew + (fMax - fStart)*2 + (support[s] - cStart)*4 + r; 2194a97b51b8SMatthew G. Knepley } 2195a97b51b8SMatthew G. Knepley } 2196a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2197a97b51b8SMatthew G. Knepley #if 1 2198a97b51b8SMatthew 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); 2199a97b51b8SMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 2200a97b51b8SMatthew 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); 2201a97b51b8SMatthew G. Knepley } 2202a97b51b8SMatthew G. Knepley #endif 2203a97b51b8SMatthew G. Knepley } 2204a97b51b8SMatthew G. Knepley /* Cell vertices have 4 supports */ 2205a97b51b8SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 2206a97b51b8SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (fMax - fStart) + (c - cStart); 2207a97b51b8SMatthew G. Knepley PetscInt supportNew[4]; 2208a97b51b8SMatthew G. Knepley 2209a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r) { 2210a97b51b8SMatthew G. Knepley supportNew[r] = fStartNew + (fMax - fStart)*2 + (c - cStart)*4 + r; 2211a97b51b8SMatthew G. Knepley } 2212a97b51b8SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2213a97b51b8SMatthew G. Knepley } 2214a97b51b8SMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 2215a97b51b8SMatthew G. Knepley break; 2216b5da9499SMatthew G. Knepley case 5: 2217b5da9499SMatthew G. Knepley /* Simplicial 3D */ 2218b5da9499SMatthew G. Knepley /* All cells have 4 faces: Tet face order is prescribed in DMPlexGetFaces_Internal() */ 2219b5da9499SMatthew G. Knepley ierr = DMPlexGetRawFaces_Internal(dm, 3, 4, cellInd, NULL, NULL, &faces);CHKERRQ(ierr); 2220b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2221b5da9499SMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8; 2222b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 2223b5da9499SMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 2224b5da9499SMatthew G. Knepley 2225b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2226b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 2227b5da9499SMatthew G. Knepley /* A tetrahedron: {0, a, c, d} */ 2228518a8359SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 0); /* A */ 2229b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 2230518a8359SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 0); /* A */ 2231b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 2232518a8359SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 0); /* A */ 2233b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 2234b5da9499SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 0; 2235b5da9499SMatthew G. Knepley orntNew[3] = 0; 2236b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 2237b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 2238b5da9499SMatthew G. Knepley #if 1 2239b5da9499SMatthew 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); 2240b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2241b5da9499SMatthew 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); 2242b5da9499SMatthew G. Knepley } 2243b5da9499SMatthew G. Knepley #endif 2244b5da9499SMatthew G. Knepley /* B tetrahedron: {a, 1, b, e} */ 2245518a8359SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 1); /* B */ 2246b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 2247518a8359SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 2); /* C */ 2248b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 2249b5da9499SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 1; 2250b5da9499SMatthew G. Knepley orntNew[2] = 0; 2251518a8359SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 1); /* B */ 2252b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 2253b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 2254b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 2255b5da9499SMatthew G. Knepley #if 1 2256b5da9499SMatthew 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); 2257b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2258b5da9499SMatthew 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); 2259b5da9499SMatthew G. Knepley } 2260b5da9499SMatthew G. Knepley #endif 2261b5da9499SMatthew G. Knepley /* C tetrahedron: {c, b, 2, f} */ 2262518a8359SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 2); /* C */ 2263b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 2264b5da9499SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 2; 2265b5da9499SMatthew G. Knepley orntNew[1] = 0; 2266518a8359SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 1); /* B */ 2267b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 2268518a8359SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 0); /* A */ 2269b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 2270b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 2271b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 2272b5da9499SMatthew G. Knepley #if 1 2273b5da9499SMatthew 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); 2274b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2275b5da9499SMatthew 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); 2276b5da9499SMatthew G. Knepley } 2277b5da9499SMatthew G. Knepley #endif 2278b5da9499SMatthew G. Knepley /* D tetrahedron: {d, e, f, 3} */ 2279b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 3; 2280b5da9499SMatthew G. Knepley orntNew[0] = 0; 2281518a8359SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 1); /* B */ 2282b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 2283518a8359SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 2); /* C */ 2284b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 2285518a8359SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 2); /* C */ 2286b5da9499SMatthew G. Knepley orntNew[3] = ornt[3]; 2287b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 2288b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 2289b5da9499SMatthew G. Knepley #if 1 2290b5da9499SMatthew 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); 2291b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2292b5da9499SMatthew 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); 2293b5da9499SMatthew G. Knepley } 2294b5da9499SMatthew G. Knepley #endif 2295b5da9499SMatthew G. Knepley /* A' tetrahedron: {d, a, c, f} */ 2296b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 0; 2297b5da9499SMatthew G. Knepley orntNew[0] = -3; 2298fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (cone[2] - fStart)*4 + 3; 2299db2c6090SMatthew G. Knepley orntNew[1] = ornt[2] < 0 ? -(GetTetSomething_Static(ornt[2], 0)+1) : GetTetSomething_Static(ornt[2], 0); 2300fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 2301fac4ab25SMatthew G. Knepley orntNew[2] = 0; 2302fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 2303fac4ab25SMatthew G. Knepley orntNew[3] = 2; 2304b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 2305b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 2306b5da9499SMatthew G. Knepley #if 1 2307b5da9499SMatthew 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); 2308b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2309b5da9499SMatthew 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); 2310b5da9499SMatthew G. Knepley } 2311b5da9499SMatthew G. Knepley #endif 2312b5da9499SMatthew G. Knepley /* B' tetrahedron: {e, b, a, f} */ 2313b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 1; 2314b5da9499SMatthew G. Knepley orntNew[0] = -3; 2315fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 2316fac4ab25SMatthew G. Knepley orntNew[1] = 1; 2317fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 2318b5da9499SMatthew G. Knepley orntNew[2] = 0; 2319fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + 3; 2320db2c6090SMatthew G. Knepley orntNew[3] = ornt[3] < 0 ? -(GetTetSomething_Static(ornt[3], 0)+1) : GetTetSomething_Static(ornt[3], 0); 2321b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 2322b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 2323b5da9499SMatthew G. Knepley #if 1 2324b5da9499SMatthew 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); 2325b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2326b5da9499SMatthew 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); 2327b5da9499SMatthew G. Knepley } 2328b5da9499SMatthew G. Knepley #endif 2329b5da9499SMatthew G. Knepley /* C' tetrahedron: {b, f, c, a} */ 2330b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 2; 2331b5da9499SMatthew G. Knepley orntNew[0] = -3; 2332fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (cone[0] - fStart)*4 + 3; 2333db2c6090SMatthew G. Knepley orntNew[1] = ornt[0] < 0 ? -(GetTetSomething_Static(ornt[0], 2)+1) : GetTetSomething_Static(ornt[0], 2); 2334fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 2335fac4ab25SMatthew G. Knepley orntNew[2] = -3; 2336fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 2337fac4ab25SMatthew G. Knepley orntNew[3] = -2; 2338b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 2339b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 2340b5da9499SMatthew G. Knepley #if 1 2341b5da9499SMatthew 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); 2342b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2343b5da9499SMatthew 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); 2344b5da9499SMatthew G. Knepley } 2345b5da9499SMatthew G. Knepley #endif 2346b5da9499SMatthew G. Knepley /* D' tetrahedron: {f, e, d, a} */ 2347b5da9499SMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 3; 2348b5da9499SMatthew G. Knepley orntNew[0] = -3; 2349fac4ab25SMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 2350b5da9499SMatthew G. Knepley orntNew[1] = -3; 2351fac4ab25SMatthew G. Knepley coneNew[2] = fStartNew + (cone[1] - fStart)*4 + 3; 2352db2c6090SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -(GetTetSomething_Static(ornt[1], 0)+1) : GetTetSomething_Static(ornt[1], 0); 2353fac4ab25SMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 2354fac4ab25SMatthew G. Knepley orntNew[3] = -3; 2355b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 2356b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 2357b5da9499SMatthew G. Knepley #if 1 2358b5da9499SMatthew 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); 2359b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2360b5da9499SMatthew 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); 2361b5da9499SMatthew G. Knepley } 2362b5da9499SMatthew G. Knepley #endif 2363b5da9499SMatthew G. Knepley } 2364b5da9499SMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 2365b5da9499SMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 2366785e854fSJed Brown ierr = PetscMalloc1((2 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 2367b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 2368b5da9499SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4; 2369b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 2370b5da9499SMatthew G. Knepley PetscInt coneNew[3], orntNew[3], coneSize, supportSize, s; 2371b5da9499SMatthew G. Knepley 2372b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 2373b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 2374b5da9499SMatthew G. Knepley /* A triangle */ 2375b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1 : 0); 2376b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 2377b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 2; 2378b5da9499SMatthew G. Knepley orntNew[1] = -2; 2379b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 0 : 1); 2380b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 2381b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 2382b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 2383b5da9499SMatthew G. Knepley #if 1 2384b5da9499SMatthew 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); 2385b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2386b5da9499SMatthew 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); 2387b5da9499SMatthew G. Knepley } 2388b5da9499SMatthew G. Knepley #endif 2389b5da9499SMatthew G. Knepley /* B triangle */ 2390b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 0 : 1); 2391b5da9499SMatthew G. Knepley orntNew[0] = ornt[0]; 2392b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1 : 0); 2393b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 2394b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 0; 2395b5da9499SMatthew G. Knepley orntNew[2] = -2; 2396b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 2397b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 2398b5da9499SMatthew G. Knepley #if 1 2399b5da9499SMatthew 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); 2400b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2401b5da9499SMatthew 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); 2402b5da9499SMatthew G. Knepley } 2403b5da9499SMatthew G. Knepley #endif 2404b5da9499SMatthew G. Knepley /* C triangle */ 2405b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 1; 2406b5da9499SMatthew G. Knepley orntNew[0] = -2; 2407b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 0 : 1); 2408b5da9499SMatthew G. Knepley orntNew[1] = ornt[1]; 2409b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 1 : 0); 2410b5da9499SMatthew G. Knepley orntNew[2] = ornt[2]; 2411b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 2412b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 2413b5da9499SMatthew G. Knepley #if 1 2414b5da9499SMatthew 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); 2415b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2416b5da9499SMatthew 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); 2417b5da9499SMatthew G. Knepley } 2418b5da9499SMatthew G. Knepley #endif 2419b5da9499SMatthew G. Knepley /* D triangle */ 2420b5da9499SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 0; 2421b5da9499SMatthew G. Knepley orntNew[0] = 0; 2422b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 1; 2423b5da9499SMatthew G. Knepley orntNew[1] = 0; 2424b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + 2; 2425b5da9499SMatthew G. Knepley orntNew[2] = 0; 2426b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 2427b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 2428b5da9499SMatthew G. Knepley #if 1 2429b5da9499SMatthew 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); 2430b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2431b5da9499SMatthew 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); 2432b5da9499SMatthew G. Knepley } 2433b5da9499SMatthew G. Knepley #endif 2434b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 2435b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2436b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 2437b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2438219f7b90SMatthew G. Knepley PetscInt subf; 2439b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2440b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2441b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 2442b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 2443b5da9499SMatthew G. Knepley if (cone[c] == f) break; 2444b5da9499SMatthew G. Knepley } 2445219f7b90SMatthew G. Knepley subf = GetTriSubfaceInverse_Static(ornt[c], r); 2446219f7b90SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*8 + (r==3 ? (c+2)%4 + 4 : faces[c*3+subf]); 2447b5da9499SMatthew G. Knepley } 2448b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportRef);CHKERRQ(ierr); 2449b5da9499SMatthew G. Knepley #if 1 24509ddff745SMatthew G. Knepley if ((newp+r < fStartNew) || (newp+r >= fEndNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+r, fStartNew, fEndNew); 2451b5da9499SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 2452b5da9499SMatthew 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); 2453b5da9499SMatthew G. Knepley } 2454b5da9499SMatthew G. Knepley #endif 2455b5da9499SMatthew G. Knepley } 2456b5da9499SMatthew G. Knepley } 2457b5da9499SMatthew G. Knepley /* Interior faces have 3 edges and 2 cells */ 2458b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2459b5da9499SMatthew G. Knepley PetscInt newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8; 2460b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 2461b5da9499SMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 2462b5da9499SMatthew G. Knepley PetscInt supportNew[2]; 2463b5da9499SMatthew G. Knepley 2464b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2465b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 2466b5da9499SMatthew G. Knepley /* Face A: {c, a, d} */ 24674bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 2); 2468b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 24694bb260e2SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 2); 2470b5da9499SMatthew G. Knepley orntNew[1] = ornt[1] < 0 ? -2 : 0; 24714bb260e2SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 2); 2472b5da9499SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 2473b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2474b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2475b5da9499SMatthew G. Knepley #if 1 2476b5da9499SMatthew 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); 2477b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2478b5da9499SMatthew 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); 2479b5da9499SMatthew G. Knepley } 2480b5da9499SMatthew G. Knepley #endif 2481b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0; 2482b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 0+4; 2483b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2484b5da9499SMatthew G. Knepley #if 1 2485b5da9499SMatthew 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); 2486b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2487b5da9499SMatthew 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); 2488b5da9499SMatthew G. Knepley } 2489b5da9499SMatthew G. Knepley #endif 2490b5da9499SMatthew G. Knepley ++newp; 2491b5da9499SMatthew G. Knepley /* Face B: {a, b, e} */ 24924bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 0); 2493b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 24944bb260e2SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 0); 2495b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 24964bb260e2SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 1); 2497b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 2498b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2499b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2500b5da9499SMatthew G. Knepley #if 1 25014bb260e2SMatthew 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); 2502b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2503b5da9499SMatthew 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); 2504b5da9499SMatthew G. Knepley } 2505b5da9499SMatthew G. Knepley #endif 2506b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1; 2507b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 1+4; 2508b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2509b5da9499SMatthew G. Knepley #if 1 2510b5da9499SMatthew 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); 2511b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2512b5da9499SMatthew 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); 2513b5da9499SMatthew G. Knepley } 2514b5da9499SMatthew G. Knepley #endif 2515b5da9499SMatthew G. Knepley ++newp; 2516b5da9499SMatthew G. Knepley /* Face C: {c, f, b} */ 25174bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 0); 2518b5da9499SMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? -2 : 0; 25194bb260e2SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 2); 2520b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 25214bb260e2SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 1); 2522b5da9499SMatthew G. Knepley orntNew[2] = ornt[0] < 0 ? -2 : 0; 2523b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2524b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2525b5da9499SMatthew G. Knepley #if 1 2526b5da9499SMatthew 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); 2527b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2528b5da9499SMatthew 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); 2529b5da9499SMatthew G. Knepley } 2530b5da9499SMatthew G. Knepley #endif 2531b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 2; 2532b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 2533b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2534b5da9499SMatthew G. Knepley #if 1 2535b5da9499SMatthew 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); 2536b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2537b5da9499SMatthew 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); 2538b5da9499SMatthew G. Knepley } 2539b5da9499SMatthew G. Knepley #endif 2540b5da9499SMatthew G. Knepley ++newp; 2541b5da9499SMatthew G. Knepley /* Face D: {d, e, f} */ 25424bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 0); 2543b5da9499SMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 25444bb260e2SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 1); 2545b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 25464bb260e2SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 1); 2547b5da9499SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 2548b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2549b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2550b5da9499SMatthew G. Knepley #if 1 2551b5da9499SMatthew 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); 2552b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2553b5da9499SMatthew 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); 2554b5da9499SMatthew G. Knepley } 2555b5da9499SMatthew G. Knepley #endif 2556b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 3; 2557b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 2558b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2559b5da9499SMatthew G. Knepley #if 1 2560b5da9499SMatthew 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); 2561b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2562b5da9499SMatthew 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); 2563b5da9499SMatthew G. Knepley } 2564b5da9499SMatthew G. Knepley #endif 2565b5da9499SMatthew G. Knepley ++newp; 2566b5da9499SMatthew G. Knepley /* Face E: {d, f, a} */ 25674bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 1); 2568b5da9499SMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? 0 : -2; 2569b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 25704bb260e2SMatthew G. Knepley orntNew[1] = -2; 25714bb260e2SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 2); 2572b5da9499SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 2573b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2574b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2575b5da9499SMatthew G. Knepley #if 1 2576b5da9499SMatthew 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); 2577b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2578b5da9499SMatthew 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); 2579b5da9499SMatthew G. Knepley } 2580b5da9499SMatthew G. Knepley #endif 2581b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 2582b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 2583b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2584b5da9499SMatthew G. Knepley #if 1 2585b5da9499SMatthew 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); 2586b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2587b5da9499SMatthew 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); 2588b5da9499SMatthew G. Knepley } 2589b5da9499SMatthew G. Knepley #endif 2590b5da9499SMatthew G. Knepley ++newp; 2591b5da9499SMatthew G. Knepley /* Face F: {c, a, f} */ 25924bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 2); 2593b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 2594b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 25954bb260e2SMatthew G. Knepley orntNew[1] = 0; 25964bb260e2SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 0); 25972baf2947SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? 0 : -2; 2598b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2599b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2600b5da9499SMatthew G. Knepley #if 1 2601b5da9499SMatthew 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); 2602b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2603b5da9499SMatthew 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); 2604b5da9499SMatthew G. Knepley } 2605b5da9499SMatthew G. Knepley #endif 2606b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 2607b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 2608b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2609b5da9499SMatthew G. Knepley #if 1 2610b5da9499SMatthew 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); 2611b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2612b5da9499SMatthew 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); 2613b5da9499SMatthew G. Knepley } 2614b5da9499SMatthew G. Knepley #endif 2615b5da9499SMatthew G. Knepley ++newp; 2616b5da9499SMatthew G. Knepley /* Face G: {e, a, f} */ 26174bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 1); 2618b5da9499SMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 2619b5da9499SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 2620fac4ab25SMatthew G. Knepley orntNew[1] = 0; 26214bb260e2SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 1); 2622b5da9499SMatthew G. Knepley orntNew[2] = ornt[3] < 0 ? 0 : -2; 2623b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2624b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2625b5da9499SMatthew G. Knepley #if 1 2626b5da9499SMatthew 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); 2627b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2628b5da9499SMatthew 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); 2629b5da9499SMatthew G. Knepley } 2630b5da9499SMatthew G. Knepley #endif 2631b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 2632b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 2633b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2634b5da9499SMatthew G. Knepley #if 1 2635b5da9499SMatthew 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); 2636b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2637b5da9499SMatthew 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); 2638b5da9499SMatthew G. Knepley } 2639b5da9499SMatthew G. Knepley #endif 2640b5da9499SMatthew G. Knepley ++newp; 2641b5da9499SMatthew G. Knepley /* Face H: {a, b, f} */ 26424bb260e2SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 0); 2643b5da9499SMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 26444bb260e2SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 2); 2645b5da9499SMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? 0 : -2; 2646b5da9499SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 26474bb260e2SMatthew G. Knepley orntNew[2] = -2; 2648b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2649b5da9499SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 2650b5da9499SMatthew G. Knepley #if 1 2651b5da9499SMatthew 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); 2652b5da9499SMatthew G. Knepley for (p = 0; p < 3; ++p) { 2653b5da9499SMatthew 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); 2654b5da9499SMatthew G. Knepley } 2655b5da9499SMatthew G. Knepley #endif 2656b5da9499SMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 2657b5da9499SMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 2658b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2659b5da9499SMatthew G. Knepley #if 1 2660b5da9499SMatthew 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); 2661b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2662b5da9499SMatthew 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); 2663b5da9499SMatthew G. Knepley } 2664b5da9499SMatthew G. Knepley #endif 2665b5da9499SMatthew G. Knepley ++newp; 2666b5da9499SMatthew G. Knepley } 2667b5da9499SMatthew G. Knepley /* Split Edges have 2 vertices and the same faces as the parent */ 2668b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 2669b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 2670b5da9499SMatthew G. Knepley 2671b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 2672b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 2673b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 2674b5da9499SMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 2675b5da9499SMatthew G. Knepley 2676b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 2677b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 2678b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 2679b5da9499SMatthew G. Knepley coneNew[(r+1)%2] = newv; 2680b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2681b5da9499SMatthew G. Knepley #if 1 2682b5da9499SMatthew 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); 2683b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2684b5da9499SMatthew 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); 2685b5da9499SMatthew G. Knepley } 2686b5da9499SMatthew G. Knepley #endif 2687b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 2688b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 2689b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2690b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2691b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2692b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 2693b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 2694b5da9499SMatthew G. Knepley if (cone[c] == e) break; 2695b5da9499SMatthew G. Knepley } 2696b5da9499SMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (c + (ornt[c] < 0 ? 1-r : r))%3; 2697b5da9499SMatthew G. Knepley } 2698b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2699b5da9499SMatthew G. Knepley #if 1 2700b5da9499SMatthew 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); 2701b5da9499SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 2702b5da9499SMatthew 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); 2703b5da9499SMatthew G. Knepley } 2704b5da9499SMatthew G. Knepley #endif 2705b5da9499SMatthew G. Knepley } 2706b5da9499SMatthew G. Knepley } 270786f0afeeSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells*(1/2) faces */ 2708b5da9499SMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 2709b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 2710b5da9499SMatthew G. Knepley PetscInt coneSize, supportSize, s; 2711b5da9499SMatthew G. Knepley 2712b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 2713b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 2714b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 2715b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*3 + r; 2716b5da9499SMatthew G. Knepley PetscInt coneNew[2], intFaces = 0, er, eint[4] = {1, 0, 2, 0}; 2717b5da9499SMatthew G. Knepley PetscInt fint[24] = { 1, 7, -1, -1, 0, 5, 2718b5da9499SMatthew G. Knepley -1, -1, 1, 6, 0, 4, 2719b5da9499SMatthew G. Knepley 2, 5, 3, 4, -1, -1, 2720b5da9499SMatthew G. Knepley -1, -1, 3, 6, 2, 7}; 2721b5da9499SMatthew G. Knepley 2722b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 2723b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[(r+0)%3] - eStart); 2724b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - eStart); 2725b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2726b5da9499SMatthew G. Knepley #if 1 2727b5da9499SMatthew 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); 2728b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2729b5da9499SMatthew 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); 2730b5da9499SMatthew G. Knepley } 2731b5da9499SMatthew G. Knepley #endif 2732b5da9499SMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + (r+1)%3; 2733b5da9499SMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + 3; 2734b5da9499SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 2735b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2736b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2737b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 2738b5da9499SMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 273986f0afeeSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 27409ddff745SMatthew G. Knepley er = GetTetSomethingInverse_Static(ornt[c], r); 2741b5da9499SMatthew G. Knepley if (er == eint[c]) { 2742b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + (c + 2)%4; 2743b5da9499SMatthew G. Knepley } else { 2744b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 0]; 2745b5da9499SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 1]; 2746b5da9499SMatthew G. Knepley } 2747b5da9499SMatthew G. Knepley } 2748b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2749b5da9499SMatthew G. Knepley #if 1 2750b5da9499SMatthew 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); 2751b5da9499SMatthew G. Knepley for (p = 0; p < intFaces; ++p) { 2752b5da9499SMatthew 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); 2753b5da9499SMatthew G. Knepley } 2754b5da9499SMatthew G. Knepley #endif 2755b5da9499SMatthew G. Knepley } 2756b5da9499SMatthew G. Knepley } 2757b5da9499SMatthew G. Knepley /* Interior edges have 2 vertices and 4 faces */ 2758b5da9499SMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 2759b5da9499SMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (c - cStart); 2760b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt, *fcone; 27614a40f731SMatthew G. Knepley PetscInt coneNew[2], supportNew[4], find; 2762b5da9499SMatthew G. Knepley 2763b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 2764b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 2765b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &fcone);CHKERRQ(ierr); 276642525629SMatthew G. Knepley find = GetTriEdge_Static(ornt[0], 0); 2767b5da9499SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 2768b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &fcone);CHKERRQ(ierr); 276942525629SMatthew G. Knepley find = GetTriEdge_Static(ornt[2], 1); 2770b5da9499SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 2771b5da9499SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 2772b5da9499SMatthew G. Knepley #if 1 2773b5da9499SMatthew 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); 2774b5da9499SMatthew G. Knepley for (p = 0; p < 2; ++p) { 2775b5da9499SMatthew 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); 2776b5da9499SMatthew G. Knepley } 2777b5da9499SMatthew G. Knepley #endif 2778b5da9499SMatthew G. Knepley supportNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 4; 2779b5da9499SMatthew G. Knepley supportNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 5; 2780b5da9499SMatthew G. Knepley supportNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 6; 2781b5da9499SMatthew G. Knepley supportNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*8 + 7; 2782b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 2783b5da9499SMatthew G. Knepley #if 1 2784b5da9499SMatthew 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); 2785b5da9499SMatthew G. Knepley for (p = 0; p < 4; ++p) { 2786b5da9499SMatthew 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); 2787b5da9499SMatthew G. Knepley } 2788b5da9499SMatthew G. Knepley #endif 2789b5da9499SMatthew G. Knepley } 2790b5da9499SMatthew G. Knepley /* Old vertices have identical supports */ 2791b5da9499SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 2792b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 2793b5da9499SMatthew G. Knepley const PetscInt *support, *cone; 2794b5da9499SMatthew G. Knepley PetscInt size, s; 2795b5da9499SMatthew G. Knepley 2796b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 2797b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 2798b5da9499SMatthew G. Knepley for (s = 0; s < size; ++s) { 2799b5da9499SMatthew G. Knepley PetscInt r = 0; 2800b5da9499SMatthew G. Knepley 2801b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2802b5da9499SMatthew G. Knepley if (cone[1] == v) r = 1; 2803b5da9499SMatthew G. Knepley supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 2804b5da9499SMatthew G. Knepley } 2805b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2806b5da9499SMatthew G. Knepley #if 1 2807b5da9499SMatthew 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); 2808b5da9499SMatthew G. Knepley for (p = 0; p < size; ++p) { 2809b5da9499SMatthew 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); 2810b5da9499SMatthew G. Knepley } 2811b5da9499SMatthew G. Knepley #endif 2812b5da9499SMatthew G. Knepley } 2813b5da9499SMatthew G. Knepley /* Edge vertices have 2 + face*2 + 0/1 supports */ 2814b5da9499SMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 2815b5da9499SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 2816b5da9499SMatthew G. Knepley const PetscInt *cone, *support; 2817b5da9499SMatthew G. Knepley PetscInt *star = NULL, starSize, cellSize = 0, coneSize, size, s; 2818b5da9499SMatthew G. Knepley 2819b5da9499SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 2820b5da9499SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 2821b5da9499SMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 2822b5da9499SMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 2823b5da9499SMatthew G. Knepley for (s = 0; s < size; ++s) { 2824b5da9499SMatthew G. Knepley PetscInt r = 0; 2825b5da9499SMatthew G. Knepley 2826b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 2827b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 2828b5da9499SMatthew G. Knepley for (r = 0; r < coneSize; ++r) {if (cone[r] == e) break;} 2829b5da9499SMatthew G. Knepley supportRef[2+s*2+0] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*3 + (r+0)%3; 2830b5da9499SMatthew G. Knepley supportRef[2+s*2+1] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*3 + (r+2)%3; 2831b5da9499SMatthew G. Knepley } 2832b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 2833b5da9499SMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 2834b5da9499SMatthew G. Knepley const PetscInt *cone, *ornt; 2835b5da9499SMatthew G. Knepley PetscInt e01, e23; 2836b5da9499SMatthew G. Knepley 2837b5da9499SMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cEnd)) { 2838b5da9499SMatthew G. Knepley /* Check edge 0-1 */ 2839b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 2840b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 2841b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 284242525629SMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 2843b5da9499SMatthew G. Knepley /* Check edge 2-3 */ 2844b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 2845b5da9499SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 284642525629SMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 284742525629SMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 2848b5da9499SMatthew G. Knepley if ((e01 == e) || (e23 == e)) {supportRef[2+size*2+cellSize++] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (star[s] - cStart);} 2849b5da9499SMatthew G. Knepley } 2850b5da9499SMatthew G. Knepley } 2851b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 2852b5da9499SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 2853b5da9499SMatthew G. Knepley #if 1 2854b5da9499SMatthew 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); 2855b5da9499SMatthew G. Knepley for (p = 0; p < 2+size*2+cellSize; ++p) { 2856b5da9499SMatthew 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); 2857b5da9499SMatthew G. Knepley } 2858b5da9499SMatthew G. Knepley #endif 2859b5da9499SMatthew G. Knepley } 2860b5da9499SMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 2861b5da9499SMatthew G. Knepley ierr = DMPlexRestoreFaces_Internal(dm, 3, cStart, NULL, NULL, &faces);CHKERRQ(ierr); 2862b5da9499SMatthew G. Knepley break; 28636ce3c06aSMatthew G. Knepley case 7: 28646ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 28656ce3c06aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(rdm, &cMaxNew, &fMaxNew, &eMaxNew, NULL);CHKERRQ(ierr); 28666ce3c06aSMatthew G. Knepley /* Interior cells have 4 faces: Tet face order is prescribed in DMPlexGetFaces_Internal() */ 28676ce3c06aSMatthew G. Knepley ierr = DMPlexGetRawFaces_Internal(dm, 3, 4, cellInd, NULL, NULL, &faces);CHKERRQ(ierr); 28686ce3c06aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 28696ce3c06aSMatthew G. Knepley const PetscInt newp = cStartNew + (c - cStart)*8; 28706ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 28716ce3c06aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 28726ce3c06aSMatthew G. Knepley 28736ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 28746ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 28756ce3c06aSMatthew G. Knepley /* A tetrahedron: {0, a, c, d} */ 28766ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 0); /* A */ 28776ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 28786ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 0); /* A */ 28796ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 28806ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 0); /* A */ 28816ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 28826ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 0; 28836ce3c06aSMatthew G. Knepley orntNew[3] = 0; 28846ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 28856ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 28866ce3c06aSMatthew G. Knepley #if 1 28876ce3c06aSMatthew 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); 28886ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 28896ce3c06aSMatthew 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); 28906ce3c06aSMatthew G. Knepley } 28916ce3c06aSMatthew G. Knepley #endif 28926ce3c06aSMatthew G. Knepley /* B tetrahedron: {a, 1, b, e} */ 28936ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 1); /* B */ 28946ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 28956ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 2); /* C */ 28966ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 28976ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 1; 28986ce3c06aSMatthew G. Knepley orntNew[2] = 0; 28996ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 1); /* B */ 29006ce3c06aSMatthew G. Knepley orntNew[3] = ornt[3]; 29016ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 29026ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 29036ce3c06aSMatthew G. Knepley #if 1 29046ce3c06aSMatthew 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); 29056ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 29066ce3c06aSMatthew 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); 29076ce3c06aSMatthew G. Knepley } 29086ce3c06aSMatthew G. Knepley #endif 29096ce3c06aSMatthew G. Knepley /* C tetrahedron: {c, b, 2, f} */ 29106ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], 2); /* C */ 29116ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 29126ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 2; 29136ce3c06aSMatthew G. Knepley orntNew[1] = 0; 29146ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 1); /* B */ 29156ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 29166ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 0); /* A */ 29176ce3c06aSMatthew G. Knepley orntNew[3] = ornt[3]; 29186ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 29196ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 29206ce3c06aSMatthew G. Knepley #if 1 29216ce3c06aSMatthew 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); 29226ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 29236ce3c06aSMatthew 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); 29246ce3c06aSMatthew G. Knepley } 29256ce3c06aSMatthew G. Knepley #endif 29266ce3c06aSMatthew G. Knepley /* D tetrahedron: {d, e, f, 3} */ 29276ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 3; 29286ce3c06aSMatthew G. Knepley orntNew[0] = 0; 29296ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], 1); /* B */ 29306ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 29316ce3c06aSMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetTriSubface_Static(ornt[2], 2); /* C */ 29326ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 29336ce3c06aSMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetTriSubface_Static(ornt[3], 2); /* C */ 29346ce3c06aSMatthew G. Knepley orntNew[3] = ornt[3]; 29356ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 29366ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 29376ce3c06aSMatthew G. Knepley #if 1 29386ce3c06aSMatthew 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); 29396ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 29406ce3c06aSMatthew 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); 29416ce3c06aSMatthew G. Knepley } 29426ce3c06aSMatthew G. Knepley #endif 29436ce3c06aSMatthew G. Knepley /* A' tetrahedron: {d, a, c, f} */ 29446ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 0; 29456ce3c06aSMatthew G. Knepley orntNew[0] = -3; 29469ddff745SMatthew G. Knepley coneNew[1] = fStartNew + (cone[2] - fStart)*4 + 3; 29479ddff745SMatthew G. Knepley orntNew[1] = ornt[2] < 0 ? -(GetTetSomething_Static(ornt[2], 0)+1) : GetTetSomething_Static(ornt[2], 0); 29489ddff745SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 5; 29499ddff745SMatthew G. Knepley orntNew[2] = 0; 29509ddff745SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 4; 29519ddff745SMatthew G. Knepley orntNew[3] = 2; 29526ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 29536ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 29546ce3c06aSMatthew G. Knepley #if 1 29556ce3c06aSMatthew 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); 29566ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 29576ce3c06aSMatthew 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); 29586ce3c06aSMatthew G. Knepley } 29596ce3c06aSMatthew G. Knepley #endif 29606ce3c06aSMatthew G. Knepley /* B' tetrahedron: {e, b, a, f} */ 29616ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 1; 29626ce3c06aSMatthew G. Knepley orntNew[0] = -3; 29639ddff745SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 6; 29649ddff745SMatthew G. Knepley orntNew[1] = 1; 29659ddff745SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 7; 29666ce3c06aSMatthew G. Knepley orntNew[2] = 0; 29679ddff745SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + 3; 29689ddff745SMatthew G. Knepley orntNew[3] = ornt[3] < 0 ? -(GetTetSomething_Static(ornt[3], 0)+1) : GetTetSomething_Static(ornt[3], 0); 29696ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 29706ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 29716ce3c06aSMatthew G. Knepley #if 1 29726ce3c06aSMatthew 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); 29736ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 29746ce3c06aSMatthew 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); 29756ce3c06aSMatthew G. Knepley } 29766ce3c06aSMatthew G. Knepley #endif 29776ce3c06aSMatthew G. Knepley /* C' tetrahedron: {b, f, c, a} */ 29786ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 2; 29796ce3c06aSMatthew G. Knepley orntNew[0] = -3; 29809ddff745SMatthew G. Knepley coneNew[1] = fStartNew + (cone[0] - fStart)*4 + 3; 29819ddff745SMatthew G. Knepley orntNew[1] = ornt[0] < 0 ? -(GetTetSomething_Static(ornt[0], 2)+1) : GetTetSomething_Static(ornt[0], 2); 29829ddff745SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 5; 29839ddff745SMatthew G. Knepley orntNew[2] = -3; 29849ddff745SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 7; 29859ddff745SMatthew G. Knepley orntNew[3] = -2; 29866ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 29876ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 29886ce3c06aSMatthew G. Knepley #if 1 29896ce3c06aSMatthew 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); 29906ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 29916ce3c06aSMatthew 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); 29926ce3c06aSMatthew G. Knepley } 29936ce3c06aSMatthew G. Knepley #endif 29946ce3c06aSMatthew G. Knepley /* D' tetrahedron: {f, e, d, a} */ 29956ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 3; 29966ce3c06aSMatthew G. Knepley orntNew[0] = -3; 29979ddff745SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 4; 29986ce3c06aSMatthew G. Knepley orntNew[1] = -3; 29999ddff745SMatthew G. Knepley coneNew[2] = fStartNew + (cone[1] - fStart)*4 + 3; 30009ddff745SMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -(GetTetSomething_Static(ornt[1], 0)+1) : GetTetSomething_Static(ornt[1], 0); 30019ddff745SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 6; 30029ddff745SMatthew G. Knepley orntNew[3] = -3; 30036ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 30046ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 30056ce3c06aSMatthew G. Knepley #if 1 30066ce3c06aSMatthew 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); 30076ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 30086ce3c06aSMatthew 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); 30096ce3c06aSMatthew G. Knepley } 30106ce3c06aSMatthew G. Knepley #endif 30116ce3c06aSMatthew G. Knepley } 30126ce3c06aSMatthew G. Knepley /* Hybrid cells have 5 faces */ 30136ce3c06aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 30146ce3c06aSMatthew G. Knepley const PetscInt newp = cStartNew + (cMax - cStart)*8 + (c - cMax)*4; 3015d3a1cc75SMatthew G. Knepley const PetscInt *cone, *ornt, *fornt; 30163b61eb6dSMatthew G. Knepley PetscInt coneNew[5], orntNew[5], o, of, i; 30176ce3c06aSMatthew G. Knepley 30186ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 30196ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 3020d3a1cc75SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, cone[0], &fornt);CHKERRQ(ierr); 3021084f9c62SMatthew G. Knepley o = ornt[0] < 0 ? -1 : 1; 30226ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 30236ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetTriSubface_Static(ornt[0], r); 30246ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 30256ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetTriSubface_Static(ornt[1], r); 30266ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 3027084f9c62SMatthew G. Knepley of = fornt[GetTriEdge_Static(ornt[0], r)] < 0 ? -1 : 1; 30283b61eb6dSMatthew G. Knepley i = GetTriEdgeInverse_Static(ornt[0], r) + 2; 30293b61eb6dSMatthew G. Knepley coneNew[i] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (cone[2+GetTriEdge_Static(ornt[0], r)] - fMax)*2 + (o*of < 0 ? 1 : 0); 30303b61eb6dSMatthew G. Knepley orntNew[i] = 0; 30313b61eb6dSMatthew G. Knepley i = GetTriEdgeInverse_Static(ornt[0], (r+1)%3) + 2; 30323b61eb6dSMatthew G. Knepley coneNew[i] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + GetTriSubface_Static(ornt[0], r); 30333b61eb6dSMatthew G. Knepley orntNew[i] = 0; 30343b61eb6dSMatthew G. Knepley of = fornt[GetTriEdge_Static(ornt[0], (r+2)%3)] < 0 ? -1 : 1; 30353b61eb6dSMatthew G. Knepley i = GetTriEdgeInverse_Static(ornt[0], (r+2)%3) + 2; 30363b61eb6dSMatthew G. Knepley coneNew[i] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (cone[2+GetTriEdge_Static(ornt[0], (r+2)%3)] - fMax)*2 + (o*of < 0 ? 0 : 1); 30373b61eb6dSMatthew G. Knepley orntNew[i] = 0; 30386ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+r, coneNew);CHKERRQ(ierr); 30396ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+r, orntNew);CHKERRQ(ierr); 30406ce3c06aSMatthew G. Knepley #if 1 30416ce3c06aSMatthew 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); 30426ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 30436ce3c06aSMatthew 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); 30446ce3c06aSMatthew G. Knepley } 30456ce3c06aSMatthew G. Knepley for (p = 2; p < 5; ++p) { 30466ce3c06aSMatthew 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); 30476ce3c06aSMatthew G. Knepley } 30486ce3c06aSMatthew G. Knepley #endif 30496ce3c06aSMatthew G. Knepley } 30506ce3c06aSMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + 3; 30516ce3c06aSMatthew G. Knepley orntNew[0] = 0; 30526ce3c06aSMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + 3; 30536ce3c06aSMatthew G. Knepley orntNew[1] = 0; 30543b61eb6dSMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + 1; 30556ce3c06aSMatthew G. Knepley orntNew[2] = 0; 30563b61eb6dSMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + 2; 30576ce3c06aSMatthew G. Knepley orntNew[3] = 0; 30583b61eb6dSMatthew G. Knepley coneNew[4] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3 + 0; 30596ce3c06aSMatthew G. Knepley orntNew[4] = 0; 30606ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 30616ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 30626ce3c06aSMatthew G. Knepley #if 1 30636ce3c06aSMatthew 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); 30646ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 30656ce3c06aSMatthew 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); 30666ce3c06aSMatthew G. Knepley } 30676ce3c06aSMatthew G. Knepley for (p = 2; p < 5; ++p) { 30686ce3c06aSMatthew 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); 30696ce3c06aSMatthew G. Knepley } 30706ce3c06aSMatthew G. Knepley #endif 30716ce3c06aSMatthew G. Knepley } 30726ce3c06aSMatthew G. Knepley /* Split faces have 3 edges and the same cells as the parent */ 30736ce3c06aSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 3074785e854fSJed Brown ierr = PetscMalloc1((2 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 30756ce3c06aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 30766ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4; 30776ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 30786ce3c06aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3], coneSize, supportSize, s; 30796ce3c06aSMatthew G. Knepley 30806ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 30816ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 30826ce3c06aSMatthew G. Knepley /* A triangle */ 30836ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1 : 0); 30846ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 30856ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 2; 30866ce3c06aSMatthew G. Knepley orntNew[1] = -2; 30876ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 0 : 1); 30886ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 30896ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 30906ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 30916ce3c06aSMatthew G. Knepley #if 1 30926ce3c06aSMatthew 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); 30936ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 30946ce3c06aSMatthew 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); 30956ce3c06aSMatthew G. Knepley } 30966ce3c06aSMatthew G. Knepley #endif 30976ce3c06aSMatthew G. Knepley /* B triangle */ 30986ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 0 : 1); 30996ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 31006ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1 : 0); 31016ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 31026ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 0; 31036ce3c06aSMatthew G. Knepley orntNew[2] = -2; 31046ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 31056ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 31066ce3c06aSMatthew G. Knepley #if 1 31076ce3c06aSMatthew 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); 31086ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 31096ce3c06aSMatthew 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); 31106ce3c06aSMatthew G. Knepley } 31116ce3c06aSMatthew G. Knepley #endif 31126ce3c06aSMatthew G. Knepley /* C triangle */ 31136ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 1; 31146ce3c06aSMatthew G. Knepley orntNew[0] = -2; 31156ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 0 : 1); 31166ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 31176ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (cone[2] - eStart)*2 + (ornt[2] < 0 ? 1 : 0); 31186ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2]; 31196ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 31206ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 31216ce3c06aSMatthew G. Knepley #if 1 31226ce3c06aSMatthew 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); 31236ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 31246ce3c06aSMatthew 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); 31256ce3c06aSMatthew G. Knepley } 31266ce3c06aSMatthew G. Knepley #endif 31276ce3c06aSMatthew G. Knepley /* D triangle */ 31286ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 0; 31296ce3c06aSMatthew G. Knepley orntNew[0] = 0; 31306ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 1; 31316ce3c06aSMatthew G. Knepley orntNew[1] = 0; 31326ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + 2; 31336ce3c06aSMatthew G. Knepley orntNew[2] = 0; 31346ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 31356ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 31366ce3c06aSMatthew G. Knepley #if 1 31376ce3c06aSMatthew 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); 31386ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 31396ce3c06aSMatthew 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); 31406ce3c06aSMatthew G. Knepley } 31416ce3c06aSMatthew G. Knepley #endif 31426ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 31436ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 31446ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 31456ce3c06aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 31469ddff745SMatthew G. Knepley PetscInt subf; 31476ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 31486ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 31496ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 31506ce3c06aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 31516ce3c06aSMatthew G. Knepley if (cone[c] == f) break; 31526ce3c06aSMatthew G. Knepley } 31539ddff745SMatthew G. Knepley subf = GetTriSubfaceInverse_Static(ornt[c], r); 31546ce3c06aSMatthew G. Knepley if (support[s] < cMax) { 31559ddff745SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*8 + (r==3 ? (c+2)%4 + 4 : faces[c*3+subf]); 31566ce3c06aSMatthew G. Knepley } else { 31579ddff745SMatthew G. Knepley supportRef[s] = cStartNew + (cMax - cStart)*8 + (support[s] - cMax)*4 + (r==3 ? r : subf); 31586ce3c06aSMatthew G. Knepley } 31596ce3c06aSMatthew G. Knepley } 31606ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportRef);CHKERRQ(ierr); 31616ce3c06aSMatthew G. Knepley #if 1 31629ddff745SMatthew G. Knepley if ((newp+r < fStartNew) || (newp+r >= fMaxNew)) SETERRQ3(PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Point %d is not a face [%d, %d)", newp+r, fStartNew, fMaxNew); 31636ce3c06aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 31646ce3c06aSMatthew 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); 31656ce3c06aSMatthew G. Knepley } 31666ce3c06aSMatthew G. Knepley #endif 31676ce3c06aSMatthew G. Knepley } 31686ce3c06aSMatthew G. Knepley } 31696ce3c06aSMatthew G. Knepley /* Interior cell faces have 3 edges and 2 cells */ 31706ce3c06aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 31716ce3c06aSMatthew G. Knepley PetscInt newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*8; 31726ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 31736ce3c06aSMatthew G. Knepley PetscInt coneNew[3], orntNew[3]; 31746ce3c06aSMatthew G. Knepley PetscInt supportNew[2]; 31756ce3c06aSMatthew G. Knepley 31766ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 31776ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 31786ce3c06aSMatthew G. Knepley /* Face A: {c, a, d} */ 31799ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 2); 31806ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 31819ddff745SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 2); 31826ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1] < 0 ? -2 : 0; 31839ddff745SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 2); 31846ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 31856ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 31866ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 31876ce3c06aSMatthew G. Knepley #if 1 31886ce3c06aSMatthew 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); 31896ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 31906ce3c06aSMatthew 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); 31916ce3c06aSMatthew G. Knepley } 31926ce3c06aSMatthew G. Knepley #endif 31936ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0; 31946ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 0+4; 31956ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 31966ce3c06aSMatthew G. Knepley #if 1 31976ce3c06aSMatthew 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); 31986ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 31996ce3c06aSMatthew 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); 32006ce3c06aSMatthew G. Knepley } 32016ce3c06aSMatthew G. Knepley #endif 32026ce3c06aSMatthew G. Knepley ++newp; 32036ce3c06aSMatthew G. Knepley /* Face B: {a, b, e} */ 32049ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 0); 32056ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 32069ddff745SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 0); 32076ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 32089ddff745SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 1); 32096ce3c06aSMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 32106ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 32116ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 32126ce3c06aSMatthew G. Knepley #if 1 32136ce3c06aSMatthew 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); 32146ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 32156ce3c06aSMatthew 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); 32166ce3c06aSMatthew G. Knepley } 32176ce3c06aSMatthew G. Knepley #endif 32186ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1; 32196ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 1+4; 32206ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 32216ce3c06aSMatthew G. Knepley #if 1 32226ce3c06aSMatthew 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); 32236ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 32246ce3c06aSMatthew 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); 32256ce3c06aSMatthew G. Knepley } 32266ce3c06aSMatthew G. Knepley #endif 32276ce3c06aSMatthew G. Knepley ++newp; 32286ce3c06aSMatthew G. Knepley /* Face C: {c, f, b} */ 32299ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 0); 32306ce3c06aSMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? -2 : 0; 32319ddff745SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 2); 32326ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 32339ddff745SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 1); 32346ce3c06aSMatthew G. Knepley orntNew[2] = ornt[0] < 0 ? -2 : 0; 32356ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 32366ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 32376ce3c06aSMatthew G. Knepley #if 1 32386ce3c06aSMatthew 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); 32396ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 32406ce3c06aSMatthew 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); 32416ce3c06aSMatthew G. Knepley } 32426ce3c06aSMatthew G. Knepley #endif 32436ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 2; 32446ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 32456ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 32466ce3c06aSMatthew G. Knepley #if 1 32476ce3c06aSMatthew 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); 32486ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 32496ce3c06aSMatthew 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); 32506ce3c06aSMatthew G. Knepley } 32516ce3c06aSMatthew G. Knepley #endif 32526ce3c06aSMatthew G. Knepley ++newp; 32536ce3c06aSMatthew G. Knepley /* Face D: {d, e, f} */ 32549ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 0); 32556ce3c06aSMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 32569ddff745SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 1); 32576ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? -2 : 0; 32589ddff745SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 1); 32596ce3c06aSMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? -2 : 0; 32606ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 32616ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 32626ce3c06aSMatthew G. Knepley #if 1 32636ce3c06aSMatthew 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); 32646ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 32656ce3c06aSMatthew 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); 32666ce3c06aSMatthew G. Knepley } 32676ce3c06aSMatthew G. Knepley #endif 32686ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 3; 32696ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 32706ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 32716ce3c06aSMatthew G. Knepley #if 1 32726ce3c06aSMatthew 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); 32736ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 32746ce3c06aSMatthew 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); 32756ce3c06aSMatthew G. Knepley } 32766ce3c06aSMatthew G. Knepley #endif 32776ce3c06aSMatthew G. Knepley ++newp; 32786ce3c06aSMatthew G. Knepley /* Face E: {d, f, a} */ 32799ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 1); 32806ce3c06aSMatthew G. Knepley orntNew[0] = ornt[2] < 0 ? 0 : -2; 32816ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 32829ddff745SMatthew G. Knepley orntNew[1] = -2; 32839ddff745SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 2); 32846ce3c06aSMatthew G. Knepley orntNew[2] = ornt[1] < 0 ? -2 : 0; 32856ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 32866ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 32876ce3c06aSMatthew G. Knepley #if 1 32886ce3c06aSMatthew 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); 32896ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 32906ce3c06aSMatthew 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); 32916ce3c06aSMatthew G. Knepley } 32926ce3c06aSMatthew G. Knepley #endif 32936ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 32946ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 32956ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 32966ce3c06aSMatthew G. Knepley #if 1 32976ce3c06aSMatthew 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); 32986ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 32996ce3c06aSMatthew 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); 33006ce3c06aSMatthew G. Knepley } 33016ce3c06aSMatthew G. Knepley #endif 33026ce3c06aSMatthew G. Knepley ++newp; 33036ce3c06aSMatthew G. Knepley /* Face F: {c, a, f} */ 33049ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 2); 33056ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 33066ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 33079ddff745SMatthew G. Knepley orntNew[1] = 0; 33089ddff745SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*3 + GetTetSomething_Static(ornt[2], 0); 33099ddff745SMatthew G. Knepley orntNew[2] = ornt[2] < 0 ? 0 : -2; 33106ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 33116ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 33126ce3c06aSMatthew G. Knepley #if 1 33136ce3c06aSMatthew 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); 33146ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 33156ce3c06aSMatthew 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); 33166ce3c06aSMatthew G. Knepley } 33176ce3c06aSMatthew G. Knepley #endif 33186ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 0+4; 33196ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 33206ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 33216ce3c06aSMatthew G. Knepley #if 1 33226ce3c06aSMatthew 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); 33236ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 33246ce3c06aSMatthew 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); 33256ce3c06aSMatthew G. Knepley } 33266ce3c06aSMatthew G. Knepley #endif 33276ce3c06aSMatthew G. Knepley ++newp; 33286ce3c06aSMatthew G. Knepley /* Face G: {e, a, f} */ 33299ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + GetTetSomething_Static(ornt[1], 1); 33306ce3c06aSMatthew G. Knepley orntNew[0] = ornt[1] < 0 ? -2 : 0; 33316ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 33329ddff745SMatthew G. Knepley orntNew[1] = 0; 33339ddff745SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 1); 33346ce3c06aSMatthew G. Knepley orntNew[2] = ornt[3] < 0 ? 0 : -2; 33356ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 33366ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 33376ce3c06aSMatthew G. Knepley #if 1 33386ce3c06aSMatthew 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); 33396ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 33406ce3c06aSMatthew 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); 33416ce3c06aSMatthew G. Knepley } 33426ce3c06aSMatthew G. Knepley #endif 33436ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 33446ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 3+4; 33456ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 33466ce3c06aSMatthew G. Knepley #if 1 33476ce3c06aSMatthew 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); 33486ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 33496ce3c06aSMatthew 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); 33506ce3c06aSMatthew G. Knepley } 33516ce3c06aSMatthew G. Knepley #endif 33526ce3c06aSMatthew G. Knepley ++newp; 33536ce3c06aSMatthew G. Knepley /* Face H: {a, b, f} */ 33549ddff745SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + GetTetSomething_Static(ornt[0], 0); 33556ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0] < 0 ? -2 : 0; 33569ddff745SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*3 + GetTetSomething_Static(ornt[3], 2); 33576ce3c06aSMatthew G. Knepley orntNew[1] = ornt[3] < 0 ? 0 : -2; 33586ce3c06aSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 33599ddff745SMatthew G. Knepley orntNew[2] = -2; 33606ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 33616ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 33626ce3c06aSMatthew G. Knepley #if 1 33636ce3c06aSMatthew 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); 33646ce3c06aSMatthew G. Knepley for (p = 0; p < 3; ++p) { 33656ce3c06aSMatthew 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); 33666ce3c06aSMatthew G. Knepley } 33676ce3c06aSMatthew G. Knepley #endif 33686ce3c06aSMatthew G. Knepley supportNew[0] = (c - cStart)*8 + 1+4; 33696ce3c06aSMatthew G. Knepley supportNew[1] = (c - cStart)*8 + 2+4; 33706ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 33716ce3c06aSMatthew G. Knepley #if 1 33726ce3c06aSMatthew 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); 33736ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 33746ce3c06aSMatthew 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); 33756ce3c06aSMatthew G. Knepley } 33766ce3c06aSMatthew G. Knepley #endif 33776ce3c06aSMatthew G. Knepley ++newp; 33786ce3c06aSMatthew G. Knepley } 33796ce3c06aSMatthew G. Knepley /* Hybrid split faces have 4 edges and same cells */ 33806ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 33816ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 33826ce3c06aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 33836ce3c06aSMatthew G. Knepley PetscInt supportNew[2], size, s, c; 33846ce3c06aSMatthew G. Knepley 33856ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 33866ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 33876ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 33886ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 33896ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 33906ce3c06aSMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + r; 33916ce3c06aSMatthew G. Knepley 33926ce3c06aSMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1-r : r); 33936ce3c06aSMatthew G. Knepley orntNew[0] = ornt[0]; 33946ce3c06aSMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1-r : r); 33956ce3c06aSMatthew G. Knepley orntNew[1] = ornt[1]; 33966ce3c06aSMatthew G. Knepley coneNew[2+r] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (cone[2+r] - eMax); 33976ce3c06aSMatthew G. Knepley orntNew[2+r] = 0; 33986ce3c06aSMatthew G. Knepley coneNew[3-r] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (f - fMax); 33996ce3c06aSMatthew G. Knepley orntNew[3-r] = 0; 34006ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 34016ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 34026ce3c06aSMatthew G. Knepley #if 1 34036ce3c06aSMatthew 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); 34046ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 34056ce3c06aSMatthew 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); 34066ce3c06aSMatthew G. Knepley } 34076ce3c06aSMatthew G. Knepley for (p = 2; p < 4; ++p) { 34086ce3c06aSMatthew 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); 34096ce3c06aSMatthew G. Knepley } 34106ce3c06aSMatthew G. Knepley #endif 34116ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 3412d3a1cc75SMatthew G. Knepley const PetscInt *coneCell, *orntCell, *fornt; 3413084f9c62SMatthew G. Knepley PetscInt o, of; 34146ce3c06aSMatthew G. Knepley 34156ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &coneCell);CHKERRQ(ierr); 34166ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &orntCell);CHKERRQ(ierr); 3417084f9c62SMatthew G. Knepley o = orntCell[0] < 0 ? -1 : 1; 34186ce3c06aSMatthew G. Knepley for (c = 2; c < 5; ++c) if (coneCell[c] == f) break; 34196ce3c06aSMatthew 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]); 3420d3a1cc75SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, coneCell[0], &fornt);CHKERRQ(ierr); 3421084f9c62SMatthew G. Knepley of = fornt[c-2] < 0 ? -1 : 1; 3422084f9c62SMatthew G. Knepley supportNew[s] = cStartNew + (cMax - cStart)*8 + (support[s] - cMax)*4 + (GetTriEdgeInverse_Static(orntCell[0], c-2) + (o*of < 0 ? 1-r : r))%3; 34236ce3c06aSMatthew G. Knepley } 34246ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 34256ce3c06aSMatthew G. Knepley #if 1 34266ce3c06aSMatthew 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); 34276ce3c06aSMatthew G. Knepley for (p = 0; p < size; ++p) { 34286ce3c06aSMatthew 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); 34296ce3c06aSMatthew G. Knepley } 34306ce3c06aSMatthew G. Knepley #endif 34316ce3c06aSMatthew G. Knepley } 34326ce3c06aSMatthew G. Knepley } 34336ce3c06aSMatthew G. Knepley /* Hybrid cell faces have 4 edges and 2 cells */ 34346ce3c06aSMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 34356ce3c06aSMatthew G. Knepley PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (c - cMax)*3; 34366ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 34376ce3c06aSMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 34386ce3c06aSMatthew G. Knepley PetscInt supportNew[2]; 34396ce3c06aSMatthew G. Knepley 34406ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 34416ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 34426ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 3443b598a9d5SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*3 + (r+2)%3; 34446ce3c06aSMatthew G. Knepley orntNew[0] = 0; 3445b598a9d5SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*3 + (r+2)%3; 34466ce3c06aSMatthew G. Knepley orntNew[1] = 0; 3447b598a9d5SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (cone[2+(r+2)%3] - fMax); 34486ce3c06aSMatthew G. Knepley orntNew[2] = 0; 3449b598a9d5SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (cone[2+r] - fMax); 34506ce3c06aSMatthew G. Knepley orntNew[3] = 0; 34516ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+r, coneNew);CHKERRQ(ierr); 34526ce3c06aSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+r, orntNew);CHKERRQ(ierr); 34536ce3c06aSMatthew G. Knepley #if 1 34546ce3c06aSMatthew 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); 34556ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 34566ce3c06aSMatthew 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); 34576ce3c06aSMatthew G. Knepley } 34586ce3c06aSMatthew G. Knepley for (p = 2; p < 4; ++p) { 34596ce3c06aSMatthew 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); 34606ce3c06aSMatthew G. Knepley } 34616ce3c06aSMatthew G. Knepley #endif 34626ce3c06aSMatthew G. Knepley supportNew[0] = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + GetTriSubface_Static(ornt[0], r); 34636ce3c06aSMatthew G. Knepley supportNew[1] = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + 3; 34646ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportNew);CHKERRQ(ierr); 34656ce3c06aSMatthew G. Knepley #if 1 34666ce3c06aSMatthew 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); 34676ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 34686ce3c06aSMatthew 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); 34696ce3c06aSMatthew G. Knepley } 34706ce3c06aSMatthew G. Knepley #endif 34716ce3c06aSMatthew G. Knepley } 34726ce3c06aSMatthew G. Knepley } 34736ce3c06aSMatthew G. Knepley /* Interior split edges have 2 vertices and the same faces as the parent */ 34746ce3c06aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 34756ce3c06aSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 34766ce3c06aSMatthew G. Knepley 34776ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 34786ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 34796ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 34806ce3c06aSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 34816ce3c06aSMatthew G. Knepley 34826ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 34836ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 34846ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 34856ce3c06aSMatthew G. Knepley coneNew[(r+1)%2] = newv; 34866ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 34876ce3c06aSMatthew G. Knepley #if 1 34886ce3c06aSMatthew 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); 34896ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 34906ce3c06aSMatthew 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); 34916ce3c06aSMatthew G. Knepley } 34926ce3c06aSMatthew G. Knepley #endif 34936ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 34946ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 34956ce3c06aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 34966ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 34976ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 34986ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 34996ce3c06aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) if (cone[c] == e) break; 35006ce3c06aSMatthew G. Knepley if (support[s] < fMax) { 35016ce3c06aSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (c + (ornt[c] < 0 ? 1-r : r))%3; 35026ce3c06aSMatthew G. Knepley } else { 35036ce3c06aSMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (support[s] - fMax)*2 + (ornt[c] < 0 ? 1-r : r); 35046ce3c06aSMatthew G. Knepley } 35056ce3c06aSMatthew G. Knepley } 35066ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 35076ce3c06aSMatthew G. Knepley #if 1 35086ce3c06aSMatthew 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); 35096ce3c06aSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 35106ce3c06aSMatthew 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); 35116ce3c06aSMatthew G. Knepley } 35126ce3c06aSMatthew G. Knepley #endif 35136ce3c06aSMatthew G. Knepley } 35146ce3c06aSMatthew G. Knepley } 35156ce3c06aSMatthew G. Knepley /* Interior face edges have 2 vertices and 2+cells*(1/2) faces */ 35166ce3c06aSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 35176ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 35186ce3c06aSMatthew G. Knepley PetscInt coneSize, supportSize, s; 35196ce3c06aSMatthew G. Knepley 35206ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 35216ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 35226ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 35236ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (f - fStart)*3 + r; 35246ce3c06aSMatthew G. Knepley PetscInt coneNew[2], intFaces = 0, er, eint[4] = {1, 0, 2, 0}; 35256ce3c06aSMatthew G. Knepley PetscInt fint[24] = { 1, 7, -1, -1, 0, 5, 35266ce3c06aSMatthew G. Knepley -1, -1, 1, 6, 0, 4, 35276ce3c06aSMatthew G. Knepley 2, 5, 3, 4, -1, -1, 35286ce3c06aSMatthew G. Knepley -1, -1, 3, 6, 2, 7}; 35296ce3c06aSMatthew G. Knepley 35306ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 35316ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[(r+0)%3] - eStart); 35326ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[(r+1)%3] - eStart); 35336ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 35346ce3c06aSMatthew G. Knepley #if 1 35356ce3c06aSMatthew 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); 35366ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 35376ce3c06aSMatthew 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); 35386ce3c06aSMatthew G. Knepley } 35396ce3c06aSMatthew G. Knepley #endif 35406ce3c06aSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + (r+1)%3; 35416ce3c06aSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + 3; 35426ce3c06aSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 35436ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 35446ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 35456ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 35466ce3c06aSMatthew G. Knepley for (c = 0; c < coneSize; ++c) {if (cone[c] == f) break;} 35476ce3c06aSMatthew G. Knepley if (support[s] < cMax) { 35486ce3c06aSMatthew G. Knepley /* Here we want to determine whether edge newp contains a vertex which is part of the cross-tet edge */ 35499ddff745SMatthew G. Knepley er = GetTetSomethingInverse_Static(ornt[c], r); 35506ce3c06aSMatthew G. Knepley if (er == eint[c]) { 35516ce3c06aSMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (support[s] - cStart)*8 + (c + 2)%4; 35526ce3c06aSMatthew G. Knepley } else { 35536ce3c06aSMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 0]; 35546ce3c06aSMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (support[s] - cStart)*8 + fint[(c*3 + er)*2 + 1]; 35556ce3c06aSMatthew G. Knepley } 35566ce3c06aSMatthew G. Knepley } else { 3557b598a9d5SMatthew G. Knepley supportRef[2+intFaces++] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (support[s] - cMax)*3 + (r + 1)%3; 35586ce3c06aSMatthew G. Knepley } 35596ce3c06aSMatthew G. Knepley } 35606ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 35616ce3c06aSMatthew G. Knepley #if 1 35626ce3c06aSMatthew 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); 35636ce3c06aSMatthew G. Knepley for (p = 0; p < intFaces; ++p) { 35646ce3c06aSMatthew 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); 35656ce3c06aSMatthew G. Knepley } 35666ce3c06aSMatthew G. Knepley #endif 35676ce3c06aSMatthew G. Knepley } 35686ce3c06aSMatthew G. Knepley } 35696ce3c06aSMatthew G. Knepley /* Interior cell edges have 2 vertices and 4 faces */ 35706ce3c06aSMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 35716ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (c - cStart); 35726ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt, *fcone; 35736ce3c06aSMatthew G. Knepley PetscInt coneNew[2], supportNew[4], find; 35746ce3c06aSMatthew G. Knepley 35756ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 35766ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 35776ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &fcone);CHKERRQ(ierr); 35786ce3c06aSMatthew G. Knepley find = GetTriEdge_Static(ornt[0], 0); 35796ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 35806ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &fcone);CHKERRQ(ierr); 35816ce3c06aSMatthew G. Knepley find = GetTriEdge_Static(ornt[2], 1); 35826ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (fcone[find] - eStart); 35836ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 35846ce3c06aSMatthew G. Knepley #if 1 35856ce3c06aSMatthew 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); 35866ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 35876ce3c06aSMatthew 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); 35886ce3c06aSMatthew G. Knepley } 35896ce3c06aSMatthew G. Knepley #endif 35906ce3c06aSMatthew G. Knepley supportNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 4; 35916ce3c06aSMatthew G. Knepley supportNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 5; 35926ce3c06aSMatthew G. Knepley supportNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 6; 35936ce3c06aSMatthew G. Knepley supportNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*8 + 7; 35946ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 35956ce3c06aSMatthew G. Knepley #if 1 35966ce3c06aSMatthew 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); 35976ce3c06aSMatthew G. Knepley for (p = 0; p < 4; ++p) { 35986ce3c06aSMatthew 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); 35996ce3c06aSMatthew G. Knepley } 36006ce3c06aSMatthew G. Knepley #endif 36016ce3c06aSMatthew G. Knepley } 36026ce3c06aSMatthew G. Knepley /* Hybrid edges have two vertices and the same faces */ 36036ce3c06aSMatthew G. Knepley for (e = eMax; e < eEnd; ++e) { 36046ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (e - eMax); 36056ce3c06aSMatthew G. Knepley const PetscInt *cone, *support, *fcone; 36066ce3c06aSMatthew G. Knepley PetscInt coneNew[2], size, fsize, s; 36076ce3c06aSMatthew G. Knepley 36086ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 36096ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 36106ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 36116ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 36126ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 36136ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 36146ce3c06aSMatthew G. Knepley #if 1 36156ce3c06aSMatthew 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); 36166ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 36176ce3c06aSMatthew 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); 36186ce3c06aSMatthew G. Knepley } 36196ce3c06aSMatthew G. Knepley #endif 36206ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 36216ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &fsize);CHKERRQ(ierr); 36226ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &fcone);CHKERRQ(ierr); 36236ce3c06aSMatthew G. Knepley for (c = 0; c < fsize; ++c) if (fcone[c] == e) break; 36246ce3c06aSMatthew 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]); 36256ce3c06aSMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (support[s] - fMax)*2 + c-2; 36266ce3c06aSMatthew G. Knepley } 36276ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 36286ce3c06aSMatthew G. Knepley #if 1 36296ce3c06aSMatthew 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); 36306ce3c06aSMatthew G. Knepley for (p = 0; p < size; ++p) { 36316ce3c06aSMatthew 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); 36326ce3c06aSMatthew G. Knepley } 36336ce3c06aSMatthew G. Knepley #endif 36346ce3c06aSMatthew G. Knepley } 36356ce3c06aSMatthew G. Knepley /* Hybrid face edges have 2 vertices and 2+2*cells faces */ 36366ce3c06aSMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 36376ce3c06aSMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (f - fMax); 3638623f4348SMatthew G. Knepley const PetscInt *cone, *support, *ccone, *cornt; 36396ce3c06aSMatthew G. Knepley PetscInt coneNew[2], size, csize, s; 36406ce3c06aSMatthew G. Knepley 36416ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 36426ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 36436ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 36446ce3c06aSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[0] - eStart); 36456ce3c06aSMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[1] - eStart); 36466ce3c06aSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 36476ce3c06aSMatthew G. Knepley #if 1 36486ce3c06aSMatthew 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); 36496ce3c06aSMatthew G. Knepley for (p = 0; p < 2; ++p) { 36506ce3c06aSMatthew 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); 36516ce3c06aSMatthew G. Knepley } 36526ce3c06aSMatthew G. Knepley #endif 36536ce3c06aSMatthew G. Knepley supportRef[0] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + 0; 36546ce3c06aSMatthew G. Knepley supportRef[1] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (f - fMax)*2 + 1; 36556ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 36566ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &csize);CHKERRQ(ierr); 36576ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &ccone);CHKERRQ(ierr); 3658623f4348SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &cornt);CHKERRQ(ierr); 36596ce3c06aSMatthew G. Knepley for (c = 0; c < csize; ++c) if (ccone[c] == f) break; 36606ce3c06aSMatthew 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]); 3661b598a9d5SMatthew G. Knepley supportRef[2+s*2+0] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (support[s] - cMax)*3 + c-2; 3662b598a9d5SMatthew G. Knepley supportRef[2+s*2+1] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (support[s] - cMax)*3 + (c-1)%3; 36636ce3c06aSMatthew G. Knepley } 36646ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 36656ce3c06aSMatthew G. Knepley #if 1 36666ce3c06aSMatthew 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); 36676ce3c06aSMatthew G. Knepley for (p = 0; p < 2+size*2; ++p) { 36686ce3c06aSMatthew 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); 36696ce3c06aSMatthew G. Knepley } 36706ce3c06aSMatthew G. Knepley #endif 36716ce3c06aSMatthew G. Knepley } 36726ce3c06aSMatthew G. Knepley /* Interior vertices have identical supports */ 36736ce3c06aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 36746ce3c06aSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 36756ce3c06aSMatthew G. Knepley const PetscInt *support, *cone; 36766ce3c06aSMatthew G. Knepley PetscInt size, s; 36776ce3c06aSMatthew G. Knepley 36786ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 36796ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 36806ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 36816ce3c06aSMatthew G. Knepley PetscInt r = 0; 36826ce3c06aSMatthew G. Knepley 36836ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 36846ce3c06aSMatthew G. Knepley if (cone[1] == v) r = 1; 36856ce3c06aSMatthew G. Knepley if (support[s] < eMax) supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 36866ce3c06aSMatthew G. Knepley else supportRef[s] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (support[s] - eMax); 36876ce3c06aSMatthew G. Knepley } 36886ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 36896ce3c06aSMatthew G. Knepley #if 1 36906ce3c06aSMatthew 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); 36916ce3c06aSMatthew G. Knepley for (p = 0; p < size; ++p) { 36926ce3c06aSMatthew 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); 36936ce3c06aSMatthew G. Knepley } 36946ce3c06aSMatthew G. Knepley #endif 36956ce3c06aSMatthew G. Knepley } 36966ce3c06aSMatthew G. Knepley /* Interior edge vertices have 2 + interior face*2 + hybrid face + cells*0/1 supports */ 36976ce3c06aSMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 36986ce3c06aSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 36996ce3c06aSMatthew G. Knepley const PetscInt *cone, *support; 37006ce3c06aSMatthew G. Knepley PetscInt *star = NULL, starSize, faceSize = 0, cellSize = 0, coneSize, size, s; 37016ce3c06aSMatthew G. Knepley 37026ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 37036ce3c06aSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 37046ce3c06aSMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 37056ce3c06aSMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 37066ce3c06aSMatthew G. Knepley for (s = 0; s < size; ++s) { 37076ce3c06aSMatthew G. Knepley PetscInt r = 0; 37086ce3c06aSMatthew G. Knepley 37096ce3c06aSMatthew G. Knepley if (support[s] < fMax) { 37106ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 37116ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 37126ce3c06aSMatthew G. Knepley for (r = 0; r < coneSize; ++r) {if (cone[r] == e) break;} 37136ce3c06aSMatthew G. Knepley supportRef[2+faceSize+0] = eStartNew + (eMax - eStart)*2 + (support[s] - fStart)*3 + (r+0)%3; 37146ce3c06aSMatthew G. Knepley supportRef[2+faceSize+1] = eStartNew + (eMax - eStart)*2 + (support[s] - fStart)*3 + (r+2)%3; 37156ce3c06aSMatthew G. Knepley faceSize += 2; 37166ce3c06aSMatthew G. Knepley } else { 37176ce3c06aSMatthew G. Knepley supportRef[2+faceSize+0] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (support[s] - fMax); 37186ce3c06aSMatthew G. Knepley ++faceSize; 37196ce3c06aSMatthew G. Knepley } 37206ce3c06aSMatthew G. Knepley } 37216ce3c06aSMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 37226ce3c06aSMatthew G. Knepley for (s = 0; s < starSize*2; s += 2) { 37236ce3c06aSMatthew G. Knepley const PetscInt *cone, *ornt; 37246ce3c06aSMatthew G. Knepley PetscInt e01, e23; 37256ce3c06aSMatthew G. Knepley 37266ce3c06aSMatthew G. Knepley if ((star[s] >= cStart) && (star[s] < cMax)) { 37276ce3c06aSMatthew G. Knepley /* Check edge 0-1 */ 37286ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 37296ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 37306ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[0], &cone);CHKERRQ(ierr); 37316ce3c06aSMatthew G. Knepley e01 = cone[GetTriEdge_Static(ornt[0], 0)]; 37326ce3c06aSMatthew G. Knepley /* Check edge 2-3 */ 37336ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, star[s], &cone);CHKERRQ(ierr); 37346ce3c06aSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, star[s], &ornt);CHKERRQ(ierr); 37356ce3c06aSMatthew G. Knepley ierr = DMPlexGetCone(dm, cone[2], &cone);CHKERRQ(ierr); 37366ce3c06aSMatthew G. Knepley e23 = cone[GetTriEdge_Static(ornt[2], 1)]; 37376ce3c06aSMatthew G. Knepley if ((e01 == e) || (e23 == e)) {supportRef[2+faceSize+cellSize++] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (star[s] - cStart);} 37386ce3c06aSMatthew G. Knepley } 37396ce3c06aSMatthew G. Knepley } 37406ce3c06aSMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, e, PETSC_FALSE, &starSize, &star);CHKERRQ(ierr); 37416ce3c06aSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 37426ce3c06aSMatthew G. Knepley #if 1 37436ce3c06aSMatthew 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); 37446ce3c06aSMatthew G. Knepley for (p = 0; p < 2+faceSize+cellSize; ++p) { 37456ce3c06aSMatthew 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); 37466ce3c06aSMatthew G. Knepley } 37476ce3c06aSMatthew G. Knepley #endif 37486ce3c06aSMatthew G. Knepley } 37496ce3c06aSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 37506ce3c06aSMatthew G. Knepley ierr = DMPlexRestoreFaces_Internal(dm, 3, cStart, NULL, NULL, &faces);CHKERRQ(ierr); 37516ce3c06aSMatthew G. Knepley break; 37522eabf88fSMatthew G. Knepley case 6: 37532eabf88fSMatthew G. Knepley /* Hex 3D */ 37542eabf88fSMatthew G. Knepley /* 37552eabf88fSMatthew G. Knepley Bottom (viewed from top) Top 37562eabf88fSMatthew G. Knepley 1---------2---------2 7---------2---------6 37572eabf88fSMatthew G. Knepley | | | | | | 37582eabf88fSMatthew G. Knepley | B 2 C | | H 2 G | 37592eabf88fSMatthew G. Knepley | | | | | | 37602eabf88fSMatthew G. Knepley 3----3----0----1----1 3----3----0----1----1 37612eabf88fSMatthew G. Knepley | | | | | | 37622eabf88fSMatthew G. Knepley | A 0 D | | E 0 F | 37632eabf88fSMatthew G. Knepley | | | | | | 37642eabf88fSMatthew G. Knepley 0---------0---------3 4---------0---------5 37652eabf88fSMatthew G. Knepley */ 37662eabf88fSMatthew G. Knepley /* All cells have 6 faces: Bottom, Top, Front, Back, Right, Left */ 37672eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 37682eabf88fSMatthew G. Knepley const PetscInt newp = (c - cStart)*8; 37692eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt; 37702eabf88fSMatthew G. Knepley PetscInt coneNew[6], orntNew[6]; 37712eabf88fSMatthew G. Knepley 37722eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 37732eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 37742eabf88fSMatthew G. Knepley /* A hex */ 3775e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 0); 37762eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 37772eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 37782eabf88fSMatthew G. Knepley orntNew[1] = 0; 3779e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 0); 37802eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 37812eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 37822eabf88fSMatthew G. Knepley orntNew[3] = 0; 37832eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 37842eabf88fSMatthew G. Knepley orntNew[4] = 0; 3785e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 0); 37862eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 37872eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 37882eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 37892eabf88fSMatthew G. Knepley #if 1 37902eabf88fSMatthew 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); 37912eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 37922eabf88fSMatthew 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); 37932eabf88fSMatthew G. Knepley } 37942eabf88fSMatthew G. Knepley #endif 37952eabf88fSMatthew G. Knepley /* B hex */ 3796e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 1); 37972eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 37982eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 37992eabf88fSMatthew G. Knepley orntNew[1] = 0; 38002eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 3801a3cddbf8SMatthew G. Knepley orntNew[2] = -1; 3802e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 1); 38032eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 38042eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 38052eabf88fSMatthew G. Knepley orntNew[4] = 0; 3806e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 3); 38072eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 38082eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 38092eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 38102eabf88fSMatthew G. Knepley #if 1 38112eabf88fSMatthew 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); 38122eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 38132eabf88fSMatthew 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); 38142eabf88fSMatthew G. Knepley } 38152eabf88fSMatthew G. Knepley #endif 38162eabf88fSMatthew G. Knepley /* C hex */ 3817e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 2); 38182eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 38192eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 38202eabf88fSMatthew G. Knepley orntNew[1] = 0; 38212eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 3822a3cddbf8SMatthew G. Knepley orntNew[2] = -1; 3823e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 0); 38242eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 3825e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 1); 38262eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 38272eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 3828a3cddbf8SMatthew G. Knepley orntNew[5] = -4; 38292eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 38302eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 38312eabf88fSMatthew G. Knepley #if 1 38322eabf88fSMatthew 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); 38332eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 38342eabf88fSMatthew 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); 38352eabf88fSMatthew G. Knepley } 38362eabf88fSMatthew G. Knepley #endif 38372eabf88fSMatthew G. Knepley /* D hex */ 3838e3f8b1d6SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 3); 38392eabf88fSMatthew G. Knepley orntNew[0] = ornt[0]; 38402eabf88fSMatthew G. Knepley coneNew[1] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 38412eabf88fSMatthew G. Knepley orntNew[1] = 0; 3842e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 1); 38432eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 38442eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 3845a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 3846e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 0); 38472eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 38482eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 3849a3cddbf8SMatthew G. Knepley orntNew[5] = -4; 38502eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 38512eabf88fSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 38522eabf88fSMatthew G. Knepley #if 1 38532eabf88fSMatthew 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); 38542eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 38552eabf88fSMatthew 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); 38562eabf88fSMatthew G. Knepley } 38572eabf88fSMatthew G. Knepley #endif 38582eabf88fSMatthew G. Knepley /* E hex */ 38592eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 3860a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3861e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 0); 38622eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 3863e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 3); 38642eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 38652eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 38662eabf88fSMatthew G. Knepley orntNew[3] = 0; 38672eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 3868a3cddbf8SMatthew G. Knepley orntNew[4] = -1; 3869e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 1); 38702eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 3871b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 3872b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 38732eabf88fSMatthew G. Knepley #if 1 3874b164cbf2SMatthew 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); 38752eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 38762eabf88fSMatthew 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); 38772eabf88fSMatthew G. Knepley } 38782eabf88fSMatthew G. Knepley #endif 38792eabf88fSMatthew G. Knepley /* F hex */ 38802eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 3881a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3882e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 1); 38832eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 3884e3f8b1d6SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 2); 38852eabf88fSMatthew G. Knepley orntNew[2] = ornt[2]; 38862eabf88fSMatthew G. Knepley coneNew[3] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 3887a3cddbf8SMatthew G. Knepley orntNew[3] = -1; 3888e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 3); 38892eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 38902eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 3891a3cddbf8SMatthew G. Knepley orntNew[5] = 1; 3892b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 3893b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 38942eabf88fSMatthew G. Knepley #if 1 3895b164cbf2SMatthew 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); 38962eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 38972eabf88fSMatthew 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); 38982eabf88fSMatthew G. Knepley } 38992eabf88fSMatthew G. Knepley #endif 39002eabf88fSMatthew G. Knepley /* G hex */ 39012eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 3902a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3903e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 2); 39042eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 39052eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 3906a3cddbf8SMatthew G. Knepley orntNew[2] = 0; 3907e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 3); 39082eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 3909e3f8b1d6SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 2); 39102eabf88fSMatthew G. Knepley orntNew[4] = ornt[4]; 39112eabf88fSMatthew G. Knepley coneNew[5] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 3912a3cddbf8SMatthew G. Knepley orntNew[5] = -3; 3913b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 3914b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 39152eabf88fSMatthew G. Knepley #if 1 3916b164cbf2SMatthew 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); 39172eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 39182eabf88fSMatthew 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); 39192eabf88fSMatthew G. Knepley } 39202eabf88fSMatthew G. Knepley #endif 39212eabf88fSMatthew G. Knepley /* H hex */ 39222eabf88fSMatthew G. Knepley coneNew[0] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 3923a3cddbf8SMatthew G. Knepley orntNew[0] = -4; 3924e3f8b1d6SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 3); 39252eabf88fSMatthew G. Knepley orntNew[1] = ornt[1]; 39262eabf88fSMatthew G. Knepley coneNew[2] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 3927a3cddbf8SMatthew G. Knepley orntNew[2] = -1; 3928e3f8b1d6SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 2); 39292eabf88fSMatthew G. Knepley orntNew[3] = ornt[3]; 39302eabf88fSMatthew G. Knepley coneNew[4] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 3931a3cddbf8SMatthew G. Knepley orntNew[4] = 3; 3932e3f8b1d6SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 2); 39332eabf88fSMatthew G. Knepley orntNew[5] = ornt[5]; 3934b164cbf2SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 3935b164cbf2SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 39362eabf88fSMatthew G. Knepley #if 1 3937b164cbf2SMatthew 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); 39382eabf88fSMatthew G. Knepley for (p = 0; p < 6; ++p) { 39392eabf88fSMatthew 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); 39402eabf88fSMatthew G. Knepley } 39412eabf88fSMatthew G. Knepley #endif 39422eabf88fSMatthew G. Knepley } 39432eabf88fSMatthew G. Knepley /* Split faces have 4 edges and the same cells as the parent */ 39442eabf88fSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 3945785e854fSJed Brown ierr = PetscMalloc1((4 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 39462eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 39472eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 3948aaebbb9dSMatthew G. Knepley /* TODO: This can come from GetFaces_Internal() */ 39492eabf88fSMatthew 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}; 39502eabf88fSMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 39512eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 3952aaebbb9dSMatthew G. Knepley PetscInt coneNew[4], orntNew[4], coneSize, c, supportSize, s; 39532eabf88fSMatthew G. Knepley 39542eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 3955aaebbb9dSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 3956a3cddbf8SMatthew G. Knepley coneNew[(r+3)%4] = eStartNew + (cone[(r+3)%4] - eStart)*2 + (ornt[(r+3)%4] < 0 ? 0 : 1); 3957a3cddbf8SMatthew G. Knepley orntNew[(r+3)%4] = ornt[(r+3)%4]; 3958a3cddbf8SMatthew G. Knepley coneNew[(r+0)%4] = eStartNew + (cone[r] - eStart)*2 + (ornt[r] < 0 ? 1 : 0); 3959a3cddbf8SMatthew G. Knepley orntNew[(r+0)%4] = ornt[r]; 3960a3cddbf8SMatthew G. Knepley coneNew[(r+1)%4] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 3961a3cddbf8SMatthew G. Knepley orntNew[(r+1)%4] = 0; 3962a3cddbf8SMatthew G. Knepley coneNew[(r+2)%4] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + (r+3)%4; 3963a3cddbf8SMatthew G. Knepley orntNew[(r+2)%4] = -2; 39642eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 3965aaebbb9dSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 39662eabf88fSMatthew G. Knepley #if 1 39672eabf88fSMatthew 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); 39682eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 39692eabf88fSMatthew 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); 39702eabf88fSMatthew G. Knepley } 39712eabf88fSMatthew G. Knepley #endif 39722eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 39732eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 39742eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 39752eabf88fSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 39762eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 39772eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 39782eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 39792eabf88fSMatthew G. Knepley if (cone[c] == f) break; 39802eabf88fSMatthew G. Knepley } 3981a3cddbf8SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*8 + newCells[c*4+GetQuadSubfaceInverse_Static(ornt[c], r)]; 39822eabf88fSMatthew G. Knepley } 39832eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 39842eabf88fSMatthew G. Knepley #if 1 39852eabf88fSMatthew 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); 39862eabf88fSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 39872eabf88fSMatthew 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); 39882eabf88fSMatthew G. Knepley } 39892eabf88fSMatthew G. Knepley #endif 39902eabf88fSMatthew G. Knepley } 39912eabf88fSMatthew G. Knepley } 39922eabf88fSMatthew G. Knepley /* Interior faces have 4 edges and 2 cells */ 39932eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 39942eabf88fSMatthew 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}; 3995afb2665bSMatthew G. Knepley const PetscInt *cone, *ornt; 3996afb2665bSMatthew G. Knepley PetscInt newp, coneNew[4], orntNew[4], supportNew[2]; 39972eabf88fSMatthew G. Knepley 39982eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 3999afb2665bSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 4000afb2665bSMatthew G. Knepley /* A-D face */ 4001afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 0; 4002a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 3); 4003a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 4004a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 4005afb2665bSMatthew G. Knepley orntNew[1] = 0; 4006a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 4007a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 4008a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 0); 4009afb2665bSMatthew G. Knepley orntNew[3] = -2; 40102eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4011afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 40122eabf88fSMatthew G. Knepley #if 1 40132eabf88fSMatthew 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); 40142eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 40152eabf88fSMatthew 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); 40162eabf88fSMatthew G. Knepley } 40172eabf88fSMatthew G. Knepley #endif 4018afb2665bSMatthew G. Knepley /* C-D face */ 4019afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 1; 4020a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 2); 4021a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 4022a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 4023afb2665bSMatthew G. Knepley orntNew[1] = 0; 4024a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 4025a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 4026a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 0); 4027afb2665bSMatthew G. Knepley orntNew[3] = -2; 4028afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4029afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4030afb2665bSMatthew G. Knepley #if 1 4031afb2665bSMatthew 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); 4032afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4033afb2665bSMatthew 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); 4034afb2665bSMatthew G. Knepley } 4035afb2665bSMatthew G. Knepley #endif 4036afb2665bSMatthew G. Knepley /* B-C face */ 4037afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 2; 4038afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 1); 4039afb2665bSMatthew G. Knepley orntNew[0] = -2; 4040afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 0); 4041afb2665bSMatthew G. Knepley orntNew[1] = 0; 4042afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 4043afb2665bSMatthew G. Knepley orntNew[2] = 0; 4044afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 4045afb2665bSMatthew G. Knepley orntNew[3] = -2; 4046afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4047afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4048afb2665bSMatthew G. Knepley #if 1 4049afb2665bSMatthew 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); 4050afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4051afb2665bSMatthew 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); 4052afb2665bSMatthew G. Knepley } 4053afb2665bSMatthew G. Knepley #endif 4054afb2665bSMatthew G. Knepley /* A-B face */ 4055afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 3; 4056afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 0); 4057afb2665bSMatthew G. Knepley orntNew[0] = -2; 4058afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 3); 4059afb2665bSMatthew G. Knepley orntNew[1] = 0; 4060afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 4061afb2665bSMatthew G. Knepley orntNew[2] = 0; 4062afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 0; 4063afb2665bSMatthew G. Knepley orntNew[3] = -2; 4064afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4065afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4066afb2665bSMatthew G. Knepley #if 1 4067afb2665bSMatthew 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); 4068afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4069afb2665bSMatthew 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); 4070afb2665bSMatthew G. Knepley } 4071afb2665bSMatthew G. Knepley #endif 4072afb2665bSMatthew G. Knepley /* E-F face */ 4073afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 4; 4074a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 4075afb2665bSMatthew G. Knepley orntNew[0] = -2; 4076a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 2); 4077a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 4078a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 0); 4079afb2665bSMatthew G. Knepley orntNew[2] = 0; 4080a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 4081a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 4082afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4083afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4084afb2665bSMatthew G. Knepley #if 1 4085afb2665bSMatthew 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); 4086afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4087afb2665bSMatthew 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); 4088afb2665bSMatthew G. Knepley } 4089afb2665bSMatthew G. Knepley #endif 4090afb2665bSMatthew G. Knepley /* F-G face */ 4091afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 5; 4092a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 4093afb2665bSMatthew G. Knepley orntNew[0] = -2; 4094a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 2); 4095a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 4096a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 1); 4097afb2665bSMatthew G. Knepley orntNew[2] = 0; 4098a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 4099a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 4100afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4101afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4102afb2665bSMatthew G. Knepley #if 1 4103afb2665bSMatthew 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); 4104afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4105afb2665bSMatthew 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); 4106afb2665bSMatthew G. Knepley } 4107afb2665bSMatthew G. Knepley #endif 4108afb2665bSMatthew G. Knepley /* G-H face */ 4109afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 6; 4110afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 2); 4111afb2665bSMatthew G. Knepley orntNew[0] = -2; 4112afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 2); 4113afb2665bSMatthew G. Knepley orntNew[1] = 0; 4114afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 4115afb2665bSMatthew G. Knepley orntNew[2] = 0; 4116afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 4117afb2665bSMatthew G. Knepley orntNew[3] = -2; 4118afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4119afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4120afb2665bSMatthew G. Knepley #if 1 4121afb2665bSMatthew 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); 4122afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4123afb2665bSMatthew 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); 4124afb2665bSMatthew G. Knepley } 4125afb2665bSMatthew G. Knepley #endif 4126afb2665bSMatthew G. Knepley /* E-H face */ 4127afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 7; 4128a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 4129afb2665bSMatthew G. Knepley orntNew[0] = -2; 4130a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 1); 4131a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 4132a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 3); 4133afb2665bSMatthew G. Knepley orntNew[2] = 0; 4134a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 1; 4135a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 4136afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4137afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4138afb2665bSMatthew G. Knepley #if 1 4139afb2665bSMatthew 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); 4140afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4141afb2665bSMatthew 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); 4142afb2665bSMatthew G. Knepley } 4143afb2665bSMatthew G. Knepley #endif 4144afb2665bSMatthew G. Knepley /* A-E face */ 4145afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 8; 4146a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 3); 4147a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 4148a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 4149afb2665bSMatthew G. Knepley orntNew[1] = 0; 4150a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 4151a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 4152a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 0); 4153afb2665bSMatthew G. Knepley orntNew[3] = -2; 4154afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4155afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4156afb2665bSMatthew G. Knepley #if 1 4157afb2665bSMatthew 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); 4158afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4159afb2665bSMatthew 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); 4160afb2665bSMatthew G. Knepley } 4161afb2665bSMatthew G. Knepley #endif 4162afb2665bSMatthew G. Knepley /* D-F face */ 4163afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 9; 4164afb2665bSMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 1); 4165afb2665bSMatthew G. Knepley orntNew[0] = -2; 4166afb2665bSMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 3); 4167afb2665bSMatthew G. Knepley orntNew[1] = 0; 4168afb2665bSMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 4169afb2665bSMatthew G. Knepley orntNew[2] = 0; 4170afb2665bSMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 2; 4171afb2665bSMatthew G. Knepley orntNew[3] = -2; 4172afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4173afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4174afb2665bSMatthew G. Knepley #if 1 4175afb2665bSMatthew 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); 4176afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4177afb2665bSMatthew 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); 4178afb2665bSMatthew G. Knepley } 4179afb2665bSMatthew G. Knepley #endif 4180afb2665bSMatthew G. Knepley /* C-G face */ 4181afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 10; 4182a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 4; 4183afb2665bSMatthew G. Knepley orntNew[0] = -2; 4184a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 1); 4185a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 4186a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 3); 4187afb2665bSMatthew G. Knepley orntNew[2] = 0; 4188a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 4189a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 4190afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4191afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4192afb2665bSMatthew G. Knepley #if 1 4193afb2665bSMatthew 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); 4194afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4195afb2665bSMatthew 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); 4196afb2665bSMatthew G. Knepley } 4197afb2665bSMatthew G. Knepley #endif 4198afb2665bSMatthew G. Knepley /* B-H face */ 4199afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + 11; 4200a3cddbf8SMatthew G. Knepley coneNew[0] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 5; 4201a3cddbf8SMatthew G. Knepley orntNew[0] = 0; 4202a3cddbf8SMatthew G. Knepley coneNew[1] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + 3; 4203a3cddbf8SMatthew G. Knepley orntNew[1] = -2; 4204a3cddbf8SMatthew G. Knepley coneNew[2] = eStartNew + (eEnd - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 1); 4205a3cddbf8SMatthew G. Knepley orntNew[2] = -2; 4206a3cddbf8SMatthew G. Knepley coneNew[3] = eStartNew + (eEnd - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 2); 4207a3cddbf8SMatthew G. Knepley orntNew[3] = 0; 4208afb2665bSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 4209afb2665bSMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 4210afb2665bSMatthew G. Knepley #if 1 4211afb2665bSMatthew 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); 4212afb2665bSMatthew G. Knepley for (p = 0; p < 4; ++p) { 4213afb2665bSMatthew 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); 4214afb2665bSMatthew G. Knepley } 4215afb2665bSMatthew G. Knepley #endif 4216afb2665bSMatthew G. Knepley for (r = 0; r < 12; ++r) { 4217afb2665bSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + r; 42182eabf88fSMatthew G. Knepley supportNew[0] = cStartNew + (c - cStart)*8 + newCells[r*2+0]; 42192eabf88fSMatthew G. Knepley supportNew[1] = cStartNew + (c - cStart)*8 + newCells[r*2+1]; 42202eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 42212eabf88fSMatthew G. Knepley #if 1 42222eabf88fSMatthew 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); 42232eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 42242eabf88fSMatthew 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); 42252eabf88fSMatthew G. Knepley } 42262eabf88fSMatthew G. Knepley #endif 42272eabf88fSMatthew G. Knepley } 42282eabf88fSMatthew G. Knepley } 42292eabf88fSMatthew G. Knepley /* Split edges have 2 vertices and the same faces as the parent */ 42302eabf88fSMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 42312eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 42322eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 42332eabf88fSMatthew G. Knepley 42342eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 42352eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 42362eabf88fSMatthew G. Knepley const PetscInt *cone, *ornt, *support; 42372eabf88fSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 42382eabf88fSMatthew G. Knepley 42392eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 42402eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 42412eabf88fSMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 42422eabf88fSMatthew G. Knepley coneNew[(r+1)%2] = newv; 42432eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 42442eabf88fSMatthew G. Knepley #if 1 42452eabf88fSMatthew 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); 42462eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 42472eabf88fSMatthew 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); 42482eabf88fSMatthew G. Knepley } 42492eabf88fSMatthew G. Knepley #endif 42502eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 42512eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 42522eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 42532eabf88fSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 42542eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 42552eabf88fSMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 42562eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 42572eabf88fSMatthew G. Knepley if (cone[c] == e) break; 42582eabf88fSMatthew G. Knepley } 42592eabf88fSMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (ornt[c] < 0 ? (c+1-r)%4 : (c+r)%4); 42602eabf88fSMatthew G. Knepley } 42612eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 42622eabf88fSMatthew G. Knepley #if 1 42632eabf88fSMatthew 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); 42642eabf88fSMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 42652eabf88fSMatthew 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); 42662eabf88fSMatthew G. Knepley } 42672eabf88fSMatthew G. Knepley #endif 42682eabf88fSMatthew G. Knepley } 42692eabf88fSMatthew G. Knepley } 42702eabf88fSMatthew G. Knepley /* Face edges have 2 vertices and 2+cells faces */ 42712eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 42726b852384SMatthew 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}; 42732eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 42746b852384SMatthew G. Knepley const PetscInt *cone, *coneCell, *orntCell, *support; 42752eabf88fSMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 42762eabf88fSMatthew G. Knepley 42772eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 42782eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 42792eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 42802eabf88fSMatthew G. Knepley 42812eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - eStart); 42822eabf88fSMatthew G. Knepley coneNew[1] = newv; 42832eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 42842eabf88fSMatthew G. Knepley #if 1 42852eabf88fSMatthew 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); 42862eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 42872eabf88fSMatthew 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); 42882eabf88fSMatthew G. Knepley } 42892eabf88fSMatthew G. Knepley #endif 42902eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 42912eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 42922eabf88fSMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + r; 42932eabf88fSMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + (r+1)%4; 42942eabf88fSMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 42956b852384SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 42966b852384SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &coneCell);CHKERRQ(ierr); 42976b852384SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &orntCell);CHKERRQ(ierr); 42982eabf88fSMatthew G. Knepley for (c = 0; c < coneSize; ++c) if (coneCell[c] == f) break; 4299a3cddbf8SMatthew G. Knepley supportRef[2+s] = fStartNew + (fEnd - fStart)*4 + (support[s] - cStart)*12 + newFaces[c*4 + GetQuadEdgeInverse_Static(orntCell[c], r)]; 43002eabf88fSMatthew G. Knepley } 43012eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 43022eabf88fSMatthew G. Knepley #if 1 43032eabf88fSMatthew 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); 43042eabf88fSMatthew G. Knepley for (p = 0; p < 2+supportSize; ++p) { 43052eabf88fSMatthew 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); 43062eabf88fSMatthew G. Knepley } 43072eabf88fSMatthew G. Knepley #endif 43082eabf88fSMatthew G. Knepley } 43092eabf88fSMatthew G. Knepley } 43102eabf88fSMatthew G. Knepley /* Cell edges have 2 vertices and 4 faces */ 43112eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 43122eabf88fSMatthew 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}; 43132eabf88fSMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 43142eabf88fSMatthew G. Knepley const PetscInt *cone; 43152eabf88fSMatthew G. Knepley PetscInt coneNew[2], supportNew[4]; 43162eabf88fSMatthew G. Knepley 43172eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 43182eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 43192eabf88fSMatthew G. Knepley const PetscInt newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 43202eabf88fSMatthew G. Knepley 43212eabf88fSMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (cone[r] - fStart); 43222eabf88fSMatthew G. Knepley coneNew[1] = newv; 43232eabf88fSMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 43242eabf88fSMatthew G. Knepley #if 1 43252eabf88fSMatthew 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); 43262eabf88fSMatthew G. Knepley for (p = 0; p < 2; ++p) { 43272eabf88fSMatthew 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); 43282eabf88fSMatthew G. Knepley } 43292eabf88fSMatthew G. Knepley #endif 43302eabf88fSMatthew G. Knepley for (f = 0; f < 4; ++f) supportNew[f] = fStartNew + (fEnd - fStart)*4 + (c - cStart)*12 + newFaces[r*4+f]; 43312eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 43322eabf88fSMatthew G. Knepley #if 1 43332eabf88fSMatthew 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); 43342eabf88fSMatthew G. Knepley for (p = 0; p < 4; ++p) { 43352eabf88fSMatthew 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); 43362eabf88fSMatthew G. Knepley } 43372eabf88fSMatthew G. Knepley #endif 43382eabf88fSMatthew G. Knepley } 43392eabf88fSMatthew G. Knepley } 43402eabf88fSMatthew G. Knepley /* Old vertices have identical supports */ 43412eabf88fSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 43422eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 43432eabf88fSMatthew G. Knepley const PetscInt *support, *cone; 43442eabf88fSMatthew G. Knepley PetscInt size, s; 43452eabf88fSMatthew G. Knepley 43462eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 43472eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 43482eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 43492eabf88fSMatthew G. Knepley PetscInt r = 0; 43502eabf88fSMatthew G. Knepley 43512eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 43522eabf88fSMatthew G. Knepley if (cone[1] == v) r = 1; 43532eabf88fSMatthew G. Knepley supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 43542eabf88fSMatthew G. Knepley } 43552eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 43562eabf88fSMatthew G. Knepley #if 1 43572eabf88fSMatthew 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); 43582eabf88fSMatthew G. Knepley for (p = 0; p < size; ++p) { 43592eabf88fSMatthew 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); 43602eabf88fSMatthew G. Knepley } 43612eabf88fSMatthew G. Knepley #endif 43622eabf88fSMatthew G. Knepley } 43632eabf88fSMatthew G. Knepley /* Edge vertices have 2 + faces supports */ 43642eabf88fSMatthew G. Knepley for (e = eStart; e < eEnd; ++e) { 43652eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 43662eabf88fSMatthew G. Knepley const PetscInt *cone, *support; 43672eabf88fSMatthew G. Knepley PetscInt size, s; 43682eabf88fSMatthew G. Knepley 43692eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 43702eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 43712eabf88fSMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 43722eabf88fSMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 43732eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 43742eabf88fSMatthew G. Knepley PetscInt r; 43752eabf88fSMatthew G. Knepley 43762eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 4377a660e16cSMatthew G. Knepley for (r = 0; r < 4; ++r) if (cone[r] == e) break; 43782eabf88fSMatthew G. Knepley supportRef[2+s] = eStartNew + (eEnd - eStart)*2 + (support[s] - fStart)*4 + r; 43792eabf88fSMatthew G. Knepley } 43802eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 43812eabf88fSMatthew G. Knepley #if 1 43822eabf88fSMatthew 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); 43832eabf88fSMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 43842eabf88fSMatthew 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); 43852eabf88fSMatthew G. Knepley } 43862eabf88fSMatthew G. Knepley #endif 43872eabf88fSMatthew G. Knepley } 43882eabf88fSMatthew G. Knepley /* Face vertices have 4 + cells supports */ 43892eabf88fSMatthew G. Knepley for (f = fStart; f < fEnd; ++f) { 43902eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (f - fStart); 43912eabf88fSMatthew G. Knepley const PetscInt *cone, *support; 43922eabf88fSMatthew G. Knepley PetscInt size, s; 43932eabf88fSMatthew G. Knepley 43942eabf88fSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 43952eabf88fSMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 43960793999aSMatthew G. Knepley for (r = 0; r < 4; ++r) supportRef[r] = eStartNew + (eEnd - eStart)*2 + (f - fStart)*4 + r; 43972eabf88fSMatthew G. Knepley for (s = 0; s < size; ++s) { 43982eabf88fSMatthew G. Knepley PetscInt r; 43992eabf88fSMatthew G. Knepley 44002eabf88fSMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 44012eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) if (cone[r] == f) break; 44022eabf88fSMatthew G. Knepley supportRef[4+s] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (support[s] - cStart)*6 + r; 44032eabf88fSMatthew G. Knepley } 44042eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 44052eabf88fSMatthew G. Knepley #if 1 44062eabf88fSMatthew 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); 44072eabf88fSMatthew G. Knepley for (p = 0; p < 4+size; ++p) { 44082eabf88fSMatthew 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); 44092eabf88fSMatthew G. Knepley } 44102eabf88fSMatthew G. Knepley #endif 44112eabf88fSMatthew G. Knepley } 44122eabf88fSMatthew G. Knepley /* Cell vertices have 6 supports */ 44132eabf88fSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 44142eabf88fSMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (c - cStart); 44152eabf88fSMatthew G. Knepley PetscInt supportNew[6]; 44162eabf88fSMatthew G. Knepley 44172eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 44182eabf88fSMatthew G. Knepley supportNew[r] = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (c - cStart)*6 + r; 44192eabf88fSMatthew G. Knepley } 44202eabf88fSMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 44212eabf88fSMatthew G. Knepley } 4422da00770fSMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 44232eabf88fSMatthew G. Knepley break; 442427fcede3SMatthew G. Knepley case 8: 442527fcede3SMatthew G. Knepley /* Hybrid Hex 3D */ 442627fcede3SMatthew G. Knepley ierr = DMPlexGetHybridBounds(rdm, &cMaxNew, &fMaxNew, &eMaxNew, NULL);CHKERRQ(ierr); 442727fcede3SMatthew G. Knepley /* 442827fcede3SMatthew G. Knepley Bottom (viewed from top) Top 442927fcede3SMatthew G. Knepley 1---------2---------2 7---------2---------6 443027fcede3SMatthew G. Knepley | | | | | | 443127fcede3SMatthew G. Knepley | B 2 C | | H 2 G | 443227fcede3SMatthew G. Knepley | | | | | | 443327fcede3SMatthew G. Knepley 3----3----0----1----1 3----3----0----1----1 443427fcede3SMatthew G. Knepley | | | | | | 443527fcede3SMatthew G. Knepley | A 0 D | | E 0 F | 443627fcede3SMatthew G. Knepley | | | | | | 443727fcede3SMatthew G. Knepley 0---------0---------3 4---------0---------5 443827fcede3SMatthew G. Knepley */ 443927fcede3SMatthew G. Knepley /* Interior cells have 6 faces: Bottom, Top, Front, Back, Right, Left */ 444027fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 444127fcede3SMatthew G. Knepley const PetscInt newp = (c - cStart)*8; 444227fcede3SMatthew G. Knepley const PetscInt *cone, *ornt; 444327fcede3SMatthew G. Knepley PetscInt coneNew[6], orntNew[6]; 444427fcede3SMatthew G. Knepley 444527fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 444627fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 444727fcede3SMatthew G. Knepley /* A hex */ 444827fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 0); 444927fcede3SMatthew G. Knepley orntNew[0] = ornt[0]; 445027fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 445127fcede3SMatthew G. Knepley orntNew[1] = 0; 445227fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 0); 445327fcede3SMatthew G. Knepley orntNew[2] = ornt[2]; 445427fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 445527fcede3SMatthew G. Knepley orntNew[3] = 0; 445627fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 445727fcede3SMatthew G. Knepley orntNew[4] = 0; 445827fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 0); 445927fcede3SMatthew G. Knepley orntNew[5] = ornt[5]; 446027fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+0, coneNew);CHKERRQ(ierr); 446127fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+0, orntNew);CHKERRQ(ierr); 446227fcede3SMatthew G. Knepley #if 1 446327fcede3SMatthew 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); 446427fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 446527fcede3SMatthew 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); 446627fcede3SMatthew G. Knepley } 446727fcede3SMatthew G. Knepley #endif 446827fcede3SMatthew G. Knepley /* B hex */ 446927fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 1); 447027fcede3SMatthew G. Knepley orntNew[0] = ornt[0]; 447127fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 447227fcede3SMatthew G. Knepley orntNew[1] = 0; 447327fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 3; /* AB */ 447427fcede3SMatthew G. Knepley orntNew[2] = -1; 447527fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 1); 447627fcede3SMatthew G. Knepley orntNew[3] = ornt[3]; 447727fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 447827fcede3SMatthew G. Knepley orntNew[4] = 0; 447927fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 3); 448027fcede3SMatthew G. Knepley orntNew[5] = ornt[5]; 448127fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+1, coneNew);CHKERRQ(ierr); 448227fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+1, orntNew);CHKERRQ(ierr); 448327fcede3SMatthew G. Knepley #if 1 448427fcede3SMatthew 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); 448527fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 448627fcede3SMatthew 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); 448727fcede3SMatthew G. Knepley } 448827fcede3SMatthew G. Knepley #endif 448927fcede3SMatthew G. Knepley /* C hex */ 449027fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 2); 449127fcede3SMatthew G. Knepley orntNew[0] = ornt[0]; 449227fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 449327fcede3SMatthew G. Knepley orntNew[1] = 0; 449427fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 449527fcede3SMatthew G. Knepley orntNew[2] = -1; 449627fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 0); 449727fcede3SMatthew G. Knepley orntNew[3] = ornt[3]; 449827fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 1); 449927fcede3SMatthew G. Knepley orntNew[4] = ornt[4]; 450027fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 2; /* BC */ 450127fcede3SMatthew G. Knepley orntNew[5] = -4; 450227fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+2, coneNew);CHKERRQ(ierr); 450327fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+2, orntNew);CHKERRQ(ierr); 450427fcede3SMatthew G. Knepley #if 1 450527fcede3SMatthew 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); 450627fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 450727fcede3SMatthew 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); 450827fcede3SMatthew G. Knepley } 450927fcede3SMatthew G. Knepley #endif 451027fcede3SMatthew G. Knepley /* D hex */ 451127fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], 3); 451227fcede3SMatthew G. Knepley orntNew[0] = ornt[0]; 451327fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 451427fcede3SMatthew G. Knepley orntNew[1] = 0; 451527fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 1); 451627fcede3SMatthew G. Knepley orntNew[2] = ornt[2]; 451727fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 1; /* CD */ 451827fcede3SMatthew G. Knepley orntNew[3] = 0; 451927fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 0); 452027fcede3SMatthew G. Knepley orntNew[4] = ornt[4]; 452127fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 0; /* AD */ 452227fcede3SMatthew G. Knepley orntNew[5] = -4; 452327fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+3, coneNew);CHKERRQ(ierr); 452427fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+3, orntNew);CHKERRQ(ierr); 452527fcede3SMatthew G. Knepley #if 1 452627fcede3SMatthew 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); 452727fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 452827fcede3SMatthew 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); 452927fcede3SMatthew G. Knepley } 453027fcede3SMatthew G. Knepley #endif 453127fcede3SMatthew G. Knepley /* E hex */ 453227fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 8; /* AE */ 453327fcede3SMatthew G. Knepley orntNew[0] = -4; 453427fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 0); 453527fcede3SMatthew G. Knepley orntNew[1] = ornt[1]; 453627fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 3); 453727fcede3SMatthew G. Knepley orntNew[2] = ornt[2]; 453827fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 453927fcede3SMatthew G. Knepley orntNew[3] = 0; 454027fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 454127fcede3SMatthew G. Knepley orntNew[4] = -1; 454227fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 1); 454327fcede3SMatthew G. Knepley orntNew[5] = ornt[5]; 454427fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+4, coneNew);CHKERRQ(ierr); 454527fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+4, orntNew);CHKERRQ(ierr); 454627fcede3SMatthew G. Knepley #if 1 454727fcede3SMatthew 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); 454827fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 454927fcede3SMatthew 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); 455027fcede3SMatthew G. Knepley } 455127fcede3SMatthew G. Knepley #endif 455227fcede3SMatthew G. Knepley /* F hex */ 455327fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 9; /* DF */ 455427fcede3SMatthew G. Knepley orntNew[0] = -4; 455527fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 1); 455627fcede3SMatthew G. Knepley orntNew[1] = ornt[1]; 455727fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (cone[2] - fStart)*4 + GetQuadSubface_Static(ornt[2], 2); 455827fcede3SMatthew G. Knepley orntNew[2] = ornt[2]; 455927fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 456027fcede3SMatthew G. Knepley orntNew[3] = -1; 456127fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 3); 456227fcede3SMatthew G. Knepley orntNew[4] = ornt[4]; 456327fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 4; /* EF */ 456427fcede3SMatthew G. Knepley orntNew[5] = 1; 456527fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+5, coneNew);CHKERRQ(ierr); 456627fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+5, orntNew);CHKERRQ(ierr); 456727fcede3SMatthew G. Knepley #if 1 456827fcede3SMatthew 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); 456927fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 457027fcede3SMatthew 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); 457127fcede3SMatthew G. Knepley } 457227fcede3SMatthew G. Knepley #endif 457327fcede3SMatthew G. Knepley /* G hex */ 457427fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 10; /* CG */ 457527fcede3SMatthew G. Knepley orntNew[0] = -4; 457627fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 2); 457727fcede3SMatthew G. Knepley orntNew[1] = ornt[1]; 457827fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 5; /* FG */ 457927fcede3SMatthew G. Knepley orntNew[2] = 0; 458027fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 3); 458127fcede3SMatthew G. Knepley orntNew[3] = ornt[3]; 458227fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (cone[4] - fStart)*4 + GetQuadSubface_Static(ornt[4], 2); 458327fcede3SMatthew G. Knepley orntNew[4] = ornt[4]; 458427fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 458527fcede3SMatthew G. Knepley orntNew[5] = -3; 458627fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+6, coneNew);CHKERRQ(ierr); 458727fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+6, orntNew);CHKERRQ(ierr); 458827fcede3SMatthew G. Knepley #if 1 458927fcede3SMatthew 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); 459027fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 459127fcede3SMatthew 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); 459227fcede3SMatthew G. Knepley } 459327fcede3SMatthew G. Knepley #endif 459427fcede3SMatthew G. Knepley /* H hex */ 459527fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 11; /* BH */ 459627fcede3SMatthew G. Knepley orntNew[0] = -4; 459727fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], 3); 459827fcede3SMatthew G. Knepley orntNew[1] = ornt[1]; 459927fcede3SMatthew G. Knepley coneNew[2] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 7; /* EH */ 460027fcede3SMatthew G. Knepley orntNew[2] = -1; 460127fcede3SMatthew G. Knepley coneNew[3] = fStartNew + (cone[3] - fStart)*4 + GetQuadSubface_Static(ornt[3], 2); 460227fcede3SMatthew G. Knepley orntNew[3] = ornt[3]; 460327fcede3SMatthew G. Knepley coneNew[4] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 6; /* GH */ 460427fcede3SMatthew G. Knepley orntNew[4] = 3; 460527fcede3SMatthew G. Knepley coneNew[5] = fStartNew + (cone[5] - fStart)*4 + GetQuadSubface_Static(ornt[5], 2); 460627fcede3SMatthew G. Knepley orntNew[5] = ornt[5]; 460727fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+7, coneNew);CHKERRQ(ierr); 460827fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+7, orntNew);CHKERRQ(ierr); 460927fcede3SMatthew G. Knepley #if 1 461027fcede3SMatthew 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); 461127fcede3SMatthew G. Knepley for (p = 0; p < 6; ++p) { 461227fcede3SMatthew 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); 461327fcede3SMatthew G. Knepley } 461427fcede3SMatthew G. Knepley #endif 461527fcede3SMatthew G. Knepley } 461627fcede3SMatthew G. Knepley /* Hybrid cells have 6 faces: Front, Back, Sides */ 461727fcede3SMatthew G. Knepley /* 461827fcede3SMatthew G. Knepley 3---------2---------2 461927fcede3SMatthew G. Knepley | | | 462027fcede3SMatthew G. Knepley | D 2 C | 462127fcede3SMatthew G. Knepley | | | 462227fcede3SMatthew G. Knepley 3----3----0----1----1 462327fcede3SMatthew G. Knepley | | | 462427fcede3SMatthew G. Knepley | A 0 B | 462527fcede3SMatthew G. Knepley | | | 462627fcede3SMatthew G. Knepley 0---------0---------1 462727fcede3SMatthew G. Knepley */ 462827fcede3SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 462927fcede3SMatthew G. Knepley const PetscInt newp = (cMax - cStart)*8 + (c - cMax)*4; 463027fcede3SMatthew G. Knepley const PetscInt *cone, *ornt, *fornt; 4631d273725eSMatthew G. Knepley PetscInt coneNew[6], orntNew[6], o, of, i; 463227fcede3SMatthew G. Knepley 463327fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 463427fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 463527fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, cone[0], &fornt);CHKERRQ(ierr); 4636d273725eSMatthew G. Knepley o = ornt[0] < 0 ? -1 : 1; 463727fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 463827fcede3SMatthew G. Knepley PetscInt subfA = GetQuadSubface_Static(ornt[0], r); 463927fcede3SMatthew G. Knepley PetscInt edgeA = GetQuadEdge_Static(ornt[0], r); 4640d273725eSMatthew G. Knepley PetscInt edgeB = GetQuadEdge_Static(ornt[0], (r+3)%4); 464127fcede3SMatthew G. Knepley if (ornt[0] != ornt[1]) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Inconsistent ordering for matching ends of hybrid cell %d: %d != %d", c, ornt[0], ornt[1]); 464227fcede3SMatthew G. Knepley coneNew[0] = fStartNew + (cone[0] - fStart)*4 + subfA; 464327fcede3SMatthew G. Knepley orntNew[0] = ornt[0]; 464427fcede3SMatthew G. Knepley coneNew[1] = fStartNew + (cone[1] - fStart)*4 + subfA; 464527fcede3SMatthew G. Knepley orntNew[1] = ornt[0]; 4646d273725eSMatthew G. Knepley of = fornt[edgeA] < 0 ? -1 : 1; 4647d273725eSMatthew G. Knepley i = GetQuadEdgeInverse_Static(ornt[0], r) + 2; 4648d273725eSMatthew G. Knepley coneNew[i] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (cone[2+edgeA] - fMax)*2 + (o*of < 0 ? 1 : 0); 4649d273725eSMatthew G. Knepley orntNew[i] = ornt[edgeA]; 4650d273725eSMatthew G. Knepley i = GetQuadEdgeInverse_Static(ornt[0], (r+1)%4) + 2; 4651d273725eSMatthew G. Knepley coneNew[i] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4 + edgeA; 4652d273725eSMatthew G. Knepley orntNew[i] = 0; 4653d273725eSMatthew G. Knepley i = GetQuadEdgeInverse_Static(ornt[0], (r+2)%4) + 2; 4654d273725eSMatthew G. Knepley coneNew[i] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4 + edgeB; 4655d273725eSMatthew G. Knepley orntNew[i] = -2; 4656d273725eSMatthew G. Knepley of = fornt[edgeB] < 0 ? -1 : 1; 4657d273725eSMatthew G. Knepley i = GetQuadEdgeInverse_Static(ornt[0], (r+3)%4) + 2; 4658d273725eSMatthew G. Knepley coneNew[i] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (cone[2+edgeB] - fMax)*2 + (o*of < 0 ? 0 : 1); 4659d273725eSMatthew G. Knepley orntNew[i] = ornt[edgeB]; 466027fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+r, coneNew);CHKERRQ(ierr); 466127fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+r, orntNew);CHKERRQ(ierr); 466227fcede3SMatthew G. Knepley #if 1 466327fcede3SMatthew 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); 466427fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 466527fcede3SMatthew 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); 466627fcede3SMatthew G. Knepley } 466727fcede3SMatthew G. Knepley for (p = 2; p < 6; ++p) { 466827fcede3SMatthew 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); 466927fcede3SMatthew G. Knepley } 467027fcede3SMatthew G. Knepley #endif 467127fcede3SMatthew G. Knepley } 467227fcede3SMatthew G. Knepley } 467327fcede3SMatthew G. Knepley /* Interior split faces have 4 edges and the same cells as the parent */ 467427fcede3SMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 467527fcede3SMatthew G. Knepley ierr = PetscMalloc1((4 + maxSupportSize*2), &supportRef);CHKERRQ(ierr); 467627fcede3SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 467727fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 467827fcede3SMatthew G. Knepley /* TODO: This can come from GetFaces_Internal() */ 467927fcede3SMatthew 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}; 468027fcede3SMatthew G. Knepley const PetscInt newp = fStartNew + (f - fStart)*4 + r; 468127fcede3SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 468227fcede3SMatthew G. Knepley PetscInt coneNew[4], orntNew[4], coneSize, c, supportSize, s; 468327fcede3SMatthew G. Knepley 468427fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 468527fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 468627fcede3SMatthew G. Knepley coneNew[(r+3)%4] = eStartNew + (cone[(r+3)%4] - eStart)*2 + (ornt[(r+3)%4] < 0 ? 0 : 1); 468727fcede3SMatthew G. Knepley orntNew[(r+3)%4] = ornt[(r+3)%4]; 468827fcede3SMatthew G. Knepley coneNew[(r+0)%4] = eStartNew + (cone[r] - eStart)*2 + (ornt[r] < 0 ? 1 : 0); 468927fcede3SMatthew G. Knepley orntNew[(r+0)%4] = ornt[r]; 469027fcede3SMatthew G. Knepley coneNew[(r+1)%4] = eStartNew + (eMax - eStart)*2 + (f - fStart)*4 + r; 469127fcede3SMatthew G. Knepley orntNew[(r+1)%4] = 0; 469227fcede3SMatthew G. Knepley coneNew[(r+2)%4] = eStartNew + (eMax - eStart)*2 + (f - fStart)*4 + (r+3)%4; 469327fcede3SMatthew G. Knepley orntNew[(r+2)%4] = -2; 469427fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 469527fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 469627fcede3SMatthew G. Knepley #if 1 469727fcede3SMatthew 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); 469827fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 469927fcede3SMatthew 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); 470027fcede3SMatthew G. Knepley } 470127fcede3SMatthew G. Knepley #endif 470227fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 470327fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 470427fcede3SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 470527fcede3SMatthew G. Knepley PetscInt subf; 470627fcede3SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 470727fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 470827fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 470927fcede3SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 471027fcede3SMatthew G. Knepley if (cone[c] == f) break; 471127fcede3SMatthew G. Knepley } 471227fcede3SMatthew G. Knepley subf = GetQuadSubfaceInverse_Static(ornt[c], r); 471327fcede3SMatthew G. Knepley if (support[s] < cMax) { 471427fcede3SMatthew G. Knepley supportRef[s] = cStartNew + (support[s] - cStart)*8 + newCells[c*4+subf]; 471527fcede3SMatthew G. Knepley } else { 471627fcede3SMatthew G. Knepley supportRef[s] = cStartNew + (cMax - cStart)*8 + (support[s] - cMax)*4 + subf; 471727fcede3SMatthew G. Knepley } 471827fcede3SMatthew G. Knepley } 471927fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 472027fcede3SMatthew G. Knepley #if 1 472127fcede3SMatthew 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); 472227fcede3SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 472327fcede3SMatthew 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); 472427fcede3SMatthew G. Knepley } 472527fcede3SMatthew G. Knepley #endif 472627fcede3SMatthew G. Knepley } 472727fcede3SMatthew G. Knepley } 4728d273725eSMatthew G. Knepley /* Interior cell faces have 4 edges and 2 cells */ 472927fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 473027fcede3SMatthew 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}; 473127fcede3SMatthew G. Knepley const PetscInt *cone, *ornt; 473227fcede3SMatthew G. Knepley PetscInt newp, coneNew[4], orntNew[4], supportNew[2]; 473327fcede3SMatthew G. Knepley 473427fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 473527fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 473627fcede3SMatthew G. Knepley /* A-D face */ 473727fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 0; 473827fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 3); 473927fcede3SMatthew G. Knepley orntNew[0] = 0; 474027fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 0; 474127fcede3SMatthew G. Knepley orntNew[1] = 0; 474227fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 2; 474327fcede3SMatthew G. Knepley orntNew[2] = -2; 474427fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 0); 474527fcede3SMatthew G. Knepley orntNew[3] = -2; 474627fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 474727fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 474827fcede3SMatthew G. Knepley #if 1 474927fcede3SMatthew 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); 475027fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 475127fcede3SMatthew 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); 475227fcede3SMatthew G. Knepley } 475327fcede3SMatthew G. Knepley #endif 475427fcede3SMatthew G. Knepley /* C-D face */ 475527fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 1; 475627fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 2); 475727fcede3SMatthew G. Knepley orntNew[0] = 0; 475827fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 0; 475927fcede3SMatthew G. Knepley orntNew[1] = 0; 476027fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 4; 476127fcede3SMatthew G. Knepley orntNew[2] = -2; 476227fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 0); 476327fcede3SMatthew G. Knepley orntNew[3] = -2; 476427fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 476527fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 476627fcede3SMatthew G. Knepley #if 1 476727fcede3SMatthew 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); 476827fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 476927fcede3SMatthew 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); 477027fcede3SMatthew G. Knepley } 477127fcede3SMatthew G. Knepley #endif 477227fcede3SMatthew G. Knepley /* B-C face */ 477327fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 2; 477427fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 1); 477527fcede3SMatthew G. Knepley orntNew[0] = -2; 477627fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 0); 477727fcede3SMatthew G. Knepley orntNew[1] = 0; 477827fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 3; 477927fcede3SMatthew G. Knepley orntNew[2] = 0; 478027fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 0; 478127fcede3SMatthew G. Knepley orntNew[3] = -2; 478227fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 478327fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 478427fcede3SMatthew G. Knepley #if 1 478527fcede3SMatthew 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); 478627fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 478727fcede3SMatthew 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); 478827fcede3SMatthew G. Knepley } 478927fcede3SMatthew G. Knepley #endif 479027fcede3SMatthew G. Knepley /* A-B face */ 479127fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 3; 479227fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*4 + GetQuadEdge_Static(ornt[0], 0); 479327fcede3SMatthew G. Knepley orntNew[0] = -2; 479427fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 3); 479527fcede3SMatthew G. Knepley orntNew[1] = 0; 479627fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 5; 479727fcede3SMatthew G. Knepley orntNew[2] = 0; 479827fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 0; 479927fcede3SMatthew G. Knepley orntNew[3] = -2; 480027fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 480127fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 480227fcede3SMatthew G. Knepley #if 1 480327fcede3SMatthew 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); 480427fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 480527fcede3SMatthew 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); 480627fcede3SMatthew G. Knepley } 480727fcede3SMatthew G. Knepley #endif 480827fcede3SMatthew G. Knepley /* E-F face */ 480927fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 4; 481027fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 2; 481127fcede3SMatthew G. Knepley orntNew[0] = -2; 481227fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 2); 481327fcede3SMatthew G. Knepley orntNew[1] = -2; 481427fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 0); 481527fcede3SMatthew G. Knepley orntNew[2] = 0; 481627fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 1; 481727fcede3SMatthew G. Knepley orntNew[3] = 0; 481827fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 481927fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 482027fcede3SMatthew G. Knepley #if 1 482127fcede3SMatthew 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); 482227fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 482327fcede3SMatthew 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); 482427fcede3SMatthew G. Knepley } 482527fcede3SMatthew G. Knepley #endif 482627fcede3SMatthew G. Knepley /* F-G face */ 482727fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 5; 482827fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 4; 482927fcede3SMatthew G. Knepley orntNew[0] = -2; 483027fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 2); 483127fcede3SMatthew G. Knepley orntNew[1] = -2; 483227fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 1); 483327fcede3SMatthew G. Knepley orntNew[2] = 0; 483427fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 1; 483527fcede3SMatthew G. Knepley orntNew[3] = 0; 483627fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 483727fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 483827fcede3SMatthew G. Knepley #if 1 483927fcede3SMatthew 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); 484027fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 484127fcede3SMatthew 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); 484227fcede3SMatthew G. Knepley } 484327fcede3SMatthew G. Knepley #endif 484427fcede3SMatthew G. Knepley /* G-H face */ 484527fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 6; 484627fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 2); 484727fcede3SMatthew G. Knepley orntNew[0] = -2; 484827fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 2); 484927fcede3SMatthew G. Knepley orntNew[1] = 0; 485027fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 1; 485127fcede3SMatthew G. Knepley orntNew[2] = 0; 485227fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 3; 485327fcede3SMatthew G. Knepley orntNew[3] = -2; 485427fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 485527fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 485627fcede3SMatthew G. Knepley #if 1 485727fcede3SMatthew 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); 485827fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 485927fcede3SMatthew 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); 486027fcede3SMatthew G. Knepley } 486127fcede3SMatthew G. Knepley #endif 486227fcede3SMatthew G. Knepley /* E-H face */ 486327fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 7; 486427fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 5; 486527fcede3SMatthew G. Knepley orntNew[0] = -2; 486627fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 1); 486727fcede3SMatthew G. Knepley orntNew[1] = -2; 486827fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*4 + GetQuadEdge_Static(ornt[1], 3); 486927fcede3SMatthew G. Knepley orntNew[2] = 0; 487027fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 1; 487127fcede3SMatthew G. Knepley orntNew[3] = 0; 487227fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 487327fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 487427fcede3SMatthew G. Knepley #if 1 487527fcede3SMatthew 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); 487627fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 487727fcede3SMatthew 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); 487827fcede3SMatthew G. Knepley } 487927fcede3SMatthew G. Knepley #endif 488027fcede3SMatthew G. Knepley /* A-E face */ 488127fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 8; 488227fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 3); 488327fcede3SMatthew G. Knepley orntNew[0] = 0; 488427fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 2; 488527fcede3SMatthew G. Knepley orntNew[1] = 0; 488627fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 5; 488727fcede3SMatthew G. Knepley orntNew[2] = -2; 488827fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 0); 488927fcede3SMatthew G. Knepley orntNew[3] = -2; 489027fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 489127fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 489227fcede3SMatthew G. Knepley #if 1 489327fcede3SMatthew 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); 489427fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 489527fcede3SMatthew 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); 489627fcede3SMatthew G. Knepley } 489727fcede3SMatthew G. Knepley #endif 489827fcede3SMatthew G. Knepley /* D-F face */ 489927fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 9; 490027fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[2] - fStart)*4 + GetQuadEdge_Static(ornt[2], 1); 490127fcede3SMatthew G. Knepley orntNew[0] = -2; 490227fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 3); 490327fcede3SMatthew G. Knepley orntNew[1] = 0; 490427fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 4; 490527fcede3SMatthew G. Knepley orntNew[2] = 0; 490627fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 2; 490727fcede3SMatthew G. Knepley orntNew[3] = -2; 490827fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 490927fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 491027fcede3SMatthew G. Knepley #if 1 491127fcede3SMatthew 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); 491227fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 491327fcede3SMatthew 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); 491427fcede3SMatthew G. Knepley } 491527fcede3SMatthew G. Knepley #endif 491627fcede3SMatthew G. Knepley /* C-G face */ 491727fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 10; 491827fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 4; 491927fcede3SMatthew G. Knepley orntNew[0] = -2; 492027fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[4] - fStart)*4 + GetQuadEdge_Static(ornt[4], 1); 492127fcede3SMatthew G. Knepley orntNew[1] = -2; 492227fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 3); 492327fcede3SMatthew G. Knepley orntNew[2] = 0; 492427fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 3; 492527fcede3SMatthew G. Knepley orntNew[3] = 0; 492627fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 492727fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 492827fcede3SMatthew G. Knepley #if 1 492927fcede3SMatthew 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); 493027fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 493127fcede3SMatthew 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); 493227fcede3SMatthew G. Knepley } 493327fcede3SMatthew G. Knepley #endif 493427fcede3SMatthew G. Knepley /* B-H face */ 493527fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + 11; 493627fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 5; 493727fcede3SMatthew G. Knepley orntNew[0] = 0; 493827fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + 3; 493927fcede3SMatthew G. Knepley orntNew[1] = -2; 494027fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (cone[3] - fStart)*4 + GetQuadEdge_Static(ornt[3], 1); 494127fcede3SMatthew G. Knepley orntNew[2] = -2; 494227fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (cone[5] - fStart)*4 + GetQuadEdge_Static(ornt[5], 2); 494327fcede3SMatthew G. Knepley orntNew[3] = 0; 494427fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 494527fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 494627fcede3SMatthew G. Knepley #if 1 494727fcede3SMatthew 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); 494827fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 494927fcede3SMatthew 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); 495027fcede3SMatthew G. Knepley } 495127fcede3SMatthew G. Knepley #endif 495227fcede3SMatthew G. Knepley for (r = 0; r < 12; ++r) { 495327fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + r; 495427fcede3SMatthew G. Knepley supportNew[0] = cStartNew + (c - cStart)*8 + newCells[r*2+0]; 495527fcede3SMatthew G. Knepley supportNew[1] = cStartNew + (c - cStart)*8 + newCells[r*2+1]; 495627fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 495727fcede3SMatthew G. Knepley #if 1 495827fcede3SMatthew 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); 495927fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 496027fcede3SMatthew 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); 496127fcede3SMatthew G. Knepley } 496227fcede3SMatthew G. Knepley #endif 496327fcede3SMatthew G. Knepley } 496427fcede3SMatthew G. Knepley } 496527fcede3SMatthew G. Knepley /* Hybrid split faces have 4 edges and same cells */ 496627fcede3SMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 496727fcede3SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 496827fcede3SMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 496927fcede3SMatthew G. Knepley PetscInt supportNew[2], size, s, c; 497027fcede3SMatthew G. Knepley 497127fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 497227fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, f, &ornt);CHKERRQ(ierr); 497327fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 497427fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 497527fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r) { 497627fcede3SMatthew G. Knepley const PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (f - fMax)*2 + r; 497727fcede3SMatthew G. Knepley 497827fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (cone[0] - eStart)*2 + (ornt[0] < 0 ? 1-r : r); 497927fcede3SMatthew G. Knepley orntNew[0] = ornt[0]; 498027fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (cone[1] - eStart)*2 + (ornt[1] < 0 ? 1-r : r); 498127fcede3SMatthew G. Knepley orntNew[1] = ornt[1]; 498227fcede3SMatthew G. Knepley coneNew[2+r] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (cone[2+r] - eMax); 498327fcede3SMatthew G. Knepley orntNew[2+r] = 0; 498427fcede3SMatthew G. Knepley coneNew[3-r] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (f - fMax); 498527fcede3SMatthew G. Knepley orntNew[3-r] = 0; 498627fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 498727fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp, orntNew);CHKERRQ(ierr); 498827fcede3SMatthew G. Knepley #if 1 498927fcede3SMatthew 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); 499027fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 499127fcede3SMatthew 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); 499227fcede3SMatthew G. Knepley } 499327fcede3SMatthew G. Knepley for (p = 2; p < 4; ++p) { 499427fcede3SMatthew 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); 499527fcede3SMatthew G. Knepley } 499627fcede3SMatthew G. Knepley #endif 499727fcede3SMatthew G. Knepley for (s = 0; s < size; ++s) { 499827fcede3SMatthew G. Knepley const PetscInt *coneCell, *orntCell, *fornt; 4999d273725eSMatthew G. Knepley PetscInt o, of; 500027fcede3SMatthew G. Knepley 500127fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &coneCell);CHKERRQ(ierr); 500227fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &orntCell);CHKERRQ(ierr); 5003d273725eSMatthew G. Knepley o = orntCell[0] < 0 ? -1 : 1; 500427fcede3SMatthew G. Knepley for (c = 2; c < 6; ++c) if (coneCell[c] == f) break; 500527fcede3SMatthew G. Knepley if (c >= 6) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Could not find face %d in cone of cell %d", f, support[s]); 500627fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, coneCell[0], &fornt);CHKERRQ(ierr); 5007d273725eSMatthew G. Knepley of = fornt[c-2] < 0 ? -1 : 1; 5008d273725eSMatthew G. Knepley supportNew[s] = cStartNew + (cMax - cStart)*8 + (support[s] - cMax)*4 + (GetQuadEdgeInverse_Static(orntCell[0], c-2) + (o*of < 0 ? 1-r : r))%4; 500927fcede3SMatthew G. Knepley } 501027fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 501127fcede3SMatthew G. Knepley #if 1 501227fcede3SMatthew 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); 501327fcede3SMatthew G. Knepley for (p = 0; p < size; ++p) { 501427fcede3SMatthew 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); 501527fcede3SMatthew G. Knepley } 501627fcede3SMatthew G. Knepley #endif 501727fcede3SMatthew G. Knepley } 501827fcede3SMatthew G. Knepley } 501927fcede3SMatthew G. Knepley /* Hybrid cell faces have 4 edges and 2 cells */ 502027fcede3SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 502127fcede3SMatthew G. Knepley PetscInt newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4; 502227fcede3SMatthew G. Knepley const PetscInt *cone, *ornt; 502327fcede3SMatthew G. Knepley PetscInt coneNew[4], orntNew[4]; 502427fcede3SMatthew G. Knepley PetscInt supportNew[2]; 502527fcede3SMatthew G. Knepley 502627fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 502727fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, c, &ornt);CHKERRQ(ierr); 502827fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 5029d273725eSMatthew G. Knepley #if 0 503027fcede3SMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*4 + GetQuadSubface_Static(ornt[0], r); 503127fcede3SMatthew G. Knepley orntNew[0] = 0; 503227fcede3SMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*4 + GetQuadSubface_Static(ornt[1], r); 503327fcede3SMatthew G. Knepley orntNew[1] = 0; 503427fcede3SMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (cone[2+GetQuadEdge_Static(ornt[0], r)] - fMax); 503527fcede3SMatthew G. Knepley orntNew[2] = 0; 503627fcede3SMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (fEnd - fMax) + (c - cMax); 503727fcede3SMatthew G. Knepley orntNew[3] = 0; 5038d273725eSMatthew G. Knepley #else 5039d273725eSMatthew G. Knepley coneNew[0] = eStartNew + (eMax - eStart)*2 + (cone[0] - fStart)*4 + r; 5040d273725eSMatthew G. Knepley orntNew[0] = 0; 5041d273725eSMatthew G. Knepley coneNew[1] = eStartNew + (eMax - eStart)*2 + (cone[1] - fStart)*4 + r; 5042d273725eSMatthew G. Knepley orntNew[1] = 0; 5043d273725eSMatthew G. Knepley coneNew[2] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (cone[2+r] - fMax); 5044d273725eSMatthew G. Knepley orntNew[2] = 0; 5045d273725eSMatthew G. Knepley coneNew[3] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (fEnd - fMax) + (c - cMax); 5046d273725eSMatthew G. Knepley orntNew[3] = 0; 5047d273725eSMatthew G. Knepley #endif 504827fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp+r, coneNew);CHKERRQ(ierr); 504927fcede3SMatthew G. Knepley ierr = DMPlexSetConeOrientation(rdm, newp+r, orntNew);CHKERRQ(ierr); 505027fcede3SMatthew G. Knepley #if 1 505127fcede3SMatthew 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); 505227fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 505327fcede3SMatthew 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); 505427fcede3SMatthew G. Knepley } 505527fcede3SMatthew G. Knepley for (p = 2; p < 4; ++p) { 505627fcede3SMatthew 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); 505727fcede3SMatthew G. Knepley } 505827fcede3SMatthew G. Knepley #endif 505927fcede3SMatthew G. Knepley supportNew[0] = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + GetQuadSubface_Static(ornt[0], r); 506027fcede3SMatthew G. Knepley supportNew[1] = cStartNew + (cMax - cStart)*8 + (c - cMax)*4 + GetQuadSubface_Static(ornt[0], (r+1)%4); 506127fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp+r, supportNew);CHKERRQ(ierr); 506227fcede3SMatthew G. Knepley #if 1 506327fcede3SMatthew 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); 506427fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 506527fcede3SMatthew 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); 506627fcede3SMatthew G. Knepley } 506727fcede3SMatthew G. Knepley #endif 506827fcede3SMatthew G. Knepley } 506927fcede3SMatthew G. Knepley } 507027fcede3SMatthew G. Knepley /* Interior split edges have 2 vertices and the same faces as the parent */ 507127fcede3SMatthew G. Knepley ierr = DMPlexGetMaxSizes(dm, NULL, &maxSupportSize);CHKERRQ(ierr); 507227fcede3SMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 507327fcede3SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 507427fcede3SMatthew G. Knepley 507527fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r) { 507627fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (e - eStart)*2 + r; 507727fcede3SMatthew G. Knepley const PetscInt *cone, *ornt, *support; 507827fcede3SMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 507927fcede3SMatthew G. Knepley 508027fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 508127fcede3SMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 508227fcede3SMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 508327fcede3SMatthew G. Knepley coneNew[(r+1)%2] = newv; 508427fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 508527fcede3SMatthew G. Knepley #if 1 508627fcede3SMatthew 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); 508727fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 508827fcede3SMatthew 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); 508927fcede3SMatthew G. Knepley } 509027fcede3SMatthew G. Knepley #endif 509127fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &supportSize);CHKERRQ(ierr); 509227fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 509327fcede3SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 509427fcede3SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 509527fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 509627fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &ornt);CHKERRQ(ierr); 509727fcede3SMatthew G. Knepley for (c = 0; c < coneSize; ++c) { 509827fcede3SMatthew G. Knepley if (cone[c] == e) break; 509927fcede3SMatthew G. Knepley } 510027fcede3SMatthew G. Knepley if (support[s] < fMax) { 510127fcede3SMatthew G. Knepley supportRef[s] = fStartNew + (support[s] - fStart)*4 + (c + (ornt[c] < 0 ? 1-r : r))%4; 510227fcede3SMatthew G. Knepley } else { 510327fcede3SMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (support[s] - fMax)*2 + (ornt[c] < 0 ? 1-r : r); 510427fcede3SMatthew G. Knepley } 510527fcede3SMatthew G. Knepley } 510627fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 510727fcede3SMatthew G. Knepley #if 1 510827fcede3SMatthew 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); 510927fcede3SMatthew G. Knepley for (p = 0; p < supportSize; ++p) { 511027fcede3SMatthew 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); 511127fcede3SMatthew G. Knepley } 511227fcede3SMatthew G. Knepley #endif 511327fcede3SMatthew G. Knepley } 511427fcede3SMatthew G. Knepley } 511527fcede3SMatthew G. Knepley /* Interior face edges have 2 vertices and 2+cells faces */ 511627fcede3SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 511727fcede3SMatthew 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}; 511827fcede3SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eMax - eStart) + (f - fStart); 511927fcede3SMatthew G. Knepley const PetscInt *cone, *coneCell, *orntCell, *support; 512027fcede3SMatthew G. Knepley PetscInt coneNew[2], coneSize, c, supportSize, s; 512127fcede3SMatthew G. Knepley 512227fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 512327fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 512427fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (f - fStart)*4 + r; 512527fcede3SMatthew G. Knepley 512627fcede3SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[r] - eStart); 512727fcede3SMatthew G. Knepley coneNew[1] = newv; 512827fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 512927fcede3SMatthew G. Knepley #if 1 513027fcede3SMatthew 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); 513127fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 513227fcede3SMatthew 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); 513327fcede3SMatthew G. Knepley } 513427fcede3SMatthew G. Knepley #endif 513527fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &supportSize);CHKERRQ(ierr); 513627fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 513727fcede3SMatthew G. Knepley supportRef[0] = fStartNew + (f - fStart)*4 + r; 513827fcede3SMatthew G. Knepley supportRef[1] = fStartNew + (f - fStart)*4 + (r+1)%4; 513927fcede3SMatthew G. Knepley for (s = 0; s < supportSize; ++s) { 514027fcede3SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &coneSize);CHKERRQ(ierr); 514127fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &coneCell);CHKERRQ(ierr); 514227fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &orntCell);CHKERRQ(ierr); 514327fcede3SMatthew G. Knepley for (c = 0; c < coneSize; ++c) if (coneCell[c] == f) break; 514427fcede3SMatthew G. Knepley if (support[s] < cMax) { 514527fcede3SMatthew G. Knepley supportRef[2+s] = fStartNew + (fMax - fStart)*4 + (support[s] - cStart)*12 + newFaces[c*4 + GetQuadEdgeInverse_Static(orntCell[c], r)]; 514627fcede3SMatthew G. Knepley } else { 5147d273725eSMatthew G. Knepley supportRef[2+s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (support[s] - cMax)*4 + r; 514827fcede3SMatthew G. Knepley } 514927fcede3SMatthew G. Knepley } 515027fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 515127fcede3SMatthew G. Knepley #if 1 515227fcede3SMatthew 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); 515327fcede3SMatthew G. Knepley for (p = 0; p < 2+supportSize; ++p) { 515427fcede3SMatthew 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); 515527fcede3SMatthew G. Knepley } 515627fcede3SMatthew G. Knepley #endif 515727fcede3SMatthew G. Knepley } 515827fcede3SMatthew G. Knepley } 515927fcede3SMatthew G. Knepley /* Interior cell edges have 2 vertices and 4 faces */ 516027fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 516127fcede3SMatthew 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}; 516227fcede3SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eMax - eStart) + (fMax - fStart) + (c - cStart); 516327fcede3SMatthew G. Knepley const PetscInt *cone; 516427fcede3SMatthew G. Knepley PetscInt coneNew[2], supportNew[4]; 516527fcede3SMatthew G. Knepley 516627fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 516727fcede3SMatthew G. Knepley for (r = 0; r < 6; ++r) { 516827fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + r; 516927fcede3SMatthew G. Knepley 517027fcede3SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (eMax - eStart) + (cone[r] - fStart); 517127fcede3SMatthew G. Knepley coneNew[1] = newv; 517227fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 517327fcede3SMatthew G. Knepley #if 1 517427fcede3SMatthew 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); 517527fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 517627fcede3SMatthew 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); 517727fcede3SMatthew G. Knepley } 517827fcede3SMatthew G. Knepley #endif 517927fcede3SMatthew G. Knepley for (f = 0; f < 4; ++f) supportNew[f] = fStartNew + (fMax - fStart)*4 + (c - cStart)*12 + newFaces[r*4+f]; 518027fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 518127fcede3SMatthew G. Knepley #if 1 518227fcede3SMatthew 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); 518327fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 518427fcede3SMatthew 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); 518527fcede3SMatthew G. Knepley } 518627fcede3SMatthew G. Knepley #endif 518727fcede3SMatthew G. Knepley } 518827fcede3SMatthew G. Knepley } 518927fcede3SMatthew G. Knepley /* Hybrid edges have two vertices and the same faces */ 519027fcede3SMatthew G. Knepley for (e = eMax; e < eEnd; ++e) { 519127fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (e - eMax); 519227fcede3SMatthew G. Knepley const PetscInt *cone, *support, *fcone; 519327fcede3SMatthew G. Knepley PetscInt coneNew[2], size, fsize, s; 519427fcede3SMatthew G. Knepley 519527fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 519627fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 519727fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 519827fcede3SMatthew G. Knepley coneNew[0] = vStartNew + (cone[0] - vStart); 519927fcede3SMatthew G. Knepley coneNew[1] = vStartNew + (cone[1] - vStart); 520027fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 520127fcede3SMatthew G. Knepley #if 1 520227fcede3SMatthew 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); 520327fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 520427fcede3SMatthew 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); 520527fcede3SMatthew G. Knepley } 520627fcede3SMatthew G. Knepley #endif 520727fcede3SMatthew G. Knepley for (s = 0; s < size; ++s) { 520827fcede3SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &fsize);CHKERRQ(ierr); 520927fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &fcone);CHKERRQ(ierr); 521027fcede3SMatthew G. Knepley for (c = 0; c < fsize; ++c) if (fcone[c] == e) break; 521127fcede3SMatthew 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]); 521227fcede3SMatthew G. Knepley supportRef[s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (support[s] - fMax)*2 + c-2; 521327fcede3SMatthew G. Knepley } 521427fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 521527fcede3SMatthew G. Knepley #if 1 521627fcede3SMatthew 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); 521727fcede3SMatthew G. Knepley for (p = 0; p < size; ++p) { 521827fcede3SMatthew 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); 521927fcede3SMatthew G. Knepley } 522027fcede3SMatthew G. Knepley #endif 522127fcede3SMatthew G. Knepley } 522227fcede3SMatthew G. Knepley /* Hybrid face edges have 2 vertices and 2+cells faces */ 522327fcede3SMatthew G. Knepley for (f = fMax; f < fEnd; ++f) { 522427fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (f - fMax); 522527fcede3SMatthew G. Knepley const PetscInt *cone, *support, *ccone, *cornt; 522627fcede3SMatthew G. Knepley PetscInt coneNew[2], size, csize, s; 522727fcede3SMatthew G. Knepley 522827fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, f, &cone);CHKERRQ(ierr); 522927fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 523027fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 523127fcede3SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (cone[0] - eStart); 523227fcede3SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (cone[1] - eStart); 523327fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 523427fcede3SMatthew G. Knepley #if 1 523527fcede3SMatthew 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); 523627fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 523727fcede3SMatthew 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); 523827fcede3SMatthew G. Knepley } 523927fcede3SMatthew G. Knepley #endif 524027fcede3SMatthew G. Knepley supportRef[0] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (f - fMax)*2 + 0; 524127fcede3SMatthew G. Knepley supportRef[1] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (f - fMax)*2 + 1; 524227fcede3SMatthew G. Knepley for (s = 0; s < size; ++s) { 524327fcede3SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, support[s], &csize);CHKERRQ(ierr); 524427fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &ccone);CHKERRQ(ierr); 524527fcede3SMatthew G. Knepley ierr = DMPlexGetConeOrientation(dm, support[s], &cornt);CHKERRQ(ierr); 524627fcede3SMatthew G. Knepley for (c = 0; c < csize; ++c) if (ccone[c] == f) break; 524727fcede3SMatthew 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]); 5248d273725eSMatthew G. Knepley supportRef[2+s] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (support[s] - cMax)*4 + c-2; 524927fcede3SMatthew G. Knepley } 525027fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 525127fcede3SMatthew G. Knepley #if 1 525227fcede3SMatthew 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); 525327fcede3SMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 525427fcede3SMatthew 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); 525527fcede3SMatthew G. Knepley } 525627fcede3SMatthew G. Knepley #endif 525727fcede3SMatthew G. Knepley } 525827fcede3SMatthew G. Knepley /* Hybrid cell edges have 2 vertices and 4 faces */ 525927fcede3SMatthew G. Knepley for (c = cMax; c < cEnd; ++c) { 526027fcede3SMatthew G. Knepley const PetscInt newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (fEnd - fMax) + (c - cMax); 526127fcede3SMatthew G. Knepley const PetscInt *cone, *support; 526227fcede3SMatthew G. Knepley PetscInt coneNew[2], size; 526327fcede3SMatthew G. Knepley 526427fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr); 526527fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, c, &size);CHKERRQ(ierr); 526627fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, c, &support);CHKERRQ(ierr); 526727fcede3SMatthew G. Knepley coneNew[0] = vStartNew + (vEnd - vStart) + (eMax - eStart) + (cone[0] - fStart); 526827fcede3SMatthew G. Knepley coneNew[1] = vStartNew + (vEnd - vStart) + (eMax - eStart) + (cone[1] - fStart); 526927fcede3SMatthew G. Knepley ierr = DMPlexSetCone(rdm, newp, coneNew);CHKERRQ(ierr); 527027fcede3SMatthew G. Knepley #if 1 527127fcede3SMatthew 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); 527227fcede3SMatthew G. Knepley for (p = 0; p < 2; ++p) { 527327fcede3SMatthew 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); 527427fcede3SMatthew G. Knepley } 527527fcede3SMatthew G. Knepley #endif 527627fcede3SMatthew G. Knepley supportRef[0] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4 + 0; 527727fcede3SMatthew G. Knepley supportRef[1] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4 + 1; 527827fcede3SMatthew G. Knepley supportRef[2] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4 + 2; 527927fcede3SMatthew G. Knepley supportRef[3] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (c - cMax)*4 + 3; 528027fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 528127fcede3SMatthew G. Knepley #if 1 528227fcede3SMatthew 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); 528327fcede3SMatthew G. Knepley for (p = 0; p < 4; ++p) { 528427fcede3SMatthew 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); 528527fcede3SMatthew G. Knepley } 528627fcede3SMatthew G. Knepley #endif 528727fcede3SMatthew G. Knepley } 528827fcede3SMatthew G. Knepley /* Interior vertices have identical supports */ 528927fcede3SMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 529027fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (v - vStart); 529127fcede3SMatthew G. Knepley const PetscInt *support, *cone; 529227fcede3SMatthew G. Knepley PetscInt size, s; 529327fcede3SMatthew G. Knepley 529427fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, v, &size);CHKERRQ(ierr); 529527fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, v, &support);CHKERRQ(ierr); 529627fcede3SMatthew G. Knepley for (s = 0; s < size; ++s) { 529727fcede3SMatthew G. Knepley PetscInt r = 0; 529827fcede3SMatthew G. Knepley 529927fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 530027fcede3SMatthew G. Knepley if (cone[1] == v) r = 1; 530127fcede3SMatthew G. Knepley if (support[s] < eMax) supportRef[s] = eStartNew + (support[s] - eStart)*2 + r; 530227fcede3SMatthew G. Knepley else supportRef[s] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (support[s] - eMax); 530327fcede3SMatthew G. Knepley } 530427fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 530527fcede3SMatthew G. Knepley #if 1 530627fcede3SMatthew 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); 530727fcede3SMatthew G. Knepley for (p = 0; p < size; ++p) { 530827fcede3SMatthew 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); 530927fcede3SMatthew G. Knepley } 531027fcede3SMatthew G. Knepley #endif 531127fcede3SMatthew G. Knepley } 531227fcede3SMatthew G. Knepley /* Interior edge vertices have 2 + faces supports */ 531327fcede3SMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 531427fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (e - eStart); 531527fcede3SMatthew G. Knepley const PetscInt *cone, *support; 531627fcede3SMatthew G. Knepley PetscInt size, s; 531727fcede3SMatthew G. Knepley 531827fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, e, &size);CHKERRQ(ierr); 531927fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, e, &support);CHKERRQ(ierr); 532027fcede3SMatthew G. Knepley supportRef[0] = eStartNew + (e - eStart)*2 + 0; 532127fcede3SMatthew G. Knepley supportRef[1] = eStartNew + (e - eStart)*2 + 1; 532227fcede3SMatthew G. Knepley for (s = 0; s < size; ++s) { 532327fcede3SMatthew G. Knepley PetscInt r; 532427fcede3SMatthew G. Knepley 532527fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 532627fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) if (cone[r] == e) break; 532727fcede3SMatthew G. Knepley if (support[s] < fMax) { 532827fcede3SMatthew G. Knepley supportRef[2+s] = eStartNew + (eMax - eStart)*2 + (support[s] - fStart)*4 + r; 532927fcede3SMatthew G. Knepley } else { 533027fcede3SMatthew G. Knepley supportRef[2+s] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (support[s] - fMax); 533127fcede3SMatthew G. Knepley } 533227fcede3SMatthew G. Knepley } 533327fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 533427fcede3SMatthew G. Knepley #if 1 533527fcede3SMatthew 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); 533627fcede3SMatthew G. Knepley for (p = 0; p < 2+size; ++p) { 533727fcede3SMatthew 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); 533827fcede3SMatthew G. Knepley } 533927fcede3SMatthew G. Knepley #endif 534027fcede3SMatthew G. Knepley } 534127fcede3SMatthew G. Knepley /* Interior face vertices have 4 + cells supports */ 534227fcede3SMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 534327fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eMax - eStart) + (f - fStart); 534427fcede3SMatthew G. Knepley const PetscInt *cone, *support; 534527fcede3SMatthew G. Knepley PetscInt size, s; 534627fcede3SMatthew G. Knepley 534727fcede3SMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, f, &size);CHKERRQ(ierr); 534827fcede3SMatthew G. Knepley ierr = DMPlexGetSupport(dm, f, &support);CHKERRQ(ierr); 534927fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) supportRef[r] = eStartNew + (eMax - eStart)*2 + (f - fStart)*4 + r; 535027fcede3SMatthew G. Knepley for (s = 0; s < size; ++s) { 535127fcede3SMatthew G. Knepley PetscInt r; 535227fcede3SMatthew G. Knepley 535327fcede3SMatthew G. Knepley ierr = DMPlexGetCone(dm, support[s], &cone);CHKERRQ(ierr); 535427fcede3SMatthew G. Knepley for (r = 0; r < 6; ++r) if (cone[r] == f) break; 535527fcede3SMatthew G. Knepley if (support[s] < cMax) { 535627fcede3SMatthew G. Knepley supportRef[4+s] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (support[s] - cStart)*6 + r; 535727fcede3SMatthew G. Knepley } else { 535827fcede3SMatthew G. Knepley supportRef[4+s] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (fEnd - fMax) + (support[s] - cMax); 535927fcede3SMatthew G. Knepley } 536027fcede3SMatthew G. Knepley } 536127fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportRef);CHKERRQ(ierr); 536227fcede3SMatthew G. Knepley #if 1 536327fcede3SMatthew 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); 536427fcede3SMatthew G. Knepley for (p = 0; p < 4+size; ++p) { 536527fcede3SMatthew 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); 536627fcede3SMatthew G. Knepley } 536727fcede3SMatthew G. Knepley #endif 536827fcede3SMatthew G. Knepley } 536927fcede3SMatthew G. Knepley /* Cell vertices have 6 supports */ 537027fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 537127fcede3SMatthew G. Knepley const PetscInt newp = vStartNew + (vEnd - vStart) + (eMax - eStart) + (fMax - fStart) + (c - cStart); 537227fcede3SMatthew G. Knepley PetscInt supportNew[6]; 537327fcede3SMatthew G. Knepley 537427fcede3SMatthew G. Knepley for (r = 0; r < 6; ++r) { 537527fcede3SMatthew G. Knepley supportNew[r] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (c - cStart)*6 + r; 537627fcede3SMatthew G. Knepley } 537727fcede3SMatthew G. Knepley ierr = DMPlexSetSupport(rdm, newp, supportNew);CHKERRQ(ierr); 537827fcede3SMatthew G. Knepley } 537927fcede3SMatthew G. Knepley ierr = PetscFree(supportRef);CHKERRQ(ierr); 538027fcede3SMatthew G. Knepley break; 538175d3a19aSMatthew G. Knepley default: 538275d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 538375d3a19aSMatthew G. Knepley } 538475d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 538575d3a19aSMatthew G. Knepley } 538675d3a19aSMatthew G. Knepley 538775d3a19aSMatthew G. Knepley #undef __FUNCT__ 538875d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerSetCoordinates" 538986150812SJed Brown static PetscErrorCode CellRefinerSetCoordinates(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 539075d3a19aSMatthew G. Knepley { 539175d3a19aSMatthew G. Knepley PetscSection coordSection, coordSectionNew; 539275d3a19aSMatthew G. Knepley Vec coordinates, coordinatesNew; 539375d3a19aSMatthew G. Knepley PetscScalar *coords, *coordsNew; 53943478d7aaSMatthew G. Knepley const PetscInt numVertices = depthSize ? depthSize[0] : 0; 5395f1d7821bSLawrence Mitchell PetscInt spaceDim, depth, bs, coordSizeNew, cStart, cEnd, cMax, c, vStart, vStartNew, vEnd, v, eStart, eEnd, eMax, e, fStart, fEnd, fMax, f; 539675d3a19aSMatthew G. Knepley PetscErrorCode ierr; 539775d3a19aSMatthew G. Knepley 539875d3a19aSMatthew G. Knepley PetscFunctionBegin; 539975d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 540075d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 5401b5da9499SMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 540275d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 540375d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 540427fcede3SMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, NULL);CHKERRQ(ierr); 54053478d7aaSMatthew G. Knepley if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, NULL, NULL, NULL, &vStartNew);CHKERRQ(ierr);} 540675d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, depthSize, NULL, NULL, NULL, &vStartNew);CHKERRQ(ierr); 5407f719d809SMatthew G. Knepley ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr); 5408f1d7821bSLawrence Mitchell ierr = PetscSectionGetFieldComponents(coordSection, 0, &spaceDim);CHKERRQ(ierr); 540975d3a19aSMatthew G. Knepley ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm), &coordSectionNew);CHKERRQ(ierr); 541075d3a19aSMatthew G. Knepley ierr = PetscSectionSetNumFields(coordSectionNew, 1);CHKERRQ(ierr); 5411f1d7821bSLawrence Mitchell ierr = PetscSectionSetFieldComponents(coordSectionNew, 0, spaceDim);CHKERRQ(ierr); 54123478d7aaSMatthew G. Knepley ierr = PetscSectionSetChart(coordSectionNew, vStartNew, vStartNew+numVertices);CHKERRQ(ierr); 541327fcede3SMatthew G. Knepley if (cMax < 0) cMax = cEnd; 541475d3a19aSMatthew G. Knepley if (fMax < 0) fMax = fEnd; 5415b5da9499SMatthew G. Knepley if (eMax < 0) eMax = eEnd; 5416f1d7821bSLawrence Mitchell /* All vertices have the spaceDim coordinates */ 54173478d7aaSMatthew G. Knepley for (v = vStartNew; v < vStartNew+numVertices; ++v) { 5418f1d7821bSLawrence Mitchell ierr = PetscSectionSetDof(coordSectionNew, v, spaceDim);CHKERRQ(ierr); 5419f1d7821bSLawrence Mitchell ierr = PetscSectionSetFieldDof(coordSectionNew, v, 0, spaceDim);CHKERRQ(ierr); 542075d3a19aSMatthew G. Knepley } 542175d3a19aSMatthew G. Knepley ierr = PetscSectionSetUp(coordSectionNew);CHKERRQ(ierr); 5422f719d809SMatthew G. Knepley ierr = DMSetCoordinateSection(rdm, coordSectionNew);CHKERRQ(ierr); 542375d3a19aSMatthew G. Knepley ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr); 542475d3a19aSMatthew G. Knepley ierr = PetscSectionGetStorageSize(coordSectionNew, &coordSizeNew);CHKERRQ(ierr); 542575d3a19aSMatthew G. Knepley ierr = VecCreate(PetscObjectComm((PetscObject)dm), &coordinatesNew);CHKERRQ(ierr); 542675d3a19aSMatthew G. Knepley ierr = PetscObjectSetName((PetscObject) coordinatesNew, "coordinates");CHKERRQ(ierr); 542775d3a19aSMatthew G. Knepley ierr = VecSetSizes(coordinatesNew, coordSizeNew, PETSC_DETERMINE);CHKERRQ(ierr); 542860b9e8a1SMatthew G. Knepley ierr = VecGetBlockSize(coordinates, &bs);CHKERRQ(ierr); 542960b9e8a1SMatthew G. Knepley ierr = VecSetBlockSize(coordinatesNew, bs);CHKERRQ(ierr); 543075d3a19aSMatthew G. Knepley ierr = VecSetFromOptions(coordinatesNew);CHKERRQ(ierr); 543175d3a19aSMatthew G. Knepley ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr); 543275d3a19aSMatthew G. Knepley ierr = VecGetArray(coordinatesNew, &coordsNew);CHKERRQ(ierr); 5433b5da9499SMatthew G. Knepley switch (refiner) { 54343478d7aaSMatthew G. Knepley case 0: break; 5435b5da9499SMatthew G. Knepley case 6: /* Hex 3D */ 5436d856d60fSMatthew G. Knepley case 8: /* Hybrid Hex 3D */ 5437b5da9499SMatthew G. Knepley /* Face vertices have the average of corner coordinates */ 5438d856d60fSMatthew G. Knepley for (f = fStart; f < fMax; ++f) { 543927fcede3SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (eMax - eStart) + (f - fStart); 5440b5da9499SMatthew G. Knepley PetscInt *cone = NULL; 5441b5da9499SMatthew G. Knepley PetscInt closureSize, coneSize = 0, off[8], offnew, p, d; 5442b5da9499SMatthew G. Knepley 5443b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, f, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 5444b5da9499SMatthew G. Knepley for (p = 0; p < closureSize*2; p += 2) { 5445b5da9499SMatthew G. Knepley const PetscInt point = cone[p]; 5446b5da9499SMatthew G. Knepley if ((point >= vStart) && (point < vEnd)) cone[coneSize++] = point; 5447b5da9499SMatthew G. Knepley } 5448b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) { 5449b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[v], &off[v]);CHKERRQ(ierr); 5450b5da9499SMatthew G. Knepley } 5451b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 5452f1d7821bSLawrence Mitchell for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] = 0.0; 5453f1d7821bSLawrence Mitchell for (v = 0; v < coneSize; ++v) {ierr = DMPlexLocalizeAddCoordinate_Internal(dm, spaceDim, &coords[off[0]], &coords[off[v]], &coordsNew[offnew]);CHKERRQ(ierr);} 5454f1d7821bSLawrence Mitchell for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] /= coneSize; 5455b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, f, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 5456b5da9499SMatthew G. Knepley } 5457b5da9499SMatthew G. Knepley case 2: /* Hex 2D */ 5458a97b51b8SMatthew G. Knepley case 4: /* Hybrid Hex 2D */ 5459b5da9499SMatthew G. Knepley /* Cell vertices have the average of corner coordinates */ 546027fcede3SMatthew G. Knepley for (c = cStart; c < cMax; ++c) { 5461f1d7821bSLawrence Mitchell const PetscInt newv = vStartNew + (vEnd - vStart) + (eMax - eStart) + (c - cStart) + (spaceDim > 2 ? (fMax - fStart) : 0); 5462b5da9499SMatthew G. Knepley PetscInt *cone = NULL; 5463b5da9499SMatthew G. Knepley PetscInt closureSize, coneSize = 0, off[8], offnew, p, d; 5464b5da9499SMatthew G. Knepley 5465b5da9499SMatthew G. Knepley ierr = DMPlexGetTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 5466b5da9499SMatthew G. Knepley for (p = 0; p < closureSize*2; p += 2) { 5467b5da9499SMatthew G. Knepley const PetscInt point = cone[p]; 5468b5da9499SMatthew G. Knepley if ((point >= vStart) && (point < vEnd)) cone[coneSize++] = point; 5469b5da9499SMatthew G. Knepley } 5470b5da9499SMatthew G. Knepley for (v = 0; v < coneSize; ++v) { 5471b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[v], &off[v]);CHKERRQ(ierr); 5472b5da9499SMatthew G. Knepley } 5473b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 5474f1d7821bSLawrence Mitchell for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] = 0.0; 5475f1d7821bSLawrence Mitchell for (v = 0; v < coneSize; ++v) {ierr = DMPlexLocalizeAddCoordinate_Internal(dm, spaceDim, &coords[off[0]], &coords[off[v]], &coordsNew[offnew]);CHKERRQ(ierr);} 5476f1d7821bSLawrence Mitchell for (d = 0; d < spaceDim; ++d) coordsNew[offnew+d] /= coneSize; 5477b5da9499SMatthew G. Knepley ierr = DMPlexRestoreTransitiveClosure(dm, c, PETSC_TRUE, &closureSize, &cone);CHKERRQ(ierr); 5478b5da9499SMatthew G. Knepley } 5479b5da9499SMatthew G. Knepley case 1: /* Simplicial 2D */ 5480b5da9499SMatthew G. Knepley case 3: /* Hybrid Simplicial 2D */ 5481b5da9499SMatthew G. Knepley case 5: /* Simplicial 3D */ 54826ce3c06aSMatthew G. Knepley case 7: /* Hybrid Simplicial 3D */ 5483b5da9499SMatthew G. Knepley /* Edge vertices have the average of endpoint coordinates */ 5484b5da9499SMatthew G. Knepley for (e = eStart; e < eMax; ++e) { 5485b5da9499SMatthew G. Knepley const PetscInt newv = vStartNew + (vEnd - vStart) + (e - eStart); 5486b5da9499SMatthew G. Knepley const PetscInt *cone; 5487b5da9499SMatthew G. Knepley PetscInt coneSize, offA, offB, offnew, d; 5488b5da9499SMatthew G. Knepley 5489b5da9499SMatthew G. Knepley ierr = DMPlexGetConeSize(dm, e, &coneSize);CHKERRQ(ierr); 5490b5da9499SMatthew G. Knepley if (coneSize != 2) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Edge %d cone should have two vertices, not %d", e, coneSize); 5491b5da9499SMatthew G. Knepley ierr = DMPlexGetCone(dm, e, &cone);CHKERRQ(ierr); 5492b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[0], &offA);CHKERRQ(ierr); 5493b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, cone[1], &offB);CHKERRQ(ierr); 5494b5da9499SMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 5495f1d7821bSLawrence Mitchell ierr = DMPlexLocalizeCoordinate_Internal(dm, spaceDim, &coords[offA], &coords[offB], &coordsNew[offnew]);CHKERRQ(ierr); 5496f1d7821bSLawrence Mitchell for (d = 0; d < spaceDim; ++d) { 5497a96104c9SMatthew G. Knepley coordsNew[offnew+d] = 0.5*(coords[offA+d] + coordsNew[offnew+d]); 5498b5da9499SMatthew G. Knepley } 5499b5da9499SMatthew G. Knepley } 550075d3a19aSMatthew G. Knepley /* Old vertices have the same coordinates */ 550175d3a19aSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) { 550275d3a19aSMatthew G. Knepley const PetscInt newv = vStartNew + (v - vStart); 550375d3a19aSMatthew G. Knepley PetscInt off, offnew, d; 550475d3a19aSMatthew G. Knepley 550575d3a19aSMatthew G. Knepley ierr = PetscSectionGetOffset(coordSection, v, &off);CHKERRQ(ierr); 550675d3a19aSMatthew G. Knepley ierr = PetscSectionGetOffset(coordSectionNew, newv, &offnew);CHKERRQ(ierr); 5507f1d7821bSLawrence Mitchell for (d = 0; d < spaceDim; ++d) { 550875d3a19aSMatthew G. Knepley coordsNew[offnew+d] = coords[off+d]; 550975d3a19aSMatthew G. Knepley } 551075d3a19aSMatthew G. Knepley } 5511b5da9499SMatthew G. Knepley break; 5512b5da9499SMatthew G. Knepley default: 5513b5da9499SMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 551475d3a19aSMatthew G. Knepley } 551575d3a19aSMatthew G. Knepley ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr); 551675d3a19aSMatthew G. Knepley ierr = VecRestoreArray(coordinatesNew, &coordsNew);CHKERRQ(ierr); 551775d3a19aSMatthew G. Knepley ierr = DMSetCoordinatesLocal(rdm, coordinatesNew);CHKERRQ(ierr); 551875d3a19aSMatthew G. Knepley ierr = VecDestroy(&coordinatesNew);CHKERRQ(ierr); 551975d3a19aSMatthew G. Knepley ierr = PetscSectionDestroy(&coordSectionNew);CHKERRQ(ierr); 5520a96104c9SMatthew G. Knepley if (dm->maxCell) { 5521a96104c9SMatthew G. Knepley const PetscReal *maxCell, *L; 5522a96104c9SMatthew G. Knepley ierr = DMGetPeriodicity(dm, &maxCell, &L);CHKERRQ(ierr); 5523a96104c9SMatthew G. Knepley ierr = DMSetPeriodicity(rdm, maxCell, L);CHKERRQ(ierr); 5524a96104c9SMatthew G. Knepley } 552575d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 552675d3a19aSMatthew G. Knepley } 552775d3a19aSMatthew G. Knepley 552875d3a19aSMatthew G. Knepley #undef __FUNCT__ 552975d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexCreateProcessSF" 553086150812SJed Brown static PetscErrorCode DMPlexCreateProcessSF(DM dm, PetscSF sfPoint, IS *processRanks, PetscSF *sfProcess) 553175d3a19aSMatthew G. Knepley { 553275d3a19aSMatthew G. Knepley PetscInt numRoots, numLeaves, l; 553375d3a19aSMatthew G. Knepley const PetscInt *localPoints; 553475d3a19aSMatthew G. Knepley const PetscSFNode *remotePoints; 553575d3a19aSMatthew G. Knepley PetscInt *localPointsNew; 553675d3a19aSMatthew G. Knepley PetscSFNode *remotePointsNew; 553775d3a19aSMatthew G. Knepley PetscInt *ranks, *ranksNew; 553875d3a19aSMatthew G. Knepley PetscErrorCode ierr; 553975d3a19aSMatthew G. Knepley 554075d3a19aSMatthew G. Knepley PetscFunctionBegin; 554175d3a19aSMatthew G. Knepley ierr = PetscSFGetGraph(sfPoint, &numRoots, &numLeaves, &localPoints, &remotePoints);CHKERRQ(ierr); 5542785e854fSJed Brown ierr = PetscMalloc1(numLeaves, &ranks);CHKERRQ(ierr); 554375d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 554475d3a19aSMatthew G. Knepley ranks[l] = remotePoints[l].rank; 554575d3a19aSMatthew G. Knepley } 554675d3a19aSMatthew G. Knepley ierr = PetscSortRemoveDupsInt(&numLeaves, ranks);CHKERRQ(ierr); 5547785e854fSJed Brown ierr = PetscMalloc1(numLeaves, &ranksNew);CHKERRQ(ierr); 5548785e854fSJed Brown ierr = PetscMalloc1(numLeaves, &localPointsNew);CHKERRQ(ierr); 5549785e854fSJed Brown ierr = PetscMalloc1(numLeaves, &remotePointsNew);CHKERRQ(ierr); 555075d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 555175d3a19aSMatthew G. Knepley ranksNew[l] = ranks[l]; 555275d3a19aSMatthew G. Knepley localPointsNew[l] = l; 555375d3a19aSMatthew G. Knepley remotePointsNew[l].index = 0; 555475d3a19aSMatthew G. Knepley remotePointsNew[l].rank = ranksNew[l]; 555575d3a19aSMatthew G. Knepley } 555675d3a19aSMatthew G. Knepley ierr = PetscFree(ranks);CHKERRQ(ierr); 555775d3a19aSMatthew G. Knepley ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm), numLeaves, ranksNew, PETSC_OWN_POINTER, processRanks);CHKERRQ(ierr); 555875d3a19aSMatthew G. Knepley ierr = PetscSFCreate(PetscObjectComm((PetscObject)dm), sfProcess);CHKERRQ(ierr); 555975d3a19aSMatthew G. Knepley ierr = PetscSFSetFromOptions(*sfProcess);CHKERRQ(ierr); 556075d3a19aSMatthew G. Knepley ierr = PetscSFSetGraph(*sfProcess, 1, numLeaves, localPointsNew, PETSC_OWN_POINTER, remotePointsNew, PETSC_OWN_POINTER);CHKERRQ(ierr); 556175d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 556275d3a19aSMatthew G. Knepley } 556375d3a19aSMatthew G. Knepley 556475d3a19aSMatthew G. Knepley #undef __FUNCT__ 556575d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerCreateSF" 556686150812SJed Brown static PetscErrorCode CellRefinerCreateSF(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 556775d3a19aSMatthew G. Knepley { 556875d3a19aSMatthew G. Knepley PetscSF sf, sfNew, sfProcess; 556975d3a19aSMatthew G. Knepley IS processRanks; 557075d3a19aSMatthew G. Knepley MPI_Datatype depthType; 557175d3a19aSMatthew G. Knepley PetscInt numRoots, numLeaves, numLeavesNew = 0, l, m; 557275d3a19aSMatthew G. Knepley const PetscInt *localPoints, *neighbors; 557375d3a19aSMatthew G. Knepley const PetscSFNode *remotePoints; 557475d3a19aSMatthew G. Knepley PetscInt *localPointsNew; 557575d3a19aSMatthew G. Knepley PetscSFNode *remotePointsNew; 557675d3a19aSMatthew G. Knepley PetscInt *depthSizeOld, *rdepthSize, *rdepthSizeOld, *rdepthMaxOld, *rvStart, *rvStartNew, *reStart, *reStartNew, *rfStart, *rfStartNew, *rcStart, *rcStartNew; 55777ba685a0SMatthew G. Knepley PetscInt depth, numNeighbors, pStartNew, pEndNew, cStart, cEnd, cMax, vStart, vEnd, vMax, fStart, fEnd, fMax, eStart, eEnd, eMax, r, n; 55787ba685a0SMatthew G. Knepley PetscInt cStartNew = 0, vStartNew = 0, fStartNew = 0, eStartNew = 0; 557975d3a19aSMatthew G. Knepley PetscErrorCode ierr; 558075d3a19aSMatthew G. Knepley 558175d3a19aSMatthew G. Knepley PetscFunctionBegin; 558275d3a19aSMatthew G. Knepley ierr = DMPlexGetChart(rdm, &pStartNew, &pEndNew);CHKERRQ(ierr); 558375d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 558475d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 558575d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 558675d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 558775d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 558875d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 5589add09238SMatthew G. Knepley cMax = cMax < 0 ? cEnd : cMax; 5590add09238SMatthew G. Knepley fMax = fMax < 0 ? fEnd : fMax; 5591add09238SMatthew G. Knepley eMax = eMax < 0 ? eEnd : eMax; 55923478d7aaSMatthew G. Knepley if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr);} 559375d3a19aSMatthew G. Knepley ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr); 559475d3a19aSMatthew G. Knepley ierr = DMGetPointSF(rdm, &sfNew);CHKERRQ(ierr); 5595add09238SMatthew G. Knepley /* Calculate size of new SF */ 559675d3a19aSMatthew G. Knepley ierr = PetscSFGetGraph(sf, &numRoots, &numLeaves, &localPoints, &remotePoints);CHKERRQ(ierr); 559775d3a19aSMatthew G. Knepley if (numRoots < 0) PetscFunctionReturn(0); 559875d3a19aSMatthew G. Knepley for (l = 0; l < numLeaves; ++l) { 559975d3a19aSMatthew G. Knepley const PetscInt p = localPoints[l]; 560075d3a19aSMatthew G. Knepley 560175d3a19aSMatthew G. Knepley switch (refiner) { 560275d3a19aSMatthew G. Knepley case 1: 5603a97b51b8SMatthew G. Knepley case 3: 5604a97b51b8SMatthew G. Knepley /* Hybrid Simplicial 2D */ 5605a97b51b8SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 5606a97b51b8SMatthew G. Knepley /* Interior vertices stay the same */ 5607a97b51b8SMatthew G. Knepley ++numLeavesNew; 5608a97b51b8SMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 5609a97b51b8SMatthew G. Knepley /* Interior faces add new faces and vertex */ 5610a97b51b8SMatthew G. Knepley numLeavesNew += 2 + 1; 5611a97b51b8SMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 5612a97b51b8SMatthew G. Knepley /* Hybrid faces stay the same */ 5613a97b51b8SMatthew G. Knepley ++numLeavesNew; 5614a97b51b8SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 5615a97b51b8SMatthew G. Knepley /* Interior cells add new cells and interior faces */ 5616a97b51b8SMatthew G. Knepley numLeavesNew += 4 + 3; 5617a97b51b8SMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 5618a97b51b8SMatthew G. Knepley /* Hybrid cells add new cells and hybrid face */ 5619a97b51b8SMatthew G. Knepley numLeavesNew += 2 + 1; 5620a97b51b8SMatthew G. Knepley } 5621a97b51b8SMatthew G. Knepley break; 562275d3a19aSMatthew G. Knepley case 2: 5623a97b51b8SMatthew G. Knepley case 4: 5624a97b51b8SMatthew G. Knepley /* Hybrid Hex 2D */ 5625a97b51b8SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 5626a97b51b8SMatthew G. Knepley /* Interior vertices stay the same */ 5627a97b51b8SMatthew G. Knepley ++numLeavesNew; 5628a97b51b8SMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 5629a97b51b8SMatthew G. Knepley /* Interior faces add new faces and vertex */ 5630a97b51b8SMatthew G. Knepley numLeavesNew += 2 + 1; 5631a97b51b8SMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 5632a97b51b8SMatthew G. Knepley /* Hybrid faces stay the same */ 5633a97b51b8SMatthew G. Knepley ++numLeavesNew; 5634a97b51b8SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 5635a97b51b8SMatthew G. Knepley /* Interior cells add new cells, interior faces, and vertex */ 5636a97b51b8SMatthew G. Knepley numLeavesNew += 4 + 4 + 1; 5637a97b51b8SMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 5638a97b51b8SMatthew G. Knepley /* Hybrid cells add new cells and hybrid face */ 5639a97b51b8SMatthew G. Knepley numLeavesNew += 2 + 1; 5640a97b51b8SMatthew G. Knepley } 5641a97b51b8SMatthew G. Knepley break; 5642b5da9499SMatthew G. Knepley case 5: 56436ce3c06aSMatthew G. Knepley case 7: 56446ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 56456ce3c06aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 56466ce3c06aSMatthew G. Knepley /* Interior vertices stay the same */ 56476ce3c06aSMatthew G. Knepley ++numLeavesNew; 56486ce3c06aSMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 56496ce3c06aSMatthew G. Knepley /* Interior edges add new edges and vertex */ 56506ce3c06aSMatthew G. Knepley numLeavesNew += 2 + 1; 56516ce3c06aSMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 56526ce3c06aSMatthew G. Knepley /* Hybrid edges stay the same */ 56536ce3c06aSMatthew G. Knepley ++numLeavesNew; 56546ce3c06aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 56556ce3c06aSMatthew G. Knepley /* Interior faces add new faces and edges */ 56566ce3c06aSMatthew G. Knepley numLeavesNew += 4 + 3; 56576ce3c06aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 56586ce3c06aSMatthew G. Knepley /* Hybrid faces add new faces and edges */ 56596ce3c06aSMatthew G. Knepley numLeavesNew += 2 + 1; 56606ce3c06aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 56616ce3c06aSMatthew G. Knepley /* Interior cells add new cells, faces, and edges */ 56626ce3c06aSMatthew G. Knepley numLeavesNew += 8 + 8 + 1; 56636ce3c06aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 56646ce3c06aSMatthew G. Knepley /* Hybrid cells add new cells and faces */ 56656ce3c06aSMatthew G. Knepley numLeavesNew += 4 + 3; 56666ce3c06aSMatthew G. Knepley } 56676ce3c06aSMatthew G. Knepley break; 56682eabf88fSMatthew G. Knepley case 6: 566927fcede3SMatthew G. Knepley case 8: 567027fcede3SMatthew G. Knepley /* Hybrid Hex 3D */ 567127fcede3SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 567227fcede3SMatthew G. Knepley /* Old vertices stay the same */ 567327fcede3SMatthew G. Knepley ++numLeavesNew; 567427fcede3SMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 567527fcede3SMatthew G. Knepley /* Interior edges add new edges, and vertex */ 567627fcede3SMatthew G. Knepley numLeavesNew += 2 + 1; 567727fcede3SMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 567827fcede3SMatthew G. Knepley /* Hybrid edges stay the same */ 567927fcede3SMatthew G. Knepley ++numLeavesNew; 568027fcede3SMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 568127fcede3SMatthew G. Knepley /* Interior faces add new faces, edges, and vertex */ 568227fcede3SMatthew G. Knepley numLeavesNew += 4 + 4 + 1; 568327fcede3SMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 568427fcede3SMatthew G. Knepley /* Hybrid faces add new faces and edges */ 568527fcede3SMatthew G. Knepley numLeavesNew += 2 + 1; 568627fcede3SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 568727fcede3SMatthew G. Knepley /* Interior cells add new cells, faces, edges, and vertex */ 568827fcede3SMatthew G. Knepley numLeavesNew += 8 + 12 + 6 + 1; 568927fcede3SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 569027fcede3SMatthew G. Knepley /* Hybrid cells add new cells, faces, and edges */ 569127fcede3SMatthew G. Knepley numLeavesNew += 4 + 4 + 1; 569227fcede3SMatthew G. Knepley } 569327fcede3SMatthew G. Knepley break; 569475d3a19aSMatthew G. Knepley default: 569575d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 569675d3a19aSMatthew G. Knepley } 569775d3a19aSMatthew G. Knepley } 569875d3a19aSMatthew G. Knepley /* Communicate depthSizes for each remote rank */ 569975d3a19aSMatthew G. Knepley ierr = DMPlexCreateProcessSF(dm, sf, &processRanks, &sfProcess);CHKERRQ(ierr); 570075d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(processRanks, &numNeighbors);CHKERRQ(ierr); 5701dcca6d9dSJed Brown ierr = PetscMalloc5((depth+1)*numNeighbors,&rdepthSize,numNeighbors,&rvStartNew,numNeighbors,&reStartNew,numNeighbors,&rfStartNew,numNeighbors,&rcStartNew);CHKERRQ(ierr); 5702dcca6d9dSJed Brown ierr = PetscMalloc7(depth+1,&depthSizeOld,(depth+1)*numNeighbors,&rdepthSizeOld,(depth+1)*numNeighbors,&rdepthMaxOld,numNeighbors,&rvStart,numNeighbors,&reStart,numNeighbors,&rfStart,numNeighbors,&rcStart);CHKERRQ(ierr); 570375d3a19aSMatthew G. Knepley ierr = MPI_Type_contiguous(depth+1, MPIU_INT, &depthType);CHKERRQ(ierr); 570475d3a19aSMatthew G. Knepley ierr = MPI_Type_commit(&depthType);CHKERRQ(ierr); 570575d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSize, rdepthSize);CHKERRQ(ierr); 570675d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSize, rdepthSize);CHKERRQ(ierr); 570775d3a19aSMatthew G. Knepley for (n = 0; n < numNeighbors; ++n) { 570875d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, &rdepthSize[n*(depth+1)], &rcStartNew[n], &rfStartNew[n], &reStartNew[n], &rvStartNew[n]);CHKERRQ(ierr); 570975d3a19aSMatthew G. Knepley } 571075d3a19aSMatthew G. Knepley depthSizeOld[depth] = cMax; 571175d3a19aSMatthew G. Knepley depthSizeOld[0] = vMax; 571275d3a19aSMatthew G. Knepley depthSizeOld[depth-1] = fMax; 571375d3a19aSMatthew G. Knepley depthSizeOld[1] = eMax; 571475d3a19aSMatthew G. Knepley 571575d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSizeOld, rdepthMaxOld);CHKERRQ(ierr); 571675d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSizeOld, rdepthMaxOld);CHKERRQ(ierr); 571775d3a19aSMatthew G. Knepley 571875d3a19aSMatthew G. Knepley depthSizeOld[depth] = cEnd - cStart; 571975d3a19aSMatthew G. Knepley depthSizeOld[0] = vEnd - vStart; 572075d3a19aSMatthew G. Knepley depthSizeOld[depth-1] = fEnd - fStart; 572175d3a19aSMatthew G. Knepley depthSizeOld[1] = eEnd - eStart; 572275d3a19aSMatthew G. Knepley 572375d3a19aSMatthew G. Knepley ierr = PetscSFBcastBegin(sfProcess, depthType, depthSizeOld, rdepthSizeOld);CHKERRQ(ierr); 572475d3a19aSMatthew G. Knepley ierr = PetscSFBcastEnd(sfProcess, depthType, depthSizeOld, rdepthSizeOld);CHKERRQ(ierr); 572575d3a19aSMatthew G. Knepley for (n = 0; n < numNeighbors; ++n) { 572675d3a19aSMatthew G. Knepley ierr = GetDepthStart_Private(depth, &rdepthSizeOld[n*(depth+1)], &rcStart[n], &rfStart[n], &reStart[n], &rvStart[n]);CHKERRQ(ierr); 57270252e7f5SMatthew G. Knepley rdepthMaxOld[n*(depth+1)+depth] = rdepthMaxOld[n*(depth+1)+depth] < 0 ? rdepthSizeOld[n*(depth+1)+depth] +rcStart[n]: rdepthMaxOld[n*(depth+1)+depth]; 57280252e7f5SMatthew G. Knepley rdepthMaxOld[n*(depth+1)+depth-1] = rdepthMaxOld[n*(depth+1)+depth-1] < 0 ? rdepthSizeOld[n*(depth+1)+depth-1]+rfStart[n]: rdepthMaxOld[n*(depth+1)+depth-1]; 57290252e7f5SMatthew G. Knepley rdepthMaxOld[n*(depth+1)+1] = rdepthMaxOld[n*(depth+1)+1] < 0 ? rdepthSizeOld[n*(depth+1)+1] +reStart[n]: rdepthMaxOld[n*(depth+1)+1]; 573075d3a19aSMatthew G. Knepley } 573175d3a19aSMatthew G. Knepley ierr = MPI_Type_free(&depthType);CHKERRQ(ierr); 573275d3a19aSMatthew G. Knepley ierr = PetscSFDestroy(&sfProcess);CHKERRQ(ierr); 573375d3a19aSMatthew G. Knepley /* Calculate new point SF */ 5734785e854fSJed Brown ierr = PetscMalloc1(numLeavesNew, &localPointsNew);CHKERRQ(ierr); 5735785e854fSJed Brown ierr = PetscMalloc1(numLeavesNew, &remotePointsNew);CHKERRQ(ierr); 573675d3a19aSMatthew G. Knepley ierr = ISGetIndices(processRanks, &neighbors);CHKERRQ(ierr); 573775d3a19aSMatthew G. Knepley for (l = 0, m = 0; l < numLeaves; ++l) { 573875d3a19aSMatthew G. Knepley PetscInt p = localPoints[l]; 573975d3a19aSMatthew G. Knepley PetscInt rp = remotePoints[l].index, n; 574075d3a19aSMatthew G. Knepley PetscMPIInt rrank = remotePoints[l].rank; 574175d3a19aSMatthew G. Knepley 574275d3a19aSMatthew G. Knepley ierr = PetscFindInt(rrank, numNeighbors, neighbors, &n);CHKERRQ(ierr); 574375d3a19aSMatthew G. Knepley if (n < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Could not locate remote rank %d", rrank); 574475d3a19aSMatthew G. Knepley switch (refiner) { 574575d3a19aSMatthew G. Knepley case 1: 574675d3a19aSMatthew G. Knepley case 3: 574775d3a19aSMatthew G. Knepley /* Hybrid simplicial 2D */ 574875d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 574975d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 575075d3a19aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 575175d3a19aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 575275d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 575375d3a19aSMatthew G. Knepley ++m; 575475d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 575575d3a19aSMatthew G. Knepley /* Old interior faces add new faces and vertex */ 575675d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 575775d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 575875d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 575975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 576075d3a19aSMatthew G. Knepley } 5761add09238SMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 5762add09238SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 5763add09238SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5764add09238SMatthew G. Knepley ++m; 576575d3a19aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 576675d3a19aSMatthew G. Knepley /* Old hybrid faces stay the same */ 576775d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - fMax); 576875d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rdepthMaxOld[n*(depth+1)+depth-1]); 576975d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 577075d3a19aSMatthew G. Knepley ++m; 577175d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 577275d3a19aSMatthew G. Knepley /* Old interior cells add new cells and interior faces */ 577375d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 577475d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 577575d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 577675d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 577775d3a19aSMatthew G. Knepley } 577875d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 577975d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - cStart)*3 + r; 578075d3a19aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rcStart[n])*3 + r; 578175d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 578275d3a19aSMatthew G. Knepley } 5783add09238SMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 578475d3a19aSMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 578575d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 578675d3a19aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 578775d3a19aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 578875d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 578975d3a19aSMatthew G. Knepley } 579075d3a19aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (p - cMax); 579175d3a19aSMatthew 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]); 579275d3a19aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 579375d3a19aSMatthew G. Knepley ++m; 579475d3a19aSMatthew G. Knepley } 579575d3a19aSMatthew G. Knepley break; 5796add09238SMatthew G. Knepley case 2: 5797a97b51b8SMatthew G. Knepley case 4: 5798a97b51b8SMatthew G. Knepley /* Hybrid Hex 2D */ 5799a97b51b8SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 5800a97b51b8SMatthew G. Knepley /* Old vertices stay the same */ 5801a97b51b8SMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 5802a97b51b8SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 5803a97b51b8SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5804a97b51b8SMatthew G. Knepley ++m; 5805a97b51b8SMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 5806a97b51b8SMatthew G. Knepley /* Old interior faces add new faces and vertex */ 5807a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 5808a97b51b8SMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*2 + r; 5809a97b51b8SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*2 + r; 5810a97b51b8SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5811a97b51b8SMatthew G. Knepley } 5812add09238SMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - fStart); 5813add09238SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - rfStart[n]); 5814add09238SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5815add09238SMatthew G. Knepley ++m; 5816a97b51b8SMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 5817a97b51b8SMatthew G. Knepley /* Old hybrid faces stay the same */ 5818a97b51b8SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - fMax); 5819a97b51b8SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rdepthMaxOld[n*(depth+1)+depth-1]); 5820a97b51b8SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5821a97b51b8SMatthew G. Knepley ++m; 5822a97b51b8SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 5823a97b51b8SMatthew G. Knepley /* Old interior cells add new cells, interior faces, and vertex */ 5824a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 5825a97b51b8SMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 5826a97b51b8SMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 5827a97b51b8SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5828a97b51b8SMatthew G. Knepley } 5829a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 5830a97b51b8SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (p - cStart)*4 + r; 5831a97b51b8SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rp - rcStart[n])*4 + r; 5832a97b51b8SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5833a97b51b8SMatthew G. Knepley } 5834add09238SMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (fMax - fStart) + (p - cStart); 5835add09238SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n]) + (rp - rcStart[n]); 5836add09238SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5837add09238SMatthew G. Knepley ++m; 5838a97b51b8SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 5839a97b51b8SMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 5840a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 5841a97b51b8SMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*4 + r; 5842a97b51b8SMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*4 + r; 5843a97b51b8SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5844a97b51b8SMatthew G. Knepley } 5845a97b51b8SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (p - cMax); 5846a97b51b8SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*4 + (rp - rdepthMaxOld[n*(depth+1)+depth]); 5847a97b51b8SMatthew G. Knepley remotePointsNew[m].rank = rrank; 5848a97b51b8SMatthew G. Knepley ++m; 5849a97b51b8SMatthew G. Knepley } 5850a97b51b8SMatthew G. Knepley break; 5851b5da9499SMatthew G. Knepley case 5: 58526ce3c06aSMatthew G. Knepley case 7: 58536ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 58546ce3c06aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 58556ce3c06aSMatthew G. Knepley /* Interior vertices stay the same */ 58566ce3c06aSMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 58576ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 58586ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 58596ce3c06aSMatthew G. Knepley ++m; 58606ce3c06aSMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 58616ce3c06aSMatthew G. Knepley /* Interior edges add new edges and vertex */ 58626ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 58636ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (p - eStart)*2 + r; 58646ce3c06aSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rp - reStart[n])*2 + r; 58656ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 58666ce3c06aSMatthew G. Knepley } 58676ce3c06aSMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - eStart); 58686ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - reStart[n]); 58696ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 58706ce3c06aSMatthew G. Knepley ++m; 58716ce3c06aSMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 58726ce3c06aSMatthew G. Knepley /* Hybrid edges stay the same */ 58736ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (p - eMax); 58747d5cd7d5SMatthew G. Knepley remotePointsNew[m].index = reStartNew[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]); 58756ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 58766ce3c06aSMatthew G. Knepley ++m; 58776ce3c06aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 58786ce3c06aSMatthew G. Knepley /* Interior faces add new faces and edges */ 58796ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 58806ce3c06aSMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*4 + r; 58816ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*4 + r; 58826ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 58836ce3c06aSMatthew G. Knepley } 58846ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 58856ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (p - fStart)*3 + r; 58866ce3c06aSMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rp - rfStart[n])*3 + r; 58876ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 58886ce3c06aSMatthew G. Knepley } 58896ce3c06aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 58906ce3c06aSMatthew G. Knepley /* Hybrid faces add new faces and edges */ 58916ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 5892899f98d0SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (p - fMax)*2 + r; 5893899f98d0SMatthew 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 - rdepthMaxOld[n*(depth+1)+depth-1])*2 + r; 58946ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 58956ce3c06aSMatthew G. Knepley } 58967d5cd7d5SMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (eEnd - eMax) + (p - fMax); 58977d5cd7d5SMatthew G. Knepley remotePointsNew[m].index = reStartNew[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]) + (rdepthSizeOld[n*(depth+1)+1]+reStart[n] - rdepthMaxOld[n*(depth+1)+1]) + (rp - rdepthMaxOld[n*(depth+1)+depth-1]); 58986ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 589909b1338fSMatthew G. Knepley ++m; 59006ce3c06aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 59016ce3c06aSMatthew G. Knepley /* Interior cells add new cells, faces, and edges */ 59026ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 59036ce3c06aSMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*8 + r; 59046ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*8 + r; 59056ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 59066ce3c06aSMatthew G. Knepley } 59076ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 59086ce3c06aSMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (p - cStart)*8 + r; 59096ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rp - rcStart[n])*8 + r; 59106ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 59116ce3c06aSMatthew G. Knepley } 59126ce3c06aSMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (p - cStart)*1 + r; 59136ce3c06aSMatthew 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; 59146ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 591509b1338fSMatthew G. Knepley ++m; 59166ce3c06aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 59176ce3c06aSMatthew G. Knepley /* Hybrid cells add new cells and faces */ 59186ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 59196ce3c06aSMatthew G. Knepley localPointsNew[m] = cStartNew + (cMax - cStart)*8 + (p - cMax)*4 + r; 59206ce3c06aSMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*8 + (rp - rdepthMaxOld[n*(depth+1)+depth])*4 + r; 59216ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 59226ce3c06aSMatthew G. Knepley } 59236ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r, ++m) { 5924899f98d0SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (p - cMax)*3 + r; 5925899f98d0SMatthew 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])*2 + (rp - rdepthMaxOld[n*(depth+1)+depth])*3 + r; 59266ce3c06aSMatthew G. Knepley remotePointsNew[m].rank = rrank; 59276ce3c06aSMatthew G. Knepley } 59286ce3c06aSMatthew G. Knepley } 59296ce3c06aSMatthew G. Knepley break; 59302eabf88fSMatthew G. Knepley case 6: 593127fcede3SMatthew G. Knepley case 8: 593227fcede3SMatthew G. Knepley /* Hybrid Hex 3D */ 593327fcede3SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 593427fcede3SMatthew G. Knepley /* Interior vertices stay the same */ 593527fcede3SMatthew G. Knepley localPointsNew[m] = vStartNew + (p - vStart); 593627fcede3SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rp - rvStart[n]); 593727fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 593827fcede3SMatthew G. Knepley ++m; 593927fcede3SMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 594027fcede3SMatthew G. Knepley /* Interior edges add new edges and vertex */ 594127fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 594227fcede3SMatthew G. Knepley localPointsNew[m] = eStartNew + (p - eStart)*2 + r; 594327fcede3SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rp - reStart[n])*2 + r; 594427fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 594527fcede3SMatthew G. Knepley } 594627fcede3SMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (p - eStart); 594727fcede3SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rp - reStart[n]); 594827fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 594927fcede3SMatthew G. Knepley ++m; 595027fcede3SMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 595127fcede3SMatthew G. Knepley /* Hybrid edges stay the same */ 595227fcede3SMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (p - eMax); 5953d2701f60SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*6 + (rp - rdepthMaxOld[n*(depth+1)+1]); 595427fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 595527fcede3SMatthew G. Knepley ++m; 595627fcede3SMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 595727fcede3SMatthew G. Knepley /* Interior faces add new faces, edges, and vertex */ 595827fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 595927fcede3SMatthew G. Knepley localPointsNew[m] = fStartNew + (p - fStart)*4 + r; 596027fcede3SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rp - rfStart[n])*4 + r; 596127fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 596227fcede3SMatthew G. Knepley } 596327fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 596427fcede3SMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (p - fStart)*4 + r; 596527fcede3SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rp - rfStart[n])*4 + r; 596627fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 596727fcede3SMatthew G. Knepley } 596827fcede3SMatthew G. Knepley localPointsNew[m] = vStartNew + (vEnd - vStart) + (eMax - eStart) + (p - fStart); 596927fcede3SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + rdepthSizeOld[n*(depth+1)+0] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n]) + (rp - rfStart[n]); 597027fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 597127fcede3SMatthew G. Knepley ++m; 597227fcede3SMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 597327fcede3SMatthew G. Knepley /* Hybrid faces add new faces and edges */ 597427fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r, ++m) { 5975d2701f60SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (p - fMax)*2 + r; 5976d2701f60SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*12 + (rp - rdepthMaxOld[n*(depth+1)+depth-1])*2 + r; 597727fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 597827fcede3SMatthew G. Knepley } 5979d2701f60SMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (p - fMax); 5980d2701f60SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*6 + (rdepthSizeOld[n*(depth+1)+1]+reStart[n] - rdepthMaxOld[n*(depth+1)+1]) + (rp - rdepthMaxOld[n*(depth+1)+depth-1]); 598127fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 598227fcede3SMatthew G. Knepley ++m; 598327fcede3SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 598427fcede3SMatthew G. Knepley /* Interior cells add new cells, faces, edges, and vertex */ 598527fcede3SMatthew G. Knepley for (r = 0; r < 8; ++r, ++m) { 598627fcede3SMatthew G. Knepley localPointsNew[m] = cStartNew + (p - cStart)*8 + r; 598727fcede3SMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rp - rcStart[n])*8 + r; 598827fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 598927fcede3SMatthew G. Knepley } 599027fcede3SMatthew G. Knepley for (r = 0; r < 12; ++r, ++m) { 599127fcede3SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (p - cStart)*12 + r; 599227fcede3SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rp - rcStart[n])*12 + r; 599327fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 599427fcede3SMatthew G. Knepley } 599527fcede3SMatthew G. Knepley for (r = 0; r < 6; ++r, ++m) { 599627fcede3SMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (p - cStart)*6 + r; 599727fcede3SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rp - rcStart[n])*6 + r; 599827fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 599927fcede3SMatthew G. Knepley } 600027fcede3SMatthew G. Knepley for (r = 0; r < 1; ++r, ++m) { 600127fcede3SMatthew G. Knepley localPointsNew[m] = vStartNew + (eMax - eStart) + (fMax - fStart) + (p - cStart) + r; 600227fcede3SMatthew G. Knepley remotePointsNew[m].index = rvStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n]) + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n]) + (rp - rcStart[n]) + r; 600327fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 600427fcede3SMatthew G. Knepley } 600527fcede3SMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 600627fcede3SMatthew G. Knepley /* Hybrid cells add new cells, faces, and edges */ 600727fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 600827fcede3SMatthew G. Knepley localPointsNew[m] = cStartNew + (cMax - cStart)*8 + (p - cMax)*4 + r; 600927fcede3SMatthew G. Knepley remotePointsNew[m].index = rcStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*8 + (rp - rdepthMaxOld[n*(depth+1)+depth])*4 + r; 601027fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 601127fcede3SMatthew G. Knepley } 601227fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r, ++m) { 6013d2701f60SMatthew G. Knepley localPointsNew[m] = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (p - cMax)*4 + r; 6014d2701f60SMatthew G. Knepley remotePointsNew[m].index = rfStartNew[n] + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*12 + (rdepthSizeOld[n*(depth+1)+depth-1]+rfStart[n] - rdepthMaxOld[n*(depth+1)+depth-1])*2 + (rp - rdepthMaxOld[n*(depth+1)+depth])*4 + r; 601527fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 601627fcede3SMatthew G. Knepley } 6017d2701f60SMatthew G. Knepley localPointsNew[m] = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (eEnd - eMax) + (fEnd - fMax) + (p - cMax); 6018d2701f60SMatthew G. Knepley remotePointsNew[m].index = reStartNew[n] + (rdepthMaxOld[n*(depth+1)+1] - reStart[n])*2 + (rdepthMaxOld[n*(depth+1)+depth-1] - rfStart[n])*4 + (rdepthMaxOld[n*(depth+1)+depth] - rcStart[n])*6 + (rdepthSizeOld[n*(depth+1)+1]+reStart[n] - rdepthMaxOld[n*(depth+1)+1]) + (rdepthSizeOld[n*(depth+1)+depth-1]+rfStart[n] - rdepthMaxOld[n*(depth+1)+depth-1]) + (rp - rdepthMaxOld[n*(depth+1)+depth]); 601927fcede3SMatthew G. Knepley remotePointsNew[m].rank = rrank; 602027fcede3SMatthew G. Knepley ++m; 602127fcede3SMatthew G. Knepley } 602227fcede3SMatthew G. Knepley break; 602375d3a19aSMatthew G. Knepley default: 602475d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 602575d3a19aSMatthew G. Knepley } 602675d3a19aSMatthew G. Knepley } 602709b1338fSMatthew G. Knepley if (m != numLeavesNew) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Number of leaf point %d should be %d", m, numLeavesNew); 602875d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(processRanks, &neighbors);CHKERRQ(ierr); 602975d3a19aSMatthew G. Knepley ierr = ISDestroy(&processRanks);CHKERRQ(ierr); 6030ba3c3d50SMatthew G. Knepley { 6031ba3c3d50SMatthew G. Knepley PetscSFNode *rp, *rtmp; 6032ba3c3d50SMatthew G. Knepley PetscInt *lp, *idx, *ltmp, i; 6033ba3c3d50SMatthew G. Knepley 6034ba3c3d50SMatthew G. Knepley /* SF needs sorted leaves to correct calculate Gather */ 6035ba3c3d50SMatthew G. Knepley ierr = PetscMalloc1(numLeavesNew,&idx);CHKERRQ(ierr); 6036ba3c3d50SMatthew G. Knepley ierr = PetscMalloc1(numLeavesNew, &lp);CHKERRQ(ierr); 6037ba3c3d50SMatthew G. Knepley ierr = PetscMalloc1(numLeavesNew, &rp);CHKERRQ(ierr); 6038ba3c3d50SMatthew G. Knepley for (i = 0; i < numLeavesNew; ++i) idx[i] = i; 6039ba3c3d50SMatthew G. Knepley ierr = PetscSortIntWithPermutation(numLeavesNew, localPointsNew, idx);CHKERRQ(ierr); 6040ba3c3d50SMatthew G. Knepley for (i = 0; i < numLeavesNew; ++i) { 6041ba3c3d50SMatthew G. Knepley lp[i] = localPointsNew[idx[i]]; 6042ba3c3d50SMatthew G. Knepley rp[i] = remotePointsNew[idx[i]]; 6043ba3c3d50SMatthew G. Knepley } 6044ba3c3d50SMatthew G. Knepley ltmp = localPointsNew; 6045ba3c3d50SMatthew G. Knepley localPointsNew = lp; 6046ba3c3d50SMatthew G. Knepley rtmp = remotePointsNew; 6047ba3c3d50SMatthew G. Knepley remotePointsNew = rp; 6048ba3c3d50SMatthew G. Knepley ierr = PetscFree(idx);CHKERRQ(ierr); 6049ba3c3d50SMatthew G. Knepley ierr = PetscFree(ltmp);CHKERRQ(ierr); 6050ba3c3d50SMatthew G. Knepley ierr = PetscFree(rtmp);CHKERRQ(ierr); 6051ba3c3d50SMatthew G. Knepley } 605275d3a19aSMatthew G. Knepley ierr = PetscSFSetGraph(sfNew, pEndNew-pStartNew, numLeavesNew, localPointsNew, PETSC_OWN_POINTER, remotePointsNew, PETSC_OWN_POINTER);CHKERRQ(ierr); 605375d3a19aSMatthew G. Knepley ierr = PetscFree5(rdepthSize,rvStartNew,reStartNew,rfStartNew,rcStartNew);CHKERRQ(ierr); 605406a0ba2dSMatthew G. Knepley ierr = PetscFree7(depthSizeOld,rdepthSizeOld,rdepthMaxOld,rvStart,reStart,rfStart,rcStart);CHKERRQ(ierr); 605575d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 605675d3a19aSMatthew G. Knepley } 605775d3a19aSMatthew G. Knepley 605875d3a19aSMatthew G. Knepley #undef __FUNCT__ 605975d3a19aSMatthew G. Knepley #define __FUNCT__ "CellRefinerCreateLabels" 606086150812SJed Brown static PetscErrorCode CellRefinerCreateLabels(CellRefiner refiner, DM dm, PetscInt depthSize[], DM rdm) 606175d3a19aSMatthew G. Knepley { 606275d3a19aSMatthew G. Knepley PetscInt numLabels, l; 60637ba685a0SMatthew G. Knepley PetscInt depth, newp, cStart, cEnd, cMax, vStart, vEnd, vMax, fStart, fEnd, fMax, eStart, eEnd, eMax, r; 60647ba685a0SMatthew G. Knepley PetscInt cStartNew = 0, vStartNew = 0, fStartNew = 0, eStartNew = 0; 606575d3a19aSMatthew G. Knepley PetscErrorCode ierr; 606675d3a19aSMatthew G. Knepley 606775d3a19aSMatthew G. Knepley PetscFunctionBegin; 606875d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 606975d3a19aSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 1, &eStart, &eEnd);CHKERRQ(ierr); 607075d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 607175d3a19aSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr); 6072d963de37SMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 60733478d7aaSMatthew G. Knepley if (refiner) {ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr);} 607475d3a19aSMatthew G. Knepley ierr = DMPlexGetNumLabels(dm, &numLabels);CHKERRQ(ierr); 607575d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, &fMax, &eMax, &vMax);CHKERRQ(ierr); 607675d3a19aSMatthew G. Knepley switch (refiner) { 60773478d7aaSMatthew G. Knepley case 0: break; 607858b8852aSMatthew G. Knepley case 7: 607958b8852aSMatthew G. Knepley case 8: 608058b8852aSMatthew G. Knepley if (eMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No edge maximum specified in hybrid mesh"); 608175d3a19aSMatthew G. Knepley case 3: 608258b8852aSMatthew G. Knepley case 4: 608375d3a19aSMatthew G. Knepley if (cMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No cell maximum specified in hybrid mesh"); 608475d3a19aSMatthew G. Knepley if (fMax < 0) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "No face maximum specified in hybrid mesh"); 608575d3a19aSMatthew G. Knepley } 608675d3a19aSMatthew G. Knepley for (l = 0; l < numLabels; ++l) { 608775d3a19aSMatthew G. Knepley DMLabel label, labelNew; 608875d3a19aSMatthew G. Knepley const char *lname; 608975d3a19aSMatthew G. Knepley PetscBool isDepth; 609075d3a19aSMatthew G. Knepley IS valueIS; 609175d3a19aSMatthew G. Knepley const PetscInt *values; 609275d3a19aSMatthew G. Knepley PetscInt numValues, val; 609375d3a19aSMatthew G. Knepley 609475d3a19aSMatthew G. Knepley ierr = DMPlexGetLabelName(dm, l, &lname);CHKERRQ(ierr); 609575d3a19aSMatthew G. Knepley ierr = PetscStrcmp(lname, "depth", &isDepth);CHKERRQ(ierr); 609675d3a19aSMatthew G. Knepley if (isDepth) continue; 609775d3a19aSMatthew G. Knepley ierr = DMPlexCreateLabel(rdm, lname);CHKERRQ(ierr); 609875d3a19aSMatthew G. Knepley ierr = DMPlexGetLabel(dm, lname, &label);CHKERRQ(ierr); 609975d3a19aSMatthew G. Knepley ierr = DMPlexGetLabel(rdm, lname, &labelNew);CHKERRQ(ierr); 610075d3a19aSMatthew G. Knepley ierr = DMLabelGetValueIS(label, &valueIS);CHKERRQ(ierr); 610175d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(valueIS, &numValues);CHKERRQ(ierr); 610275d3a19aSMatthew G. Knepley ierr = ISGetIndices(valueIS, &values);CHKERRQ(ierr); 610375d3a19aSMatthew G. Knepley for (val = 0; val < numValues; ++val) { 610475d3a19aSMatthew G. Knepley IS pointIS; 610575d3a19aSMatthew G. Knepley const PetscInt *points; 610675d3a19aSMatthew G. Knepley PetscInt numPoints, n; 610775d3a19aSMatthew G. Knepley 610875d3a19aSMatthew G. Knepley ierr = DMLabelGetStratumIS(label, values[val], &pointIS);CHKERRQ(ierr); 610975d3a19aSMatthew G. Knepley ierr = ISGetLocalSize(pointIS, &numPoints);CHKERRQ(ierr); 611075d3a19aSMatthew G. Knepley ierr = ISGetIndices(pointIS, &points);CHKERRQ(ierr); 611175d3a19aSMatthew G. Knepley for (n = 0; n < numPoints; ++n) { 611275d3a19aSMatthew G. Knepley const PetscInt p = points[n]; 611375d3a19aSMatthew G. Knepley switch (refiner) { 611475d3a19aSMatthew G. Knepley case 1: 611575d3a19aSMatthew G. Knepley /* Simplicial 2D */ 611675d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 611775d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 611875d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 611975d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 612075d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 612175d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 612275d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 612375d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 612475d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 612575d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 612675d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 612775d3a19aSMatthew G. Knepley } 612875d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 612975d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces */ 613075d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 613175d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 613275d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 613375d3a19aSMatthew G. Knepley } 613475d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 613575d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 613675d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 613775d3a19aSMatthew G. Knepley } 613875d3a19aSMatthew G. Knepley } 613975d3a19aSMatthew G. Knepley break; 614075d3a19aSMatthew G. Knepley case 2: 614175d3a19aSMatthew G. Knepley /* Hex 2D */ 614275d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 614375d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 614475d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 614575d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 614675d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 614775d3a19aSMatthew G. Knepley /* Old faces add new faces and vertex */ 614875d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 614975d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 615075d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 615175d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 615275d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 615375d3a19aSMatthew G. Knepley } 615475d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 615575d3a19aSMatthew G. Knepley /* Old cells add new cells and interior faces and vertex */ 615675d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 615775d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 615875d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 615975d3a19aSMatthew G. Knepley } 616075d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 616175d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*4 + r; 616275d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 616375d3a19aSMatthew G. Knepley } 616475d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (p - cStart); 616575d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 616675d3a19aSMatthew G. Knepley } 616775d3a19aSMatthew G. Knepley break; 616875d3a19aSMatthew G. Knepley case 3: 616975d3a19aSMatthew G. Knepley /* Hybrid simplicial 2D */ 617075d3a19aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 617175d3a19aSMatthew G. Knepley /* Old vertices stay the same */ 617275d3a19aSMatthew G. Knepley newp = vStartNew + (p - vStart); 617375d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 617475d3a19aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 617575d3a19aSMatthew G. Knepley /* Old interior faces add new faces and vertex */ 617675d3a19aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 617775d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 617875d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 617975d3a19aSMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 618075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 618175d3a19aSMatthew G. Knepley } 618275d3a19aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 618375d3a19aSMatthew G. Knepley /* Old hybrid faces stay the same */ 618475d3a19aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (p - fMax); 618575d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 618675d3a19aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 618775d3a19aSMatthew G. Knepley /* Old interior cells add new cells and interior faces */ 618875d3a19aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 618975d3a19aSMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 619075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 619175d3a19aSMatthew G. Knepley } 619275d3a19aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 619375d3a19aSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*3 + r; 619475d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 619575d3a19aSMatthew G. Knepley } 619675d3a19aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 619775d3a19aSMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 619875d3a19aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 619975d3a19aSMatthew G. Knepley newp = cStartNew + (cMax - cStart)*4 + (p - cMax)*2 + r; 620075d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 620175d3a19aSMatthew G. Knepley } 620275d3a19aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*3 + (p - cMax); 620375d3a19aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 620475d3a19aSMatthew G. Knepley } 620575d3a19aSMatthew G. Knepley break; 6206a97b51b8SMatthew G. Knepley case 4: 6207a97b51b8SMatthew G. Knepley /* Hybrid Hex 2D */ 6208a97b51b8SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 6209a97b51b8SMatthew G. Knepley /* Old vertices stay the same */ 6210a97b51b8SMatthew G. Knepley newp = vStartNew + (p - vStart); 6211a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6212a97b51b8SMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 6213a97b51b8SMatthew G. Knepley /* Old interior faces add new faces and vertex */ 6214a97b51b8SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - fStart); 6215a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6216a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r) { 6217a97b51b8SMatthew G. Knepley newp = fStartNew + (p - fStart)*2 + r; 6218a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6219a97b51b8SMatthew G. Knepley } 6220a97b51b8SMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 6221a97b51b8SMatthew G. Knepley /* Old hybrid faces stay the same */ 6222a97b51b8SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (p - fMax); 6223a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6224a97b51b8SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 6225a97b51b8SMatthew G. Knepley /* Old interior cells add new cells, interior faces, and vertex */ 6226a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r) { 6227a97b51b8SMatthew G. Knepley newp = cStartNew + (p - cStart)*4 + r; 6228a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6229a97b51b8SMatthew G. Knepley } 6230a97b51b8SMatthew G. Knepley for (r = 0; r < 4; ++r) { 6231a97b51b8SMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*2 + (p - cStart)*4 + r; 6232a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6233a97b51b8SMatthew G. Knepley } 6234a97b51b8SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (fEnd - fStart) + (p - cStart); 6235a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6236a97b51b8SMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 6237a97b51b8SMatthew G. Knepley /* Old hybrid cells add new cells and hybrid face */ 6238a97b51b8SMatthew G. Knepley for (r = 0; r < 2; ++r) { 6239a97b51b8SMatthew G. Knepley newp = cStartNew + (cMax - cStart)*4 + (p - cMax)*2 + r; 6240a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6241a97b51b8SMatthew G. Knepley } 6242a97b51b8SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*2 + (cMax - cStart)*4 + (p - cMax); 6243a97b51b8SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6244a97b51b8SMatthew G. Knepley } 6245a97b51b8SMatthew G. Knepley break; 6246b5da9499SMatthew G. Knepley case 5: 6247b5da9499SMatthew G. Knepley /* Simplicial 3D */ 6248b5da9499SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 6249b5da9499SMatthew G. Knepley /* Old vertices stay the same */ 6250b5da9499SMatthew G. Knepley newp = vStartNew + (p - vStart); 6251b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6252b5da9499SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 6253b5da9499SMatthew G. Knepley /* Old edges add new edges and vertex */ 6254b5da9499SMatthew G. Knepley for (r = 0; r < 2; ++r) { 6255b5da9499SMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 6256b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6257b5da9499SMatthew G. Knepley } 6258b5da9499SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 6259b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6260b5da9499SMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 6261b5da9499SMatthew G. Knepley /* Old faces add new faces and edges */ 6262b5da9499SMatthew G. Knepley for (r = 0; r < 4; ++r) { 6263b5da9499SMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 6264b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6265b5da9499SMatthew G. Knepley } 6266b5da9499SMatthew G. Knepley for (r = 0; r < 3; ++r) { 6267b5da9499SMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (p - fStart)*3 + r; 6268b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6269b5da9499SMatthew G. Knepley } 6270b5da9499SMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 6271b5da9499SMatthew G. Knepley /* Old cells add new cells and interior faces and edges */ 6272b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 6273b5da9499SMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 6274b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6275b5da9499SMatthew G. Knepley } 6276b5da9499SMatthew G. Knepley for (r = 0; r < 8; ++r) { 6277b5da9499SMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (p - cStart)*8 + r; 6278b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6279b5da9499SMatthew G. Knepley } 6280b5da9499SMatthew G. Knepley for (r = 0; r < 1; ++r) { 6281b5da9499SMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*3 + (p - cStart)*1 + r; 6282b5da9499SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 6283b5da9499SMatthew G. Knepley } 6284b5da9499SMatthew G. Knepley } 6285b5da9499SMatthew G. Knepley break; 62866ce3c06aSMatthew G. Knepley case 7: 62876ce3c06aSMatthew G. Knepley /* Hybrid Simplicial 3D */ 62886ce3c06aSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 62896ce3c06aSMatthew G. Knepley /* Interior vertices stay the same */ 62906ce3c06aSMatthew G. Knepley newp = vStartNew + (p - vStart); 62916ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 62926ce3c06aSMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 62936ce3c06aSMatthew G. Knepley /* Interior edges add new edges and vertex */ 62946ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 62956ce3c06aSMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 62966ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 62976ce3c06aSMatthew G. Knepley } 62986ce3c06aSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 62996ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63006ce3c06aSMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 63016ce3c06aSMatthew G. Knepley /* Hybrid edges stay the same */ 63026ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (p - eMax); 63036ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63046ce3c06aSMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 63056ce3c06aSMatthew G. Knepley /* Interior faces add new faces and edges */ 63066ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 63076ce3c06aSMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 63086ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63096ce3c06aSMatthew G. Knepley } 63106ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 63116ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (p - fStart)*3 + r; 63126ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63136ce3c06aSMatthew G. Knepley } 63146ce3c06aSMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 63156ce3c06aSMatthew G. Knepley /* Hybrid faces add new faces and edges */ 63166ce3c06aSMatthew G. Knepley for (r = 0; r < 2; ++r) { 63176ce3c06aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (p - fMax)*2 + r; 63186ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63196ce3c06aSMatthew G. Knepley } 63206ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (cMax - cStart) + (p - fMax); 63216ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63226ce3c06aSMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 63236ce3c06aSMatthew G. Knepley /* Interior cells add new cells, faces, and edges */ 63246ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 63256ce3c06aSMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 63266ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63276ce3c06aSMatthew G. Knepley } 63286ce3c06aSMatthew G. Knepley for (r = 0; r < 8; ++r) { 63296ce3c06aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (p - cStart)*8 + r; 63306ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63316ce3c06aSMatthew G. Knepley } 63326ce3c06aSMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*3 + (p - cStart); 63336ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 633458b8852aSMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 63356ce3c06aSMatthew G. Knepley /* Hybrid cells add new cells and faces */ 63366ce3c06aSMatthew G. Knepley for (r = 0; r < 4; ++r) { 63376ce3c06aSMatthew G. Knepley newp = cStartNew + (cMax - cStart)*8 + (p - cMax)*4 + r; 63386ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63396ce3c06aSMatthew G. Knepley } 63406ce3c06aSMatthew G. Knepley for (r = 0; r < 3; ++r) { 63416ce3c06aSMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*8 + (fEnd - fMax)*2 + (p - cMax)*3 + r; 63426ce3c06aSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63436ce3c06aSMatthew G. Knepley } 63446ce3c06aSMatthew G. Knepley } 63456ce3c06aSMatthew G. Knepley break; 63462eabf88fSMatthew G. Knepley case 6: 63472eabf88fSMatthew G. Knepley /* Hex 3D */ 63482eabf88fSMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 63492eabf88fSMatthew G. Knepley /* Old vertices stay the same */ 63502eabf88fSMatthew G. Knepley newp = vStartNew + (p - vStart); 63512eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 635219d7d790SMatthew G. Knepley } else if ((p >= eStart) && (p < eEnd)) { 63532eabf88fSMatthew G. Knepley /* Old edges add new edges and vertex */ 63542eabf88fSMatthew G. Knepley for (r = 0; r < 2; ++r) { 63552eabf88fSMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 63562eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63572eabf88fSMatthew G. Knepley } 63582eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 63592eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63602eabf88fSMatthew G. Knepley } else if ((p >= fStart) && (p < fEnd)) { 63612eabf88fSMatthew G. Knepley /* Old faces add new faces, edges, and vertex */ 63622eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 63632eabf88fSMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 63642eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63652eabf88fSMatthew G. Knepley } 63662eabf88fSMatthew G. Knepley for (r = 0; r < 4; ++r) { 63672eabf88fSMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (p - fStart)*4 + r; 63682eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63692eabf88fSMatthew G. Knepley } 63702eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (p - fStart); 63712eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63722eabf88fSMatthew G. Knepley } else if ((p >= cStart) && (p < cEnd)) { 63732eabf88fSMatthew G. Knepley /* Old cells add new cells, faces, edges, and vertex */ 63742eabf88fSMatthew G. Knepley for (r = 0; r < 8; ++r) { 63752eabf88fSMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 63762eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63772eabf88fSMatthew G. Knepley } 63782eabf88fSMatthew G. Knepley for (r = 0; r < 12; ++r) { 63792eabf88fSMatthew G. Knepley newp = fStartNew + (fEnd - fStart)*4 + (p - cStart)*12 + r; 63802eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63812eabf88fSMatthew G. Knepley } 63822eabf88fSMatthew G. Knepley for (r = 0; r < 6; ++r) { 63832eabf88fSMatthew G. Knepley newp = eStartNew + (eEnd - eStart)*2 + (fEnd - fStart)*4 + (p - cStart)*6 + r; 63842eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63852eabf88fSMatthew G. Knepley } 63862eabf88fSMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eEnd - eStart) + (fEnd - fStart) + (p - cStart); 63872eabf88fSMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 63882eabf88fSMatthew G. Knepley } 63892eabf88fSMatthew G. Knepley break; 639027fcede3SMatthew G. Knepley case 8: 639127fcede3SMatthew G. Knepley /* Hybrid Hex 3D */ 639227fcede3SMatthew G. Knepley if ((p >= vStart) && (p < vEnd)) { 639327fcede3SMatthew G. Knepley /* Interior vertices stay the same */ 639427fcede3SMatthew G. Knepley newp = vStartNew + (p - vStart); 639527fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 639627fcede3SMatthew G. Knepley } else if ((p >= eStart) && (p < eMax)) { 639727fcede3SMatthew G. Knepley /* Interior edges add new edges and vertex */ 639827fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r) { 639927fcede3SMatthew G. Knepley newp = eStartNew + (p - eStart)*2 + r; 640027fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 640127fcede3SMatthew G. Knepley } 640227fcede3SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (p - eStart); 640327fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 640427fcede3SMatthew G. Knepley } else if ((p >= eMax) && (p < eEnd)) { 640527fcede3SMatthew G. Knepley /* Hybrid edges stay the same */ 640627fcede3SMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (p - eMax); 640727fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 640827fcede3SMatthew G. Knepley } else if ((p >= fStart) && (p < fMax)) { 640927fcede3SMatthew G. Knepley /* Interior faces add new faces, edges, and vertex */ 641027fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 641127fcede3SMatthew G. Knepley newp = fStartNew + (p - fStart)*4 + r; 641227fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 641327fcede3SMatthew G. Knepley } 641427fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 641527fcede3SMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (p - fStart)*4 + r; 641627fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 641727fcede3SMatthew G. Knepley } 641827fcede3SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eMax - eStart) + (p - fStart); 641927fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 642027fcede3SMatthew G. Knepley } else if ((p >= fMax) && (p < fEnd)) { 642127fcede3SMatthew G. Knepley /* Hybrid faces add new faces and edges */ 642227fcede3SMatthew G. Knepley for (r = 0; r < 2; ++r) { 642327fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (p - fMax)*2 + r; 642427fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 642527fcede3SMatthew G. Knepley } 642627fcede3SMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (p - fMax); 642727fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 642827fcede3SMatthew G. Knepley } else if ((p >= cStart) && (p < cMax)) { 642927fcede3SMatthew G. Knepley /* Interior cells add new cells, faces, edges, and vertex */ 643027fcede3SMatthew G. Knepley for (r = 0; r < 8; ++r) { 643127fcede3SMatthew G. Knepley newp = cStartNew + (p - cStart)*8 + r; 643227fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 643327fcede3SMatthew G. Knepley } 643427fcede3SMatthew G. Knepley for (r = 0; r < 12; ++r) { 643527fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (p - cStart)*12 + r; 643627fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 643727fcede3SMatthew G. Knepley } 643827fcede3SMatthew G. Knepley for (r = 0; r < 6; ++r) { 643927fcede3SMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (p - cStart)*6 + r; 644027fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 644127fcede3SMatthew G. Knepley } 644227fcede3SMatthew G. Knepley newp = vStartNew + (vEnd - vStart) + (eMax - eStart) + (fMax - fStart) + (p - cStart); 644327fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 644427fcede3SMatthew G. Knepley } else if ((p >= cMax) && (p < cEnd)) { 644527fcede3SMatthew G. Knepley /* Hybrid cells add new cells, faces, and edges */ 644627fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 644727fcede3SMatthew G. Knepley newp = cStartNew + (cMax - cStart)*8 + (p - cMax)*4 + r; 644827fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 644927fcede3SMatthew G. Knepley } 645027fcede3SMatthew G. Knepley for (r = 0; r < 4; ++r) { 645127fcede3SMatthew G. Knepley newp = fStartNew + (fMax - fStart)*4 + (cMax - cStart)*12 + (fEnd - fMax)*2 + (p - cMax)*4 + r; 645227fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 645327fcede3SMatthew G. Knepley } 645427fcede3SMatthew G. Knepley newp = eStartNew + (eMax - eStart)*2 + (fMax - fStart)*4 + (cMax - cStart)*6 + (fEnd - fMax) + (p - cMax); 645527fcede3SMatthew G. Knepley ierr = DMLabelSetValue(labelNew, newp, values[val]);CHKERRQ(ierr); 645627fcede3SMatthew G. Knepley } 645727fcede3SMatthew G. Knepley break; 645875d3a19aSMatthew G. Knepley default: 645975d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", refiner); 646075d3a19aSMatthew G. Knepley } 646175d3a19aSMatthew G. Knepley } 646275d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(pointIS, &points);CHKERRQ(ierr); 646375d3a19aSMatthew G. Knepley ierr = ISDestroy(&pointIS);CHKERRQ(ierr); 646475d3a19aSMatthew G. Knepley } 646575d3a19aSMatthew G. Knepley ierr = ISRestoreIndices(valueIS, &values);CHKERRQ(ierr); 646675d3a19aSMatthew G. Knepley ierr = ISDestroy(&valueIS);CHKERRQ(ierr); 646775d3a19aSMatthew G. Knepley if (0) { 646875d3a19aSMatthew G. Knepley ierr = PetscViewerASCIISynchronizedAllow(PETSC_VIEWER_STDOUT_WORLD, PETSC_TRUE);CHKERRQ(ierr); 646975d3a19aSMatthew G. Knepley ierr = DMLabelView(labelNew, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 647075d3a19aSMatthew G. Knepley ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 647175d3a19aSMatthew G. Knepley } 647275d3a19aSMatthew G. Knepley } 647375d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 647475d3a19aSMatthew G. Knepley } 647575d3a19aSMatthew G. Knepley 647675d3a19aSMatthew G. Knepley #undef __FUNCT__ 6477509c9b89SMatthew G. Knepley #define __FUNCT__ "DMPlexRefineUniform_Internal" 647875d3a19aSMatthew G. Knepley /* This will only work for interpolated meshes */ 6479509c9b89SMatthew G. Knepley PetscErrorCode DMPlexRefineUniform_Internal(DM dm, CellRefiner cellRefiner, DM *dmRefined) 648075d3a19aSMatthew G. Knepley { 648175d3a19aSMatthew G. Knepley DM rdm; 648275d3a19aSMatthew G. Knepley PetscInt *depthSize; 648375d3a19aSMatthew G. Knepley PetscInt dim, depth = 0, d, pStart = 0, pEnd = 0; 648475d3a19aSMatthew G. Knepley PetscErrorCode ierr; 648575d3a19aSMatthew G. Knepley 648675d3a19aSMatthew G. Knepley PetscFunctionBegin; 648775d3a19aSMatthew G. Knepley ierr = DMCreate(PetscObjectComm((PetscObject)dm), &rdm);CHKERRQ(ierr); 648875d3a19aSMatthew G. Knepley ierr = DMSetType(rdm, DMPLEX);CHKERRQ(ierr); 648975d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 649075d3a19aSMatthew G. Knepley ierr = DMPlexSetDimension(rdm, dim);CHKERRQ(ierr); 649175d3a19aSMatthew G. Knepley /* Calculate number of new points of each depth */ 649275d3a19aSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 6493785e854fSJed Brown ierr = PetscMalloc1((depth+1), &depthSize);CHKERRQ(ierr); 649475d3a19aSMatthew G. Knepley ierr = PetscMemzero(depthSize, (depth+1) * sizeof(PetscInt));CHKERRQ(ierr); 649575d3a19aSMatthew G. Knepley ierr = CellRefinerGetSizes(cellRefiner, dm, depthSize);CHKERRQ(ierr); 649675d3a19aSMatthew G. Knepley /* Step 1: Set chart */ 649775d3a19aSMatthew G. Knepley for (d = 0; d <= depth; ++d) pEnd += depthSize[d]; 649875d3a19aSMatthew G. Knepley ierr = DMPlexSetChart(rdm, pStart, pEnd);CHKERRQ(ierr); 649975d3a19aSMatthew G. Knepley /* Step 2: Set cone/support sizes */ 650075d3a19aSMatthew G. Knepley ierr = CellRefinerSetConeSizes(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 650175d3a19aSMatthew G. Knepley /* Step 3: Setup refined DM */ 650275d3a19aSMatthew G. Knepley ierr = DMSetUp(rdm);CHKERRQ(ierr); 650375d3a19aSMatthew G. Knepley /* Step 4: Set cones and supports */ 650475d3a19aSMatthew G. Knepley ierr = CellRefinerSetCones(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 650575d3a19aSMatthew G. Knepley /* Step 5: Stratify */ 650675d3a19aSMatthew G. Knepley ierr = DMPlexStratify(rdm);CHKERRQ(ierr); 650775d3a19aSMatthew G. Knepley /* Step 6: Set coordinates for vertices */ 650875d3a19aSMatthew G. Knepley ierr = CellRefinerSetCoordinates(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 650975d3a19aSMatthew G. Knepley /* Step 7: Create pointSF */ 651075d3a19aSMatthew G. Knepley ierr = CellRefinerCreateSF(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 651175d3a19aSMatthew G. Knepley /* Step 8: Create labels */ 651275d3a19aSMatthew G. Knepley ierr = CellRefinerCreateLabels(cellRefiner, dm, depthSize, rdm);CHKERRQ(ierr); 651375d3a19aSMatthew G. Knepley ierr = PetscFree(depthSize);CHKERRQ(ierr); 651475d3a19aSMatthew G. Knepley 651575d3a19aSMatthew G. Knepley *dmRefined = rdm; 651675d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 651775d3a19aSMatthew G. Knepley } 651875d3a19aSMatthew G. Knepley 651975d3a19aSMatthew G. Knepley #undef __FUNCT__ 65202389894bSMatthew G. Knepley #define __FUNCT__ "DMPlexCreateCoarsePointIS" 65212389894bSMatthew G. Knepley /*@ 65222389894bSMatthew G. Knepley DMPlexCreateCoarsePointIS - Creates an IS covering the coarse DM chart with the fine points as data 65232389894bSMatthew G. Knepley 65242389894bSMatthew G. Knepley Input Parameter: 65252389894bSMatthew G. Knepley . dm - The coarse DM 65262389894bSMatthew G. Knepley 65272389894bSMatthew G. Knepley Output Parameter: 65282389894bSMatthew G. Knepley . fpointIS - The IS of all the fine points which exist in the original coarse mesh 65292389894bSMatthew G. Knepley 65302389894bSMatthew G. Knepley Level: developer 65312389894bSMatthew G. Knepley 65322389894bSMatthew G. Knepley .seealso: DMRefine(), DMPlexSetRefinementUniform(), DMPlexCreateSubpointIS() 65332389894bSMatthew G. Knepley @*/ 65342389894bSMatthew G. Knepley PetscErrorCode DMPlexCreateCoarsePointIS(DM dm, IS *fpointIS) 65352389894bSMatthew G. Knepley { 65362389894bSMatthew G. Knepley CellRefiner cellRefiner; 65372389894bSMatthew G. Knepley PetscInt *depthSize, *fpoints; 65382389894bSMatthew G. Knepley PetscInt cStartNew = 0, vStartNew = 0, fStartNew = 0, eStartNew = 0; 65392389894bSMatthew G. Knepley PetscInt depth, pStart, pEnd, p, vStart, vEnd, v; 65402389894bSMatthew G. Knepley PetscErrorCode ierr; 65412389894bSMatthew G. Knepley 65422389894bSMatthew G. Knepley PetscFunctionBegin; 65432389894bSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 65442389894bSMatthew G. Knepley ierr = DMPlexGetChart(dm, &pStart, &pEnd);CHKERRQ(ierr); 65452389894bSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr); 65462389894bSMatthew G. Knepley ierr = DMPlexGetCellRefiner_Internal(dm, &cellRefiner);CHKERRQ(ierr); 65472389894bSMatthew G. Knepley ierr = PetscMalloc1((depth+1), &depthSize);CHKERRQ(ierr); 65482389894bSMatthew G. Knepley ierr = CellRefinerGetSizes(cellRefiner, dm, depthSize);CHKERRQ(ierr); 65492389894bSMatthew G. Knepley if (cellRefiner) {ierr = GetDepthStart_Private(depth, depthSize, &cStartNew, &fStartNew, &eStartNew, &vStartNew);CHKERRQ(ierr);} 65502389894bSMatthew G. Knepley ierr = PetscMalloc1(pEnd-pStart,&fpoints);CHKERRQ(ierr); 65512389894bSMatthew G. Knepley for (p = 0; p < pEnd-pStart; ++p) fpoints[p] = -1; 65522389894bSMatthew G. Knepley switch (cellRefiner) { 65532389894bSMatthew G. Knepley case 1: /* Simplicial 2D */ 65542389894bSMatthew G. Knepley case 3: /* Hybrid simplicial 2D */ 65552389894bSMatthew G. Knepley case 2: /* Hex 2D */ 65562389894bSMatthew G. Knepley case 4: /* Hybrid Hex 2D */ 65572389894bSMatthew G. Knepley case 5: /* Simplicial 3D */ 65582389894bSMatthew G. Knepley case 7: /* Hybrid Simplicial 3D */ 65592389894bSMatthew G. Knepley case 6: /* Hex 3D */ 65602389894bSMatthew G. Knepley case 8: /* Hybrid Hex 3D */ 65612389894bSMatthew G. Knepley for (v = vStart; v < vEnd; ++v) fpoints[v-pStart] = vStartNew + (v - vStart); 65622389894bSMatthew G. Knepley break; 65632389894bSMatthew G. Knepley default: 65642389894bSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown cell refiner %d", cellRefiner); 65652389894bSMatthew G. Knepley } 65662389894bSMatthew G. Knepley ierr = ISCreateGeneral(PETSC_COMM_SELF, pEnd-pStart, fpoints, PETSC_OWN_POINTER, fpointIS);CHKERRQ(ierr); 65672389894bSMatthew G. Knepley ierr = PetscFree(depthSize);CHKERRQ(ierr); 65682389894bSMatthew G. Knepley PetscFunctionReturn(0); 65692389894bSMatthew G. Knepley } 65702389894bSMatthew G. Knepley 65712389894bSMatthew G. Knepley #undef __FUNCT__ 657275d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexSetRefinementUniform" 65730e2b6761SMatthew G. Knepley /*@ 65740e2b6761SMatthew G. Knepley DMPlexSetRefinementUniform - Set the flag for uniform refinement 65750e2b6761SMatthew G. Knepley 65760e2b6761SMatthew G. Knepley Input Parameters: 65770e2b6761SMatthew G. Knepley + dm - The DM 65780e2b6761SMatthew G. Knepley - refinementUniform - The flag for uniform refinement 65790e2b6761SMatthew G. Knepley 65800e2b6761SMatthew G. Knepley Level: developer 65810e2b6761SMatthew G. Knepley 65820e2b6761SMatthew G. Knepley .seealso: DMRefine(), DMPlexGetRefinementUniform(), DMPlexGetRefinementLimit(), DMPlexSetRefinementLimit() 65830e2b6761SMatthew G. Knepley @*/ 658475d3a19aSMatthew G. Knepley PetscErrorCode DMPlexSetRefinementUniform(DM dm, PetscBool refinementUniform) 658575d3a19aSMatthew G. Knepley { 658675d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 658775d3a19aSMatthew G. Knepley 658875d3a19aSMatthew G. Knepley PetscFunctionBegin; 658975d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 659075d3a19aSMatthew G. Knepley mesh->refinementUniform = refinementUniform; 659175d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 659275d3a19aSMatthew G. Knepley } 659375d3a19aSMatthew G. Knepley 659475d3a19aSMatthew G. Knepley #undef __FUNCT__ 659575d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexGetRefinementUniform" 65960e2b6761SMatthew G. Knepley /*@ 65970e2b6761SMatthew G. Knepley DMPlexGetRefinementUniform - Retrieve the flag for uniform refinement 65980e2b6761SMatthew G. Knepley 65990e2b6761SMatthew G. Knepley Input Parameter: 66000e2b6761SMatthew G. Knepley . dm - The DM 66010e2b6761SMatthew G. Knepley 66020e2b6761SMatthew G. Knepley Output Parameter: 66030e2b6761SMatthew G. Knepley . refinementUniform - The flag for uniform refinement 66040e2b6761SMatthew G. Knepley 66050e2b6761SMatthew G. Knepley Level: developer 66060e2b6761SMatthew G. Knepley 66070e2b6761SMatthew G. Knepley .seealso: DMRefine(), DMPlexSetRefinementUniform(), DMPlexGetRefinementLimit(), DMPlexSetRefinementLimit() 66080e2b6761SMatthew G. Knepley @*/ 660975d3a19aSMatthew G. Knepley PetscErrorCode DMPlexGetRefinementUniform(DM dm, PetscBool *refinementUniform) 661075d3a19aSMatthew G. Knepley { 661175d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 661275d3a19aSMatthew G. Knepley 661375d3a19aSMatthew G. Knepley PetscFunctionBegin; 661475d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 661575d3a19aSMatthew G. Knepley PetscValidPointer(refinementUniform, 2); 661675d3a19aSMatthew G. Knepley *refinementUniform = mesh->refinementUniform; 661775d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 661875d3a19aSMatthew G. Knepley } 661975d3a19aSMatthew G. Knepley 662075d3a19aSMatthew G. Knepley #undef __FUNCT__ 662175d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexSetRefinementLimit" 66220e2b6761SMatthew G. Knepley /*@ 66230e2b6761SMatthew G. Knepley DMPlexSetRefinementLimit - Set the maximum cell volume for refinement 66240e2b6761SMatthew G. Knepley 66250e2b6761SMatthew G. Knepley Input Parameters: 66260e2b6761SMatthew G. Knepley + dm - The DM 66270e2b6761SMatthew G. Knepley - refinementLimit - The maximum cell volume in the refined mesh 66280e2b6761SMatthew G. Knepley 66290e2b6761SMatthew G. Knepley Level: developer 66300e2b6761SMatthew G. Knepley 66310e2b6761SMatthew G. Knepley .seealso: DMRefine(), DMPlexGetRefinementLimit(), DMPlexGetRefinementUniform(), DMPlexSetRefinementUniform() 66320e2b6761SMatthew G. Knepley @*/ 663375d3a19aSMatthew G. Knepley PetscErrorCode DMPlexSetRefinementLimit(DM dm, PetscReal refinementLimit) 663475d3a19aSMatthew G. Knepley { 663575d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 663675d3a19aSMatthew G. Knepley 663775d3a19aSMatthew G. Knepley PetscFunctionBegin; 663875d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 663975d3a19aSMatthew G. Knepley mesh->refinementLimit = refinementLimit; 664075d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 664175d3a19aSMatthew G. Knepley } 664275d3a19aSMatthew G. Knepley 664375d3a19aSMatthew G. Knepley #undef __FUNCT__ 664475d3a19aSMatthew G. Knepley #define __FUNCT__ "DMPlexGetRefinementLimit" 66450e2b6761SMatthew G. Knepley /*@ 66460e2b6761SMatthew G. Knepley DMPlexGetRefinementLimit - Retrieve the maximum cell volume for refinement 66470e2b6761SMatthew G. Knepley 66480e2b6761SMatthew G. Knepley Input Parameter: 66490e2b6761SMatthew G. Knepley . dm - The DM 66500e2b6761SMatthew G. Knepley 66510e2b6761SMatthew G. Knepley Output Parameter: 66520e2b6761SMatthew G. Knepley . refinementLimit - The maximum cell volume in the refined mesh 66530e2b6761SMatthew G. Knepley 66540e2b6761SMatthew G. Knepley Level: developer 66550e2b6761SMatthew G. Knepley 66560e2b6761SMatthew G. Knepley .seealso: DMRefine(), DMPlexSetRefinementLimit(), DMPlexGetRefinementUniform(), DMPlexSetRefinementUniform() 66570e2b6761SMatthew G. Knepley @*/ 665875d3a19aSMatthew G. Knepley PetscErrorCode DMPlexGetRefinementLimit(DM dm, PetscReal *refinementLimit) 665975d3a19aSMatthew G. Knepley { 666075d3a19aSMatthew G. Knepley DM_Plex *mesh = (DM_Plex*) dm->data; 666175d3a19aSMatthew G. Knepley 666275d3a19aSMatthew G. Knepley PetscFunctionBegin; 666375d3a19aSMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 666475d3a19aSMatthew G. Knepley PetscValidPointer(refinementLimit, 2); 666575d3a19aSMatthew G. Knepley /* if (mesh->refinementLimit < 0) = getMaxVolume()/2.0; */ 666675d3a19aSMatthew G. Knepley *refinementLimit = mesh->refinementLimit; 666775d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 666875d3a19aSMatthew G. Knepley } 666975d3a19aSMatthew G. Knepley 667075d3a19aSMatthew G. Knepley #undef __FUNCT__ 6671509c9b89SMatthew G. Knepley #define __FUNCT__ "DMPlexGetCellRefiner_Internal" 6672509c9b89SMatthew G. Knepley PetscErrorCode DMPlexGetCellRefiner_Internal(DM dm, CellRefiner *cellRefiner) 667375d3a19aSMatthew G. Knepley { 66743478d7aaSMatthew G. Knepley PetscInt dim, cStart, cEnd, coneSize, cMax; 667575d3a19aSMatthew G. Knepley PetscErrorCode ierr; 667675d3a19aSMatthew G. Knepley 667775d3a19aSMatthew G. Knepley PetscFunctionBegin; 667875d3a19aSMatthew G. Knepley ierr = DMPlexGetDimension(dm, &dim);CHKERRQ(ierr); 66793478d7aaSMatthew G. Knepley ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr); 66803478d7aaSMatthew G. Knepley if (cEnd <= cStart) {*cellRefiner = 0; PetscFunctionReturn(0);} 668175d3a19aSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, cStart, &coneSize);CHKERRQ(ierr); 668275d3a19aSMatthew G. Knepley ierr = DMPlexGetHybridBounds(dm, &cMax, NULL, NULL, NULL);CHKERRQ(ierr); 668375d3a19aSMatthew G. Knepley switch (dim) { 668475d3a19aSMatthew G. Knepley case 2: 668575d3a19aSMatthew G. Knepley switch (coneSize) { 668675d3a19aSMatthew G. Knepley case 3: 668775d3a19aSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 3; /* Hybrid */ 668875d3a19aSMatthew G. Knepley else *cellRefiner = 1; /* Triangular */ 668975d3a19aSMatthew G. Knepley break; 669075d3a19aSMatthew G. Knepley case 4: 669175d3a19aSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 4; /* Hybrid */ 669275d3a19aSMatthew G. Knepley else *cellRefiner = 2; /* Quadrilateral */ 669375d3a19aSMatthew G. Knepley break; 669475d3a19aSMatthew G. Knepley default: 669575d3a19aSMatthew G. Knepley SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown coneSize %d in dimension %d for cell refiner", coneSize, dim); 669675d3a19aSMatthew G. Knepley } 669775d3a19aSMatthew G. Knepley break; 6698b5da9499SMatthew G. Knepley case 3: 6699b5da9499SMatthew G. Knepley switch (coneSize) { 6700b5da9499SMatthew G. Knepley case 4: 6701b5da9499SMatthew G. Knepley if (cMax >= 0) *cellRefiner = 7; /* Hybrid */ 6702b5da9499SMatthew G. Knepley else *cellRefiner = 5; /* Tetrahedral */ 6703b5da9499SMatthew G. Knepley break; 67042eabf88fSMatthew G. Knepley case 6: 67052eabf88fSMatthew G. Knepley if (cMax >= 0) *cellRefiner = 8; /* Hybrid */ 67062eabf88fSMatthew G. Knepley else *cellRefiner = 6; /* hexahedral */ 67072eabf88fSMatthew G. Knepley break; 6708b5da9499SMatthew G. Knepley default: 6709b5da9499SMatthew G. Knepley SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown coneSize %d in dimension %d for cell refiner", coneSize, dim); 6710b5da9499SMatthew G. Knepley } 6711b5da9499SMatthew G. Knepley break; 671275d3a19aSMatthew G. Knepley default: 671375d3a19aSMatthew G. Knepley SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown dimension %d for cell refiner", dim); 671475d3a19aSMatthew G. Knepley } 671575d3a19aSMatthew G. Knepley PetscFunctionReturn(0); 671675d3a19aSMatthew G. Knepley } 6717