xref: /petsc/src/dm/label/tutorials/ex1.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1c4762a1bSJed Brown static char help[] = "Tests DMLabel operations.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdm.h>
4c4762a1bSJed Brown #include <petscdmplex.h>
5c4762a1bSJed Brown 
6*d71ae5a4SJacob Faibussowitsch PetscErrorCode ViewLabels(DM dm, PetscViewer viewer)
7*d71ae5a4SJacob Faibussowitsch {
8c4762a1bSJed Brown   DMLabel     label;
9c4762a1bSJed Brown   const char *labelName;
10c4762a1bSJed Brown   PetscInt    numLabels, l;
11c4762a1bSJed Brown 
12c4762a1bSJed Brown   PetscFunctionBegin;
13c4762a1bSJed Brown   /* query the number and name of labels*/
149566063dSJacob Faibussowitsch   PetscCall(DMGetNumLabels(dm, &numLabels));
1563a3b9bcSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Number of labels: %" PetscInt_FMT "\n", numLabels));
16c4762a1bSJed Brown   for (l = 0; l < numLabels; ++l) {
1774d235b2SVaclav Hapla     IS labelIS, tmpIS;
1874d235b2SVaclav Hapla 
199566063dSJacob Faibussowitsch     PetscCall(DMGetLabelName(dm, l, &labelName));
2063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Label %" PetscInt_FMT ": name: %s\n", l, labelName));
219566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "IS of values\n"));
229566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, labelName, &label));
239566063dSJacob Faibussowitsch     PetscCall(DMLabelGetValueIS(label, &labelIS));
249566063dSJacob Faibussowitsch     PetscCall(ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS));
259566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
269566063dSJacob Faibussowitsch     PetscCall(ISView(tmpIS, viewer));
279566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
289566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&tmpIS));
299566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&labelIS));
309566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
31c4762a1bSJed Brown   }
32c4762a1bSJed Brown   /* Making sure that string literals work */
339566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "\n\nCell Set label IS\n"));
349566063dSJacob Faibussowitsch   PetscCall(DMGetLabel(dm, "Cell Sets", &label));
35c4762a1bSJed Brown   if (label) {
3674d235b2SVaclav Hapla     IS labelIS, tmpIS;
3774d235b2SVaclav Hapla 
389566063dSJacob Faibussowitsch     PetscCall(DMLabelGetValueIS(label, &labelIS));
399566063dSJacob Faibussowitsch     PetscCall(ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS));
409566063dSJacob Faibussowitsch     PetscCall(ISView(tmpIS, viewer));
419566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&tmpIS));
429566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&labelIS));
43c4762a1bSJed Brown   }
44c4762a1bSJed Brown   PetscFunctionReturn(0);
45c4762a1bSJed Brown }
46c4762a1bSJed Brown 
47*d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckLabelsSame(DMLabel label0, DMLabel label1)
48*d71ae5a4SJacob Faibussowitsch {
4974d235b2SVaclav Hapla   const char *name0, *name1;
5074d235b2SVaclav Hapla   PetscBool   same;
5174d235b2SVaclav Hapla   char       *msg;
5274d235b2SVaclav Hapla 
5374d235b2SVaclav Hapla   PetscFunctionBegin;
549566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)label0, &name0));
559566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)label1, &name1));
569566063dSJacob Faibussowitsch   PetscCall(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, &same, &msg));
571dca8a05SBarry Smith   PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg);
5828b400f6SJacob Faibussowitsch   PetscCheck(same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg);
5974d235b2SVaclav Hapla   /* Test passing NULL, must not fail */
609566063dSJacob Faibussowitsch   PetscCall(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, NULL, NULL));
619566063dSJacob Faibussowitsch   PetscCall(PetscFree(msg));
6274d235b2SVaclav Hapla   PetscFunctionReturn(0);
6374d235b2SVaclav Hapla }
6474d235b2SVaclav Hapla 
65*d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckLabelsNotSame(DMLabel label0, DMLabel label1)
66*d71ae5a4SJacob Faibussowitsch {
6774d235b2SVaclav Hapla   const char *name0, *name1;
6874d235b2SVaclav Hapla   PetscBool   same;
6974d235b2SVaclav Hapla   char       *msg;
7074d235b2SVaclav Hapla 
7174d235b2SVaclav Hapla   PetscFunctionBegin;
729566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)label0, &name0));
739566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)label1, &name1));
749566063dSJacob Faibussowitsch   PetscCall(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, &same, &msg));
751dca8a05SBarry Smith   PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg);
7628b400f6SJacob Faibussowitsch   PetscCheck(!same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should differ!", name0, name1);
779566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Compare label \"%s\" with \"%s\": %s\n", name0, name1, msg));
789566063dSJacob Faibussowitsch   PetscCall(PetscFree(msg));
7974d235b2SVaclav Hapla   PetscFunctionReturn(0);
8074d235b2SVaclav Hapla }
8174d235b2SVaclav Hapla 
82*d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckDMLabelsSame(DM dm0, DM dm1)
83*d71ae5a4SJacob Faibussowitsch {
8474d235b2SVaclav Hapla   const char *name0, *name1;
8574d235b2SVaclav Hapla   PetscBool   same;
8674d235b2SVaclav Hapla   char       *msg;
8774d235b2SVaclav Hapla 
8874d235b2SVaclav Hapla   PetscFunctionBegin;
899566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm0, &name0));
909566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm1, &name1));
919566063dSJacob Faibussowitsch   PetscCall(DMCompareLabels(dm0, dm1, &same, &msg));
921dca8a05SBarry Smith   PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg);
9328b400f6SJacob Faibussowitsch   PetscCheck(same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg);
9474d235b2SVaclav Hapla   /* Test passing NULL, must not fail */
959566063dSJacob Faibussowitsch   PetscCall(DMCompareLabels(dm0, dm1, NULL, NULL));
969566063dSJacob Faibussowitsch   PetscCall(PetscFree(msg));
9774d235b2SVaclav Hapla   PetscFunctionReturn(0);
9874d235b2SVaclav Hapla }
9974d235b2SVaclav Hapla 
100*d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckDMLabelsNotSame(DM dm0, DM dm1)
101*d71ae5a4SJacob Faibussowitsch {
10274d235b2SVaclav Hapla   const char *name0, *name1;
10374d235b2SVaclav Hapla   PetscBool   same;
10474d235b2SVaclav Hapla   char       *msg;
10574d235b2SVaclav Hapla 
10674d235b2SVaclav Hapla   PetscFunctionBegin;
1079566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm0, &name0));
1089566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm1, &name1));
1099566063dSJacob Faibussowitsch   PetscCall(DMCompareLabels(dm0, dm1, &same, &msg));
1101dca8a05SBarry Smith   PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg);
11128b400f6SJacob Faibussowitsch   PetscCheck(!same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should differ!", name0, name1);
1129566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Labels of DMs \"%s\" and \"%s\" differ: %s\n", name0, name1, msg));
1139566063dSJacob Faibussowitsch   PetscCall(PetscFree(msg));
11474d235b2SVaclav Hapla   PetscFunctionReturn(0);
11574d235b2SVaclav Hapla }
11674d235b2SVaclav Hapla 
117*d71ae5a4SJacob Faibussowitsch PetscErrorCode CreateMesh(const char name[], DM *newdm)
118*d71ae5a4SJacob Faibussowitsch {
119c4762a1bSJed Brown   DM        dm, dmDist;
120c4762a1bSJed Brown   char      filename[PETSC_MAX_PATH_LEN] = "";
121c4762a1bSJed Brown   PetscBool interpolate                  = PETSC_FALSE;
122c4762a1bSJed Brown 
12374d235b2SVaclav Hapla   PetscFunctionBegin;
124c4762a1bSJed Brown   /* initialize and get options */
125d0609cedSBarry Smith   PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "DMLabel ex1 Options", "DMLabel");
1269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-i", "filename to read", "ex1.c", filename, filename, sizeof(filename), NULL));
1279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex1.c", interpolate, &interpolate, NULL));
128d0609cedSBarry Smith   PetscOptionsEnd();
129c4762a1bSJed Brown 
130c4762a1bSJed Brown   /* create and distribute DM */
1319566063dSJacob Faibussowitsch   PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, filename, "ex1_plex", interpolate, &dm));
1329566063dSJacob Faibussowitsch   PetscCall(DMPlexDistribute(dm, 0, NULL, &dmDist));
133c4762a1bSJed Brown   if (dmDist) {
1349566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&dm));
135c4762a1bSJed Brown     dm = dmDist;
136c4762a1bSJed Brown   }
1379566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(dm));
1389566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)dm, name));
13974d235b2SVaclav Hapla   *newdm = dm;
14074d235b2SVaclav Hapla   PetscFunctionReturn(0);
14174d235b2SVaclav Hapla }
142c4762a1bSJed Brown 
143*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
144*d71ae5a4SJacob Faibussowitsch {
14574d235b2SVaclav Hapla   DM dm;
14674d235b2SVaclav Hapla 
147327415f7SBarry Smith   PetscFunctionBeginUser;
1489566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
1499566063dSJacob Faibussowitsch   PetscCall(CreateMesh("plex0", &dm));
150c4762a1bSJed Brown   /* add custom labels to test adding/removal */
151c4762a1bSJed Brown   {
152c4762a1bSJed Brown     DMLabel  label0, label1, label2, label3;
153c4762a1bSJed Brown     PetscInt p, pStart, pEnd;
1549566063dSJacob Faibussowitsch     PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
155c4762a1bSJed Brown     /* create label in DM and get from DM */
1569566063dSJacob Faibussowitsch     PetscCall(DMCreateLabel(dm, "label0"));
1579566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
158c4762a1bSJed Brown     /* alternative: create standalone label and add to DM; needs to be destroyed */
1599566063dSJacob Faibussowitsch     PetscCall(DMLabelCreate(PETSC_COMM_SELF, "label1", &label1));
1609566063dSJacob Faibussowitsch     PetscCall(DMAddLabel(dm, label1));
161c4762a1bSJed Brown 
16274d235b2SVaclav Hapla     pEnd = PetscMin(pEnd, pStart + 5);
163c4762a1bSJed Brown     for (p = pStart; p < pEnd; p++) {
1649566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label0, p, 1));
1659566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label1, p, 2));
166c4762a1bSJed Brown     }
167c4762a1bSJed Brown     /* duplicate label */
1689566063dSJacob Faibussowitsch     PetscCall(DMLabelDuplicate(label0, &label2));
1699566063dSJacob Faibussowitsch     PetscCall(DMLabelDuplicate(label1, &label3));
1709566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label2, "label2"));
1719566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label3, "label3"));
1729566063dSJacob Faibussowitsch     PetscCall(DMAddLabel(dm, label2));
1739566063dSJacob Faibussowitsch     PetscCall(DMAddLabel(dm, label3));
174c4762a1bSJed Brown     /* remove the labels in this scope */
1759566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label1));
1769566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label2));
1779566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label3));
178c4762a1bSJed Brown   }
179c4762a1bSJed Brown 
1809566063dSJacob Faibussowitsch   PetscCall(ViewLabels(dm, PETSC_VIEWER_STDOUT_WORLD));
181c4762a1bSJed Brown 
18274d235b2SVaclav Hapla   /* do label perturbations and comparisons */
18374d235b2SVaclav Hapla   {
18474d235b2SVaclav Hapla     DMLabel  label0, label1, label2, label3;
18574d235b2SVaclav Hapla     PetscInt val;
18674d235b2SVaclav Hapla     PetscInt p, pStart, pEnd;
18774d235b2SVaclav Hapla 
1889566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
1899566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label1", &label1));
1909566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label2", &label2));
1919566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label3", &label3));
19274d235b2SVaclav Hapla 
1939566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label0, label1));
1949566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label0, label2));
1959566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
19674d235b2SVaclav Hapla 
1979566063dSJacob Faibussowitsch     PetscCall(DMLabelGetDefaultValue(label1, &val));
1989566063dSJacob Faibussowitsch     PetscCall(DMLabelSetDefaultValue(label1, 333));
1999566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label1, label3));
2009566063dSJacob Faibussowitsch     PetscCall(DMLabelSetDefaultValue(label1, val));
2019566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
20274d235b2SVaclav Hapla 
2039566063dSJacob Faibussowitsch     PetscCall(DMLabelGetBounds(label1, &pStart, &pEnd));
20474d235b2SVaclav Hapla 
20574d235b2SVaclav Hapla     for (p = pStart; p < pEnd; p++) {
2069566063dSJacob Faibussowitsch       PetscCall(DMLabelGetValue(label1, p, &val));
20774d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
2089566063dSJacob Faibussowitsch       PetscCall(DMLabelClearValue(label1, p, val));
20974d235b2SVaclav Hapla       val++;
2109566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label1, p, val));
21174d235b2SVaclav Hapla     }
2129566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label1, label3));
21374d235b2SVaclav Hapla     for (p = pStart; p < pEnd; p++) {
2149566063dSJacob Faibussowitsch       PetscCall(DMLabelGetValue(label1, p, &val));
21574d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
2169566063dSJacob Faibussowitsch       PetscCall(DMLabelClearValue(label1, p, val));
21774d235b2SVaclav Hapla       val--;
2189566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label1, p, val));
21974d235b2SVaclav Hapla     }
2209566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
22174d235b2SVaclav Hapla 
2229566063dSJacob Faibussowitsch     PetscCall(DMLabelGetValue(label3, pEnd - 1, &val));
2239566063dSJacob Faibussowitsch     PetscCall(DMLabelSetValue(label3, pEnd, val));
2249566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label1, label3));
22574d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
2269566063dSJacob Faibussowitsch     PetscCall(DMLabelClearValue(label3, pEnd, val));
2279566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
22874d235b2SVaclav Hapla   }
22974d235b2SVaclav Hapla 
23074d235b2SVaclav Hapla   {
23174d235b2SVaclav Hapla     DM       dm1;
23274d235b2SVaclav Hapla     DMLabel  label02, label12;
23374d235b2SVaclav Hapla     PetscInt p = 0, val;
23474d235b2SVaclav Hapla 
2359566063dSJacob Faibussowitsch     PetscCall(CreateMesh("plex1", &dm1));
2369566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsNotSame(dm, dm1));
23774d235b2SVaclav Hapla 
2389566063dSJacob Faibussowitsch     PetscCall(DMCopyLabels(dm, dm1, PETSC_OWN_POINTER, PETSC_FALSE, DM_COPY_LABELS_REPLACE));
2399566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsSame(dm, dm1));
24074d235b2SVaclav Hapla 
2419566063dSJacob Faibussowitsch     PetscCall(DMCopyLabels(dm, dm1, PETSC_COPY_VALUES, PETSC_FALSE, DM_COPY_LABELS_REPLACE));
2429566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label2", &label02));
2439566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm1, "label2", &label12));
2449566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label02, label12));
24574d235b2SVaclav Hapla 
2469566063dSJacob Faibussowitsch     PetscCall(DMLabelGetValue(label12, p, &val));
24774d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
2489566063dSJacob Faibussowitsch     PetscCall(DMLabelClearValue(label12, p, val));
2499566063dSJacob Faibussowitsch     PetscCall(DMLabelSetValue(label12, p, val + 1));
2509566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label02, label12));
2519566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsNotSame(dm, dm1));
25274d235b2SVaclav Hapla 
25374d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
2549566063dSJacob Faibussowitsch     PetscCall(DMLabelClearValue(label12, p, val + 1));
2559566063dSJacob Faibussowitsch     PetscCall(DMLabelSetValue(label12, p, val));
2569566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label02, label12));
2579566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsSame(dm, dm1));
25874d235b2SVaclav Hapla 
2599566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label12, "label12"));
2609566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsNotSame(dm, dm1));
2619566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label12, "label2"));
2629566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsSame(dm, dm1));
26374d235b2SVaclav Hapla 
2649566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&dm1));
26574d235b2SVaclav Hapla   }
26674d235b2SVaclav Hapla 
267c4762a1bSJed Brown   /* remove label0 and label1 just to test manual removal; let label3 be removed automatically by DMDestroy() */
268c4762a1bSJed Brown   {
269c4762a1bSJed Brown     DMLabel label0, label1, label2;
2709566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
2719566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label1", &label1));
27228b400f6SJacob Faibussowitsch     PetscCheck(label0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must not be NULL now");
27328b400f6SJacob Faibussowitsch     PetscCheck(label1, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must not be NULL now");
2749566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabel(dm, "label1", NULL));
2759566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabel(dm, "label2", &label2));
2769566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabelBySelf(dm, &label0, PETSC_TRUE));
2779566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
2789566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label1", &label1));
27928b400f6SJacob Faibussowitsch     PetscCheck(!label0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must be NULL now");
28028b400f6SJacob Faibussowitsch     PetscCheck(!label1, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must be NULL now");
28128b400f6SJacob Faibussowitsch     PetscCheck(label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
2829566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabelBySelf(dm, &label2, PETSC_FALSE)); /* this should do nothing */
28328b400f6SJacob Faibussowitsch     PetscCheck(label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
2849566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label2));
2859566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label2", &label2));
28628b400f6SJacob Faibussowitsch     PetscCheck(!label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must be NULL now");
287c4762a1bSJed Brown   }
288c4762a1bSJed Brown 
2899566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dm));
2909566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
291b122ec5aSJacob Faibussowitsch   return 0;
292c4762a1bSJed Brown }
293c4762a1bSJed Brown 
294c4762a1bSJed Brown /*TEST
295c4762a1bSJed Brown 
296c4762a1bSJed Brown   test:
297c4762a1bSJed Brown     suffix: 0
29874d235b2SVaclav Hapla     nsize: {{1 2}separate output}
299c4762a1bSJed Brown     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo -interpolate
300c4762a1bSJed Brown     requires: exodusii
301c4762a1bSJed Brown 
302c4762a1bSJed Brown TEST*/
303