1*6fc05355SMatthew G. Knepley static char help[] = "Tests for creation of cohesive meshes by transforms\n\n"; 2*6fc05355SMatthew G. Knepley 3*6fc05355SMatthew G. Knepley #include <petscdmplex.h> 4*6fc05355SMatthew G. Knepley #include <petscsf.h> 5*6fc05355SMatthew G. Knepley 6*6fc05355SMatthew G. Knepley #include <petsc/private/dmpleximpl.h> 7*6fc05355SMatthew G. Knepley 8*6fc05355SMatthew G. Knepley PETSC_EXTERN char tri_2_cv[]; 9*6fc05355SMatthew G. Knepley char tri_2_cv[] = "\ 10*6fc05355SMatthew G. Knepley 2 4 6 3 1\n\ 11*6fc05355SMatthew G. Knepley 0 2 1\n\ 12*6fc05355SMatthew G. Knepley 1 2 3\n\ 13*6fc05355SMatthew G. Knepley 4 1 5\n\ 14*6fc05355SMatthew G. Knepley 4 0 1\n\ 15*6fc05355SMatthew G. Knepley -1.0 0.0 0.0 1\n\ 16*6fc05355SMatthew G. Knepley 0.0 1.0 0.0 -1\n\ 17*6fc05355SMatthew G. Knepley 0.0 -1.0 0.0 1\n\ 18*6fc05355SMatthew G. Knepley 1.0 0.0 0.0 -1\n\ 19*6fc05355SMatthew G. Knepley -2.0 1.0 0.0 1\n\ 20*6fc05355SMatthew G. Knepley -1.0 2.0 0.0 -1"; 21*6fc05355SMatthew G. Knepley 22*6fc05355SMatthew G. Knepley /* List of test meshes 23*6fc05355SMatthew G. Knepley 24*6fc05355SMatthew G. Knepley Test tri_0: triangle 25*6fc05355SMatthew G. Knepley 26*6fc05355SMatthew G. Knepley 4-10--5 8-16--7-14--4 27*6fc05355SMatthew G. Knepley |\ 1 | |\ \ 1 | 28*6fc05355SMatthew G. Knepley | \ | | \ \ | 29*6fc05355SMatthew G. Knepley 6 8 9 -> 9 12 2 11 13 30*6fc05355SMatthew G. Knepley | \ | | \ \ | 31*6fc05355SMatthew G. Knepley | 0 \| | 0 \ \| 32*6fc05355SMatthew G. Knepley 2--7--3 3-10--6-15--5 33*6fc05355SMatthew G. Knepley 34*6fc05355SMatthew G. Knepley Test tri_1: triangle, not tensor 35*6fc05355SMatthew G. Knepley 36*6fc05355SMatthew G. Knepley 4-10--5 8-10--7-16--4 37*6fc05355SMatthew G. Knepley |\ 1 | |\ \ 1 | 38*6fc05355SMatthew G. Knepley | \ | | \ \ | 39*6fc05355SMatthew G. Knepley 6 8 9 -> 11 14 2 13 15 40*6fc05355SMatthew G. Knepley | \ | | \ \ | 41*6fc05355SMatthew G. Knepley | 0 \| | 0 \ \| 42*6fc05355SMatthew G. Knepley 2--7--3 3-12--6--9--5 43*6fc05355SMatthew G. Knepley 44*6fc05355SMatthew G. Knepley Test tri_2: 4 triangles, non-oriented surface 45*6fc05355SMatthew G. Knepley 46*6fc05355SMatthew G. Knepley 9 47*6fc05355SMatthew G. Knepley / \ 48*6fc05355SMatthew G. Knepley / \ 49*6fc05355SMatthew G. Knepley 17 2 16 50*6fc05355SMatthew G. Knepley / \ 51*6fc05355SMatthew G. Knepley / \ 52*6fc05355SMatthew G. Knepley 8-----15----5 53*6fc05355SMatthew G. Knepley \ /|\ 54*6fc05355SMatthew G. Knepley \ / | \ 55*6fc05355SMatthew G. Knepley 18 3 12 | 14 56*6fc05355SMatthew G. Knepley \ / | \ 57*6fc05355SMatthew G. Knepley \ / | \ 58*6fc05355SMatthew G. Knepley 4 0 11 1 7 59*6fc05355SMatthew G. Knepley \ | / 60*6fc05355SMatthew G. Knepley \ | / 61*6fc05355SMatthew G. Knepley 10 | 13 62*6fc05355SMatthew G. Knepley \ | / 63*6fc05355SMatthew G. Knepley \|/ 64*6fc05355SMatthew G. Knepley 6 65*6fc05355SMatthew G. Knepley becomes 66*6fc05355SMatthew G. Knepley 8 67*6fc05355SMatthew G. Knepley / \ 68*6fc05355SMatthew G. Knepley / \ 69*6fc05355SMatthew G. Knepley / \ 70*6fc05355SMatthew G. Knepley 25 2 24 71*6fc05355SMatthew G. Knepley / \ 72*6fc05355SMatthew G. Knepley / \ 73*6fc05355SMatthew G. Knepley 13-----18------9 74*6fc05355SMatthew G. Knepley 28 | 5 26/ \ 75*6fc05355SMatthew G. Knepley 14----19----10 \ 76*6fc05355SMatthew G. Knepley \ /| |\ 77*6fc05355SMatthew G. Knepley \ / | | \ 78*6fc05355SMatthew G. Knepley 21 3 20 | | 23 79*6fc05355SMatthew G. Knepley \ / | | \ 80*6fc05355SMatthew G. Knepley \ / | | \ 81*6fc05355SMatthew G. Knepley 6 0 17 4 16 1 7 82*6fc05355SMatthew G. Knepley \ | | / 83*6fc05355SMatthew G. Knepley \ | | / 84*6fc05355SMatthew G. Knepley 15 | | 22 85*6fc05355SMatthew G. Knepley \ | | / 86*6fc05355SMatthew G. Knepley \| |/ 87*6fc05355SMatthew G. Knepley 12---11 88*6fc05355SMatthew G. Knepley 27 89*6fc05355SMatthew G. Knepley 90*6fc05355SMatthew G. Knepley Test tri_3: tri_2, in parallel 91*6fc05355SMatthew G. Knepley 92*6fc05355SMatthew G. Knepley 6 93*6fc05355SMatthew G. Knepley / \ 94*6fc05355SMatthew G. Knepley / \ 95*6fc05355SMatthew G. Knepley / \ 96*6fc05355SMatthew G. Knepley 12 1 11 97*6fc05355SMatthew G. Knepley / \ 98*6fc05355SMatthew G. Knepley / \ 99*6fc05355SMatthew G. Knepley 5-----10------2 100*6fc05355SMatthew G. Knepley \ 101*6fc05355SMatthew G. Knepley 5-----9-----3 2 102*6fc05355SMatthew G. Knepley \ /| |\ 103*6fc05355SMatthew G. Knepley \ / | | \ 104*6fc05355SMatthew G. Knepley 10 1 8 | | 9 105*6fc05355SMatthew G. Knepley \ / | | \ 106*6fc05355SMatthew G. Knepley \ / | | \ 107*6fc05355SMatthew G. Knepley 2 0 7 7 0 4 108*6fc05355SMatthew G. Knepley \ | | / 109*6fc05355SMatthew G. Knepley \ | | / 110*6fc05355SMatthew G. Knepley 6 | | 8 111*6fc05355SMatthew G. Knepley \ | | / 112*6fc05355SMatthew G. Knepley \| |/ 113*6fc05355SMatthew G. Knepley 4 3 114*6fc05355SMatthew G. Knepley becomes 115*6fc05355SMatthew G. Knepley 11 116*6fc05355SMatthew G. Knepley / \ 117*6fc05355SMatthew G. Knepley / \ 118*6fc05355SMatthew G. Knepley / \ 119*6fc05355SMatthew G. Knepley 19 1 18 120*6fc05355SMatthew G. Knepley / \ 121*6fc05355SMatthew G. Knepley / \ 122*6fc05355SMatthew G. Knepley 8-----14------4 123*6fc05355SMatthew G. Knepley 22 \ 3 | 124*6fc05355SMatthew G. Knepley 9------15 |\ 125*6fc05355SMatthew G. Knepley \ | \ 126*6fc05355SMatthew G. Knepley 9------14-----5 \ 20 | 127*6fc05355SMatthew G. Knepley 20\ 3 18/ \ \/ | 128*6fc05355SMatthew G. Knepley 10----15-----6 | 5 | 129*6fc05355SMatthew G. Knepley \ /| | | |\ 130*6fc05355SMatthew G. Knepley \ / | | | | \ 131*6fc05355SMatthew G. Knepley 17 1 16 | | | | 17 132*6fc05355SMatthew G. Knepley \ / | 2 | | 2 | \ 133*6fc05355SMatthew G. Knepley \ / | | | | \ 134*6fc05355SMatthew G. Knepley 4 0 13 12 13 12 0 10 135*6fc05355SMatthew G. Knepley \ | | | | / 136*6fc05355SMatthew G. Knepley \ | | | | / 137*6fc05355SMatthew G. Knepley 11 | | | | 16 138*6fc05355SMatthew G. Knepley \ | | | | / 139*6fc05355SMatthew G. Knepley \| | | |/ 140*6fc05355SMatthew G. Knepley 8---7 7---6 141*6fc05355SMatthew G. Knepley 19 21 142*6fc05355SMatthew G. Knepley 143*6fc05355SMatthew G. Knepley Test quad_0: quadrilateral 144*6fc05355SMatthew G. Knepley 145*6fc05355SMatthew G. Knepley 5-10--6-11--7 5-12-10-20--9-14--6 146*6fc05355SMatthew G. Knepley | | | | | | | 147*6fc05355SMatthew G. Knepley 12 0 13 1 14 --> 15 0 18 2 17 1 16 148*6fc05355SMatthew G. Knepley | | | | | | | 149*6fc05355SMatthew G. Knepley 2--8--3--9--4 3-11--8-19--7-13--4 150*6fc05355SMatthew G. Knepley 151*6fc05355SMatthew G. Knepley Test quad_1: quadrilateral, not tensor 152*6fc05355SMatthew G. Knepley 153*6fc05355SMatthew G. Knepley 5-10--6-11--7 5-14-10-12--9-16--6 154*6fc05355SMatthew G. Knepley | | | | | | | 155*6fc05355SMatthew G. Knepley 12 0 13 1 14 --> 17 0 20 2 19 1 18 156*6fc05355SMatthew G. Knepley | | | | | | | 157*6fc05355SMatthew G. Knepley 2--8--3--9--4 3-13--8-11--7-15--4 158*6fc05355SMatthew G. Knepley 159*6fc05355SMatthew G. Knepley Test quad_2: quadrilateral, 2 processes 160*6fc05355SMatthew G. Knepley 161*6fc05355SMatthew G. Knepley 3--6--4 3--6--4 3--9--7-14--6 5-14--4--9--7 162*6fc05355SMatthew G. Knepley | | | | | | | | | | 163*6fc05355SMatthew G. Knepley 7 0 8 7 0 8 --> 10 0 12 1 11 12 1 11 0 10 164*6fc05355SMatthew G. Knepley | | | | | | | | | | 165*6fc05355SMatthew G. Knepley 1--5--2 1--5--2 2--8--5-13--4 3-13--2--8--6 166*6fc05355SMatthew G. Knepley 167*6fc05355SMatthew G. Knepley Test quad_3: quadrilateral, 4 processes, non-oriented surface 168*6fc05355SMatthew G. Knepley 169*6fc05355SMatthew G. Knepley 3--6--4 3--6--4 3--9--7-14--6 5-14--4--9--7 170*6fc05355SMatthew G. Knepley | | | | | | | | | | 171*6fc05355SMatthew G. Knepley 7 0 8 7 0 8 10 0 12 1 11 12 1 11 0 10 172*6fc05355SMatthew G. Knepley | | | | | | | | | | 173*6fc05355SMatthew G. Knepley 1--5--2 1--5--2 2--8--5-13--4 3-13--2--8--6 174*6fc05355SMatthew G. Knepley --> 175*6fc05355SMatthew G. Knepley 3--6--4 3--6--4 3--9--7-14--6 5-14--4--9--7 176*6fc05355SMatthew G. Knepley | | | | | | | | | | 177*6fc05355SMatthew G. Knepley 7 0 8 7 0 8 10 0 12 1 11 12 1 11 0 10 178*6fc05355SMatthew G. Knepley | | | | | | | | | | 179*6fc05355SMatthew G. Knepley 1--5--2 1--5--2 2--8--5-13--4 3-13--2--8--6 180*6fc05355SMatthew G. Knepley 181*6fc05355SMatthew G. Knepley Test quad_4: embedded fault 182*6fc05355SMatthew G. Knepley 183*6fc05355SMatthew G. Knepley 14-24-15-25-16-26--17 184*6fc05355SMatthew G. Knepley | | | | 185*6fc05355SMatthew G. Knepley 28 3 30 4 32 5 34 186*6fc05355SMatthew G. Knepley | | | | 187*6fc05355SMatthew G. Knepley 10-21-11-22-12-23--13 188*6fc05355SMatthew G. Knepley | | | | 189*6fc05355SMatthew G. Knepley 27 0 29 1 31 2 33 190*6fc05355SMatthew G. Knepley | | | | 191*6fc05355SMatthew G. Knepley 6-18--7-19--8-20--9 192*6fc05355SMatthew G. Knepley 193*6fc05355SMatthew G. Knepley becomes 194*6fc05355SMatthew G. Knepley 195*6fc05355SMatthew G. Knepley 13-26-14-27-15-28--16 196*6fc05355SMatthew G. Knepley | | | | 197*6fc05355SMatthew G. Knepley 30 3 32 4 39 5 40 198*6fc05355SMatthew G. Knepley | | | | 199*6fc05355SMatthew G. Knepley 12-25-17-36-19-38--21 200*6fc05355SMatthew G. Knepley | | | 201*6fc05355SMatthew G. Knepley 41 6 42 7 43 202*6fc05355SMatthew G. Knepley | | | 203*6fc05355SMatthew G. Knepley 12-25-17-35-18-37--20 204*6fc05355SMatthew G. Knepley | | | | 205*6fc05355SMatthew G. Knepley 29 0 31 1 33 2 34 206*6fc05355SMatthew G. Knepley | | | | 207*6fc05355SMatthew G. Knepley 8-22--9-23-10-24--11 208*6fc05355SMatthew G. Knepley 209*6fc05355SMatthew G. Knepley Test quad_5: two faults 210*6fc05355SMatthew G. Knepley 211*6fc05355SMatthew G. Knepley 14-24-15-25-16-26--17 212*6fc05355SMatthew G. Knepley | | | | 213*6fc05355SMatthew G. Knepley 28 3 30 4 32 5 34 214*6fc05355SMatthew G. Knepley | | | | 215*6fc05355SMatthew G. Knepley 10-21-11-22-12-23--13 216*6fc05355SMatthew G. Knepley | | | | 217*6fc05355SMatthew G. Knepley 27 0 29 1 31 2 33 218*6fc05355SMatthew G. Knepley | | | | 219*6fc05355SMatthew G. Knepley 6-18--7-19--8-20--9 220*6fc05355SMatthew G. Knepley 221*6fc05355SMatthew G. Knepley becomes 222*6fc05355SMatthew G. Knepley 223*6fc05355SMatthew G. Knepley 12-26-13-27-14-28--15 224*6fc05355SMatthew G. Knepley | | | | 225*6fc05355SMatthew G. Knepley 37 4 31 3 33 5 40 226*6fc05355SMatthew G. Knepley | | | | 227*6fc05355SMatthew G. Knepley 17-36-18-25-19-39--21 228*6fc05355SMatthew G. Knepley | | | | 229*6fc05355SMatthew G. Knepley 43 6 44 41 7 42 230*6fc05355SMatthew G. Knepley | | | | 231*6fc05355SMatthew G. Knepley 16-35-18-25-19-38--20 232*6fc05355SMatthew G. Knepley | | | | 233*6fc05355SMatthew G. Knepley 29 0 30 1 32 2 34 234*6fc05355SMatthew G. Knepley | | | | 235*6fc05355SMatthew G. Knepley 8-22--9-23-10-24--11 236*6fc05355SMatthew G. Knepley 237*6fc05355SMatthew G. Knepley Test quad_6: T-junction 238*6fc05355SMatthew G. Knepley 239*6fc05355SMatthew G. Knepley 14-24-15-25-16-26--17 240*6fc05355SMatthew G. Knepley | | | | 241*6fc05355SMatthew G. Knepley 28 3 30 4 32 5 34 242*6fc05355SMatthew G. Knepley | | | | 243*6fc05355SMatthew G. Knepley 10-21-11-22-12-23--13 244*6fc05355SMatthew G. Knepley | | | | 245*6fc05355SMatthew G. Knepley 27 0 29 1 31 2 33 246*6fc05355SMatthew G. Knepley | | | | 247*6fc05355SMatthew G. Knepley 6-18--7-19--8-20--9 248*6fc05355SMatthew G. Knepley 249*6fc05355SMatthew G. Knepley becomes 250*6fc05355SMatthew G. Knepley 251*6fc05355SMatthew G. Knepley 13-26-14-27-15-28--16 252*6fc05355SMatthew G. Knepley | | | | 253*6fc05355SMatthew G. Knepley 30 3 32 4 39 5 40 254*6fc05355SMatthew G. Knepley | | | | 255*6fc05355SMatthew G. Knepley 12-25-17-36-19-38--21 256*6fc05355SMatthew G. Knepley | | | 257*6fc05355SMatthew G. Knepley 41 6 42 7 43 258*6fc05355SMatthew G. Knepley | | | 259*6fc05355SMatthew G. Knepley 12-25-17-35-18-37--20 260*6fc05355SMatthew G. Knepley | | | | 261*6fc05355SMatthew G. Knepley 29 0 31 1 33 2 34 262*6fc05355SMatthew G. Knepley | | | | 263*6fc05355SMatthew G. Knepley 8-22--9-23-10-24--11 264*6fc05355SMatthew G. Knepley 265*6fc05355SMatthew G. Knepley becomes 266*6fc05355SMatthew G. Knepley 267*6fc05355SMatthew G. Knepley 14-28-15-41-21-44--20-29-16 268*6fc05355SMatthew G. Knepley | | | | | 269*6fc05355SMatthew G. Knepley 31 3 33 5 43 8 42 4 40 270*6fc05355SMatthew G. Knepley | | | | | 271*6fc05355SMatthew G. Knepley 13-27-17-37-23-46--23-39-19 272*6fc05355SMatthew G. Knepley | | | | 273*6fc05355SMatthew G. Knepley 47 6 48 48 7 49 274*6fc05355SMatthew G. Knepley | | | | 275*6fc05355SMatthew G. Knepley 13-27-17-36-22-45--22-38-18 276*6fc05355SMatthew G. Knepley | | | | | 277*6fc05355SMatthew G. Knepley 30 0 32 1 34 34 2 35 278*6fc05355SMatthew G. Knepley | | | | | 279*6fc05355SMatthew G. Knepley 9-24-10-25-11-----11-26-12 280*6fc05355SMatthew G. Knepley 281*6fc05355SMatthew G. Knepley List of future tests: 282*6fc05355SMatthew G. Knepley - Detect and error on intersecting faults 283*6fc05355SMatthew G. Knepley - 3D 284*6fc05355SMatthew G. Knepley */ 285*6fc05355SMatthew G. Knepley 286*6fc05355SMatthew G. Knepley typedef struct { 287*6fc05355SMatthew G. Knepley PetscInt testNum; // The mesh to test 288*6fc05355SMatthew G. Knepley } AppCtx; 289*6fc05355SMatthew G. Knepley 290*6fc05355SMatthew G. Knepley static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 291*6fc05355SMatthew G. Knepley { 292*6fc05355SMatthew G. Knepley PetscFunctionBegin; 293*6fc05355SMatthew G. Knepley options->testNum = 0; 294*6fc05355SMatthew G. Knepley 295*6fc05355SMatthew G. Knepley PetscOptionsBegin(comm, "", "Cohesive Meshing Options", "DMPLEX"); 296*6fc05355SMatthew G. Knepley PetscCall(PetscOptionsBoundedInt("-test_num", "The particular mesh to test", "ex5.c", options->testNum, &options->testNum, NULL, 0)); 297*6fc05355SMatthew G. Knepley PetscOptionsEnd(); 298*6fc05355SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 299*6fc05355SMatthew G. Knepley } 300*6fc05355SMatthew G. Knepley 301*6fc05355SMatthew G. Knepley static PetscErrorCode CreateQuadMesh1(MPI_Comm comm, AppCtx *user, DM *dm) 302*6fc05355SMatthew G. Knepley { 303*6fc05355SMatthew G. Knepley const PetscInt faces[2] = {1, 1}; 304*6fc05355SMatthew G. Knepley PetscReal lower[2], upper[2]; 305*6fc05355SMatthew G. Knepley DMLabel label; 306*6fc05355SMatthew G. Knepley PetscMPIInt rank; 307*6fc05355SMatthew G. Knepley void *get_tmp; 308*6fc05355SMatthew G. Knepley PetscInt64 *cidx; 309*6fc05355SMatthew G. Knepley PetscMPIInt flg; 310*6fc05355SMatthew G. Knepley 311*6fc05355SMatthew G. Knepley PetscFunctionBeginUser; 312*6fc05355SMatthew G. Knepley PetscCallMPI(MPI_Comm_rank(comm, &rank)); 313*6fc05355SMatthew G. Knepley // Create serial mesh 314*6fc05355SMatthew G. Knepley lower[0] = (PetscReal)(rank % 2); 315*6fc05355SMatthew G. Knepley lower[1] = (PetscReal)(rank / 2); 316*6fc05355SMatthew G. Knepley upper[0] = (PetscReal)(rank % 2) + 1.; 317*6fc05355SMatthew G. Knepley upper[1] = (PetscReal)(rank / 2) + 1.; 318*6fc05355SMatthew G. Knepley PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_SELF, 2, PETSC_FALSE, faces, lower, upper, NULL, PETSC_TRUE, dm)); 319*6fc05355SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)*dm, "box")); 320*6fc05355SMatthew G. Knepley // Flip edges to make fault non-oriented 321*6fc05355SMatthew G. Knepley switch (rank) { 322*6fc05355SMatthew G. Knepley case 2: 323*6fc05355SMatthew G. Knepley PetscCall(DMPlexOrientPoint(*dm, 8, -1)); 324*6fc05355SMatthew G. Knepley break; 325*6fc05355SMatthew G. Knepley case 3: 326*6fc05355SMatthew G. Knepley PetscCall(DMPlexOrientPoint(*dm, 7, -1)); 327*6fc05355SMatthew G. Knepley break; 328*6fc05355SMatthew G. Knepley default: 329*6fc05355SMatthew G. Knepley break; 330*6fc05355SMatthew G. Knepley } 331*6fc05355SMatthew G. Knepley // Need this so that all procs create the cell types 332*6fc05355SMatthew G. Knepley PetscCall(DMPlexGetCellTypeLabel(*dm, &label)); 333*6fc05355SMatthew G. Knepley // Replace comm in object (copied from PetscHeaderCreate/Destroy()) 334*6fc05355SMatthew G. Knepley PetscCall(PetscCommDestroy(&(*dm)->hdr.comm)); 335*6fc05355SMatthew G. Knepley PetscCall(PetscCommDuplicate(comm, &(*dm)->hdr.comm, &(*dm)->hdr.tag)); 336*6fc05355SMatthew G. Knepley PetscCallMPI(MPI_Comm_get_attr((*dm)->hdr.comm, Petsc_CreationIdx_keyval, &get_tmp, &flg)); 337*6fc05355SMatthew G. Knepley PetscCheck(flg, (*dm)->hdr.comm, PETSC_ERR_ARG_CORRUPT, "MPI_Comm does not have an object creation index"); 338*6fc05355SMatthew G. Knepley cidx = (PetscInt64 *)get_tmp; 339*6fc05355SMatthew G. Knepley (*dm)->hdr.cidx = (*cidx)++; 340*6fc05355SMatthew G. Knepley // Create new pointSF 341*6fc05355SMatthew G. Knepley { 342*6fc05355SMatthew G. Knepley PetscSF sf; 343*6fc05355SMatthew G. Knepley PetscInt *local = NULL; 344*6fc05355SMatthew G. Knepley PetscSFNode *remote = NULL; 345*6fc05355SMatthew G. Knepley PetscInt Nl; 346*6fc05355SMatthew G. Knepley 347*6fc05355SMatthew G. Knepley PetscCall(PetscSFCreate(comm, &sf)); 348*6fc05355SMatthew G. Knepley switch (rank) { 349*6fc05355SMatthew G. Knepley case 0: 350*6fc05355SMatthew G. Knepley Nl = 5; 351*6fc05355SMatthew G. Knepley PetscCall(PetscMalloc1(Nl, &local)); 352*6fc05355SMatthew G. Knepley PetscCall(PetscMalloc1(Nl, &remote)); 353*6fc05355SMatthew G. Knepley local[0] = 2; 354*6fc05355SMatthew G. Knepley remote[0].index = 1; 355*6fc05355SMatthew G. Knepley remote[0].rank = 1; 356*6fc05355SMatthew G. Knepley local[1] = 3; 357*6fc05355SMatthew G. Knepley remote[1].index = 1; 358*6fc05355SMatthew G. Knepley remote[1].rank = 2; 359*6fc05355SMatthew G. Knepley local[2] = 4; 360*6fc05355SMatthew G. Knepley remote[2].index = 1; 361*6fc05355SMatthew G. Knepley remote[2].rank = 3; 362*6fc05355SMatthew G. Knepley local[3] = 6; 363*6fc05355SMatthew G. Knepley remote[3].index = 5; 364*6fc05355SMatthew G. Knepley remote[3].rank = 2; 365*6fc05355SMatthew G. Knepley local[4] = 8; 366*6fc05355SMatthew G. Knepley remote[4].index = 7; 367*6fc05355SMatthew G. Knepley remote[4].rank = 1; 368*6fc05355SMatthew G. Knepley break; 369*6fc05355SMatthew G. Knepley case 1: 370*6fc05355SMatthew G. Knepley Nl = 3; 371*6fc05355SMatthew G. Knepley PetscCall(PetscMalloc1(Nl, &local)); 372*6fc05355SMatthew G. Knepley PetscCall(PetscMalloc1(Nl, &remote)); 373*6fc05355SMatthew G. Knepley local[0] = 3; 374*6fc05355SMatthew G. Knepley remote[0].index = 1; 375*6fc05355SMatthew G. Knepley remote[0].rank = 3; 376*6fc05355SMatthew G. Knepley local[1] = 4; 377*6fc05355SMatthew G. Knepley remote[1].index = 2; 378*6fc05355SMatthew G. Knepley remote[1].rank = 3; 379*6fc05355SMatthew G. Knepley local[2] = 6; 380*6fc05355SMatthew G. Knepley remote[2].index = 5; 381*6fc05355SMatthew G. Knepley remote[2].rank = 3; 382*6fc05355SMatthew G. Knepley break; 383*6fc05355SMatthew G. Knepley case 2: 384*6fc05355SMatthew G. Knepley Nl = 3; 385*6fc05355SMatthew G. Knepley PetscCall(PetscMalloc1(Nl, &local)); 386*6fc05355SMatthew G. Knepley PetscCall(PetscMalloc1(Nl, &remote)); 387*6fc05355SMatthew G. Knepley local[0] = 2; 388*6fc05355SMatthew G. Knepley remote[0].index = 1; 389*6fc05355SMatthew G. Knepley remote[0].rank = 3; 390*6fc05355SMatthew G. Knepley local[1] = 4; 391*6fc05355SMatthew G. Knepley remote[1].index = 3; 392*6fc05355SMatthew G. Knepley remote[1].rank = 3; 393*6fc05355SMatthew G. Knepley local[2] = 8; 394*6fc05355SMatthew G. Knepley remote[2].index = 7; 395*6fc05355SMatthew G. Knepley remote[2].rank = 3; 396*6fc05355SMatthew G. Knepley break; 397*6fc05355SMatthew G. Knepley case 3: 398*6fc05355SMatthew G. Knepley Nl = 0; 399*6fc05355SMatthew G. Knepley break; 400*6fc05355SMatthew G. Knepley default: 401*6fc05355SMatthew G. Knepley SETERRQ(comm, PETSC_ERR_SUP, "This example only supports 4 ranks"); 402*6fc05355SMatthew G. Knepley } 403*6fc05355SMatthew G. Knepley PetscCall(PetscSFSetGraph(sf, 9, Nl, local, PETSC_OWN_POINTER, remote, PETSC_OWN_POINTER)); 404*6fc05355SMatthew G. Knepley PetscCall(DMSetPointSF(*dm, sf)); 405*6fc05355SMatthew G. Knepley PetscCall(PetscSFDestroy(&sf)); 406*6fc05355SMatthew G. Knepley } 407*6fc05355SMatthew G. Knepley // Create fault label 408*6fc05355SMatthew G. Knepley PetscCall(DMCreateLabel(*dm, "fault")); 409*6fc05355SMatthew G. Knepley PetscCall(DMGetLabel(*dm, "fault", &label)); 410*6fc05355SMatthew G. Knepley switch (rank) { 411*6fc05355SMatthew G. Knepley case 0: 412*6fc05355SMatthew G. Knepley case 2: 413*6fc05355SMatthew G. Knepley PetscCall(DMLabelSetValue(label, 8, 1)); 414*6fc05355SMatthew G. Knepley PetscCall(DMLabelSetValue(label, 2, 0)); 415*6fc05355SMatthew G. Knepley PetscCall(DMLabelSetValue(label, 4, 0)); 416*6fc05355SMatthew G. Knepley break; 417*6fc05355SMatthew G. Knepley case 1: 418*6fc05355SMatthew G. Knepley case 3: 419*6fc05355SMatthew G. Knepley PetscCall(DMLabelSetValue(label, 7, 1)); 420*6fc05355SMatthew G. Knepley PetscCall(DMLabelSetValue(label, 1, 0)); 421*6fc05355SMatthew G. Knepley PetscCall(DMLabelSetValue(label, 3, 0)); 422*6fc05355SMatthew G. Knepley break; 423*6fc05355SMatthew G. Knepley default: 424*6fc05355SMatthew G. Knepley break; 425*6fc05355SMatthew G. Knepley } 426*6fc05355SMatthew G. Knepley PetscCall(DMPlexOrientLabel(*dm, label)); 427*6fc05355SMatthew G. Knepley PetscCall(DMPlexLabelCohesiveComplete(*dm, label, NULL, 1, PETSC_FALSE, PETSC_FALSE, NULL)); 428*6fc05355SMatthew G. Knepley PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE)); 429*6fc05355SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 430*6fc05355SMatthew G. Knepley } 431*6fc05355SMatthew G. Knepley 432*6fc05355SMatthew G. Knepley static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm) 433*6fc05355SMatthew G. Knepley { 434*6fc05355SMatthew G. Knepley PetscFunctionBegin; 435*6fc05355SMatthew G. Knepley if (user->testNum) { 436*6fc05355SMatthew G. Knepley PetscCall(CreateQuadMesh1(comm, user, dm)); 437*6fc05355SMatthew G. Knepley } else { 438*6fc05355SMatthew G. Knepley PetscCall(DMCreate(comm, dm)); 439*6fc05355SMatthew G. Knepley PetscCall(DMSetType(*dm, DMPLEX)); 440*6fc05355SMatthew G. Knepley } 441*6fc05355SMatthew G. Knepley PetscCall(DMSetFromOptions(*dm)); 442*6fc05355SMatthew G. Knepley { 443*6fc05355SMatthew G. Knepley const char *prefix; 444*6fc05355SMatthew G. Knepley 445*6fc05355SMatthew G. Knepley // We cannot redistribute with cohesive cells in the SF 446*6fc05355SMatthew G. Knepley PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE)); 447*6fc05355SMatthew G. Knepley PetscCall(PetscObjectGetOptionsPrefix((PetscObject)*dm, &prefix)); 448*6fc05355SMatthew G. Knepley PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "f0_")); 449*6fc05355SMatthew G. Knepley PetscCall(DMSetFromOptions(*dm)); 450*6fc05355SMatthew G. Knepley PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "f1_")); 451*6fc05355SMatthew G. Knepley PetscCall(DMSetFromOptions(*dm)); 452*6fc05355SMatthew G. Knepley PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, prefix)); 453*6fc05355SMatthew G. Knepley } 454*6fc05355SMatthew G. Knepley PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view")); 455*6fc05355SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 456*6fc05355SMatthew G. Knepley } 457*6fc05355SMatthew G. Knepley 458*6fc05355SMatthew G. Knepley int main(int argc, char **argv) 459*6fc05355SMatthew G. Knepley { 460*6fc05355SMatthew G. Knepley DM dm; 461*6fc05355SMatthew G. Knepley AppCtx user; 462*6fc05355SMatthew G. Knepley 463*6fc05355SMatthew G. Knepley PetscFunctionBeginUser; 464*6fc05355SMatthew G. Knepley PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 465*6fc05355SMatthew G. Knepley PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user)); 466*6fc05355SMatthew G. Knepley PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm)); 467*6fc05355SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 468*6fc05355SMatthew G. Knepley PetscCall(PetscFinalize()); 469*6fc05355SMatthew G. Knepley return 0; 470*6fc05355SMatthew G. Knepley } 471*6fc05355SMatthew G. Knepley 472*6fc05355SMatthew G. Knepley /*TEST 473*6fc05355SMatthew G. Knepley 474*6fc05355SMatthew G. Knepley testset: 475*6fc05355SMatthew G. Knepley requires: triangle 476*6fc05355SMatthew G. Knepley args: -dm_refine 1 -dm_plex_transform_type cohesive_extrude \ 477*6fc05355SMatthew G. Knepley -dm_plex_transform_active fault \ 478*6fc05355SMatthew G. Knepley -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail 479*6fc05355SMatthew G. Knepley 480*6fc05355SMatthew G. Knepley test: 481*6fc05355SMatthew G. Knepley suffix: tri_0 482*6fc05355SMatthew G. Knepley args: -dm_plex_box_faces 1,1 -dm_plex_cohesive_label_fault 8 483*6fc05355SMatthew G. Knepley test: 484*6fc05355SMatthew G. Knepley suffix: tri_1 485*6fc05355SMatthew G. Knepley args: -dm_plex_box_faces 1,1 -dm_plex_cohesive_label_fault 8 \ 486*6fc05355SMatthew G. Knepley -dm_plex_transform_extrude_use_tensor 0 487*6fc05355SMatthew G. Knepley test: 488*6fc05355SMatthew G. Knepley suffix: tri_2 489*6fc05355SMatthew G. Knepley args: -dm_plex_file_contents dat:tri_2_cv -dm_plex_cohesive_label_fault 11,15 490*6fc05355SMatthew G. Knepley test: 491*6fc05355SMatthew G. Knepley suffix: tri_3 492*6fc05355SMatthew G. Knepley nsize: 2 493*6fc05355SMatthew G. Knepley args: -dm_plex_file_contents dat:tri_2_cv -dm_plex_cohesive_label_fault 11,15 \ 494*6fc05355SMatthew G. Knepley -petscpartitioner_type shell -petscpartitioner_shell_sizes 2,2 \ 495*6fc05355SMatthew G. Knepley -petscpartitioner_shell_points 0,3,1,2 496*6fc05355SMatthew G. Knepley 497*6fc05355SMatthew G. Knepley testset: 498*6fc05355SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 2,1 \ 499*6fc05355SMatthew G. Knepley -dm_refine 1 -dm_plex_transform_type cohesive_extrude \ 500*6fc05355SMatthew G. Knepley -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 13 \ 501*6fc05355SMatthew G. Knepley -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail 502*6fc05355SMatthew G. Knepley 503*6fc05355SMatthew G. Knepley test: 504*6fc05355SMatthew G. Knepley suffix: quad_0 505*6fc05355SMatthew G. Knepley test: 506*6fc05355SMatthew G. Knepley suffix: quad_1 507*6fc05355SMatthew G. Knepley args: -dm_plex_transform_extrude_use_tensor 0 508*6fc05355SMatthew G. Knepley test: 509*6fc05355SMatthew G. Knepley suffix: quad_2 510*6fc05355SMatthew G. Knepley nsize: 2 511*6fc05355SMatthew G. Knepley args: -petscpartitioner_type simple 512*6fc05355SMatthew G. Knepley 513*6fc05355SMatthew G. Knepley test: 514*6fc05355SMatthew G. Knepley suffix: quad_3 515*6fc05355SMatthew G. Knepley nsize: 4 516*6fc05355SMatthew G. Knepley args: -test_num 1 \ 517*6fc05355SMatthew G. Knepley -dm_refine 1 -dm_plex_transform_type cohesive_extrude \ 518*6fc05355SMatthew G. Knepley -dm_plex_transform_active fault \ 519*6fc05355SMatthew G. Knepley -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail \ 520*6fc05355SMatthew G. Knepley -orientation_view -orientation_view_synchronized 521*6fc05355SMatthew G. Knepley 522*6fc05355SMatthew G. Knepley test: 523*6fc05355SMatthew G. Knepley suffix: quad_4 524*6fc05355SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \ 525*6fc05355SMatthew G. Knepley -dm_refine 1 -dm_plex_transform_type cohesive_extrude \ 526*6fc05355SMatthew G. Knepley -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 22,23 \ 527*6fc05355SMatthew G. Knepley -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail 528*6fc05355SMatthew G. Knepley 529*6fc05355SMatthew G. Knepley test: 530*6fc05355SMatthew G. Knepley suffix: quad_5 531*6fc05355SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \ 532*6fc05355SMatthew G. Knepley -dm_plex_cohesive_label_fault0 21 \ 533*6fc05355SMatthew G. Knepley -dm_plex_cohesive_label_fault1 23 \ 534*6fc05355SMatthew G. Knepley -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \ 535*6fc05355SMatthew G. Knepley -f0_dm_plex_transform_active fault0 -f0_coarse_dm_view ::ascii_info_detail \ 536*6fc05355SMatthew G. Knepley -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \ 537*6fc05355SMatthew G. Knepley -f1_dm_plex_transform_active fault1 -f1_coarse_dm_view ::ascii_info_detail \ 538*6fc05355SMatthew G. Knepley -dm_view ::ascii_info_detail 539*6fc05355SMatthew G. Knepley 540*6fc05355SMatthew G. Knepley test: 541*6fc05355SMatthew G. Knepley suffix: quad_6 542*6fc05355SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \ 543*6fc05355SMatthew G. Knepley -dm_plex_cohesive_label_fault0 22,23 \ 544*6fc05355SMatthew G. Knepley -dm_plex_cohesive_label_fault1 32 \ 545*6fc05355SMatthew G. Knepley -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \ 546*6fc05355SMatthew G. Knepley -f0_dm_plex_transform_active fault0 -f0_coarse_dm_view ::ascii_info_detail \ 547*6fc05355SMatthew G. Knepley -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \ 548*6fc05355SMatthew G. Knepley -f1_dm_plex_transform_active fault1 -f1_coarse_dm_view ::ascii_info_detail \ 549*6fc05355SMatthew G. Knepley -dm_view ::ascii_info_detail 550*6fc05355SMatthew G. Knepley 551*6fc05355SMatthew G. Knepley TEST*/ 552