1*c4762a1bSJed Brown static char help[] = "Tests DMLabel operations.\n\n"; 2*c4762a1bSJed Brown 3*c4762a1bSJed Brown #include <petscdm.h> 4*c4762a1bSJed Brown #include <petscdmplex.h> 5*c4762a1bSJed Brown 6*c4762a1bSJed Brown PetscErrorCode ViewLabels(DM dm, PetscViewer viewer) 7*c4762a1bSJed Brown { 8*c4762a1bSJed Brown DMLabel label; 9*c4762a1bSJed Brown IS labelIS; 10*c4762a1bSJed Brown const char *labelName; 11*c4762a1bSJed Brown PetscInt numLabels, l; 12*c4762a1bSJed Brown PetscErrorCode ierr; 13*c4762a1bSJed Brown 14*c4762a1bSJed Brown PetscFunctionBegin; 15*c4762a1bSJed Brown /* query the number and name of labels*/ 16*c4762a1bSJed Brown ierr = DMGetNumLabels(dm, &numLabels);CHKERRQ(ierr); 17*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(viewer, "Number of labels: %d\n", numLabels);CHKERRQ(ierr); 18*c4762a1bSJed Brown for (l = 0; l < numLabels; ++l) { 19*c4762a1bSJed Brown ierr = DMGetLabelName(dm, l, &labelName);CHKERRQ(ierr); 20*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(viewer, "Label %d: name: %s\n", l, labelName);CHKERRQ(ierr); 21*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(viewer, "IS of values\n");CHKERRQ(ierr); 22*c4762a1bSJed Brown ierr = DMGetLabel(dm, labelName, &label);CHKERRQ(ierr); 23*c4762a1bSJed Brown ierr = DMLabelGetValueIS(label, &labelIS);CHKERRQ(ierr); 24*c4762a1bSJed Brown ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 25*c4762a1bSJed Brown ierr = ISView(labelIS, viewer);CHKERRQ(ierr); 26*c4762a1bSJed Brown ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 27*c4762a1bSJed Brown ierr = ISDestroy(&labelIS);CHKERRQ(ierr); 28*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(viewer, "\n");CHKERRQ(ierr); 29*c4762a1bSJed Brown } 30*c4762a1bSJed Brown /* Making sure that string literals work */ 31*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"\n\nCell Set label IS\n");CHKERRQ(ierr); 32*c4762a1bSJed Brown ierr = DMGetLabel(dm, "Cell Sets", &label);CHKERRQ(ierr); 33*c4762a1bSJed Brown if (label) { 34*c4762a1bSJed Brown ierr = DMLabelGetValueIS(label, &labelIS);CHKERRQ(ierr); 35*c4762a1bSJed Brown ierr = ISView(labelIS, viewer);CHKERRQ(ierr); 36*c4762a1bSJed Brown ierr = ISDestroy(&labelIS);CHKERRQ(ierr); 37*c4762a1bSJed Brown } 38*c4762a1bSJed Brown PetscFunctionReturn(0); 39*c4762a1bSJed Brown } 40*c4762a1bSJed Brown 41*c4762a1bSJed Brown int main(int argc, char **argv) 42*c4762a1bSJed Brown { 43*c4762a1bSJed Brown DM dm, dmDist; 44*c4762a1bSJed Brown char filename[PETSC_MAX_PATH_LEN]=""; 45*c4762a1bSJed Brown PetscBool interpolate = PETSC_FALSE; 46*c4762a1bSJed Brown PetscErrorCode ierr; 47*c4762a1bSJed Brown 48*c4762a1bSJed Brown /* initialize and get options */ 49*c4762a1bSJed Brown ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr; 50*c4762a1bSJed Brown ierr = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "DMLabel ex1 Options", "DMLabel");CHKERRQ(ierr); 51*c4762a1bSJed Brown ierr = PetscOptionsString("-i", "filename to read", "ex1.c", filename, filename, sizeof(filename), NULL);CHKERRQ(ierr); 52*c4762a1bSJed Brown ierr = PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex1.c", interpolate, &interpolate, NULL);CHKERRQ(ierr); 53*c4762a1bSJed Brown ierr = PetscOptionsEnd();CHKERRQ(ierr); 54*c4762a1bSJed Brown 55*c4762a1bSJed Brown /* create and distribute DM */ 56*c4762a1bSJed Brown ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, filename, interpolate, &dm);CHKERRQ(ierr); 57*c4762a1bSJed Brown ierr = DMPlexDistribute(dm, 0, NULL, &dmDist);CHKERRQ(ierr); 58*c4762a1bSJed Brown if (dmDist) { 59*c4762a1bSJed Brown ierr = DMDestroy(&dm);CHKERRQ(ierr); 60*c4762a1bSJed Brown dm = dmDist; 61*c4762a1bSJed Brown } 62*c4762a1bSJed Brown ierr = DMSetFromOptions(dm);CHKERRQ(ierr); 63*c4762a1bSJed Brown 64*c4762a1bSJed Brown /* add custom labels to test adding/removal */ 65*c4762a1bSJed Brown { 66*c4762a1bSJed Brown DMLabel label0, label1, label2, label3; 67*c4762a1bSJed Brown PetscInt p, pStart, pEnd; 68*c4762a1bSJed Brown ierr = DMPlexGetChart(dm, &pStart, &pEnd);CHKERRQ(ierr); 69*c4762a1bSJed Brown /* create label in DM and get from DM */ 70*c4762a1bSJed Brown ierr = DMCreateLabel(dm, "label0");CHKERRQ(ierr); 71*c4762a1bSJed Brown ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr); 72*c4762a1bSJed Brown /* alternative: create standalone label and add to DM; needs to be destroyed */ 73*c4762a1bSJed Brown ierr = DMLabelCreate(PETSC_COMM_SELF, "label1", &label1);CHKERRQ(ierr); 74*c4762a1bSJed Brown ierr = DMAddLabel(dm, label1);CHKERRQ(ierr); 75*c4762a1bSJed Brown 76*c4762a1bSJed Brown pEnd = pStart + (pEnd-pStart)/3; /* we will mark the first third of points */ 77*c4762a1bSJed Brown for (p=pStart; p < pEnd; p++) { 78*c4762a1bSJed Brown ierr = DMLabelSetValue(label0, p, 1);CHKERRQ(ierr); 79*c4762a1bSJed Brown ierr = DMLabelSetValue(label1, p, 2);CHKERRQ(ierr); 80*c4762a1bSJed Brown } 81*c4762a1bSJed Brown /* duplicate label */ 82*c4762a1bSJed Brown ierr = DMLabelDuplicate(label0, &label2);CHKERRQ(ierr); 83*c4762a1bSJed Brown ierr = DMLabelDuplicate(label1, &label3);CHKERRQ(ierr); 84*c4762a1bSJed Brown ierr = PetscObjectSetName((PetscObject)label2, "label2");CHKERRQ(ierr); 85*c4762a1bSJed Brown ierr = PetscObjectSetName((PetscObject)label3, "label3");CHKERRQ(ierr); 86*c4762a1bSJed Brown ierr = DMAddLabel(dm, label2);CHKERRQ(ierr); 87*c4762a1bSJed Brown ierr = DMAddLabel(dm, label3);CHKERRQ(ierr); 88*c4762a1bSJed Brown /* remove the labels in this scope */ 89*c4762a1bSJed Brown ierr = DMLabelDestroy(&label1);CHKERRQ(ierr); 90*c4762a1bSJed Brown ierr = DMLabelDestroy(&label2);CHKERRQ(ierr); 91*c4762a1bSJed Brown ierr = DMLabelDestroy(&label3);CHKERRQ(ierr); 92*c4762a1bSJed Brown } 93*c4762a1bSJed Brown 94*c4762a1bSJed Brown ierr = ViewLabels(dm, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 95*c4762a1bSJed Brown 96*c4762a1bSJed Brown /* remove label0 and label1 just to test manual removal; let label3 be removed automatically by DMDestroy() */ 97*c4762a1bSJed Brown { 98*c4762a1bSJed Brown DMLabel label0, label1, label2; 99*c4762a1bSJed Brown ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr); 100*c4762a1bSJed Brown ierr = DMGetLabel(dm, "label1", &label1);CHKERRQ(ierr); 101*c4762a1bSJed Brown if (!label0) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must not be NULL now"); 102*c4762a1bSJed Brown if (!label1) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must not be NULL now"); 103*c4762a1bSJed Brown ierr = DMRemoveLabel(dm, "label1", NULL);CHKERRQ(ierr); 104*c4762a1bSJed Brown ierr = DMRemoveLabel(dm, "label2", &label2);CHKERRQ(ierr); 105*c4762a1bSJed Brown ierr = DMRemoveLabelBySelf(dm, &label0, PETSC_TRUE);CHKERRQ(ierr); 106*c4762a1bSJed Brown ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr); 107*c4762a1bSJed Brown ierr = DMGetLabel(dm, "label1", &label1);CHKERRQ(ierr); 108*c4762a1bSJed Brown if (label0) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must be NULL now"); 109*c4762a1bSJed Brown if (label1) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must be NULL now"); 110*c4762a1bSJed Brown if (!label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now"); 111*c4762a1bSJed Brown ierr = DMRemoveLabelBySelf(dm, &label2, PETSC_FALSE);CHKERRQ(ierr); /* this should do nothing */ 112*c4762a1bSJed Brown if (!label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now"); 113*c4762a1bSJed Brown ierr = DMLabelDestroy(&label2);CHKERRQ(ierr); 114*c4762a1bSJed Brown ierr = DMGetLabel(dm, "label2", &label2);CHKERRQ(ierr); 115*c4762a1bSJed Brown if (label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must be NULL now"); 116*c4762a1bSJed Brown } 117*c4762a1bSJed Brown 118*c4762a1bSJed Brown ierr = DMDestroy(&dm);CHKERRQ(ierr); 119*c4762a1bSJed Brown ierr = PetscFinalize(); 120*c4762a1bSJed Brown return ierr; 121*c4762a1bSJed Brown } 122*c4762a1bSJed Brown 123*c4762a1bSJed Brown /*TEST 124*c4762a1bSJed Brown 125*c4762a1bSJed Brown test: 126*c4762a1bSJed Brown suffix: 0 127*c4762a1bSJed Brown args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo -interpolate 128*c4762a1bSJed Brown requires: exodusii 129*c4762a1bSJed Brown 130*c4762a1bSJed Brown TEST*/ 131