xref: /petsc/src/dm/label/tutorials/ex1.c (revision 74d235b2fd92820081e0e5808101a8f99eef1d1b)
1c4762a1bSJed Brown static char help[] = "Tests DMLabel operations.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdm.h>
4c4762a1bSJed Brown #include <petscdmplex.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown PetscErrorCode ViewLabels(DM dm, PetscViewer viewer)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   DMLabel        label;
9c4762a1bSJed Brown   const char    *labelName;
10c4762a1bSJed Brown   PetscInt       numLabels, l;
11c4762a1bSJed Brown   PetscErrorCode ierr;
12c4762a1bSJed Brown 
13c4762a1bSJed Brown   PetscFunctionBegin;
14c4762a1bSJed Brown   /* query the number and name of labels*/
15c4762a1bSJed Brown   ierr = DMGetNumLabels(dm, &numLabels);CHKERRQ(ierr);
16c4762a1bSJed Brown   ierr = PetscViewerASCIIPrintf(viewer, "Number of labels: %d\n", numLabels);CHKERRQ(ierr);
17c4762a1bSJed Brown   for (l = 0; l < numLabels; ++l) {
18*74d235b2SVaclav Hapla     IS labelIS, tmpIS;
19*74d235b2SVaclav Hapla 
20c4762a1bSJed Brown     ierr = DMGetLabelName(dm, l, &labelName);CHKERRQ(ierr);
21c4762a1bSJed Brown     ierr = PetscViewerASCIIPrintf(viewer, "Label %d: name: %s\n", l, labelName);CHKERRQ(ierr);
22c4762a1bSJed Brown     ierr = PetscViewerASCIIPrintf(viewer, "IS of values\n");CHKERRQ(ierr);
23c4762a1bSJed Brown     ierr = DMGetLabel(dm, labelName, &label);CHKERRQ(ierr);
24c4762a1bSJed Brown     ierr = DMLabelGetValueIS(label, &labelIS);CHKERRQ(ierr);
25*74d235b2SVaclav Hapla     ierr = ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS);CHKERRQ(ierr);
26c4762a1bSJed Brown     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
27*74d235b2SVaclav Hapla     ierr = ISView(tmpIS, viewer);CHKERRQ(ierr);
28c4762a1bSJed Brown     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
29*74d235b2SVaclav Hapla     ierr = ISDestroy(&tmpIS);CHKERRQ(ierr);
30c4762a1bSJed Brown     ierr = ISDestroy(&labelIS);CHKERRQ(ierr);
31c4762a1bSJed Brown     ierr = PetscViewerASCIIPrintf(viewer, "\n");CHKERRQ(ierr);
32c4762a1bSJed Brown   }
33c4762a1bSJed Brown   /* Making sure that string literals work */
34c4762a1bSJed Brown   ierr = PetscViewerASCIIPrintf(viewer,"\n\nCell Set label IS\n");CHKERRQ(ierr);
35c4762a1bSJed Brown   ierr = DMGetLabel(dm, "Cell Sets", &label);CHKERRQ(ierr);
36c4762a1bSJed Brown   if (label) {
37*74d235b2SVaclav Hapla     IS labelIS, tmpIS;
38*74d235b2SVaclav Hapla 
39c4762a1bSJed Brown     ierr = DMLabelGetValueIS(label, &labelIS);CHKERRQ(ierr);
40*74d235b2SVaclav Hapla     ierr = ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS);CHKERRQ(ierr);
41*74d235b2SVaclav Hapla     ierr = ISView(tmpIS, viewer);CHKERRQ(ierr);
42*74d235b2SVaclav Hapla     ierr = ISDestroy(&tmpIS);CHKERRQ(ierr);
43c4762a1bSJed Brown     ierr = ISDestroy(&labelIS);CHKERRQ(ierr);
44c4762a1bSJed Brown   }
45c4762a1bSJed Brown   PetscFunctionReturn(0);
46c4762a1bSJed Brown }
47c4762a1bSJed Brown 
48*74d235b2SVaclav Hapla PetscErrorCode CheckLabelsSame(DMLabel label0, DMLabel label1)
49*74d235b2SVaclav Hapla {
50*74d235b2SVaclav Hapla   const char     *name0, *name1;
51*74d235b2SVaclav Hapla   PetscBool       same;
52*74d235b2SVaclav Hapla   char           *msg;
53*74d235b2SVaclav Hapla   PetscErrorCode  ierr;
54*74d235b2SVaclav Hapla 
55*74d235b2SVaclav Hapla   PetscFunctionBegin;
56*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)label0, &name0);CHKERRQ(ierr);
57*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)label1, &name1);CHKERRQ(ierr);
58*74d235b2SVaclav Hapla   ierr = DMLabelCompare(label0, label1, &same, &msg);CHKERRQ(ierr);
59*74d235b2SVaclav Hapla   if (same != (PetscBool) !msg) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg);
60*74d235b2SVaclav Hapla   if (!same) SETERRQ3(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg);
61*74d235b2SVaclav Hapla   /* Test passing NULL, must not fail */
62*74d235b2SVaclav Hapla   ierr = DMLabelCompare(label0, label1, NULL, NULL);CHKERRQ(ierr);
63*74d235b2SVaclav Hapla   ierr = PetscFree(msg);CHKERRQ(ierr);
64*74d235b2SVaclav Hapla   PetscFunctionReturn(0);
65*74d235b2SVaclav Hapla }
66*74d235b2SVaclav Hapla 
67*74d235b2SVaclav Hapla PetscErrorCode CheckLabelsNotSame(DMLabel label0, DMLabel label1)
68*74d235b2SVaclav Hapla {
69*74d235b2SVaclav Hapla   const char     *name0, *name1;
70*74d235b2SVaclav Hapla   PetscBool       same;
71*74d235b2SVaclav Hapla   char           *msg;
72*74d235b2SVaclav Hapla   PetscErrorCode  ierr;
73*74d235b2SVaclav Hapla 
74*74d235b2SVaclav Hapla   PetscFunctionBegin;
75*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)label0, &name0);CHKERRQ(ierr);
76*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)label1, &name1);CHKERRQ(ierr);
77*74d235b2SVaclav Hapla   ierr = DMLabelCompare(label0, label1, &same, &msg);CHKERRQ(ierr);
78*74d235b2SVaclav Hapla   if (same != (PetscBool) !msg) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg);
79*74d235b2SVaclav Hapla   if (same) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should differ!", name0, name1);
80*74d235b2SVaclav Hapla   ierr = PetscPrintf(PETSC_COMM_WORLD, "Compare label \"%s\" with \"%s\": %s\n", name0, name1, msg);CHKERRQ(ierr);
81*74d235b2SVaclav Hapla   ierr = PetscFree(msg);CHKERRQ(ierr);
82*74d235b2SVaclav Hapla   PetscFunctionReturn(0);
83*74d235b2SVaclav Hapla }
84*74d235b2SVaclav Hapla 
85*74d235b2SVaclav Hapla PetscErrorCode CheckDMLabelsSame(DM dm0, DM dm1)
86*74d235b2SVaclav Hapla {
87*74d235b2SVaclav Hapla   const char     *name0, *name1;
88*74d235b2SVaclav Hapla   PetscBool       same;
89*74d235b2SVaclav Hapla   char           *msg;
90*74d235b2SVaclav Hapla   PetscErrorCode  ierr;
91*74d235b2SVaclav Hapla 
92*74d235b2SVaclav Hapla   PetscFunctionBegin;
93*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)dm0, &name0);CHKERRQ(ierr);
94*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)dm1, &name1);CHKERRQ(ierr);
95*74d235b2SVaclav Hapla   ierr = DMCompareLabels(dm0, dm1, &same, &msg);CHKERRQ(ierr);
96*74d235b2SVaclav Hapla   if (same != (PetscBool) !msg) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg);
97*74d235b2SVaclav Hapla   if (!same) SETERRQ3(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg);
98*74d235b2SVaclav Hapla   /* Test passing NULL, must not fail */
99*74d235b2SVaclav Hapla   ierr = DMCompareLabels(dm0, dm1, NULL, NULL);CHKERRQ(ierr);
100*74d235b2SVaclav Hapla   ierr = PetscFree(msg);CHKERRQ(ierr);
101*74d235b2SVaclav Hapla   PetscFunctionReturn(0);
102*74d235b2SVaclav Hapla }
103*74d235b2SVaclav Hapla 
104*74d235b2SVaclav Hapla PetscErrorCode CheckDMLabelsNotSame(DM dm0, DM dm1)
105*74d235b2SVaclav Hapla {
106*74d235b2SVaclav Hapla   const char     *name0, *name1;
107*74d235b2SVaclav Hapla   PetscBool       same;
108*74d235b2SVaclav Hapla   char           *msg;
109*74d235b2SVaclav Hapla   PetscErrorCode  ierr;
110*74d235b2SVaclav Hapla 
111*74d235b2SVaclav Hapla   PetscFunctionBegin;
112*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)dm0, &name0);CHKERRQ(ierr);
113*74d235b2SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)dm1, &name1);CHKERRQ(ierr);
114*74d235b2SVaclav Hapla   ierr = DMCompareLabels(dm0, dm1, &same, &msg);CHKERRQ(ierr);
115*74d235b2SVaclav Hapla   if (same != (PetscBool) !msg) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg);
116*74d235b2SVaclav Hapla   if (same) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should differ!", name0, name1);
117*74d235b2SVaclav Hapla   ierr = PetscPrintf(PETSC_COMM_WORLD, "Labels of DMs \"%s\" and \"%s\" differ: %s\n", name0, name1, msg);CHKERRQ(ierr);
118*74d235b2SVaclav Hapla   ierr = PetscFree(msg);CHKERRQ(ierr);
119*74d235b2SVaclav Hapla   PetscFunctionReturn(0);
120*74d235b2SVaclav Hapla }
121*74d235b2SVaclav Hapla 
122*74d235b2SVaclav Hapla PetscErrorCode CreateMesh(const char name[], DM *newdm)
123c4762a1bSJed Brown {
124c4762a1bSJed Brown   DM             dm, dmDist;
125c4762a1bSJed Brown   char           filename[PETSC_MAX_PATH_LEN]="";
126c4762a1bSJed Brown   PetscBool      interpolate = PETSC_FALSE;
127c4762a1bSJed Brown   PetscErrorCode ierr;
128c4762a1bSJed Brown 
129*74d235b2SVaclav Hapla   PetscFunctionBegin;
130c4762a1bSJed Brown   /* initialize and get options */
131c4762a1bSJed Brown   ierr = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "DMLabel ex1 Options", "DMLabel");CHKERRQ(ierr);
132c4762a1bSJed Brown   ierr = PetscOptionsString("-i", "filename to read", "ex1.c", filename, filename, sizeof(filename), NULL);CHKERRQ(ierr);
133c4762a1bSJed Brown   ierr = PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex1.c", interpolate, &interpolate, NULL);CHKERRQ(ierr);
134c4762a1bSJed Brown   ierr = PetscOptionsEnd();CHKERRQ(ierr);
135c4762a1bSJed Brown 
136c4762a1bSJed Brown   /* create and distribute DM */
137c4762a1bSJed Brown   ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, filename, interpolate, &dm);CHKERRQ(ierr);
138c4762a1bSJed Brown   ierr = DMPlexDistribute(dm, 0, NULL, &dmDist);CHKERRQ(ierr);
139c4762a1bSJed Brown   if (dmDist) {
140c4762a1bSJed Brown     ierr = DMDestroy(&dm);CHKERRQ(ierr);
141c4762a1bSJed Brown     dm   = dmDist;
142c4762a1bSJed Brown   }
143c4762a1bSJed Brown   ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
144*74d235b2SVaclav Hapla   ierr = PetscObjectSetName((PetscObject)dm, name);CHKERRQ(ierr);
145*74d235b2SVaclav Hapla   *newdm = dm;
146*74d235b2SVaclav Hapla   PetscFunctionReturn(0);
147*74d235b2SVaclav Hapla }
148c4762a1bSJed Brown 
149*74d235b2SVaclav Hapla int main(int argc, char **argv)
150*74d235b2SVaclav Hapla {
151*74d235b2SVaclav Hapla   DM             dm;
152*74d235b2SVaclav Hapla   PetscErrorCode ierr;
153*74d235b2SVaclav Hapla 
154*74d235b2SVaclav Hapla   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
155*74d235b2SVaclav Hapla   ierr = CreateMesh("plex0", &dm);CHKERRQ(ierr);
156c4762a1bSJed Brown   /* add custom labels to test adding/removal */
157c4762a1bSJed Brown   {
158c4762a1bSJed Brown     DMLabel label0, label1, label2, label3;
159c4762a1bSJed Brown     PetscInt p, pStart, pEnd;
160c4762a1bSJed Brown     ierr = DMPlexGetChart(dm, &pStart, &pEnd);CHKERRQ(ierr);
161c4762a1bSJed Brown     /* create label in DM and get from DM */
162c4762a1bSJed Brown     ierr = DMCreateLabel(dm, "label0");CHKERRQ(ierr);
163c4762a1bSJed Brown     ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr);
164c4762a1bSJed Brown     /* alternative: create standalone label and add to DM; needs to be destroyed */
165c4762a1bSJed Brown     ierr = DMLabelCreate(PETSC_COMM_SELF, "label1", &label1);CHKERRQ(ierr);
166c4762a1bSJed Brown     ierr = DMAddLabel(dm, label1);CHKERRQ(ierr);
167c4762a1bSJed Brown 
168*74d235b2SVaclav Hapla     pEnd = PetscMin(pEnd, pStart + 5);
169c4762a1bSJed Brown     for (p=pStart; p < pEnd; p++) {
170c4762a1bSJed Brown       ierr = DMLabelSetValue(label0, p, 1);CHKERRQ(ierr);
171c4762a1bSJed Brown       ierr = DMLabelSetValue(label1, p, 2);CHKERRQ(ierr);
172c4762a1bSJed Brown     }
173c4762a1bSJed Brown     /* duplicate label */
174c4762a1bSJed Brown     ierr = DMLabelDuplicate(label0, &label2);CHKERRQ(ierr);
175c4762a1bSJed Brown     ierr = DMLabelDuplicate(label1, &label3);CHKERRQ(ierr);
176c4762a1bSJed Brown     ierr = PetscObjectSetName((PetscObject)label2, "label2");CHKERRQ(ierr);
177c4762a1bSJed Brown     ierr = PetscObjectSetName((PetscObject)label3, "label3");CHKERRQ(ierr);
178c4762a1bSJed Brown     ierr = DMAddLabel(dm, label2);CHKERRQ(ierr);
179c4762a1bSJed Brown     ierr = DMAddLabel(dm, label3);CHKERRQ(ierr);
180c4762a1bSJed Brown     /* remove the labels in this scope */
181c4762a1bSJed Brown     ierr = DMLabelDestroy(&label1);CHKERRQ(ierr);
182c4762a1bSJed Brown     ierr = DMLabelDestroy(&label2);CHKERRQ(ierr);
183c4762a1bSJed Brown     ierr = DMLabelDestroy(&label3);CHKERRQ(ierr);
184c4762a1bSJed Brown   }
185c4762a1bSJed Brown 
186c4762a1bSJed Brown   ierr = ViewLabels(dm, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
187c4762a1bSJed Brown 
188*74d235b2SVaclav Hapla   /* do label perturbations and comparisons */
189*74d235b2SVaclav Hapla   {
190*74d235b2SVaclav Hapla     DMLabel   label0, label1, label2, label3;
191*74d235b2SVaclav Hapla     PetscInt  val;
192*74d235b2SVaclav Hapla     PetscInt  p, pStart, pEnd;
193*74d235b2SVaclav Hapla 
194*74d235b2SVaclav Hapla     ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr);
195*74d235b2SVaclav Hapla     ierr = DMGetLabel(dm, "label1", &label1);CHKERRQ(ierr);
196*74d235b2SVaclav Hapla     ierr = DMGetLabel(dm, "label2", &label2);CHKERRQ(ierr);
197*74d235b2SVaclav Hapla     ierr = DMGetLabel(dm, "label3", &label3);CHKERRQ(ierr);
198*74d235b2SVaclav Hapla 
199*74d235b2SVaclav Hapla     ierr = CheckLabelsNotSame(label0, label1);CHKERRQ(ierr);
200*74d235b2SVaclav Hapla     ierr = CheckLabelsSame(label0, label2);CHKERRQ(ierr);
201*74d235b2SVaclav Hapla     ierr = CheckLabelsSame(label1, label3);CHKERRQ(ierr);
202*74d235b2SVaclav Hapla 
203*74d235b2SVaclav Hapla     ierr = DMLabelGetDefaultValue(label1, &val);CHKERRQ(ierr);
204*74d235b2SVaclav Hapla     ierr = DMLabelSetDefaultValue(label1, 333);CHKERRQ(ierr);
205*74d235b2SVaclav Hapla     ierr = CheckLabelsNotSame(label1, label3);CHKERRQ(ierr);
206*74d235b2SVaclav Hapla     ierr = DMLabelSetDefaultValue(label1, val);CHKERRQ(ierr);
207*74d235b2SVaclav Hapla     ierr = CheckLabelsSame(label1, label3);CHKERRQ(ierr);
208*74d235b2SVaclav Hapla 
209*74d235b2SVaclav Hapla     ierr = DMLabelGetBounds(label1, &pStart, &pEnd);CHKERRQ(ierr);
210*74d235b2SVaclav Hapla 
211*74d235b2SVaclav Hapla     for (p=pStart; p<pEnd; p++) {
212*74d235b2SVaclav Hapla       ierr = DMLabelGetValue(label1, p, &val);CHKERRQ(ierr);
213*74d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
214*74d235b2SVaclav Hapla       ierr = DMLabelClearValue(label1, p, val);CHKERRQ(ierr);
215*74d235b2SVaclav Hapla       val++;
216*74d235b2SVaclav Hapla       ierr = DMLabelSetValue(label1, p, val);CHKERRQ(ierr);
217*74d235b2SVaclav Hapla     }
218*74d235b2SVaclav Hapla     ierr = CheckLabelsNotSame(label1, label3);CHKERRQ(ierr);
219*74d235b2SVaclav Hapla     for (p=pStart; p<pEnd; p++) {
220*74d235b2SVaclav Hapla       ierr = DMLabelGetValue(label1, p, &val);CHKERRQ(ierr);
221*74d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
222*74d235b2SVaclav Hapla       ierr = DMLabelClearValue(label1, p, val);CHKERRQ(ierr);
223*74d235b2SVaclav Hapla       val--;
224*74d235b2SVaclav Hapla       ierr = DMLabelSetValue(label1, p, val);CHKERRQ(ierr);
225*74d235b2SVaclav Hapla     }
226*74d235b2SVaclav Hapla     ierr = CheckLabelsSame(label1, label3);CHKERRQ(ierr);
227*74d235b2SVaclav Hapla 
228*74d235b2SVaclav Hapla     ierr = DMLabelGetValue(label3, pEnd-1, &val);CHKERRQ(ierr);
229*74d235b2SVaclav Hapla     ierr = DMLabelSetValue(label3, pEnd, val);CHKERRQ(ierr);
230*74d235b2SVaclav Hapla     ierr = CheckLabelsNotSame(label1, label3);CHKERRQ(ierr);
231*74d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
232*74d235b2SVaclav Hapla     ierr = DMLabelClearValue(label3, pEnd, val);CHKERRQ(ierr);
233*74d235b2SVaclav Hapla     ierr = CheckLabelsSame(label1, label3);CHKERRQ(ierr);
234*74d235b2SVaclav Hapla   }
235*74d235b2SVaclav Hapla 
236*74d235b2SVaclav Hapla   {
237*74d235b2SVaclav Hapla     DM        dm1;
238*74d235b2SVaclav Hapla     DMLabel   label02, label12;
239*74d235b2SVaclav Hapla     PetscInt  p = 0, val;
240*74d235b2SVaclav Hapla 
241*74d235b2SVaclav Hapla     ierr = CreateMesh("plex1", &dm1);CHKERRQ(ierr);
242*74d235b2SVaclav Hapla     ierr = CheckDMLabelsNotSame(dm, dm1);CHKERRQ(ierr);
243*74d235b2SVaclav Hapla 
244*74d235b2SVaclav Hapla     ierr = DMCopyLabels(dm, dm1, PETSC_OWN_POINTER, PETSC_FALSE, DM_COPY_LABELS_REPLACE);CHKERRQ(ierr);
245*74d235b2SVaclav Hapla     ierr = CheckDMLabelsSame(dm, dm1);CHKERRQ(ierr);
246*74d235b2SVaclav Hapla 
247*74d235b2SVaclav Hapla     ierr = DMCopyLabels(dm, dm1, PETSC_COPY_VALUES, PETSC_FALSE, DM_COPY_LABELS_REPLACE);CHKERRQ(ierr);
248*74d235b2SVaclav Hapla     ierr = DMGetLabel(dm, "label2", &label02);CHKERRQ(ierr);
249*74d235b2SVaclav Hapla     ierr = DMGetLabel(dm1, "label2", &label12);CHKERRQ(ierr);
250*74d235b2SVaclav Hapla     ierr = CheckLabelsSame(label02, label12);CHKERRQ(ierr);
251*74d235b2SVaclav Hapla 
252*74d235b2SVaclav Hapla     ierr = DMLabelGetValue(label12, p, &val);CHKERRQ(ierr);
253*74d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
254*74d235b2SVaclav Hapla     ierr = DMLabelClearValue(label12, p, val);CHKERRQ(ierr);
255*74d235b2SVaclav Hapla     ierr = DMLabelSetValue(label12, p, val+1);CHKERRQ(ierr);
256*74d235b2SVaclav Hapla     ierr = CheckLabelsNotSame(label02, label12);CHKERRQ(ierr);
257*74d235b2SVaclav Hapla     ierr = CheckDMLabelsNotSame(dm, dm1);CHKERRQ(ierr);
258*74d235b2SVaclav Hapla 
259*74d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
260*74d235b2SVaclav Hapla     ierr = DMLabelClearValue(label12, p, val+1);CHKERRQ(ierr);
261*74d235b2SVaclav Hapla     ierr = DMLabelSetValue(label12, p, val);CHKERRQ(ierr);
262*74d235b2SVaclav Hapla     ierr = CheckLabelsSame(label02, label12);CHKERRQ(ierr);
263*74d235b2SVaclav Hapla     ierr = CheckDMLabelsSame(dm, dm1);CHKERRQ(ierr);
264*74d235b2SVaclav Hapla 
265*74d235b2SVaclav Hapla     ierr = PetscObjectSetName((PetscObject)label12, "label12");CHKERRQ(ierr);
266*74d235b2SVaclav Hapla     ierr = CheckDMLabelsNotSame(dm, dm1);CHKERRQ(ierr);
267*74d235b2SVaclav Hapla     ierr = PetscObjectSetName((PetscObject)label12, "label2");CHKERRQ(ierr);
268*74d235b2SVaclav Hapla     ierr = CheckDMLabelsSame(dm, dm1);CHKERRQ(ierr);
269*74d235b2SVaclav Hapla 
270*74d235b2SVaclav Hapla     ierr = DMDestroy(&dm1);CHKERRQ(ierr);
271*74d235b2SVaclav Hapla   }
272*74d235b2SVaclav Hapla 
273c4762a1bSJed Brown   /* remove label0 and label1 just to test manual removal; let label3 be removed automatically by DMDestroy() */
274c4762a1bSJed Brown   {
275c4762a1bSJed Brown     DMLabel label0, label1, label2;
276c4762a1bSJed Brown     ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr);
277c4762a1bSJed Brown     ierr = DMGetLabel(dm, "label1", &label1);CHKERRQ(ierr);
278c4762a1bSJed Brown     if (!label0) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must not be NULL now");
279c4762a1bSJed Brown     if (!label1) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must not be NULL now");
280c4762a1bSJed Brown     ierr = DMRemoveLabel(dm, "label1", NULL);CHKERRQ(ierr);
281c4762a1bSJed Brown     ierr = DMRemoveLabel(dm, "label2", &label2);CHKERRQ(ierr);
282c4762a1bSJed Brown     ierr = DMRemoveLabelBySelf(dm, &label0, PETSC_TRUE);CHKERRQ(ierr);
283c4762a1bSJed Brown     ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr);
284c4762a1bSJed Brown     ierr = DMGetLabel(dm, "label1", &label1);CHKERRQ(ierr);
285c4762a1bSJed Brown     if (label0) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must be NULL now");
286c4762a1bSJed Brown     if (label1) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must be NULL now");
287c4762a1bSJed Brown     if (!label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
288c4762a1bSJed Brown     ierr = DMRemoveLabelBySelf(dm, &label2, PETSC_FALSE);CHKERRQ(ierr); /* this should do nothing */
289c4762a1bSJed Brown     if (!label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
290c4762a1bSJed Brown     ierr = DMLabelDestroy(&label2);CHKERRQ(ierr);
291c4762a1bSJed Brown     ierr = DMGetLabel(dm, "label2", &label2);CHKERRQ(ierr);
292c4762a1bSJed Brown     if (label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must be NULL now");
293c4762a1bSJed Brown   }
294c4762a1bSJed Brown 
295c4762a1bSJed Brown   ierr = DMDestroy(&dm);CHKERRQ(ierr);
296c4762a1bSJed Brown   ierr = PetscFinalize();
297c4762a1bSJed Brown   return ierr;
298c4762a1bSJed Brown }
299c4762a1bSJed Brown 
300c4762a1bSJed Brown /*TEST
301c4762a1bSJed Brown 
302c4762a1bSJed Brown   test:
303c4762a1bSJed Brown     suffix: 0
304*74d235b2SVaclav Hapla     nsize: {{1 2}separate output}
305c4762a1bSJed Brown     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo -interpolate
306c4762a1bSJed Brown     requires: exodusii
307c4762a1bSJed Brown 
308c4762a1bSJed Brown TEST*/
309