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