xref: /petsc/src/dm/label/tutorials/ex1.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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